emacs 的使用:哪些是真正有用的组合键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了emacs 的使用:哪些是真正有用的组合键相关的知识,希望对你有一定的参考价值。

参考技术A 早期的 Shell 直接运行在各种各样的 Terminal 里面,随着时间的推移,我们有了 X Window。大量的 Shell 开始运行 Xterm 里面。对于笔者来说呢,更加喜欢让 Shell 运行在 Emacs 里面。将 Shell 运行在 Emacs 里面与运行在 Xterm 里面到底有什么不同呢?相信我,将 Shell 从 Xterm 里面搬出来绝对不是一个赚取眼球,标新立异的决定。这篇文章介绍了将 Shell 从 Xterm 里面搬到 Emacs 里面带来的各种改变。这篇文章适合 Emacs 的初级与中级用户,需要读者具有一定的 Shell 使用经验。最好具有较长时间的 Shell 使用经历,以更加充分的体会到 Emacs 带来的变化。文章中的内容谨代表作者的个人观点。不代表 IBM 的任何官方观点。所附代码仅在运行于 Cygwin 环境下的 GNU Emacs 当中测试通过。 您可以访问“Emacs 编辑环境“系列教程来了解更多和 Emacs 相关的内容: Emacs 编辑环境 为什么要使用 Shell? 我不也太清楚,但是,在这样一个 Windows 横行的年代里,总是有着无数的 Unix 管理员在遍布全球的各个角落里默默奉献,保证着我们的世界继续运行。那么,为什么要在 Emacs 里面使用 Shell? 在Emacs 里面使用 Shell 和在其他地方相比,比如说 xterm,甚至是 Windows 的命令行窗口里面使用 Shell 有什么不一样呢?这个问题,我个人认为不是一个技术问题,而是一个生活舒适度的问题。之所以选择在 Emacs 里面使用 Shell,就是因为在 Emacs 里面会使你的生活的更加舒适。 生活舒适度的问题 信不信由你,人们总是希望生活的更加舒适。那么,把 Shell 搬到Emacs 环境里究竟能够带来那些生活舒适度的提高呢?在回答这个问题之前,让我们先进行一个简单的热身运动。 大家都知道,现代的 Bourn Again Shell(bash) 要比古老的 Bourn Shell(sh) 用起来舒服多了。因为 Bourn Again Shell(Bash) 引入了很多非常舒服的新的特性。比如说历史 (History) 功能,比如说命令行编辑功能。这些都是大家非常喜欢的功能。不是吗?但是,问题是,如果你想在 Shell 的世界中生活的更加舒适,就会发现很多时候他都不能真正的让你满意。 通常来说,但凡有过在古老的 Bourn Shell(sh) 或者某些缺乏历史功能的 Korn Shell(ksh) 环境下的使用经验的人来说,Bourn Again Shell(bash) 的历史 (History) 功能都是一个非常可爱的功能。它提供了很多很好的重复历史命令的有趣方式,我们可以使用 ! 命令去全部或者部分的引用上一条刚刚执行过的命令,我们可以使用 ^^ 命令简单编辑上一条命令并且生成一条新的命令,我们可以也使用向上的箭头键去回朔查找许久以前曾经执行过的命令,然后使用命令行编辑功能随心所欲的编辑这条命令。但是这里面有一个非常隐蔽的问题:所有这一切,都是集中在“命令行”这个概念中的。说白了,各种各样的不同的 Shell 版本提供给我们的就是一个命令解释器,外加一个命令行编辑环境。 这样有什么不对吗?对,但是欲望总是没有止境的。为什么不能够全屏幕编辑呢? 让我们来看看一个很简单的例子。我有一个 Omegamon XE for Messaging 的安装。这是 IBM Tivoli 旗下的一款监控产品。通过与 IBM Tivoli Monitor 产品的集成,实现对 WebSphere MQ,WebSphere Message Broker 产品的运行监控,以及对 WebSphere MQ 产品的修改与配置。由于某种需要,现在我需要将一个 MQ Monitoring agent 停止下来。我不想将那个漫长的命令从头到尾输入一遍,因为我知道我可以使用 history | grep ‘itmcmd agent’ 命令从已经存在的命令历史里面找到曾经启动这个 agent 的命令,然后我所要做的,仅仅只是在原来命令的基础上将 start 参数修改为 stop 就可以了。但是……事实上 Shell 并没有给我一个修改这条命令的机会。 图1 事实上我必须先用鼠标将屏幕上的第 437 条命令复制到剪贴板里面,然后把它粘贴到我的命令提示符后面,之后再使用 bash 的命令行编辑功能,将那个可爱的 start 参数修改为 stop。说实话,我的某些同事每天就是这样做的,另一些则是干脆将停止命令从头到尾再输入一遍。回答我一个问题,你有没有曾经也像我一样,在看到 history | grep 的输出的时候,曾经梦想过,能够直接在第 437 条命令上面改几个字母,然后就直接敲下回车呢?现在你可以了--在 Emacs 里面。在 Emacs 里面,你可以将你的 Shell“扩展”到全屏幕编辑。 让我们重新查找刚才提到的那条命令。这一次,我们不用 history | grep 的方法。是的,这个方法仍然管用。但是既然是在 Emacs 里面,我希望介绍一些更加 Emacs 化的使用方法,我们使用 Ctrl-r 组合键。如果你已经使用过 Emacs,但是从来还没有在 Emacs 里面看到过 shell 提示符的话,不妨跟我一起来,在 Emacs 当中输入 ESC-x 组合键,然后在提示缓冲区里面输入 shell(全部字母小写)回车,然后你就会在 Emacs 的编辑缓冲区里面看到熟悉的 shell 提示符了。在接下来的例子里面我们假设你已经执行过启动 MQ Monitoring agent 的那条命令了,大约是在 4 个小时前或者别的什么时候。现在要做的,就是把这个特定的 agent 停止下来。跟我一起在 Emacs 里面输入 Ctrl-r 组合键,这个时候你会在提示缓冲区里面看到 I-search backward: 这样的字样。没错,这个组合键对应的就是 Emacs 当中的回朔查找的功能。我们所要做的,就是像通常在一篇文档里面查找一个句子一样,在回朔查找提示符的后面输入 itmcmd agent,Emacs 非常迅速的就把光标定位到了曾经执行过的 bin/itmcmd agent –o QM_106 start mq 这一行命令上面。就在这里,让我们把 start 修改为 stop,然后,直接就在这里按下回车键--修改以后的命令会自动的被复制到正确的 shell 提示符后面并且被执行。无穷无尽的拷贝与粘贴终于被终结了。 更理想的情况下,如果你想修改的命令还仍然显示在你当前的屏幕范围内(这在我的工作当中覆盖了大多数情况),甚至可以省略使用 Ctrl-r 组合进进行查找的过程,直接移动光标到你需要的命令,修改,或者回车就是了。 图2回页首 技术性击倒 上面提到的还只是一些很简单的事情。或者说是一些使用习惯方面的事情。每个人都有自己的生活习惯。我就见过一些人,他们甚至很少使用 History 功能。他们执行每一条命令都会从头到尾输入进去。如果中间有什么东西写错了,他们会停下来再输一遍。我只能承认我没有他们那么勤奋了。 下面我们要谈论一些真正技术性的问题。一个实际工作中的案例问题。我在上面提到过,我的日常工作的一部分就是使用 Omegamon XE for Messaging 产品,既然他是监控 WebSphere MQ 的一款产品,那么同样意味着我也会频繁使用 WebSphere MQ 产品。一天,我需要处理这样一个问题,我有 11 个处于停止状态的队列管理器(Queue Manager),他们全部需要启动起来。 图3 通常在 shell 环境下,会有两个选择。第一个选择,一条一条的编写 11 条strmqm 命令,将所有这些队列管理器一个一个地启动起来。第二个选择,我可以使用 SED 实用工具编写一些小脚本,利用 dspmq 命令产生的输出内容来生成这 11 条命令,并把它们输出到一个文件里面。是的,在使用 Emacs 之前我是使用这第二种方法的。现在,在 Emacs 里面,我可以使用第三种选择,一种所见即所得的选择。Emacs 不仅提供了全屏幕编辑的全套功能,而且还提供了超越传统编辑方式的矩形编辑功能。使用这个功能,你可以把屏幕上的任何内容作为一个矩形块进行剪切或粘贴操作。现在跟我一起,把光标定位到 QM_100 的字母 Q 的位置,并输入 Ctrl-@ 组合键设置起始的标记位。接下来把光标移动到 QM_110 的数字 0 的后面,输入 Ctrl-x r k 组合键(对,一共是 4 个按键。但是仍然非常容易记忆,只要记住中间的 r 是rectangle 的缩写就行了,所有的矩形编辑命令都会有这个 r 字母加入)。看看屏幕上面发生了什么?是的,所有的队列管理器的名字全都不见了。他们被作为一个矩形块剪切进了 Emacs 的删除环(king-ring)当中。 图4 接下来,让我们将这些剪切下来的队列管理器的名字粘贴到一个用来启动这些队列管理器的脚本文件中去。在这里我们使用最简单的 here 文档的功能 cat <<eof >strmqm.sh,创建一个空白的脚本文件。然后,在 Emacs 当中输入 Ctrl-x r y 组合键,这个组合键的作用是将删除环里面的矩形文本块作为一个矩形,粘贴回去。下面的截图就是你在屏幕上所看到的结果。 图5 没错,你注意到了,我们真正需要的并不是队列管理器的名字列表,而是一连串 strmqm QM_100 这样的 shell 命令。没问题,接下来让我们继续使用 Emacs 的矩形编辑功能来完成这些命令。再次把光标移动到 QM_100 的字母 Q 的位置,输入 Ctrl-@ 组合键设置标志,然后移动光标到 QM_110 的字母 Q 的位置,输入 Ctrl-x r p 组合键。这个组合键的作用是在选定的位置前面填充一个矩形区域,填充的内容在提示缓冲区里面输入。现在在提示缓冲区里面 string insert rectangle: 的提示符后面输入 strmqm 加空格。下面的截图就是这个时候你在屏幕上所看到的结果。 图6 这里面有一个小秘密需要提示一下,因为在 here 文档的提示符下事实上是不可能进行这样的修改的。但是,直到目前为止 Emacs 还没有将编辑缓冲区里的内容传递给 here 文档提示符。以上所做的一切还都仅仅发生在 Emacs 内部。 现在输入一个回车键,已经编辑好的 11 条strmqm QM_1xx 命令就已经传递给 here 文档提示符了。最后输入 eof 结束文档编辑。一个简单清晰的队列管理器启动脚本就已经完成了。只要在 shell 提示符下通过 bash strmqm.sh 命令运行它,就可以启动所有这 11 个队列管理器了。 图7回页首 一些有趣的小技巧 第一个小技巧:在 Emacs 里面同时打开多个 shell 会话 这听起来应该是理所当然的,既然 Emacs 可以同时运行多个窗口……但是即使是在我买的那本关于 Emacs 的书里面也没有提到如何能够真的打开多个 shell 会话。让我们试试看,输入 ESC-x shell 启动shell 会话,在 shell 提示符下执行 cd /tmp 命令,然后输入 Ctrl-x 2 组合键将屏幕切分成上下两个窗口,然后再次输入 ESC-x shell 启动shell 会话,你会发现 Emacs 不为所动。在上下两个窗口里面仍然还是 cd /tmp 命令执行后的结果,也就是说仍然还是原先的那个 shell 会话。说起来 O’reilly 公司应该退还我一部分书钱,因为他们没有将我想知道的问题讲明白。后来我终于发现了解决的办法。只要我将当前的 shell 会话所在的缓冲区重新命名,然后就可以再次启动一个新的 shell 会话。让我们来试试看。输入 ESC-x rename-buffer,在 Rename buffer (to new name): 提示符后输入一个新名字,例如 *shellA*。这个时候你会看到上下两个窗口中的缓冲区都被重命名为 *shellA* 了,是的,他们显示的是同一个缓冲区。现在在任意一个窗口里面输入 ESC-x shell 启动shell 会话,这时你会看到一个新的 *shell* 缓冲区创建了出来,并且有了一个新的 shell 提示符。现在让我们在这个新的 shell 提示符下执行 cd / 命令,你会发现,缓冲区 *shellA* 当中的 shell 会话并没有受到新的命令的影响,因为他们是两个不同的 shell 会话。重复同样的方法,可以得到更多的 shell 会话,满足你的使用需要。 图8 第二个小技巧:history | grep 的输出结果可以直接输入回车使用 让我们再回到当初提到过的第 437 条命令。如果需要再次运行这条命令,你只需要把光标定位到这条命令所在行,删除掉命令前面的 437 这个号码,然后直接输入回车,Emacs 会提你把它复制到正确的 shell 提示符后并且启动执行。似乎这个方式描述起来并没有 shell 本身提供的 !437 命令来的迅速,但是他毕竟提供了一个更加直观的操作可能。另外,如果希望在运行之前对于这条命令进行一些修改,我指的是删除,例如删除掉某个参数,或者单词,你也尽可以尽情删除,然后在最终的删除结果上面输入回车,告诉 Emacs 去复制运行就是了。这个状况目前似乎还没有发现 ! 命令有可以搞定的可能。另外,如果希望在运行之前对于这条命令进行一些添加性质的修改,例如添加一些新的参数,或者把第 437 条命令中的 start 单词删掉,添加上 stop 单词,在目前的 Emacs 里面还没有提供直接的支持。但是我们可以通过增加一步操作来实现它。第一步,让我们首先把光标定位到第 437 条命令的位置,然后输入回车,这个时候命令不会成功运行,一行提示信息 bash: 437: command not found 会显示在你的 shell 提示符下面。没关系,让我们稍微修改一下刚刚运行失败的这条命令。重新定位光标到刚刚执行过的这条命令所在的行,然后把命令中的 start 参数修改为 stop 参数,并且删除命令前面的 437 这个号码,再次输入回车,修改之后的命令就会成功运行了。这里增加的第一步操作实际上代替了通常情况下需要的拷贝粘贴操作,拷贝和粘贴事实上是交由 Emacs 替我们实现了。 图9 第三个小技巧,整理你的屏幕 在前面讲到生活舒适度话题的时候,我们曾经提到过在 Emacs 里面使用 shell 的一个很常用的方法就是在屏幕上已有的命令上面稍作修改,或者直接回车来复用已经执行过的历史命令。但是如果你所感兴趣的命令因为种种原因已经不在当前屏幕显示的范围之内了,除了不断的通过使用 Ctrl-r 组合键进行回朔查找以外,还有没有什么更方便的办法呢?答案是有,而且还有不止一种选择。如果在你的当前提示符和你感兴趣的命令之间仅仅只是由于时间的关系隔着太多无关的命令记录,那么你尽可以简单的将这些多余的内容删除掉就行了。不要担心,这些内容仅仅只是在 *shell* 编辑缓冲区里的普通文本内容而已,将他们删除和将一篇文档里面的文本删除没有什么区别。如果这些中间的命令记录并不是完全无用了,仅仅只是在现在这段时间不感兴趣的话,你还可以选择使用 hide-region-hide 命令将这些中间的命令记录作为一个文本块隐藏起来。这些隐藏起来的内容仅仅只是不再在屏幕上显示而已,他们仍然存留在原有的编辑缓冲区里面,以后当你再次需要他们的时候,可是使用 hide-region-unhide 命令再把他们重新显示出来。还有一种情况就是仅仅因为你刚刚执行了一个产生大量输出的命令而已,比如说使用 cat 命令书出了一个较大的日志文件,从而导致你感兴趣的历史命令被日志文件的内容冲出了当前屏幕显示范围,这个时候只需要输入 Ctrl-c Ctrl-o 组合键,将刚刚执行过的那条命令的屏幕输出清除掉就是了。通常我在每次 cat 日志文件或者列出一个含有较多文件的目录之后都会使用 Ctrl-c Ctrl-o 组合键来清理一下我的屏幕。 最后我们再来说一个非常有用的小技巧,使用缩写词 Emacs 的强大的缩写词(abbrev)功能,这些缩写词功能同样可以应用到 Emacs 当中的 shell 环境里来。通常在使用 Emacs 便写文章的时候,我们会使用缩写词功能来减少频繁输入冗长的单词或者语句时候的击键次数,或者使用缩写词功能避免一些可能的拼写错误。当我们在 Emacs 里面使用 shell 的时候,我们同样可以使用缩写词功能来缩写一些冗长的命令,路径,和避免一些常见的输入错误,这样在每天的工作当中会为我节省大量的击键次数。有些读者看到这里一定会想到 shell 本身提供的别名(Alias)功能也能完成命令的缩写,但是,别名功能有很多局限性。首先,别名功能缩写的命令只能通过别名单独引用,无法和其他 shell 命令一同组合运行。例如我可以定义一个别名来进入常用的 IBM Tivoli Monitoring 产品的安装目录,alias cditm=’cd /opt/IBM/ITM’, 然后输入 cditm 执行这条命令来进入 IBM Tivoli Monitoring 产品的安装目录。但是我不能够定义一个别名来缩写这个目录本身,alias itmm=’/opt/IBM/ITM’, 然后输入 cd itmm 执行这条命令来进入这个目录,或者输入 itmm/bin/cinfo –r 来直接引用该目录下的可执行文件。还有一个问题,通过别名定义的命令缩写只能够直接引用执行,没有可能对于很多相似的命令定义通用的一个“别名模板”,然后每次使用的时候引用模板,然后稍作修改之后运行。例如启动 Omegamon XE for Messaging 产品中的 MQ Monitoring agent 的常用命令,bin/itmcmd agent –o QM_101 start mq。我可以把它定义为一个别名,alias strkmq_QM101=’bin/itmcmd agent –o QM_101 start mq’, 但是事实上每次在启动一个 MQ Monitoring Agent 的时候,其中的队列管理器(Queue Manager)的名称都是不同的,我不可能为每一个队列管理器都定义一个单独的别名。况且还有其他的 agent,这样的话别名的数量将会相当可观。Emacs 的缩写词功能在这里提供了两步走的设计方法,避免了以上提到的所有问题。让我们还是以上面提到的目录和命令的两个例子来了解一下在 Emacs 里面如何使用缩写词功能来解决这些问题。首先是常用目录的缩写词定义。在 shell 提示符下输入 cd /opt/IBM/ITM 命令,不用专门为了缩写词去输入这条命令,就在你日常工作当中需要的时候输入就是了,只是记得先不要输入回车,然后,让我们数一数究竟有多少个单词将被包含在这个缩写词定义当中,在这里是 3 个单词,分别是 opt, IBM 和ITM,现在输入 Ctrl-u 3 Ctrl-x a l 组合键,稍微有点儿复杂,我在这里简单解释一下,Ctrl-u 在Emacs 里面是一个非常有用的组合键,它代表一个通用前缀,通常在后面跟一个数字参数,表示随后输入的命令将被重复多少单元,在这个例子里是 3 个单元,后面的 Ctrl-x a l 组合键代表在当前主模式下添加缩写词定义(add-mode-abbrev)命令,其中的 l 代表将该缩写词的定义添加到当前的主模式中,如果希望这个缩写词定义在任何主模式下都可以使用,那么将组合键中的 l 替换成 g,即 Ctrl-x a g, 代表add-global-abbrev 命令。然后,在提示缓冲区确认定义无误之后,输入希望的缩写单词,itmm,即可完成缩写词定义。 图10 接下来我们来使用这个缩写词。例如我们需要进入到 IBM Tivoli Monitoring 产品的安装目录,在 shell 提示符下输入 cd /itmm 加空格,你会发现 Emacs 立刻将这条命令扩展成为 cd /opt/IBM/ITM 显示在刚才的输入位置。现在我们要执行 IBM Tivoli Monitoring 产品目录下的 cinfo 可执行程序,在 shell 提示符下输入 /itmm 加空格,Emacs 立刻将这条命令扩展成为 /opt/IBM/ITM 显示在刚才的输入位置,然后我们只需要输入一个退格键删掉刚才那个空格,继续在后面输入 bin/cinfo –r 就可以了。事实上由于在我的工作当中 , 对于cinfo 命令来说,-r 这个参数非常常用,所以在我的 Emacs 里,bin/cinfo –r 已经被缩写成了 rcinfo 这个缩写词了。那么在我的 Emacs 里面我只需要输入 /itmm 空格键,退格键和 rcinfo 就可以实现完整的 /opt/IBM/ITM/bin/cinfo –r 这条命令了。 再下来我们来看看启动 MQ Monitoring Agent 的命令的缩写词。在 shell 提示符下输入 bin/itmcmd agent –o start mq 命令,注意,在–o 参数后面没有提供队列管理器的名字。因为每次执行这条命令的时候,队列管理器的名字都有可能变化,因此我们不把它定义到缩写词内部。输入 Ctrl-u 6 Ctrl-x a l 组合键,然后,在提示缓冲区确认定义无误之后,输入希望的缩写单词,strkmq 即可完成缩写词定义。 图11 现在让我们来使用这个缩写词。首先我们需要使用 itmm 这个缩写词进入到 IBM Tivoli Monitoring 产品的安装目录,然后,在 shell 提示符后面输入 strkmq 空格,Emacs 立刻将这条命令扩展成为 bin/itmcmd agent –o start mq 显示在刚才的输入位置,现在移动光标到–o 参数后面,输入队列管理器的名称并且回车,你就会看到希望的命令得到运行。 发明一个完美无缺的 shell 是一件相当困难的事情,但是将现有的资源整合起来却会产生很多意想不到的效果。

Emacs常用基本操作

按键约定

组合按键

Emacs中大量的按键操作都是各式各样的组合按键(快捷键),下面是几种通常的约定:

  • Ctrl键:表示为C
  • Alt键:表示为M
  • Shift键:表示为S
  • 组合按键:比如向下移动一行的组合按键是Ctrl+n,就表示为:C-n,其含义表示同时按下键盘上的Ctrln键。

按键顺序

有时候用多个组合按键来表示一种操作,比如以下按键序列:C-x C-f [文件路径] <RET>就表示打开文件的操作,它表示这样的操作含义:先同时按下Ctrlx键,然后松开,紧接着马上再同时按下Ctrlf键,然后再松开,然后在下方的输入栏中输入文件路径,输入完之后按回车键(用<RET>表示),最后就打开了一个文件。

还有一种按键顺序:C-x o,表示切换到另外一个缓冲区,它是这样一组按键:先同时按下Ctrlx键,然后松开,然后紧接着按字母o键。

还有另外一种按键顺序,比如以下按键序列:C-u [10] C-p,就表示这样的操作含义:先同时按下Ctrlu键,然后松开,然后依次按10键,然后松开,最后再同时按Ctrlp键。这组按键达到的效果就是把光标从当前位置往上移动10行。

特殊按键

  • 表示输入内容,用方括号括起来:[输入的内容]
  • 表示回车键:<RET>
  • 表示其他键:比如<Backspace>表示退格键(删除键),<Delete>表示删除键,<TAB>表示TAB键,<Left>表示左箭头键,<Right>表示右箭头键,<Up>表示上箭头键,<Down>表示下箭头键,<f5>表示F5键。

Quick Start

文本操作,无外乎打开文件、编辑文件、保存文件,涉及的核心、最高频命令非常简单,整理如下:

  • C-x C-f [文件路径] <RET>:打开一个文件
  • C-n:将光标向下移动一行
  • C-p:将光标向上移动一行
  • C-g:取消之前的按键(将会成为最常用的按键之一)
  • C-x C-s:保存文件
  • C-x C-c:退出Emacs

常用操作分类汇总

文件操作

  • C-x C-f [文件路径] <RET>:打开一个文件
  • C-x C-s:保存文件
  • C-x 4 f [文件路径] <RET>:在一个新的窗格(缓冲区)中打开文件
  • C-x 5 f [文件路径] <RET>:在一个新的窗口中打开文件

移动操作

  • C-n:将光标向下移动一行
  • C-p:将光标向上移动一行
  • C-b:将光标左移一个字符
  • C-f:将光标右移一个字符
  • M-f:将光标右移一个单词
  • M-b:将光标左移一个单词
  • C-v:向下移动一屏
  • M-v:向上移动一屏
  • C-l:将当前光标所在行移动到屏幕中央(注意:这里是字母L
  • C-a:将光标移到行首
  • C-e:将光标移到行尾
  • M-S-<:将光标移动到文件开头
  • M-S->:将光标移动到文件末尾
  • M-m:将光标移动到行首的第一个非空白字符

查找与替换操作

  • C-s [查找的内容]:向前查找
  • C-r [查找的内容]:向后查找
  • C-M-s [查找的内容]:向前正则查找
  • C-M-r [查找的内容]:向后正则查找
  • M-S-%:查找并替换,操作步骤如下:按下M-S-%键启动查找替换,输入要被替换的词,回车,然后输入要替换的词,再回车。被替换的词此时会高亮起来,这时,输入y替换并跳到下一个,输入n忽略并跳到下一个,输入q结束,输入!替换剩下的全部。

文本选择操作

  • C-S-e:选中从当前位置到行尾的文本
  • C-S-n:从当前位置开始往下选中一行文本
  • C-S-p:从当前位置开始往上选中一行文本
  • C-S-f:从当前位置开始往后选中一个字符
  • C-S-b:从当前位置开始往前选中一个字符
  • M-S-f:从当前位置开始往后选中一个单词
  • M-S-b:从当前位置开始往前选中一个单词
  • M-S-e:选中从当前位置开始到当前句尾的文本
  • M-S-a:选中从当前位置开始到当前句首的文本
  • [email protected] [其他移动操作]:从一个起始位置,选中连续的字符,比如[email protected] C-e就表示选中从当前光标位置到行尾的所有字符
  • C-S-v:向下选择一屏
  • M-S-v:向上选择一屏
  • C-S-l:让当前光标所在行居中
  • C-x h:全选

文本编辑操作

  • 插入文本:只要光标在当前缓冲区,就可以直接输入插入文本。
  • C-k:删除光标到行尾的所有字符
  • C-u [N] [操作序列]:重复执行一个操作序列N次
  • C-/C-x u:撤销(undo)上次操作,多次按可以撤销之前的多次操作
  • C-g C-/:重做(redo),用于重做上次的撤销动作(撤销之后后悔了,想恢复重做)
  • <Backspace>:删除当前光标前的一个字符
  • C-<Backspace>:删除当前光标前的一个单词
  • C-d<Delete>:删除当前光标后的一个字符
  • M-<Backspace>:剪切当前光标前的一个字符到剪贴板
  • M-d:剪切当前光标后的一个字符到剪贴板
  • C-k:剪切从光标到行尾的字符到剪贴板
  • C-y:粘贴剪贴板中的文本到当前光标位置
  • M-w:复制当前选中的字符
  • C-w:剪切当前选择的字符到剪贴板
  • C-a C-k:剪切一整行到剪贴板中,其实也可以用于删除一整行
  • C-e <RET>:在当前行下方插入一空行
  • C-x C-q:让当前buffer在“只读”和“读写”两种编辑模式之间切换

多窗格与多窗口

首先要明确一下Emacs中窗格与窗口的概念的区别:每个窗格其实就是一个缓冲区,一个窗口中可以同时打开多个窗格,而窗口就是像Windows那样的GUI窗口。

  • C-x 1:仅保留当前窗格,关闭其他窗格
  • C-x 2:在垂直方向打开2个窗格
  • C-x 3:在水平方向打开2个窗格
  • C-x o:在不同窗格之间切换
  • C-x 0:关闭当前窗格
  • C-x S-{:减小当前窗格的水平宽度
  • C-x S-}:缩小当前窗格的水平宽度
  • C-x S-^:增大当前窗格的垂直高度
  • C-M-v:在另一个窗格中向下滚动一屏(但光标还保留在当前窗格)
  • C-M-S-v:在另一个窗格中向上滚动一屏(但光标还保留在当前窗格)
  • M-x make-frame:打开一个新窗口
  • M-x delete-frame:关闭当前窗口
  • C-z:挂起当前的窗口(相当于最小化当前的窗口)

文本编码

  • M-x describe-coding-system <RET>:查看当前缓冲区的编码格式
  • C-x <RET> r <TAB>:列出当前的所有编码
  • C-x <RET> f utf-8 <RET>:改变当前缓冲区的编码为utf-8

命令与函数操作

  • M-x [函数名] <RET>:执行一个函数
  • M-S-! [命令] <RET>:执行一个命令行命令
  • M-x shell <RET>:在一个新窗格中、当前目录位置打开命令行

一些常用操作

  • M-x goto-line <RET> [行号] <RET>:跳转到某一行,将其绑定到快捷键C-c j
;; 快速跳到某一行
(global-set-key (kbd "C-c j") ‘goto-line)
  • M-x electric-pair-mode <RET>:打开括号配对模式

缓冲区

  • C-x C-b:在一个新窗格中列出当前所有的缓冲区
  • C-x b xxx <RET>:切换到名为xxx的缓冲区
  • C-x k xxx <RET>:关闭一个名为xxx的缓冲区(如果直接按回车,默认关闭的是当前缓冲区)
  • C-x s:一个个询问是否保存当前每个缓冲区的内容
  • M-x kill-some-buffers <RET>:一个个询问是否关闭当前打开的缓冲区
  • C-x <Left>:在多个缓冲区之间切换
  • C-x <Right>:在多个缓冲区之间切换

配置相关

  • C-x d S-~ <RET>:打开Emacs配置文件所在路径
  • C-h v load-path <RET>:查看Emacs的加载路径

帮助操作

  • C-h t:查看Emacs快速指南
  • C-h f:查看一个函数(命令)的帮助文档
  • C-h S-?M-x [help]:查看帮助
  • C-h c [命令序列]:显示命令序列对应的函数名
  • C-h k [命令序列]:显示命令序列的详细文档(打开一个新窗格)
  • C-h a [关键词]:打开一个新窗格列出所有含有此关键词的命令
  • C-h i:查看信息字典文档
  • C-h r:查看使用手册
  • C-h m:查看当前缓冲区的major mode和minor mode及其介绍
  • C-h b:查看和当前缓冲区绑定的快捷键列表
  • C-h v [变量名]:查看某个变量的值
  • C-h w [函数名]:查看某个函数绑定的快捷键
  • C-h i m [elisp] <RET>:查看elisp文档

命令行操作

以下操作都是在系统命令行中的操作:

  • emacs -nw -Q:在命令行中打开Emacs,-nw参数表示:no window-Q参数表示:不显示欢迎界面。在命令行打开Emacs后,各项操作和按键与在GUI窗口中是一致的


作者:m2fox
链接:https://www.jianshu.com/p/89b689a586b3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

以上是关于emacs 的使用:哪些是真正有用的组合键的主要内容,如果未能解决你的问题,请参考以下文章

Emacs常用基本操作

Sublime Keymap 设置

Emacs常用命令快速参考

Emacs基本的按键与命令

全国计算机等级三级Linux应用与开发技术考试-第13章-Emacs编辑器-练习题

绑定键以增加/减少emacs中的字体大小