2009年10月26日星期一

Emacs 的 Abbrevs 使用

缩写词是可以用于扩展的词,在文本中输入它时,会自动变为预先定义的内容。缩写词和内容需要自己定义,例如,把 foo 定义为串 find outer otter 的缩写词后,通过 f o o SPC 可以插入串 find outer otter。

Emacs 通过词的分界符(空格或标点等)判断输入的是否是一个缩写词。例如,当输入 f o o . 时,foo. 将自动被替换为串“find outer otter.”。当然,只有打开缩写子模式(M-x abbrev-mode)时,这些才有效。

缩写词的定义,可以在编辑的过程中完成。定义和内容保存在文件中,关闭子模式或 Emacs 不会丢失。缩写的定义分为全局的模式相关的两种,可以同时有一个全局定义和几个不同模式的定义。

定义缩写


C-x a g
定义一个全局缩写词,用光标前的一个或多个词作为内容,可以通过前缀参数指定词的个数;
C-x a l
同上,但是当前模式下的;
C-x a i g
和上面的命令相反,光标处的为全局缩写词,通过小缓冲输入内容;
C-x a i l
同上,但是当前模式下的;
M-x define-global-abbrev RET Abbrev RET Content RET
定义全局缩写词 Abbrev,内容为 Content;
M-x define-mode-abbrev RET Abbrev RET Content RET
同上,当前模式下的缩写;
M-x kill-all-abbrevs
删除所有缩写的定义;
一般来说,当出现需要重复输入的内容时,先输入一遍,然后执行 C-x a g 将输入的内容定义为一个缩写。通过前缀参数来设定包含的词的个数。例如,输入 find outer otter 之后,执行M-3 C-x a g foo RET,就定义了缩写词“foo”,内容为“find outer otter”。命令 C-x a l 同上,但都是当前模式下的,只在相同模式下有效。重新定义已存在的词可以覆盖原来内容。

先定义 region(通过设置 Mark),然后 C-u 0 C-x a g 可以将 region 作为缩写词的内容。

在编辑的过程中,如果先输入了缩写词,可以用命令 C-x a i g 为它输入内容。

命令 M-x define-global-abbrevM-x define-mode-abbrev 直接定义一个全局缩写词,通过小缓冲分别输入缩写词和内容。

负的前缀参数用来删除,如 C-u - C-x a g foo RETC-u - C-x a l foo RET 分别删除全局的和当前模式的 foo 定义。 M-x kill-all-abbrevs 删除所有缩写的定义,不论全局与否。

控制缩写的扩展


扩展缩写时的大小写比较有趣,会根据你的输入自动转换,例如:

  • foo -> find outer otter

  • Foo -> Find Outer Otter

  • FOO -> FIND OUTER OTTER 如果 abbrev-all-caps 是 non-nil

  • FOO -> Find Outer Otter 如果 abbrev-all-caps 是 nil


M-'
用于扩展有前缀的缩写词。
有时候可能需要扩展有一个前缀的缩写,例如,当缩写 cnst 扩展为 construction,又想要用来输入 reconstruction 。输入 recnst 不起作用的,因为没定义,在 re 和 cnst 之间用命令 M-' 就可以了。即 r e M-' c n s t SPC

C-x a e
将位点之前的缩写扩展,即使在关闭缩写子模式时也有效。
M-x expand-region-abbrevs
扩展 region 中所有缩写。
如果需要的文本恰恰就是缩写本身,不是其内容,可以用 C-q 抑制扩展,比如 foo C-q , 得到“foo,”。Undo 命令(C-_) 和 M-x unexpand-abbrev 都可以取消扩展,而且 M-x unexpand-abbrev 不会删除其后的标点。

M-x expand-region-abbrevs 用来在 region 中搜索和替换所有缩写,在已经输入了文本,但忘了开启缩写子模式的时候比较有用。

没有评论:

发表评论