vim的设计哲学

前言

正如亚里士多德对physics的讨论之前进行了一番metaphysics的讨论,从而有了形而上学。在讨论vim之前,我们也可以形而上学地讨论一下vim的设计哲学。我认为vim的设计哲学主要分为两点:

  • 键盘only
  • 类言语交互逻辑

前者比较好理解,vim的前身vi诞生于1976年,那时候还没有图形化界面和鼠标的概念,因此vim的核心内容依然可以只用鼠标完成,尽管鼠标的各个案件都可以在vim中定义使用方式,但是“无鼠标交互”依然是vim和使用vim的人群的底色。

后者来自learnvim.irian.to的启发。从irian所提到的“vim的语法就是动宾结构”出发,我们可以窥见vim的整个模式设计就是类言语交互逻辑。包括但不限于不及物动词,及物动词,双及物动词,从句等,而动词与各类名词的无限组合从而构建起了vim的上限。本文所讨论的meta-vim就是关于这点的思考和阐述。

vim的言语逻辑

动宾结构

一门语言最核心的就是动词,英语学会了动词的八个时态,日语学会了动词的各种变形,基本上就算入了门。而vim的最核心也是动词。

我们列举几个vim中的动词和名词,试着排列组合以下。

动词解释名词解释
y(yank)提取 vtw(word)一个词
p(paste)粘贴 vis(sentence)一句话
d(delete)删除 vtp(paragraph)一段话
‘ ’扩起来的内容
“ ”扩起来的内容
{{ }扩起来的内容
最常见的动词和名词

加上比较常用的两个介词(获形容词)

  • i 表示inner不附带空格或者‘等前后相关内容。
  • a 表示一个,附带前后空格和相关内容

于是我们可以组合得到任何我们想做到的事。

  • yaw 提取一个单词,包括一个空格。
  • di{ 删除{}里面的内容,并提取到vim缓存。
  • ya" 提取一个“”引用的内容,包括“”

不及物动词

除了p为不及物动词粘贴外,其他不及物动词大部分起到快速定位作用。在这里介绍了大部分导航相关的vim不及物动词,如hjkl, ^, $等。

vim的四个模式及对应的语法逻辑

普通模式

上述我们提到的动宾结构和不及物动词都是在普通模式下进行的,此时vim的左下角没有任何显示。

普通模式就是我们对vim交互时使用vim语法的基础界面。

插入模式

我们都知道vim的最基本的用法就是打开文件vim test.txt然后按i进入插入模式,此时vim的左下角会显示-- INSERT --。接下来输入一串内容,按esc或者ctrl+c结束插入模式。

从另一个角度看上面这段操作,i是及物动词,其后面接的名词是以ctrl+c或者esc结束的文字。因此我们可以把插入模式看成一个完整的名词,接在i这个及物动词后方。

另外有时候需要在插入模式进行导航,而vim的导航键是hjkl,退出导航模式需要ctrl+c或esc,这两个方案都比较远,同时再次进入插入模式需要再按i。个人觉得这是思维还停在其他编辑器的时候必然会存在的问题,就是一直待在插入模式不愿意出去。

我觉得临时解决方法有两个:

  • 使用方向键在插入模式临时导航
  • .vimrc中配置jj或者jk为退出插入模式。
inoremap jj <Esc>

此时如果还使用了tmux,则需要配置tmux的esc键以避免延迟。在.tmux.conf中填写:

set -s escape-time 0

此外除了i以外,还有其他按键可以进入插入模式:

  • a在当前光标后进入插入模式
  • A在行末进入插入模式
  • o在下一行插入空行并进入插入模式
  • O在上一行插入空行并进入插入模式

visual模式

在普通模式下有集中进入visual模式的方法:

  • 按v进入普通的visual模式,此时左下角显示-- VISUAL --
  • 按V(shift v)进入行visual模式,此时左下角显示-- VISUAL LINE --
  • 按Ctrl+v进入块visual模式,此时左下角显示-- VISUAL BLOCK --
由于windows系统对于ctrl c和ctrl v有系统级别的劫持,因此在vim上无法受到ctrl v的命令,此时需要使用ctrl+alt+v来进入块visual模式,而mac上的复制粘贴使用的是command c command v,所以ctrl c ctrl v不受影响。

visual模式在个人看来对应的是英语中的从句。这一以一个最常见的给三行同时添加缩进为例子:

{
int a = 0;
print("hello world\n");
return a;
}

光标放在int的i处输入如下命令:

  • ctrl + i 进入visual block模式
  • jjj 纵向选择三行一列的block
  • i 进入插入模式
  • 输入两个空格
  • esc

此时缩进就添加好了。此时的语法结构为“insert two spaces where visual block lies”,类似关系副词where的定语从句。

还有给一个区域的字母全部变大写,将上面的第三部换成U就行了,此时visual block内的字母作为宾语,被改成大写,类似复合宾语。

总之主体动宾结构没有大的改变,但是句式需要变复杂的时候就需要用到visual模式。

命令模式

普通模式下按:进入命令行模式此时左下角直接显示:

这个模式下最常用的有两个,一个是复杂的语法,比如替换,把这段话中的A单词换成B单词;另一个是vim的基础配置,比如:set nu


后记

一个初学者可能大多数时候都在使用vim的插入模式,其他三个模式几乎不会使用,但是随着普通模式下会的动词与名词越来越多,更多时候会选择在普通模式下进行交互,这时候才能渐渐体会到vim的设计的交互哲学。到后来几乎不怎么使用插入模式,相同的单词几乎不会打第二遍,使用各种命令来高效完成与vim的对话。

在这个过程中的学习曲线是比较平滑的,会的动词少一点和多一点并没有太大的区别,但是当一个操作重复次数较多,可以思考一下有没有更省时省力的方法,有时会更高效。

文章标题:vim的设计哲学
文章作者:Myron
转载链接:https://phyiscs.com/meta-vim-before-the-introduction-of-vim.html
上一篇
下一篇