33.5 用户级插入命令

本节描述用于插入文本的更高级别命令,这类命令主要面向用户,但在 Lisp 程序中同样有用。

Command: insert-buffer from-buffer-or-name

此命令将 from-buffer-or-name(必须已存在)的全部可访问内容插入到当前缓冲区的光标之后。 它会把标记置于插入文本的末尾。返回值为 nil

Command: self-insert-command count &optional char

此命令插入字符 char(即最后键入的字符);在光标前重复插入 count 次,并返回 nil。 多数可打印字符都绑定到此命令。在日常使用中,self-insert-command 是 Emacs 中被调用最频繁的函数, 但程序一般很少直接使用它,通常只是将其绑定到按键映射。

在交互式调用时,count 为数字前缀参数。

自插入会通过 translation-table-for-input 转换输入字符。See 字符转换

auto-fill-function 非空且插入的字符在 auto-fill-chars 表中时,此命令会调用该函数。see 自动换行

若启用了缩写模式且插入的字符不具备单词构成语法,此命令会执行缩写展开。See 缩写与缩写展开,以及 语法类别表。 当插入的字符具有右括号语法时,它还负责调用 blink-paren-function。see 括号闪烁

此命令最后会运行钩子 post-self-insert-hook。 例如,你可以用它在输入文本时自动重新缩进。 该钩子中的函数可以通过 last-command-event 获取刚刚插入的字符。see 来自命令循环的信息

若该钩子中的某个函数需要作用于区域,see 区域, 应确保在 post-self-insert-hook 函数执行前,选择删除模式不会删除该区域。see Delete Selection in The GNU Emacs Manual。 实现方式是向 self-insert-uses-region-functions 添加一个返回 nil 的函数, 这是一个专用钩子,用于告知选择删除模式不应删除区域。

不要尝试用自定义定义替换标准的 self-insert-command。编辑器命令循环会对该函数做特殊处理。

Command: newline &optional number-of-newlines interactive

此命令在当前缓冲区的光标前插入换行符。 若提供了 number-of-newlines,则插入对应数量的换行符。 在交互式调用时,number-of-newlines 为数字前缀参数。

此命令调用 self-insert-command 插入换行,随后可能通过调用 auto-fill-function 折行前一行。see 自动换行。 通常 auto-fill-function 的行为是插入一个换行;因此这种情况下的整体结果是在不同位置插入两个换行:一个在光标处,另一个在本行靠前位置。 若 number-of-newlines 非空,newline 不会执行自动填充。

此命令不会运行 post-self-insert-hook,除非是交互式调用或 interactive 非空。

若左页边距不为零,此命令会缩进至左页边距。See 填充边距

返回值为 nil

Command: ensure-empty-lines &optional number-of-empty-lines

此命令用于确保光标前有指定数量的空行。 (此处 “空行(empty line)” 定义为不包含任何字符的行—含有空格的行不算空行。) 默认确保光标前有一行空行。

若光标不在行首,会先插入一个换行符。 若光标前空行数量多于指定值,则减少空行数量;否则增加至指定数量。

Variable: overwrite-mode

此变量控制是否启用覆盖模式。取值可为 overwrite-mode-textualoverwrite-mode-binaryniloverwrite-mode-textual 表示文本覆盖模式(对换行与制表符特殊处理), overwrite-mode-binary 表示二进制覆盖模式(将换行与制表符视为普通字符)。