[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 把光标位置存到 a
  • C-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 将当前窗口的配置存到 a
  • C-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 打开文件,类似位置寄存器。

键盘宏记录

这个专门留一篇文章讲,内容有点多。

书签

专门留一篇。

Powered by Org Mode.