33.4 插入文本

插入(insertion)指向缓冲区中添加新文本。插入的文本出现在光标处——光标前字符与光标后字符之间。 部分插入函数会将光标留在插入文本之前,另一些则留在之后。 我们称前者为光标后插入(after point),后者为光标前插入(before point)

插入操作会移动位于插入点之后位置的标记,使其保持跟随周围文本(see 标记)。 若某个标记指向插入位置,插入操作是否重新定位该标记取决于标记的插入类型(see 标记插入类型)。 某些特殊函数(如 insert-before-markers)会将所有此类标记重新定位到插入文本之后的光标位置,无论标记的插入类型如何。

若当前缓冲区为只读(see 只读缓冲区)或插入位置位于只读文本内(see 具有特殊含义的文本属性),插入函数会触发错误。

这些函数从字符串与缓冲区复制文本字符时会一并复制其属性。插入的字符与其源字符具有完全相同的属性。 与之相对,作为独立参数而非字符串或缓冲区一部分指定的字符,会从相邻文本继承文本属性。

若文本来自字符串或其他缓冲区,插入函数会将单字节文本转换为多字节文本以插入到多字节缓冲区,反之亦然。 但它们不会将 128 至 255 的单字节字符编码转换为多字节字符,即使当前缓冲区是多字节缓冲区。See 文本表示形式转换

Function: insert &rest args

此函数将字符串和/或字符 args 插入当前缓冲区的光标位置,并将光标向后移动。 换言之,它在光标前插入文本。 除非所有 args 均为字符串或字符,否则会触发错误。返回值为 nil

Function: insert-before-markers &rest args

此函数将字符串和/或字符 args 插入当前缓冲区的光标位置,并将光标向后移动。 除非所有 args 均为字符串或字符,否则会触发错误。返回值为 nil

此函数与其他插入函数的区别在于,它会将最初指向插入点的标记重新定位到插入文本之后的光标位置。 若某个覆盖层起始于插入点,插入的文本位于该覆盖层之外; 若非空覆盖层结束于插入点,插入的文本则位于该覆盖层之内。

Command: insert-char character &optional count inherit

此命令在当前缓冲区的光标前插入 countcharacter 字符。 参数 count 必须为整数,character 必须为字符。

若交互式调用,此命令会通过字符的 Unicode 名称或码点提示输入 character。See Inserting Text in The GNU Emacs Manual

此函数不会将 128 至 255 的单字节字符编码转换为多字节字符,即使当前缓冲区是多字节缓冲区。See 文本表示形式转换

inheritnil,插入的字符会从插入点前后两个字符继承粘性文本属性。See 文本属性的粘性

Function: insert-buffer-substring from-buffer-or-name &optional start end

此函数将 from-buffer-or-name 缓冲区的片段插入当前缓冲区的光标前。 插入的文本为 start(包含)与 end(不包含)之间的区域。 (这些参数默认为对应缓冲区可访问部分的开头与结尾。) 此函数返回 nil

在本例中,表达式以缓冲区 ‘bar’ 为当前缓冲区执行。我们假设缓冲区 ‘bar’ 初始为空。

---------- Buffer: foo ----------
We hold these truths to be self-evident, that all
---------- Buffer: foo ----------

(insert-buffer-substring "foo" 1 20)
     ⇒ nil

---------- Buffer: bar ----------
We hold these truth∗
---------- Buffer: bar ----------
Function: insert-buffer-substring-no-properties from-buffer-or-name &optional start end

此函数与 insert-buffer-substring 类似,区别在于不复制任何文本属性。

Function: insert-into-buffer to-buffer &optional start end

此函数与 insert-buffer-substring 类似,但方向相反:文本从当前缓冲区复制到 to-buffer。 文本块被复制到 to-buffer 的当前光标位置,且该缓冲区的光标会移动到复制文本末尾之后。 若 start/endnil,则复制当前缓冲区中的全部文本。

有关其他在插入文本同时从邻近文本继承属性的插入函数,See 文本属性的粘性。 由缩进函数插入的空白字符同样会继承文本属性。