当前位置:文档之家› ZHL的emacs笔记:基本操作

ZHL的emacs笔记:基本操作


本文档是"ZHL的emacs笔记"的一部分。

本文档的格式是为了快速检索与浏览而专门调整的,最好用emacs来查看,将tab
缩进显式设为3个字符,设置不自动换行,并使用outline模式,以提高学习和工
作效率。具体配置可参考文档"ZHL的emacs笔记:配置小技巧"。

本文档主要讲述的是一些emacs的基本操作,包括帮助的用法、光标的移动以及基
本的文本编辑命令,当然,主要是本人在使用过程中所关注的细节以及积累的经
验。

希望本文档能给emacs同好一些帮助,任何问题或建议可以发信到 seaxii@https://www.doczj.com/doc/6d17257265.html, 来讨论。

文档正文----------------------------------------------------------------

**帮助:有完备的帮助,要善于运用。
C-h 或 F1 help-command :各帮助命令的前导符。
C-h C-h/?/F1 help-for-help :帮助的帮助。按 q 键退出(C-h q help-quit)。
C-h m describe-mode :给出当前 mode 的说明、命令以及键绑定。
C-h c describe-key-briefly :告诉你某个键执行的什么命令。
C-h k describe-key :告诉你按这个键执行那个lisp function及其详细说明。
C-h K Info-goto-emacs-key-command-node :查看随后的按键绑定所对应的info手册页(节点),描述信息更全面一些。会在Emacs manual的索引中查找,或在命令的info-file中查找,或在变量Info-file-list-for-emacs中查找。
C-h w where-is :告诉你某个命令绑定的什么键。
C-h f describe-function :告诉你某function的作用。如果只按一下SPC,emacs会给你所有lisp函数的列表和说明。
C-h F Info-goto-emacs-command-node :查看随后的命令所对应的info手册页(节点),描述信息更全面一些。会在Emacs manual的索引中查找,或在命令的info-file中查找,或在变量Info-file-list-for-emacs中查找。
C-h v describe-variable :告诉你某变量的描述及其当前值,如:C-h v load-path RET 会告诉你load-path的值。有自动补齐,甚至可以输入变量名中间某部分字串也可自动补齐,比如,输入 -table 后按TAB,则会列出所有包含 -table 的变量名。
C-h b describe-bindings :列出目前所有的keybinding。
C-h s describe-syntax :列出当前语法表(syntax table)中的语法定义。所有的emacs命令都是在语法表的控制下进行词分析或括号匹配,语法表决定了各个字符所扮演的角色(即语法分类)--分隔符、词成员、串引用、等等,每个主模式都可以有它自己的语法表,而每个缓冲区都会安装一个语法表,所有命令都会使用该语法表,可以用命令 modify-syntax-entry 来修改语法定义。语法分类在正则表达式中会用到。参见"关于语法表"。
describe-categories :列出当前分类表(category table)中的分类定义(category specifications)。分类定义主要指明了何种字符属于哪个类,比如汉字类、希

腊字母类等等。分类定义在正则表达式中会用到。参见"关于分类表"。
C-h a apropos-command :apropos的意思(approximate)。给lisp function的部份字串,emacs帮你找。
apropos-variable :显示所有名称匹配的用户变量。
apropos-value :显示那些其值中包含了匹配内容的符号。
apropos :这个概念都涉及哪些函数和变量。
C-h d apropos-documentation :显示那些其帮助文档中包含了匹配内容的符号(函数和变量等)。
C-h p finder-by-keyword :按关键字查找包信息,非常实用。会列出所有的功能分类,RET后会列出该类下的所有包(即emacs lisp文件.el),再RET会显示选定包的描述和使用方法等。
C-h i info :以Info查看的所有主要的GNU项目的手册页,有许多重要的信息可以在这里找到。具体参考后面关于"Info模式"的描述。
C-h S info-lookup-symbol :查看与指定符号(symbol)(即变量)相关的info文档,要求输入符号名,按 M-n 会翻出默认符号名(即光标处字串)以方便在此基础上进行符号名编辑。
C-h C-f view-emacs-FAQ :查看 Emacs FAQ 的info文档。
C-h C-p view-emacs-problems :已知问题及 workaround 。
C-h C-n 或 C-h n view-emacs-news :Emacs NEWS file,介绍最近改版的新功能。
C-h C-c describe-copying :版权信息描述,即 GNU/GPL (GNU GENERAL PUBLIC LICENSE) 。
C-h C-d view-emacs-debugging :显示如何调试Emacs的相关信息。
C-h t help-with-tutorial :给出一个基本模式的缓冲来显示"Emacs起步(tutorial)",居然是中文的。
C-h g describe-gnu-project :GNU工程(GNU project)描述,即 Richard Stallman 写的"The GNU Project"。
C-h l view-lossage :列出最近输入的100个字符。
C-h h view-hello-file :打开HELLO文件,其中列出了很多种语言及其字符集的hello,从而可以看出当前系统支持的字符集。
要查询所有以某个按键作为前辍的快捷键只需输入该按键后再按 C-h 就可以列出了,比如:C-c C-h ,C-x C-h ,C-h C-h ,M-O C-h ,M-o C-h ,M-s C-h ,等等。
**帮助窗口操作:
RET help-follow :帮助前跳。在帮助窗口中,能前进到光标所处交叉引用(cross-reference)点(即相当于超链处)对应的帮助文档或源码中。在试图跳到包源码去时,有时会报错说库不在路径中,这是由于对应的源码文件被编译了而自身又被删除了,即,只有.elc文件而无.el文件了,这可能是为了节省空间而将该emacs安装成了紧凑形式,即只保留了编译后的源码而未保留编译前的源码,所以找不到对应的源码包(.el文件)。
TAB forward-button :在帮助窗口中,光标前进到下一个交叉引用(cross-reference)点(即相当于超链处)。
S-TAB backward-button :在帮助窗口中,光标前进到上一个交叉引用(cross-reference)点(即相当于超链处)。 S-TAB 即

C-c C-b help-go-back :帮助返回。帮助前进后能一步步再退回来。
C-c C-f help-go-forward :帮助再返回。即帮助回退后再前进。
C-c C-c help-follow-symbol :符号帮助前跳。不同于 help-follow 命令,该命令可针对普通字串执行,而不要求一定得是交叉引用点。其会分析光标所处字串,然后尝试显示所有该符号(即分析出的字串)相关的文档,包括变量、函数等等。
**移动(motion):
说明:1、emacs里对"单词"(word)的定义是指在两个符号之间的字符串内容,如:"ab_cd"包含两个单词。
2、emacs里对"表达式"(sexp : syntactic expression,语法表达式)的定义是指在两个空格或逗号或括号等特殊语言符号之间的内容单位,如:"ab_cd"是一个表达式;"(a_b k***d)"是一个表达式,而其中"a_b"和"k***d"又分别是两个表达式。
3、emacs里对"句子"(sentence)的定义差不多相当于自然语言对句子的定义。句子的概念由变量 sentence-end 控制,这是一个相当复杂的正则表达式,用以判断何处是句尾。段边界同时也是句子的终止处。
4、emacs里对"段"(paragraph)的定义是指在两个空行之间的内容(也许缩进也是一个评估条件)。但经实验,好象大部分时候是指单行内容。参考变量 paragraph-separate 和 paragraph-start 。
5、emacs里对"页"(page)的定义是指在两个分页符之间的内容。分页符在文本模式里是一个打印字符,表示为"^L",若要插入一个分页符使用命令'C-q C-l',C-q为引用命令(quoted-insert),C-l为分页符(^L)。
6、defun 表示函数(function),常用于程序语言模式中。其在lisp语言里是指最高一级的sexp,而在C语言里,它的含义就是函数。
C-p previous-line :向上。
UP hide-region-previous-line :其与 C-p 的一个区别在于不会记住移动开始时的列位置,比如移动开始时处于100列,使用 C-p 向上移动时则每一行都尝试回到100列位置上,而使用 UP 向上移动时则只尝试进入之前一行的列位置,若某行无内容,则其进入0列并不再改变。
C-n next-line :向下。
DOWN hide-region-next-line :
C-x C-n set-goal-column :将当前插入点所在列值设为变量 goal-column 的值,加 C-u 前辍则重置为nil(即清除设置)。设置目标列的目的在于,使用 C-n 或 C-p 移动光标时,光标总是试图定位到新行的目标列。该命令默认是 disabled 的,可以在~/.emacs中加入行 (put 'set-goal-column 'disabled nil) 来去掉该disabled属性以使其总是可用。
C-b backward-char :向左。
LEFT hide-region-backward-char :
C-f forward-char :向右。
RIGHT hide-region-forward-char :
M-b 或 C-lEFT 或 M-LEFT backward-word :向左一个单词。
M-f 或 C-RIGHT 或 M-RIGHT forward-word :向右一个单词。
M-C-b backward-sexp :向左一个表达式。光

标在右括号后一个字符上时,将跳到左括号上。一对括号算做一个表达式,因此可以以括号为单位进行移动。
M-C-f forward-sexp :向右一个表达式。光标在左括号上时,将跳到右括号后一个字符上。一对括号算做一个表达式,因此可以以括号为单位进行移动。
C-a 或 HOME beginning-of-line :移到行头。
M-m back-to-indentation :移动到行首第一个非空白字符上。
C-e 或 END end-of-line :移到行尾。
M-a backward-sentence :句首。
M-e forward-sentence :句尾。
M-C-a beginning-of-defun :函数头。
M-C-e end-of-defun :函数尾。
M-{ 或 C-UP backward-paragraph :段首。
M-} 或 C-DOWN forward-paragraph :段尾。
C-x [ backward-page :上一分页符。若无分页符则移动到文件头。
C-x ] forward-page :下一分页符。若无分页符则移动到文件尾。
C-v 或 PgDn scroll-up :下一屏。
M-v 或 PgUp scroll-down :上一屏。
M-< 或 C-HOME beginning-of-buffer :文件头。
M-> 或 C-END end-of-buffer :文件尾。
C-l recenter :滚屏将当前行置于屏幕中央。在窗口被其它消息弄混乱时,是重新绘制屏显画面的一种好方法。定位滚屏依赖于前导命令参数,默认将当前行置于窗口中央,0将当前行置于窗口第一行,反向将当前行置于窗口最后一行,数字则指明将当前行置于窗口第几行。
C-M-l reposition-window :滚屏使当前(函数)定义及其前导注释可见,使定义前部(及其前导注释)处于窗口顶部,再次执行该命令则翻转使前导注释可见或不可见。若定义在一个窗口可以完全显示则光标位置不变,否则光标位置有可能改变。Scroll heuristically to bring useful information onto the screen.
M-r move-to-window-line :在窗口内定位,依赖于前导命令参数,默认为窗口中央,0为窗口头,反向为窗口尾,数字则指明窗口第几行。Position point relative to window.With no argument,position point at center of window.An argument specifies vertical position within the window;zero means top of window, negative means relative to bottom of window.
M-g M-g 或 M-g g goto-line n :到第n行,从文件头始。
goto-char n :到第n个字符(字节),从文件头始。
C-x < 或 C-PgDn scroll-left :窗口内容左滚。
C-x > 或 C-PgUp scroll-right :窗口内容右滚。
M-C-v 或 M-PgDn scroll-other-window :下一窗口滚动下一屏。
M-C-S-v 或 M-PgUp scroll-other-window-down :下一窗口滚动上一屏。
M-HOME beginning-of-buffer-other-window :下一窗口到头。
M-END end-of-buffer-other-window :下一窗口到尾。
M-C-d down-list :正向跳到多级嵌套括号的内一层括号上,光标处于内层左括号后。到最内层后则不动。加重复参数则连跳多次。加反向参数则反向跳到多级嵌套括号的内一层括号上,光标处于内层右括号前。Mov

e forward down one level of parentheses. With ARG, do this that many times. A negative argument means move backward but still go down a level.
M-C-u backward-up-list :反向跳到多级嵌套括号的外一层括号上,光标处于外层左括号前。到最外层后则不动。加重复参数则连跳多次。加反向参数则正向跳到多级嵌套括号的外一层括号上,光标处于外层右括号后。Move backward out of one level of parentheses. With ARG, do this that many times. A negative argument means move forward but still to a less deep spot.
up-list :类似于加反向参数的backward-up-list命令。Move forward out of one level of parentheses. With ARG, do this that many times. A negative argument means move backward but still to a less deep spot.
M-C-n forward-list :跳到平级的括号对的下一对上,光标处于右括号后。没有平级的则不动。加重复参数则连跳多次。加重复参数则跳到平级的括号对的上一对上,光标处于左括号前。Move forward across one balanced group of parentheses. With ARG, do it that many times. Negative arg -N means move backward across N groups of parentheses.
M-C-p backward-list :跳到平级的括号对的上一对上,光标处于左括号前。没有平级的则不动。加重复参数则连跳多次。加重复参数则跳到平级的括号对的下一对上,光标处于右括号后。Move backward across one balanced group of parentheses. With ARG, do it that many times. Negative arg -N means move forward across N groups of parentheses.
变量 scroll-margin :该变量控制了当光标上下移动时距离上下窗口边界多远时发生滚屏,默认值为0,可以适当调大,这样当滚屏发生时可以很好的看到上下文。其配置的例子参见"emacs配置小技巧"第73。
变量 scroll-conservatively :该变量控制了滚屏的方式,当光标上下移动(一次性移动而导致滚屏发生)而跃过上下窗口边界的行数小于该值时窗口只是滚动必要的行数以使光标所在的新行显示在窗口内,否则窗口将滚动多行以使光标所在新行处于窗口中间一行。默认值为0,这是出于效率的考虑,但这种情况下窗口滚动时有种跳动的感觉,不利于眼睛定位,如果硬件性能允许,可以设一个比较大的值,这样窗口滚动时就比较平滑了。其配置的例子参见"emacs配置小技巧"第73。
变量 scroll-step :该变量指明滚屏时的行数。但若想平滑的滚屏,只设定 scroll-conservatively 为一较大值即可,而不必再修改该变量的值。
**编辑:
**杂项:
INS overwrite-mode :切换插入与改写状态。打开后状态行出现"ovwrt"辅模式标记。
C-m 该按键组合等价于 RET 键,在使用 RET 键的场合均可以该组合键替换。
C-i 该按键组合等价于 TAB 键,在使用 TAB 键的场合均可以该组合键替换。
C-[ 该按键组合等

价于 ESC 键,在使用 ESC 键的场合均可以该组合键替换。
C-x l count-lines-page :统计当前页有多少行,以及光标前和光标后各多少。
M-= count-lines-region :统计文本块的行数和字符数。
C-x = what-cursor-position :给出当前字符的ASCII码值及其在缓冲区字符总数中的位置。
**空白操作:
RET newline :换行。
C-o open-line :在光标位置前插入一个新行,光标处于新行的起始处。
C-j newline-and-indent :在光标位置前插入一个新行(即插入newline字符),并自动缩进,光标处于新行的缩进后起始处。
M-C-o split-line :光标所处后半行垂直向下平移,前面插入空格。Split current line, moving portion beyond point vertically down.
M-\ delete-horizontal-space :删除光标左近的全部空白。
M-SPC just-one-space :将当前光标位置处的所有空格缩减为一个空格。
C-x C-o delete-blank-lines :若该行和/或其下若干行是空行,则删除这些空行,否则什么也不做。光标位置不变。
M-^ delete-indentation :把当前行合并到上一行去,并用一个空格分隔。
delete-trailing-whitespace :将当前缓冲区内各行行尾的空白符(如果有的话)都删掉。
tabify :将当前选中文本块区域内的多个空格替换为tab符如果可以的话,列数将保持不变。
untabify :将当前选中文本块区域内的tab符都替换为等量空格,列数将保持不变。
**缩进:是指对类似于tab符行为的处理。各种主模式对于缩进的处理都大致相同,只在细节上有所不同。
TAB indent-relative :在 text 模式下绑定在 TAB 键上。其首先依据上一个非空行找到一系列缩进点(即那行内每个词的起始处),再在当前插入点与下个缩进点间插入空白(用空格或tab,由变量indent-tabs-mode来决定),并将光标定位在空白后;若未求得缩进点位置,则调用 tab-to-tab-stop 来进行缩进,但若此时加了数字前辍则什么也不做。
M-i tab-to-tab-stop :在当前插入点与下个缩进点间插入空白(用空格或tab,由变量indent-tabs-mode来决定),并将光标定位在空白后,缩进点由变量 tab-stop-list 决定(其为一个数字列表,定义了每个缩进点的列值,可用命令 edit-tab-stops 对其进行编辑,注意其为一个全局唯一变量,不会有缓冲区本地值)。
indent-relative-maybe :依据上一个非空行来缩进一个新行,如果上一个非空行在当前光标位置未缩进则该命令什么也不做。
TAB indent-for-tab-command :在 fundamental 模式下绑定在 TAB 键上。依据当前主模式进行适当的缩进或插入tab,变量 tab-always-indent 决定该命令是缩进还是插入tab,但若插入点处于缩进区(within line's indentation 我试验是行首)则tab也不会被插入,而变量 indent-line-function 指明了调用的缩

进函数,其值默认为 indent-to-left-margin 。
变量 tab-width :决定了TAB字符显示时的宽度,其可设为缓冲区本地值。
变量 indent-tabs-mode :决定了插入空白时用空格还是tab符,其可设为缓冲区本地值。其值非nil时表示使用tab符,但也仅是在插入空白的宽度大于tab符显示宽度时才插入相应数量的tab符,而不足tab符显示宽度的部分则依然插入空白。
变量 tab-stop-list :为一个数字列表,定义了在使用命令 tab-to-tab-stop 时一行上各个缩进点的列值。其值可用命令 edit-tab-stops 进行编辑。注意该变量为一个全局唯一变量,不会有缓冲区本地值。其值可以手工设置一个列表,如:(setq tab-stop-list (list 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81)) ,更简单的,用一个循环即可指定,但之前应先清空,如:(setq tab-stop-list ()) (loop for x downfrom 40 to 1 do (setq tab-stop-list (cons (* x 3) tab-stop-list))) ,后来知道了 number-sequence 函数,还可以更简单:(setq tab-stop-list (number-sequence 3 120 3)) 。
M-C-\ indent-region :对文本块缩进(行首缩进)。其行为比较繁琐,总结如下(Text模式下):无前导参数时,若块内没有一行缩进,则整体依据前一行的缩进方法缩进,此时若前一行也没缩进则什么也不做,若块内有行是缩进的则除了整体依据前一行的缩进方法缩进外,在块内缩进行后的行再依据该缩进行继续缩进;有前导参数时相当于为块内每行指定了重新从头缩进的列数,不管原来有没有缩进,块内每行都将对齐,C-- 和 C-0 是等价的,表示调整为不缩进,其它数字表示重新缩进的列数,视情况会插入 tab ,而 C-u 等价于 C-4 。
**回逆:撤消操作(undo)。所有做过的操作被记录在一个环上,那么在回逆时即是在这个环上移动。
C-x u advertised-undo :Undo。
C-/ 或 C-_ undo :Undo。
emacs没有提供redo命令,但利用undo命令的特性可以实现该功能:undo后移动一下光标再undo即可达到redo的功能,注意中间一定要有一个移动操作,否则将撤消更上一个操作。
revert-buffer :从磁盘上取回文件内容,即导致自上次对文件存盘后的所有修改都被丢弃。变量 revert-buffer-function 用于配置该命令的特殊行为,其值为nil时 revert-buffer 执行默认行为,不为nil则指明了要执行的函数,很多特别的缓冲,比如 occur 和 dired ,都为该变量指定了缓冲本地值以完成刷新功能。
**文本块:region。
C-SPC 或 C-@ 或 C-Win set-mark-command :不带前导参数则在光标处设置标记(mark),那么在标记和光标当前位置之间的即为"文本块",可对文本块进行复制或剪切。设置标记时会将此标记压入(push)本地标记环(local mark ring),如果之前的标记是在

其它缓冲中设置的,则亦会将此标记压入全局标记环(global mark ring)。
带前导参数则光标跳到本地标记环(为缓冲本地变量 mark-ring )中当前标记所在的位置,而当前标记会从本地标记环中弹出(pop)并被设置为缓冲区当前标记,这个过程不影响全局标记环,当然,可以用命令 pop-global-mark 在全局标记环上回跳,行为是类似的。
标记环为一个可变环状数据结构,标记指针在其上循环移动,其所指标记即为标记环当前标记。实验知标记环操作具有以下特性:
a.弹出标记就是将标记指针所指标记设为缓冲区当前标记后再将标记指针向前移动一位。与通常意义上的弹出栈数据不同,弹出标记只是向前移动一下标记指针,标记环的大小和内容并不改变,又因为标记环是个环形结构,所以弹出标记操作可以一直循环执行下去,而弹出栈数据会改变栈的大小,数据弹出后就丢掉了。
b.压入标记就是在标记指针所指标记的后面插入一个新标记并将标记指针向后移动一位,新插入标记并不覆盖已有标记,因此标记环是扩大了。也许标记环会有最大限制而导致覆盖,但没有试验。
c.在标记环上只能回跳,还没发现有能正向跳转的命令。
变量 set-mark-command-repeat-pop 用于控制在弹出标记后紧接着再连续执行 C-@ 的行为,为non-nil表示后续执行的 C-@ (不用再加前导参数)会接着弹出标记,比如按键序列 C-u C-@ C-@ C-@ 会导致连续回跳三级,而为nil则表示后续的 C-@ (不带前导参数)依然是设置标记,默认值为nil。
Windows下 C-SPC 被(切换输入法)占用,但发现有时 C-win 被绑定为 set-mark-command (在从windows远程启动的XEmacs中是这样),这比按 C-@ 要方便一些,若该键未被绑定,则手工亦可绑定之,参见"emacs配置小技巧"第57。
C-x C-x exchange-point-and-mark :光标在当前位置和标记之间跳转(交换)一下,以显示文本块范围。
C-x C-SPC 或 C-x C-@ pop-global-mark :跳到全局标记环(global mark ring)中上一个标记所在的位置。变量 global-mark-ring 为全局标记环,全局标记环是全局唯一的。变量 set-mark-command-repeat-pop 亦对全局标记回跳有效,比如按键序列 C-x C-@ C-@ C-@ 会导致在全局标记环上连续回跳三级。
C-w 或 S-DEL kill-region :剪切文本块。有时会将组合键 C-w 绑定到 backward-kill-word 上,这与bash shell下的emacs风格行编辑时的 C-w 组合键意义相同,好使又好记;同时,也可以实现成只在激活了文本块时 C-w 才执行 kill-region ,具体参见"emacs配置小技巧"第94。
M-w 或 C-INS kill-ring-save :复制文本块。
M-@ mark-word :从光标位置向后标记一个单词。光标置于首部,标记置于尾部。版本23.1后,连续

执行该命令则会依次加大标记范围。
M-C-SPC 或 M-C-@ mark-sexp :从光标位置向后标记一个表达式。光标置于首部,标记置于尾部。版本23.1后,连续执行该命令则会依次加大标记范围。
mark-end-of-sentence :从光标位置向后标记一个句子。光标置于首部,标记置于尾部。
M-h mark-paragraph :标记当前段。光标置于首部,标记置于尾部。
M-C-h mark-defun :标记当前函数。光标置于首部,标记置于尾部。版本23.1后,连续执行该命令则会依次加大标记范围。
C-x C-p mark-page :标记当前页。光标置于首部,标记置于尾部。
C-x h mark-whole-buffer :标记全文。光标置于首部,标记置于尾部。
M-- 标记块命令 :M--命令为反向前导命令(negative-argument),导致标记块命令反向执行,比如 M-- M-@ 会标记光标前的一个单词,命令完成之后光标位置不变(处于尾部),标记则置于首部。
在X窗口中可按鼠标左键:单击设置标记;双击选取一个单词;三击选取一行文本。
transient-mark-mode :翻转"临时标记模式"。打开后,文本块将以高亮显示,取消选择按'C-g'。默认是关闭的,在~/.emacs加入一行:(setq-default transient-mark-mode t) 即可在启动时打开临时标记模式。执行标记命令 set-mark-command 会自动打开该模式以使选中部分高亮显示。
delete-selection-mode :翻转"删除选中模式"。打开后,若在选中了文本块以后再输入字符,则会首先删掉选中的文本块然后插入输入的字符,其行为类似于Windows下的选中后输入;若关闭则输入字符时只是取消选中并在光标处插入字符。其打开时会自动使能transient-mark-mode。默认是关闭的,在~/.emacs加入一行:(delete-selection-mode t) 即可在启动时打开删除选中模式。
S-移动命令 :如果在执行移动命令的同时按着 Shift 键,则移动的范围会被选中形成文本块。这应该是较新版本的emacs所改进的功能,老版本没有(2012-06-20 17:28:56)。
**删除:emacs会把删除(kill)掉的东西放到删除环(kill ring)去,算是一种暂存的地方,以后可以叫出来。除了删除单字符,其它的大部分删除命令都会把删除掉的东西放到删除环里去。
C-d 或 DEL delete-char :删除光标目前所指的字母。
BS delete-backward-char :删除光标前面的字母。在UNIX下可能是按DEL键起到这个作用,所以在emacs帮助里面表示为"DEL"。注意,在下面组合键里出现"BS"的地方在emacs帮助里面都表示为"DEL",用"BS"是咱自己改的。
M-d kill-word :向后删除从光标开始算起的一个单词。
M-BS backward-kill-word :往回删除从光标前一个字符开始算起的一个单词。
M-C-k kill-sexp :向后删除从光标开始算起的一个表达式。
ESC C-BS backward-kill-sexp :往

回删除从光标前一个字符开始算起的一个表达式。注意:M-C-BS 这个组合键很危险,在X界面下它的作用是无条件终止X客户端而退回到命令行下。注意:ESC C-BS 与 M-C-BS 是两个不同的组合键,后者现在已无绑定,而前者按起来不太方便。后来发现 C-BS 与 M-BS 一样都绑定了 backward-kill-word 命令,有点重复,那么干脆将其绑定为回删一个表达式更方便些:(global-set-key (kbd "") 'backward-kill-sexp) 。
C-k kill-line :向后删除从光标开始算起到行尾的内容。指定前导数字0则删除当前行中光标前的内容。若设置变量 kill-whole-line 为 non-nil 则当光标处于行首时执行该命令将导致整行包括结尾的 newline 都被删除;其值默认为 nil ,那么删除整行时将保留结尾的 newline 。若缓冲区只读则该命令不能删除行,但它却会将行内容放到删除环上,所以可以用该命令从只读缓冲区中拷贝文本。
M-k kill-sentence :向后删除从光标开始算起的一个句子。
C-x BS backward-kill-sentence :往回删除从光标前一个字符开始算起的一个句子。
kill-paragraph :向后删除从光标开始算起的一个段。
M-z zap-to-char :向后删除到指定字符。Kill up to char. variable case-fold-search *Non-nil if searches and matches should ignore case.
M-C-w append-next-kill :用在删除(kill)命令之前,导致删除的内容追加到删除环最后一项内容后。Cause following command, if it kills, to append to previous kill.
**粘贴:从删除环(kill ring)中取。删除环可保存最后放进的30(由变量kill-ring-max指定)份内容。注意:连续的删除操作所删除的内容会作为一个整体(单元)(且整理成原始的顺序,就好象被一次删除的一样)放到删除环里去,因此粘贴时一次即会把它们全部取出;所谓连续是指中间没有其它操作,比如移动光标操作。
C-y 或 S-INS yank :粘贴被kill掉的东西,称为yank。将粘贴删除环中最后一次的内容。
M-y yank-pop :紧接在C-y之后使用。被Kill掉的数据是放在称作kill ring的数据结构上面,ring就是个圆圈,被kill掉的东西会依序摆在圆圈上。yank会放回最近一次kill掉的数据,如果不是你想要的话,用M-y可以换环上靠前的数据,按一次往前换一个,直到最后循环回来。
menu->edit->select and paste :将弹出一个包含删除环所有内容的窗口,每个内容一行,选择一个后会将其粘贴到光标当前位置。第三方包 browse-kill-ring.el 中的命令 browse-kill-ring 亦提供了从删除环中选择内容并粘贴的功能,且其优化了 M-y 绑定的功能,具体参见"emacs配置小技巧"第43。
**交换位置:
C-t transpose-chars :光标所在字符与其前一个字符交换位置,之后光标后移一个字符。
M-t transpose-words :

光标所在单词与其后一个单词交换位置,之后光标置于这两个单词之后一个字符。这里光标所处的位置应在前一个单词的第二个字符到后一个单词第一个字符的范围内。
M-C-t transpose-sexps :光标所在表达式与其后一个表达式交换位置,之后光标置于这两个表达式之后一个字符。这里光标所处的位置应在前一个表达式的第二个字符到后一个表达式第一个字符的范围内。
C-x C-t transpose-lines :光标所在行与其前一行交换位置,之后光标置于下一行开头。
transpose-sentences :交换句子。
transpose-paragraphs :交换段落。
reverse-region :以行为单位颠倒一块文本。
**大小写变换:
M-c capitalize-word :单词首字母大写,针对从光标位置开始算起的单词,之后光标置于单词后面的第一个字符。
M-l downcase-word :单词全部改为小写,针对从光标位置开始算起的单词,之后光标置于单词后面的第一个字符。
M-u upcase-word :单词全部改为大写,针对从光标位置开始算起的单词,之后光标置于单词后面的第一个字符。
M-- 大小写命令 :M--命令为反向前导命令(negative-argument),导致针对的单词为从光标前一个字符位置开始往前算起的单词,命令完成之后光标位置不变。
capitalize-region :文本块首字母大写,之后光标置于文本块后面的第一个字符。
C-x C-l downcase-region :文本块全部改为小写,之后光标置于文本块后面的第一个字符。该命令默认是 disabled 的,可以在~/.emacs中加入行 (put 'downcase-region 'disabled nil) 来去掉该disabled属性以使其总是可用。
C-x C-u upcase-region :文本块全部改为大写,之后光标置于文本块后面的第一个字符。该命令默认是 disabled 的,可以在~/.emacs中加入行 (put 'upcase-region 'disabled nil) 来去掉该disabled属性以使其总是可用。
**查找:
**说明:1、变量 case-fold-search 影响查找时对大小写的敏感性。为t时若查找字符串全为小写则不区分大小写,但若查找字符串包含大写字母时则区分大小写;为nil时则精确匹配大小写。
2、查找完成后会在开始查找的地方置一个标记,则从那里到当前找到的位置为一个文本块。
3、曾查找过的串都会放在一个查找环(search ring)中,可用命令方便的再次取到。
4、当前缓冲区的输入法也同时能用于辅助缓冲区中查找字串的输入。
5、这里所讨论的查找命令都是针对缓冲区的。关于在指定目录/文件中进行搜索/查找的方法可参考"C模式"中的相关部分。
6、关于同时在多个缓冲区里进行查找的方法可参考"缓冲区操作"中的相关描述。
**递增查找:(Incremental Search)即在输入查找字符串的第一个字母时就启动查找

并定位。这种查找不是精确匹配单词的,即会查找单词的一部分。
C-s 输入查找字串 isearch-forward :正向递增查找。加前导命令则为正向递增正则表达式查找。光标定位在第一个找到字串的后一个字符上,再按C-s则定位到下一个字串;按RET或移动光标则结束本次查找并将光标停留在当前位置;按两次C-g(注意有时必须是两次,但有时可以是一次)则取消本次查找,光标回到最初开始执行查找操作的地方。
C-r 输入查找字串 isearch-backward :反向递增查找。加前导命令则为反向递增正则表达式查找。与正向递增查找的行为完全相反,如光标定位在找到字串的开头。
查找时会进入 Isearch 模式,以下子命令绑定在 isearch-mode-map 上:
C-h b isearch-describe-bindings :进入递增查找模式后按该键显示出该模式下的所有键绑定。
C-h k isearch-describe-key :进入递增查找模式后按该键显示出其后按下的某组合键的帮助。
C-h m isearch-describe-mode :进入递增查找模式后按该键显示出递增查找模式的描述。
M-TAB isearch-complete :利用查找环补齐查找串。to complete the search string using the search ring.
M-p isearch-ring-retreat :换为查找环中上一个查找字串,并可按 BS 删除查找字串中的字符并对其修改,再按 RET 开始查找。
M-n isearch-ring-advance :换为查找环中下一个查找字串,并可按 BS 删除查找字串中的字符并对其修改,再按 RET 开始查找。
C-q isearch-quote-char :引用控制符以便查找之。如:命令序列 C-s 。C-q C-j 会查找以"。"结尾的位置,而命令序列 C-s C-q C-m 会查找单独存在的回车符。to quote control character to search for it.
C-j isearch-printing-char :将这个可打印字符(即LF)加入到查找串末尾并执行查找。即引用newline字符。效果是匹配上处于行末尾的串。
S-SPC isearch-printing-char :
C-s isearch-repeat-forward :继续正向查找,即定位到下一个匹配。
C-r isearch-repeat-backward :继续反向查找,即定位到上一个匹配。
C-w isearch-yank-word-or-char :查找过程中的任何时候按 C-w 会导致光标当前位置后的一个词(若再按一下 C-w 则为两个词,依次类推)被复制追加到查找串(处于辅助缓冲区中)后形成新的查找串并继续查找。追加串将被复制到辅助缓冲区,但注意:若变量 case-fold-search 值为t,则复制时其中的大写字母均被转换为小写以保证查找操作不区分大小写,值为nil时则精确复制并进行区分大小写的查找。
C-y isearch-yank-line :同 C-w 类似,但复制追加从光标当前位置到行尾的串。
M-y isearch-yank-kill :同 C-w 类似,但复制追加删除环里面的最后一个串。
C-M-y isearch-yank-char :

同 C-w 类似,但复制追加光标当前位置上的那个字符并光标后移一位,即每按一次查找串会增加一个字符。
C-M-w isearch-del-char :同 C-w 相对,会将查找串的最后一个字符删除,每按一次查找串会减少一个字符。
M-e isearch-edit-string :在minibuffer中再编辑查找串,完后再按 RET 开始查找。
M-c isearch-toggle-case-fold :翻转(toggle)查找时大小写敏感性(case-sensitivity)。
M-r isearch-toggle-regexp :翻转(toggle)正则表达式查找模式(regular-expression mode)。
C-g isearch-abort :若查找中或查找失败则回复到上次查找成功时的状态(包括光标位置和查找串)并继续处于递增查找模式;若查找成功则取消本次查找并退出递增查找模式,光标回到最初开始执行查找操作的地方。
RET isearch-exit :退出递增查找模式,光标保持在当前位置。
M-% isearch-query-replace :直接进入查询替换,自动以当前查找串作为被替换者,并等待用户输入替换串。替换完成后不会再回到递增查找模式。
C-M-% isearch-query-replace-regexp :直接进入正则表达式查询替换。
C-\ isearch-toggle-input-method :翻转输入法以编辑辅助缓冲区中的查找字串,同时输入法的变换也会影响到当前缓冲区。To toggle the input method. It also toggles the input method in the current buffer.
C-^ isearch-toggle-specified-input-method :切换输入法以编辑辅助缓冲区中的查找字串,同时输入法的变换也会影响到当前缓冲区。To use a different input method for searching.
M-s o isearch-occur :直接执行 occur 命令。
M-s r isearch-toggle-regexp :翻转正则表达式查找。
M-s w isearch-toggle-word :翻转单词查找。
M-C-s 输入查找正则表达式 isearch-forward-regexp :正向递增正则表达式查找。
M-C-r 输入查找正则表达式 isearch-backward-regexp :反向递增正则表达式查找。
**简单查找:(Nonincremental Search)非递增查找,即在确定后才启动查找并定位。这种查找不是精确匹配单词的,即会查找单词的一部分。
C-s RET 输入查找字串 RET search-forward :正向简单查找。光标定位在第一个找到字串的后一个字符上并结束本次查找;按 C-s C-s 或 C-r C-r 查找下一个。
C-r RET 输入查找字串 RET search-backward :反向简单查找。与正向简单查找的行为完全相反,如光标定位在找到字串的开头。
M-C-s RET 输入查找正则表达式 RET re-search-forward :正向简单正则表达式查找。函数 search-forward-regexp 为其别名。
M-C-r RET 输入查找正则表达式 RET re-search-backward :反向简单正则表达式查找。函数 search-backward-regexp 为其别名。
**单词查找:(Word Search)是一种单词精确匹配的查找。可以查找字串中包含多个单词,

则查找时会忽略目标字串中单词间的标点或换行等符号,但各单词必须精确匹配。比如:查找"if then",那么可能会找到"if, 换行 then"。
M-s w isearch-forward-word :正向单词递增查找。
M-s w WORDS word-search-forward :正向单词简单查找。光标定位在第一个找到字串的后一个字符上并结束本次查找。
M-s w C-r WORDS word-search-backward :反向单词简单查找。与正向单词查找的行为完全相反,如光标定位在找到字串的开头。
**其它循环查找命令(Other Search-and-Loop Commands):针对当前缓冲区光标后的部分,或 on the active region in Transient Mark mode.
M-s o occur :输入要查找的正则表达式,则会搜出当前缓冲区中所有包含该正则表达式的行并形成一个列表显示在一个名为 *Occur* 的缓冲区中。类似于其它搜索命令得出的列表,可以从列表的某位置直接跳到该项所处的原文中,亦可以用命令 next-error / previous-error 在列表中浏览。以下是occur模式的一些子命令:
M-n occur-next :下一处。
M-p occur-prev :上一处。
RET 或 C-c C-c occur-mode-goto-occurrence :跳到另一窗口定位源文件。
o occur-mode-goto-occurrence-other-window :跳到另一窗口定位源文件。
C-o occur-mode-display-occurrence :在另一窗口定位源文件,光标还留在列表窗口。
C-c C-f next-error-follow-minor-mode :翻转光标跟随定位辅模式,状态行模式名为 Fol 。打开该模式后,当在列表中移动时,会自动在另一窗口定位源文件。也同样适用于 compilation 、grep 、diff 等缓冲区。
r occur-rename-buffer :自动改名。默认生成的列表缓冲区都命名为 *Occur* ,因此只会存在这么一个缓冲区,也即下次生成的列表会覆盖前次生成的列表。该命令会将缓冲区重命名为 *Occur: original-buffer-name* ,那么下次新列表会生成到名为 *Occur* 的缓冲区中,而不会影响前一个改名后的缓冲区。
g revert-buffer :重新生成一次列表,即刷新。
q quit-window :退出。只是将当前缓冲放到最后,但若加前导参数则会杀掉当前缓冲。
z kill-this-buffer :退出。会杀掉当前缓冲。
c clone-buffer :克隆当前缓冲。
list-matching-lines :为 occur 命令的别名。
multi-occur :类似于 occur 命令,但可以在多个缓冲区中搜索,会提问每一个要搜索的缓冲区的名字,只指定当前缓冲区则其等价于 occur 命令。
multi-occur-in-matching-buffers :类似于 multi-occur 命令,但用一个正则表达式来匹配要搜索的缓冲区。默认的,匹配缓冲区时用缓冲区对应的文件名,若加前导参数则会匹配实际的缓冲区名字。
how-many :统计正则表达式出现次数。
flush-lines :删除匹配正则表达式的

行。
keep-lines :保留匹配正则表达式的行而删除其它行。
**替换:
**说明:1、变量 case-replace 影响替换时对字母大小写的处理。为t时会根据被替换字串中字母的大小写情况作出相应的处理,具体的如:查找"tandom"替换为"random",找到"Tandom"则替换为"Random",而找到"tanDom"则替换为"ranDom",当然,首先要查找到目标字串,这由查找操作的大小写敏感性决定;为nil时则精确替换而不处理大小写。
2、关于以正则表达式替换,参见"elisp初步"中的"正则表达式相关"。
**全局替换:从光标位置开始,把其后的所有查找到的字串都替换掉。
replace-string RET 查找字串 RET 替换字串 RET :开始替换到文件尾。
replace-regexp :正则表达式全局替换。慎用。关于以正则表达式替换,参见"elisp初步"中的"正则表达式相关"。
**查询替换:即交互式替换。
M-% query-replace :输入查找字串和替换字串后定位到第一个找到的字串并等待执行下面子命令。如果加上前导命令则表示进行单词完整匹配,否则可能匹配到单词的一部分。
M-C-% query-replace-regexp :正则表达式查询替换。如果加上前导命令则表示进行单词完整匹配,否则可能匹配到单词的一部分。关于以正则表达式替换,参见"elisp初步"中的"正则表达式相关"。
? :帮助。
y 或 SPC :替换并前进到下一个位置。
n 或 DEL :不替换前进到下一个位置。
. :替换后退出查询替换操作。
, :替换并显示替换情况,即还在这个替换处,等待按下 SPC 或 y 前进到下一个位置。
! :不再询问而替换后面所有的。
^ :返回上个替换的位置,可连续返回,再按 SPC 或 y 返回当前位置。
q 或 RET :退出查询替换操作。
e 或 E :修改用于替换的字串而不用退出查询替换过程。该功能可导致前后替换出的效果不同。
C-l :刷新。
C-r :进入"递归编辑"状态。状态条模式区会多出一对方括号[]。
C-w :删除该处查找到的字串并进入递归编辑状态。
C-M-c :退出递归编辑状态,接着查询替换操作。
C-] :退出递归编辑状态和查询替换操作。
例:1、在修改别人的C++源码时发现其习惯于为小括号左右都加些空格,而我不愿留空格,那么用了个正则表达式替换将空格全部去掉,正则表达式字串为" *\([()]\) *",用于替换的字串为"\1"。
**递归编辑:即临时暂停一个编辑操作而进入另一个编辑操作(状态条模式区会多出一对方括号[]),完成后一个编辑操作后再接着开始前一个编辑操作。比如查询替换过程中想进行其它编辑操作。递归编辑可多次嵌套。
recursive-edit :开始一次递归编辑。注意不同的编辑状态下

也许进入递归编辑的快捷键不同,如查询替换中用 C-r 。
ESC C-c exit-recursive-edit :退出本次递归编辑。
C-] abort-recursive-edit :
**矩形编辑:操作矩形区域。
说明:1、定义矩形区域与定义文本块的方法是一样的,显示也是一样的,主要区别体现在随后发出的编辑命令上。
2、矩形删除缓冲区(rectangle kill buffer)用于存放被删除的矩形区域。注意:它不是一个环,只能保留最近一份内容。
C-x r k kill-rectangle :删除矩形区域并放于矩形删除缓冲区中。
C-x r y yank-rectangle :将矩形删除缓冲区中的矩形区域插入光标当前位置。
C-x r o open-rectangle :插入一个空白矩形,原有内容向右推,空白中视情况会插入 tab 。首先定义一个矩形,然后执行该命令,则插入一个同样的矩形,而原来的矩形向右推。
C-x r c clear-rectangle :清除矩形中的文本。注意:被清除掉的内容不会放于矩形删除缓冲区中,将永久消失。
C-x r d delete-rectangle :删除矩形区域但不放于矩形删除缓冲区中(将永久消失)。
C-x r t string-rectangle :
**寄存器:寄存器是一个暂存数据的地方,每个寄存器由一个字符作为其名字,进行寄存器操作时需指明寄存器名字。
view-register :查看指定寄存器中保存的是什么。
变量 register-alist :该变量保存所有定义了的寄存器及其内容。每行第一个数字为寄存器名(一个字符)的ASCII值。
C-x r f frame-configuration-to-register
C-x r w window-configuration-to-register
C-x r + increment-register
C-x r n number-to-register
C-x r s 或 C-x r x copy-to-register :复制文本块到指定寄存器中,将替换寄存器中原有的内容,带前导参数时将删除文本块。
C-x r r copy-rectangle-to-register :复制矩形区域到指定寄存器中。
C-x r i 或 C-x r g insert-register :插入指定寄存器内容到当前位置,插入后,默认的,光标置于内容前,标记置于内容后,带前导参数时,光标置于内容后而标记置于内容前。
C-x r SPC 或 C-x r C-SPC 或 C-x r C-@ point-to-register :将当前位置信息存入指定寄存器,以便从其它位置通过该寄存器跳回该位置。
C-x r j jump-to-register :跳转到指定寄存器所包含的位置信息指明的位置。
C-x / point-to-register-compatibility-binding
C-x g insert-register-compatibility-binding
C-x j jump-to-register-compatibility-binding
C-x x copy-to-register-compatibility-binding
**文本排序:其操作都是针对的文本块。
说明:1、命令执行时首先将文本块内容分析为很多排序记录(sort record)并标记排序关键字(sort key),排序关键字可能是整个记录也可能是记录中的一个部分,然后依据排序关键字将这些记录进行重排。
2、各排序命

令的不同点就在于排序记录的分裂方法不同或排序关键字的选取方法不同。
3、大写字母排于小写字母之前,这是由ASCII字符顺序决定的,但变量 sort-fold-case 决定了字母大小写是否影响排序,当指定为非 nil 值时将忽略大小写。
sort-lines :行间排序。带数字参数则降序(descending order)。
sort-paragraphs :段间排序。带数字参数则降序。
sort-pages :页间排序。带数字参数则降序。
sort-fields :行间按域排序。域是指每行上以空格分隔的部分,其计数从1始。数字参数指明按哪个域排序,不带参数则默认为1,若排序域在几行中相同则这几行的顺序保持不变(注意不会再依据其它域而进行重排),负数参数则指明以从右算起第几个域作为排序域。其结果可再用reverse-region命令来翻转为降序。
sort-numeric-fields :类似于sort-fields,但排序域首先被转换为一个整数,然后依据这个整数进行排序。比如:在sort-fields中 10 要先于 2 ,但在sort-numeric-fields则 2 先于 10 。默认的,将基于变量 sort-numeric-base(指明基数) 的值对数字进行翻译,但以 0x 或 0 开头的数字将被作为十六进制数(hexadecimal)和八进制数(octal)看待。其结果可再用reverse-region命令来翻转为降序。
sort-columns :类似于sort-fields,但排序域由固定的列范围指明。列范围由插入点和标记来指明,这更象是选取了一个矩形区域,矩形区域即指明了域,但参与排序的是矩形区域所处的所有行。带数字参数则降序。
reverse-region :翻转各行间的顺序。对于sort-fields和sort-numeric-fields等不可降序的命令很有用。
**对齐:
align-regexp :针对一个选中区域执行对齐操作,会提示输入一个正则表达式,然后从每行内符合该表达式的开始位置执行对齐。帮助中的那个例子很直观。
align-current :
align-entire :
align-highlight-rule :
align-unhighlight-rule :
align-newline-and-indent :
**鼠标操作:
mouse-wheel-scroll-line :滚行。
mouse-wheel-scroll-screen :滚屏。
mouse-set-point :左键,放置光标。
mouse-yank-at-click :右键,粘贴。
mouse-save-then-kill :中键,剪切。
mouse-drag-region :文本块选择。
mouse-delete-other-windows :状态行上点右键关闭该窗口。
mouse-avoidance-mode :该命令可以控制当鼠标在光标附近时的行为,默认为nil表示无动作,可以设为animate使鼠标自动移开别挡住视线,如在配置文件中指定为:(mouse-avoidance-mode 'animate) 。当前的行为方式保存在同名变量 mouse-avoidance-mode 中。其配置的例子参见"emacs配置小技巧"第74。
mouse-set-font :该命令用于为本次会话改

变显示字体,会弹出一个字体菜单(W32是字体对话框)以供选择,可以通过这种方法来临时改变显示字体的大小。
**输入特殊字符:通过 C-q 或 C-x 8 组合键前辍输入。但能否输入可能跟当前的编解码环境及字符集有关。
C-q quoted-insert :后跟特殊字符命令以插入特殊字符。如:后跟C-l命令以插入分页符,在文本模式下分页符表示为"^L",但其实该字符是无法显示的,是送给打印机用来分页的。也可以后跟数字,比如 C-q 1 2 将插入字符newline(LF),12是其八进制值,而以几进制来输入数字是由变量 read-quoted-char-radix 来决定的,其默认值为8,可另设为10或16,比如 (setq read-quoted-char-radix 16) 。
一个输入特殊字符的例子是:在查找/替换时,若输入的字串中要包含回车,则不能仅仅简单地直接打回车,那emacs会认为是把字串输完了,此时只要输入 C-q C-j 即可,其会插入一个回车到字串中。
C-x 8 C-h :得到一份完整的输入特殊字符命令的列表。
C-x 8 R iso-transl-registered-sign :输入版权符号。
C-x 8 o iso-transl-degree-sign :输入摄氏度符号。
**限定区域编辑:即仅使要编辑的区域可见而其它区域不可见来达到只能在限定区域进行编辑的目的,不可见的区域还可以再恢复为可见而信息并不会丢失。
C-x n d narrow-to-defun :仅使当前函数可见。
C-x n n narrow-to-region :仅使当前选中区域可见。该命令默认是 disabled 的,可以在~/.emacs中加入行 (put 'narrow-to-region 'disabled nil) 来去掉该disabled属性以使其总是可用。
C-x n p narrow-to-page :仅使当前页可见。该命令默认是 disabled 的,可以在~/.emacs中加入行 (put 'narrow-to-page 'disabled nil) 来去掉该disabled属性以使其总是可用。
C-x n w widen :针对当前缓冲区移除限定(restrictions/narrowing),即使所有区域变为可见。

相关主题
文本预览
相关文档 最新文档