工作流分享
这里分享一下我使用emacs的工作流。原则就是尽量高效,也就是说,操作尽量简化。编辑器作为一个输入文本的工具,应该尽量不影响程序员本身的行为,例如编写代码或者写文章的时候,应该使操作者集中注意力于本身的操作而不是相反。
evil
首先,我是vi指法的坚定支持者。vi指法的好处是手指一直处于主键盘区,光标的移动、操作(跳转、选择、复制粘贴等)都脱离鼠标操作,因此不会打断自己写代码的思路。emacs的指法由于没有一个独立的state,因此需要加入meta键,会更复杂一些。
因此,如果认同vi的指法的话,也会受益于evil-leader的好处,即以一个leader键而不是一个组合键作为命令的开始。现在最流行的是以空格作为leader键,例如space-bb是切换buffer。
单文件编辑
除了vi提供的指法之外,还有一些需要知道的包与技巧。
- 高亮
一般由major-mode决定 - 语法检测
采用flycheck - 补全
采用company - 搜索
swiper(s-f) - 替换
swiper + multi-cursor(s-m) - 跳转
- avy(s-g)
在文件内自由跳转 - auto-highlight-symbol(c-n/c-p)
同样的symbol之间跳转 - mark(s-,)
很多命令会在光标当前位置自动插入一个mark,一般用于跳转之后的跳回 - line-mode(s-l)
行号默认不需要打开。只有在定位问题的时候才需要
- avy(s-g)
- shell(s-t)
eshell,日常操作都可以,但还是推荐专业的终端工具
多文件操作
涉及到文件内容的多文件操作也是一个编辑环境需要的,工程相关的下面单独列出。
涉及到文件的重命名、拷贝、删除等使用dired。
- 跳转(s-.)
一般由major-mode支持 - 跳回(bb)
一般跳到另一个文件之后使用最简单的switch-buffer再调回来 - 搜索
- grep
按照路径搜索文件内容,emacs提供了很多利用其特性封装的函数 - find
按照文件名的搜索 - ag/rg
依然是封装的命令行工具,与grep类似,但速度更快
- grep
- 替换
ag + counsel + wgrep
分屏 w
写代码常用的一个操作是分屏,例如同时编写两部分需要互相交互的代码的时候可能就会用到。关于分屏,有一个原则,就是尽量少,一般最多两个屏,再多就是分散注意力的行为(暂时的弹窗无所谓)。分屏的常用快捷键如下:
key | comment |
wo | Other window, 跳到另一个window |
wh | Split horizontally, 横向分一个屏 |
wv | Split vertically, 纵向分一个屏 |
wk | Kill all other window, 只保留当前的window |
ws | Swap window,将当前窗口与另一个窗口交换位置 |
buffer b
emacs的一个与众不同的地方就是抽象出了buffer。我们实际操作的对象是一个内存对象而不是实际的文件,只有当加载和保存文件的时候才会与文件打交道。
只要不显式的杀死buffer就能够访问到buffer,即使这个buffer已经不在内存中了。这在当由于电脑重启等原因导致emacs关闭之后的继续工作时将变得很方便。
key | comment |
ff | 加载文件 |
fo | 在另一个窗口打开文件 |
bb | 切换buffer |
bo | 在另一个窗口切换buffer |
bk | Kill buffer,关闭当前buffer |
bi | 打开ibuffer,即所有buffer的列表,批量操作 |
directory d
emacs除了编辑单个文件,还有很强的路径操作功能,其主体也就是dired。dired对于文件的操作很强大,并且支持远程操作。
key | comment |
dd | 打开当前buffer所在的路径 |
dr | 打开最近访问的路径列表 |
df | 访问当前Finder所在的路径 |
dn | neotree |
git g
git是目前最流行的版本管理工具,emacs有很好用的magit对其进行了封装,可以无缝的进行代码的提交、更新。
key | comment |
gs | git status,用magit打开当前buffer对应的文件所在的工程 |
gl | last commit,显示当前行所对应的最后一次git commit |
help h
自定义的一些帮助功能。
key | comment |
hp | 根据包名跳转到其主页,一般是github |
hy | 有道词典 |
hs | 搜索引擎 |
project p
利用projectile,提供工程相关的操作。
key | comment |
pp | 切换工程,很有效的路径切换手段 |
s-F | 利用ag搜索工程内文件的内容 |
pf | 工程内按文件名查找 |
pb | 工程内切换buffer,较少用到 |
pc | 清空工程缓存,例如文件路径发送了改变时,此时pf仍会搜索原有的缓存 |
bookmark bm
书签是个好东西,特别是涉及远程访问的时候。
key | comment |
bmm | Make bookmark |
bmj | Jump to bookmark |
bml | List bookmarks,批量操作 |