使用 Doom Emacs 工作
Table of Contents
- Table of Contents
- 安装
- 项目与工作空间 (Projects and Workspaces)
- 常见任务 (Common Tasks)
- 寻找文本 (Finding Text)
- 在文本间移动 (Moving To Text)
- 扩大和缩小范围 (Narrowing and Widening Regions)
- 多光标 (Multiple Cursors)
- 撤销与重做 (Undoing and Redoing)
- 在编译输出间导航 (Navigating Compliation Output)
- 杂项
- 了解更多 Doom
原文: Doom Emacs Workflows 发布于 2019 年 2 月 15日,部分功能可能已发生变化。
我最近放弃了 Spacemacs, 开始使用 Doom Emacs. 目前为止,Doom Emacs 的文档仍十分简陋,所以我用 Doom Emacs 写了这篇个人笔记来介绍我的工作流(包含一些我认为比较重要但是缺少文档的功能)。
如果你有下面的情况,Doom 也许就很适合你:
- 喜欢 Emacs 又想使用 Vim 的按键绑定
- 没有时间配置像是 helm 之类的优秀插件
- 感觉 Spacemacs 太慢
这篇文章并不打算介绍 Emacs 的运行方式和基础的 Vim 按键绑定,而是把焦点放在我认为出类拔萃的地方
安装
一定要使用 develop
分支,不是 master
! 使用 develop
分支需要
然后运行 bin/doom quickstart
即可完成安装。之后您可以运行 bin/doom help
查看可用命令。
项目与工作空间 (Projects and Workspaces)
我发现使用项目与工作空间来管理工作十分有用。我从中得到了两点好处:从当前项目中寻找东西更快,还可以快速方便的通过保存和恢复 window 和 buffer 配置来回到工作。在 Doom 中,这些功能由 projectile
和 persp-mode
实现。
基本工作流程如下:
- 判断我自己要做什么。是单独的一个项目,还是涉及多个项目 (例如管理 Todo 列表),亦或是不需要在项目中保存 (像是进行在 scratch buffer 中快速计算)?如果是单独的项目,就把它放到一个属于它的工作空间中,否则就把它放在默认工作空间中(main)
- 使用
SPC TAB .
切换到恰当的工作空间。如果这个工作空间并没有显示,那么就用SPC TAB l
加载这个工作空间,或者使用SPC TAB n
创建一个新工作空间。就我个人而言,我经常用SPC TAB r
来使工作空间的命名中包含更多信息,然后用SPC TAB s
保存。 - 当我切换到一个已存在的工作空间时,Emacs 会恢复到我上次在项目的工作状态,这样我可以直接开始工作。不然我会使用
SPC p p
来选择一个项目来继续工作。
有三个命令非常有用:
SPC SPC
在当前项目中切换文件,支持模糊搜索SPC ,
在项目中切换 buffer, 同样支持模糊搜索SPC f r
打开最近浏览的文件
常见任务 (Common Tasks)
我经常使用的有:
SPC :
而非M x
SPC g g
打开 Magit, 这是我唯一使用 Git 的方式
我偶尔使用的有:
SPC .
打开一个文件。值得一提的是使用SPC SPC
比使用这个要快,只有当你要打开当前项目之外的文件时才会使用这个命令SPC b B
切换到当前项目外的 buffer
寻找文本 (Finding Text)
如果你知道有某个文本存在,却不知道它的位置,有两种方式可以找到它:
SPC s p
搜索当前项目中的所有文件 (按下SPC s
后等待弹窗出现可以了解其他选项)。您可以在搜索结果的 buffer 中使用Return
跳转到该位置,或者使用C-c C-e
来编辑所有的搜索结果。无论您修改了什么,您都可以使用C-c C-c
来保存修改,或者使用C-c C-k
放弃保存。这对于简单或者复杂的编辑多个文件中的内容都特别有用。/
在当前 buffer 中搜索。使用n
和N
分别跳转的下一个搜索结果和上一个搜索结果。 (使用?
可以向上搜索)
在文本间移动 (Moving To Text)
当您在屏幕上看到某个特定文字时,有很多方式可让您快速的将光标移动到那里:
s
然后输入两个字符,您就能跳转的当前位置下方的最近的匹配项,用S
则可以向上跳转。输入,
可以继续跳转到该 buffer 中的上一项,=;= 则能跳转到下一项。通常配置下,这些功能只会跳转到当前行中的匹配结果,但是如果您多次输入,
或;
,您就可以在整个 buffer 中进行跳转操作。这是 evil-snipe 的功能。g s SPC
,然后键入你想找的文字。当没有歧义时,您可以直接跳转到那里,否则需要使用特定的字母组合来选择位置。如果您在config.el
文件中配置了(seq avy-all-windows t)
,则会在所有的可见窗口中进行匹配。我比较喜欢这个功能,因为他能让我在屏幕中快速跳转。该功能使用了 Avy。g s
后等待弹窗出现可以了解其他选项,其实我并没有真正使用过这个,因为上面的两个方法完全可以满足我的需求,但是或许我在这里错过了什么。
当我想跳转到的位置和现在的位置比较近时,我会使用 evil-snipe (s
和 S
)。如果位置较远或在另一个窗口,我会使用 Avy (g s SPC
)。它们都能用来选择文本,假如我们有这样的一串文本:
当光标位于 J
时,如果我们想选中 Just some example
。我们可以用 v3e
,但如果这样我们就需要去查单词的数量(还要记住 e
和 w
的区别),因此,我们可以用 vsle
。 s
表示使用 evil-snipe , le
则是我们找的两个字母。我们也可以用 vgs SPC le
来使用 Avy (然后我们需要把光标向右移动一个字母)。
使用 evil-snipe 有点复杂。它把选择命令绑定到了 s
键上,但是其他一些指令(例如 yank, 或者说 y
) 被 evil-surround 绑定到了 s
上。在这种情况下, evil-snipe 被绑定到了 z
键( Z
来向后搜索)。如果我们不想在选中的文字中包含某个特定文本,我们可以使用 x
( X
键向后搜索 )
扩大和缩小范围 (Narrowing and Widening Regions)
译者注:该部分在新版 Doom emacs 中有较大变化,故该部分存在少许调整与原文不同,如需查看旧版本操作请查看原文。
在 Emacs 中有一个叫 Narrowing 的功能,对于将 buffer 限制到一个选择的文本中十分有用,但它由于经常给初学者造成困扰,默认情况下被禁用,在初次使用时可以选择是否启用。它特别适合与多个光标(见下)同时使用。您可以用 C-x n n
来将范围缩小到当前选择的区域,使用 C-x n w
执行相反操作(即扩大范围)。用 C-x n d
来缩小范围到当前的函数也十分有用。
多光标 (Multiple Cursors)
多光标允许您同时编辑多个地方。Doom 提供了两种多光标的实现方式,它们分别是 evil-multiedit 和 evil-mc。我各人感觉 evil-multiedit 更容易使用,但是功能比较局限。
有两种方式可以开始使用 evil-multiedit :
- 选择您想编辑的文本,然后按
R
继续选择在当前 buffer 中您想要编辑的文本。 - 将光标移动到您想要编辑的单词旁,然后使用
M-d
和M-D
来分别选中上一个或下一个相同的单词(可以先缩小范围)
当您选择了一些文本区域后,您可以使用 C-n
(下一个) 和 C-p
(上一个)。按下选中的文本上按回车键,该文本区域会被取消选中。使用这些按键,您可以随意地选中文本。
当您完成了选择后,对一个区域的修改将会影响所有的区域,大多数的 evil 命令都能够与 evil-multiedit 配合使用。
您也可以使用平时的取消按键( ESC
或 C-[
)来退出 evil-multiedit 模式。
evil-mc 是另外一个多光标实现,它更加的灵活,但也更加难以使用。使用 evil-mc 创建多个光标有以下几种选择:
gzm
在所有的匹配项创建一个光标(可以先缩小范围)gzd
创建光标,然后移动到下一个匹配项(gzd
移动到上一项)gzj
创建光标,然后移动到下一行 (gzk
移动到上一行 )gzz
在当前项创建光标。
这些创建光标会重复您在真正的光标上输入的命令。您可以用 gzt
来临时关闭多光标,从光标位置继续可以再次按相同的按键 gzt
大多数的命令都能与 evil-mc 配合使用,但是少数我使用的功能不能用:
DEL
(backspace) 在插入模式下不能在所有的光标进行重复操作ysiw
在所有模式下都不能在所有的光标下工作 (尽管ciw
可以)
如果光标之间不同步,使用撤消一些命令通常可以解决问题。
当您完成了编辑操作后,按下 gzu
来移除所有光标
撤销与重做 (Undoing and Redoing)
译者注:原文在这里标注了 TODO
TODO
u
键撤销。 undo-tree
系统比较复杂,但是您会慢慢习惯它。 C-r
和 M-_
执行重做操作, C-x u
显示撤销树(undo tree)
在编译输出间导航 (Navigating Compliation Output)
TODO
按下 SPC p c
或 M-b
来进行编译。 ]e
和 [e
查看下一个或上一个 flycheck (一种拼写检查) 错误。 SPC c x
来分别列出所有错误。
杂项
gcc
注释或取消当前行的注释SPC oA
打开 Org agendaSPC x
为任意笔记打开临时 buffer (scratch buffer)- 更改文字大小:
M-=+
增加字号,M--
缩小字号,M-+
重置
了解更多 Doom
我对 Doom 的了解大多数都是通过阅读默认按键绑定, 查看我不认识的命令获得的。在 scratch buffer 中实验每个命令的含义很容易。