我多年来一直使用的 Emacs 命令
据我所知,奥斯汀 Emacs Meetup 小组 EmacsATX 的下一次会议已经计划了一个主题:Org 模式。我本打算写一篇关于我常用的 Org 功能的文章,但我觉得应该从我二十多年前开始使用通用 Emacs 时的常用命令说起。这可能对刚开始学习 Emacs 的人也有帮助。
如果你只想了解入门指南的内容,而跳过历史和评论,请访问下面的 “我的基本命令列表 “部分。
也许我再介绍一次 Emacs 会把水搅得更浑,但既然别人都这样做了,我为什么不能呢?你可以随时点击这里查看 Emacs 文档。
我当时使用 Emacs 的方式与现在大不相同。你可以把这两个时代称为BC(Before Chemacs)和AD(After Dired)。
如今,我通过调用 M-x 和函数名来使用很多函数。我使用 ido 和 smex,因此不仅能获得自动完成功能,还能获得一些历史记录。如果我所在的 Emacs 实例已经运行了一段时间,那么历史记录中就会有很多函数。然后,我通常只需按一下 M-x,就能得到我在 minibuffer 中调用过的函数列表,我可能只需使用箭头键就能使用我想要的函数。它会保留该会话的历史记录,但到目前为止,我还没有找到在不同会话之间保留历史记录的方法。
我第一次接触 Emacs 时,是在橡树园的一家小型分析公司,现在这家公司已经不存在了。所有开发人员都使用 Sun Sparcstations,并使用 Emacs 或 vi 进行编辑。也许当时用的是 vim 而不是 vi;我不知道两者之间有什么区别,坦白说,我并不关心,以后也不会关心。
有人(可能是系统管理员)给我演示了 vi。我觉得整个模式的概念都很愚蠢。我找到一个用 Emacs 的人。我问他们如果我在 Emacs 中打开一个文件,然后按下 “A “键,会发生什么?他们告诉我,只会在文件中插入字母 “A”。我决定学习 Emacs,而不是 vi。我学会了一些命令,并把它们写在一张纸上,一直带在身边,直到记住为止。如果你正在学习 Emacs,把命令写在纸上,甚至写在另一个编辑器里,或者使用在线小抄,都没有错。在过去的二十年里,我仍然对人们想要玩 “who can spin the most plates in their head“的游戏感到惊讶。这是一个愚蠢的游戏,只有愚蠢的人才喜欢玩这个游戏。
我知道很多使用 vi 的人 “因为它总是在那里”,但这真的是一个好理由吗?听起来很实用,但在我看来,这和 “我在我的机器上运行 Windows 系统,因为我在百思买(Best Buy)买它的时候,上面就装有这个系统 “没有什么区别。普通不一定更好。方便并不总是更好。公司不应再把开发人员(以及其他所有人)当作可替代的齿轮。Emacs 并非昙花一现。如果你想在 prod 服务器上使用精简的工具,那就使用 GNU nano。只要你知道^键指的是Control键,你就能在底部找到所有需要的命令。
我在公司工作了几年后,公司失去了一个大客户。如果某个重要人物突然离开,而没有人知道原因,这可能是一个警示信号。另外:当一家小公司的绝大部分收入都来自一个客户时,这家公司就非常脆弱了。
我仍在使用 Emacs,但使用得不多了。我成为了一名 Java 开发人员,因此多年来我一直使用 jEdit 作为我的主要编辑器,即使在 Linux 上也是如此。它的一个卖点是,我还可以在公司的 Windows 机器上使用它。后来我搬到了奥斯汀,开始寻找可以加入的技术小组。我搬到这里时,EmacsATX 小组已经存在,但它在市中心的午餐时间开会。奥斯汀的公司似乎比芝加哥更分散;似乎没有一个区域像芝加哥的 Loop 那样具有重要的经济地位。我从来没听说过芝加哥的 Meetup 在午餐时间举行会议,因为芝加哥更集中,有更好的公共交通。在奥斯汀,大多数人都会开车去开会,但一到那里就得掉头。所以我没有参加 Emacs 的会议。也许他们有自己的理由,但对我来说,这似乎是个错误的决定。
后来有了新的领导,他把活动改到了晚上,我就开始去了。然后,我又开始更多地使用 Emacs。我在 “Emacs复兴 “期间对Emacs的使用与我的 “古典时代 “有很大不同。第一次使用 Emacs 时,我不知道缓冲区或桌面;我只是打开一个文件,做一些我需要的改动,然后退出。你可以把 Emacs 的 “桌面 “看作一个会话;它会记录你上次使用 Emacs 时打开的文件列表,以及你在这些文件中的位置。我在 Bash 中做了几个别名,一个带”-no-desktop”,一个不带。现在,我的一台机器上有一个实例一直在运行 Emacs 桌面。我将本地桌面文件保存在本地 git repo 中,每月保存一次。我会在 jEdit 中打开多个文件。当我学会如何在 Emacs 中切换桌面后,我就放弃了 jEdit。
我在一次 EmacsATX 会议上提到了桌面,人们对我把它叫做 “桌面 “而不是 “会话 “这样更有描述性的名称感到不满。我不得不慢慢说,用简短的词语向他们解释,我并没有把它叫做 “桌面”,所以对我的不满是非常愚蠢的。生活中的小贴士:在问别人事情为什么会这样之前,先问问他们现状是不是他们决定的。
了解缓冲区也会扩展你的 Emacs 技能。(我指的不是底部的迷你缓冲区,它用于 M-x 自动补全或查找和替换正则表达式)。和其他文本编辑器一样,在内存中编辑文件时,文件被保存在缓冲区中。但在 Emacs 的缓冲区中还会发生许多其他事情:
- 消息可以记录到文件中,但会显示在 “消息 “缓冲区中。
- 当你列出缓冲区时,列表本身就是一个缓冲区。你可以使用缓冲区列表来管理缓冲区,例如重命名或删除它们。你可以把它的另一个名字叫做元缓冲区(meta-buffer),但这可能会造成混乱,使你无法控制 Emacs。
- Dired 可以用来管理文件系统,也是一个缓冲区。
- 你可以使用 “occur “函数列出文件或缓冲区中正则表达式的所有实例,并将结果显示在缓冲区中。
- 还有一个 scratch 缓冲区,可以用来运行 Emacs Lisp 代码或进行简单的数学计算。
- Eshell 在缓冲区中运行。如果希望在一个 Emacs 实例中打开多个 Eshell 实例,则需要更改先前 Eshell 缓冲区的名称。否则,运行 M-x eshell 就会一直进入同一个缓冲区。
- 俄罗斯方块和乒乓等游戏都有自己的缓冲区。
我开始使用基于 Flying Machine 的 Emacs 配置。其中对我来说比较新的是 smex(EmacsWiki 页面,此处;Github 页面,此处)和 IDO(EmacsWiki 页面,此处;手册,此处)。我发现输入 M-x,smex 就会给出一个可用函数列表,并使用自动完成功能给出可能的匹配。在一次漫无边际的 EmacsATX 会议上,其中一个议题是如果出现组合键冲突,该怎么办,以及如何防止冲突。我决定使用 M-x,从那以后,当我开始使用一种新模式时,我一般不会再学习组合键。取而代之的是获取功能名称并加以使用。我通常可以通过 M-x describe-bindings 获取所有功能的名称,或通过 M-x describe-key 获取特定组合键的名称。当然,这种方法比较耗时,但大多数函数的名称都能说明它们的作用,org-ctrl-c-ctrl-c 是个例外。
给初学者的附带说明:”M-x “表示同时按下 “Meta “和 “X “键。开发 Emacs 时,键盘上有一个键叫 “Meta “键。后来它被改名为 Alt 键,但 Emacs 社区在组合键列表中仍然用 “M “来称呼它。在生活中,有时你只需要说:”不知道,不知道:不知道,也不在乎,让我们继续前进。
“C-x “表示同时按下 Control 键和 X 键,”Esc “表示 Escape 键,”S “表示 shift 键,但很少有组合键明确将 “Shift “列为一个键。有些组合键确实需要 shift,如 “C-@”,即 “set-mark-command”。at 符号是 Shift-2。
我的基本命令列表
关于 Emacs,需要记住的一点是,Emacs 诞生于 IBM PC 成为标准配置之前,因此 Emacs 中的很多东西几十年前在麻省理工学院的定制机器上就已经存在了。有些东西不会有太大变化。另一方面,既然东西不会变,那么一旦你学会了某些东西,你可能就会在 Emacs 中终身受益。每隔一段时间,黑客新闻(Hacker News)上就会出现一个关于 “为什么有人会使用 Emacs “的话题。在某些时候,一位 Emacs 用户会指出,在过去的十年中,我们看到了很多文本编辑器的出现和消失:Eclipse、Light Table、Atom、Sublime,以及现在的 VS Code。而 Emacs 用户却无需调整。当人们意识到 VS Code 就是 MS Code 时,Emacs 仍然会存在。
如果将 Emacs 作为图形用户界面程序启动,你可以用鼠标做一些事情,也可以使用 CUA 模式,但最好还是学习标准的键位映射。
以下是我在开始深入研究 Emacs 之前使用多年的一些常用命令。根据参考卡,在 Emacs 键位绑定符号中,C-x 是 Ctrl+X;M-x 通常是 Alt+X;S-x 是 Shift+X;C-M-x 是 Ctrl+Alt+X,等等。
- C-x C-s 保存文件/缓冲区。
- C-x C-c 退出。
- C-x C-f 打开文件。
- C-s 搜索文本。
- C-v 下屏
- E-v 上屏(我可以按住 Control 键,然后一直按 “v “继续下屏,但按 “E-v “时,我必须重新按两个键才能上屏。我最近发现,如果不使用 “无窗口系统 “启动 Emacs,也可以使用 M-v)
- C-k 键删除文本(在其他程序中剪切)。
- C-y 删除文本(在其他程序中粘贴)。
- C-d 删除字符。
- C-a 转到行首。
- C-e 转到行尾。
- C-g 退出命令;如果输入 M-x- 后在迷你缓冲区中迷失方向,该命令很有用。
- C-x u 是撤销,也很有用。
- C-_ (Control-Shift-minus 一次):也是撤消。
使用 Escape 键组合键时,按下并松开 Escape 键,然后同时按其他键。同时按住四个键比较困难。
- Esc,然后按 Shift-5 键搜索并替换文本 M-%。
- Esc,然后 Shift-less-than 转到文件开头 M-<
- Esc,然后 Shift-大于,转到文件末尾 M->
在我开始 Emacs Revival 之后,我学会了几个和组合键,它们比用 M-x 调用函数更有效。
- C-x C-b 可以列出缓冲区。如果键入 M-x list-buffers,Emacs 会分割框架,并在框架中的第二个窗口列出缓冲区。我更喜欢缓冲区列表占据整个框架。新手须知:也许是前 PC 时代的产物,Emacs 使用 “框架 “和 “窗口 “的方式与其他程序相反。操作系统窗口就是 Emacs 框架,而 Emacs 框架中可以包含多个窗口。这里有一个 Stack Exchange 链接,解释 Emacs 中的框架和窗口,并配有一张漂亮的图片。
- C-l 使屏幕居中。它与 M-x 重新居中(recenter-top-bottom)相同。当我使用 C-l 时,我可以反复点击该键,将光标处的线条从中间移到顶部或底部。而反复使用 M-x 重定向-上-下,只是将标记保持在中心位置。
- C-x o 可以从一个窗口切换到另一个窗口。这在调用 M-x occur 后特别有用,因为它会为输出创建一个分割窗口。这就是 Oscar 中的字母 “O”。这个和弦相当于调用 M-x other-window。
- C-x 0 关闭当前窗口。即数字 0 中的 0。这相当于调用 M-x delete-window。
- C-x 1 删除您不在其中的窗口。这相当于调用 M-x delete-other-windows。
可扩展性可能会让人不知所措,但你不必一下子学会所有的东西。一旦你学会了足够多的东西,不需要每隔几分钟就去查资料,你就可以在一个窗口中完成几乎所有的事情。你的操作系统将是运行 Emacs 所需的应用程序。
本文文字及图片出自 Emacs Commands I Got By With For Years