[Emacs] 寄存器 Registers
简介
顾名思义,寄存器就是用来存东西的地方,先把东西写到里边,需要的时候再拿出来,可以反复取。比如我正在写小说,我就可以把角色的名字、地名等存到寄存器里面,取的时候只需要几个命令就能拿出来。
Emacs 的寄存器不止能存文本,其容许多种类型的数据:
- 位置
- 矩形区域
- 数字
- 文件名
足以应付大多数的场景。寄存器在 Emacs 退出之后就会被请空。
寄存器简介
每个寄存器要分配一个名字,可以是多种多样:
- 单个字母 a,b,c ,大小写敏感,即 a 和 A 代表不同的寄存器
- 单个数字 1,2,3
- 特殊符号 * #
- 命令组合
C-d
之所以这样是因为设置新寄存器时,要在 minibuffer 指定寄存器名字,只能执行一次操作。注意, 'C-g'和'ESC' 不能被分配。在 Elisp 中,在字符前面加 ?
就表示寄存器,如 ?+
, ?z
反别表示 +
寄存器和 z
寄存器。
M-x view-register RET r
查看寄存器 r
的值
寄存器的类型是动态的,比如你在 a 上存了一段文本,之后可以对 a 存数字覆盖之前的记录,即要存的数据类型跟之前的无关。
加下来的叙述中,都以 a 作为寄存器的名字,且不用代码快包裹了。
位置寄存器
C-x r SPC a
把光标位置存到 aC-x r j a
跳转到位置 a
存储的位置可以是不同 buffer 。我在 A-buffer 存了位置到 a ,我在 B-buffer 执行跳转就会转到 A-buffer 的位置。
文本寄存器
C-x r s a
将一段文字存到 a 。需要先选择(mark)一段文本。M-x append-to-register RET a
将选中的文本插入到 a 的文本后面,之前 a 的内容不会变。这个可以用命令C-x r + a
来实现,但注意,如此的话之前的内容和要存的内容都必须是文本。(见数字寄存器)M-x prepend-to-register RET a
将选中文本插入到 a 的文本 *前面,同样之前的内容不会变
以上三者都可以加前缀(C-u
),文本* 。如果 C-u
会把当前选择的文本删除,类似与剪切操作。
C-x r i a
将 a 的文字输出到光标
如果想在插入时加入分隔符,那么需作如下配置:
(setq register-separator ?+)
(set-register register-separator "\n\n")
矩形区域 Rectangles
就是记录了一个矩形四个角的位置区域,比如像这种:
按住 Ctrl+Alt
然后鼠标拖拽。具体区块相关的内容可以看教程:Rectangles (GNU Emacs Manual)。
C-x r r a
复制区块到 a 有前缀是剪切C-x r i a
从 a 中取出区块
窗口配置寄存器
C-x r w a
将当前窗口的配置存到 aC-x r f a
将所有窗口(包括其他 frame )的配置存到 a
感觉这个没啥用。
数字寄存器
C-u N C-x r n a
前缀 N,表示将 数字 N 存入 a。如果没有前缀,即C-x r n a
则会存入 0 。C-u N C-x r + a
如果 a 存了数字,那么就给它加 N ,N 可以是负数,也就是减。如果 a 为文本或没东西,那么这个命令就等价于文本寄存器里面的append-to-register
,把上一次 mark 的文本存进 a 。C-x r i a
从 a 中取数字,类似文本寄存器。
文件名寄存器
把文件名写到寄存器中,可以通过寄存器快速打开。这部分没有快捷命令,要手撸 elisp 代码。
(set-register r '(file . name))
;; e.g. 把 "/gd/gnu/emacs/19.0/src/ChangeLog" 存到寄存器 z 中
(set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))
通过 C-x r j r
打开文件,类似位置寄存器。
键盘宏记录
这个专门留一篇文章讲,内容有点多。
书签
专门留一篇。