前言
正如亚里士多德对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) | 提取 vt | w(word) | 一个词 |
p(paste) | 粘贴 vi | s(sentence) | 一句话 |
d(delete) | 删除 vt | p(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 --
。
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的对话。
在这个过程中的学习曲线是比较平滑的,会的动词少一点和多一点并没有太大的区别,但是当一个操作重复次数较多,可以思考一下有没有更省时省力的方法,有时会更高效。