========================
== Seeking Complexity ==
========================

guide of emacs for vim user

PUBLIC

目标用户

singularity追求者

vim

vim的modal editing模式非常受欢迎,尤其是以hjkl motion movement为核心的keybinding。

而vim keybinding比vim本身更加流行,浏览器 各种IDE,一些terminal都有vim keybinding。 所以值得一问:

我是喜欢vim还是喜欢vim keybinding

as elisp interpreter

emacs最大的特点可能是emacs本身是一个emacs lisp的解释器,大部分emacs的代码都由elisp写成,包括配置文件本身。 与编辑器交互的command,也就是在解释器里执行新的function。

lisp本身是一个很有魅力的语言,简洁的语法,彻底的functional programming支持。 可以在经典教材SICP中看到很全面的介绍。也可以参考Paul Graham的lisp 洗脑文

另外一点值得一提的是这个lisp解释器的server-client结构。 vim和其他的编译器也有类似的结构,但是可能是因为语言的原因,使用的并不多。 而在emacs中就经常见到一些很灵活的操作,一个我比较喜欢的例子是:org-pomodoro&polybar 写一个shell script,通过 emacsclient -e 执行在emacs配置中声明的一个函数,获取一个文本输出。再把这个shell script放到桌面管理器status line的callback里,做到在桌面显示emacs内部的信息。

org-mode

org-mode直接看起来是一个类似markdown的东西,一种标记语法。

使它看起来独特的原因有下面几个点:

structure editing

包括报表在内,有一套比较方便的键盘操作:交换章节、提高/降低层级、加TODO

literal programming

类似jupyter,可以边写代码,边写文档,文档中可以直接包含代码的输出。

digraph G {
splines=false;
  subgraph cluster_1 {
    problem1[label="问题"]
    solve1[label="解法"]
    result1[label="结果"]
    problem1->solve1->result1
  }
  solve2[label="解法2"]
  problem1->solve2->result1
}

GTD

一个永远准备 capture TODO项的GTD系统。

例如正在coding,可以使用 org-capture 加一个TODO

这部分的介绍太多了,应该是很多人入坑emacs的原因。 很多非程序员也在使用emacs,用org-mode做GTD应该算是一个比较主流的原因之一。

we love UI: TUI & GUI

emacs是一个完整的GUI程序,所以能享受众多GUI程序的基本人权:

  • 丰富的字体选择(不只是等宽字体)
  • 内嵌图片,上面literal programming已经介绍过。也可以(在编辑过程中)嵌入渲染好的latex公式(实际上是图片)
  • 鼠标点击和下拉菜单,很多TUI中的文字其实是按钮。

在GUI和command line两个极端之间,我认为TUI是非常吸引人的一个选项。

现在有一种潮流是用rust重写很多CLI工具,其中一个特点就是具有非常丰富的TUI。 lazygit应该算是一个非常有代表性的例子(虽然很快就要说到lazygit是在重复造一个emacs中存在已久的轮子)。

magit

Figure 1: magit
Figure 2: 跟github cli的集成(pr issue)

magit是emacs中常用的git工具。想来想去觉得用下面这个文章最好说明他的设计思想:Emacs is the 2D Command-line Interface

magit是一个TUI工具,但是他每个显示的文字都是一个潜在的按钮。所以配合光标停留的位置,加上快捷键就可以表达verb+noun。

(好像想到了老罗的TNT)

tramp

emacs中用来remote editing的工具。

vim常常被认为是适合远程编辑的:通过ssh登录,在terminal中执行vim。然后可怕的就来了,每次按键都要经历一次网络延迟。

这明显不是一个合理的设计,起码不适合长期工作。

VSCode中的remote设计的比较好(几乎和emacs一样好),编辑器会维护一个副本,隔离开高频的按键操作和低频的同步操作。

tramp是emacs中一个非常基础的模块,当你编辑一个远程文件的时候(文件名常常是类似 user@host:/path/to/remote/file ,甚至可以pipe, user@host|docker:user@host:/path/to/remote/file ),其他的插件几乎是可以开箱即用:

  • grep可以知道在远程搜索文件
  • language server知道应该索引远程的工程
  • magit也知道应该在远程做git操作

tramp的设计完成度很高,是一层很好的设计。

可维护度

vim的维护者主要是BM一个人。当初neovim之所以fork出来,就是因为一个关于async action的PR被BM拒绝了(当然后面又自己加上了,这个时候neovim已经分道扬镳了)。

neovim明显不打算跟vim保持兼容性了,从配置语言开始,neovim跟vim已经不是一个东西了,以后应该会差别越来越大。

谁知道以后会不会又有oenvim呢。

更可怕的是: what if BM dies… (2023.08.05 update,听闻BM去世了,我感到很抱歉和触动)

plugin

基本说完了,plugin算是最不重要的了,几乎都有比较等价的实现。 不过还是说几个确实非常独特的plugin:

org-roam

可以认为是roam research的开源实现。而roam research是zettelkasten笔记法的一个商业实现。

最近类似的note taking工具越来越多,简单总结这类工具就是尝试把过去常用的树形笔记结构,变成图的形状,靠各种双向链接来建造知识库。

evil

emacs中的vim keybinding。

感慨一下,实现一个vim的keybinding感觉还是非常麻烦的。。。佩服。

可惜的是很多vim的motion插件,自然是不能使用的。