程序员我用 Linux工具癖

效率至上--一文带你真正走进vim

2018-12-15  本文已影响34人  擦柱而出

vim一直是程序员之间比较有争议的一个话题。有人认为她是编辑器之神,有人则认为她古老过时,远远不如IDE,或是以当红小生vscode为代表的图形化文本编辑器。无论爱恨,我们的开发工作,大到远程登录服务器coding,修改config文件,小到git commit message,或多或少总要接触她。

为什么要写这篇blog呢,是因为我发现各大平台充斥的vim教程类blog其实很不友好,大多数是命令的堆砌,很少有对思想的解读。由此造成的结果,很多工程师对vim总是敬畏三分,或者就算部分人可以使用vim,也只是以自己的固有思维,结合vim的命令操作,并没有真正掌握vim的精髓。所以我尝试用自己的方式,试图帮助大家系统地建立起vim的知识系统。

文章主要结构如下:

模式

vim有三个模式,分别为普通(正常)模式、插入模式以及命令模式。

很多人对于vim的第一点疑惑,便来源于此。我们习惯了图形化编辑器下,始终处于插入状态。然而在vim中,大多数情况下,我们会处于正常模式。只有当需要输入字符时,进入插入模式;当需要使用命令时,进入到命令模式。在插入和命令模式下,输入Esc便可返回正常模式。一张图概括如下:

image

注:后文讲解,如无特殊说明,均为普通模式下操作。

基本操作

如果不追求效率,只想完成修改文件的任务,并保存退出,只需要掌握以下三个命令:

  1. 移动:h j k l 最简单的移动,相当于键盘上面的方向键,分别对应左下上右。
  2. 进入插入模式:i
  3. 保存退出:ZZ(注意区分大小写)

流程如下:

  1. 普通模式下,通过h j k l 移动到想要修改的位置
  2. 输入i进入插入模式,此时通过输入(字母、数字、符号),删除(Backspace)等,完成基本修改操作
  3. Esc回到普通模式,ZZ,保存修改并退出。

进阶:命令形式

普通模式下,vim的命令主要分为以下三种:

  1. 动作,用以移动光标,或者定义操作的范围;比如:

    1. h:定义操作范围为一格,单独使用时,向左移动光标一格。
    2. w:定义操作范围为一个单词,移动光标到下一个单词首部。
  2. 操作,这种命令需要在后面接表示操作范围的指令;

    1. d,删除,后接表示一个单词操作范围的w,即dw时,表示删除到当前词尾。
    2. c,修改,后接表示一个单词操作范围的w,即cw时,表示修改当前单词。(编辑器行为表现为,删除到当前词尾,同时进入插入模式)。
  3. 命令,直接执行的命令,其中一部分,在执行命令后,直接进入编辑模式;比如:

    1. D,删除至行末。
    2. I,到行首进入插入模式。
      我们的使用方式主要也是三种:命令、动作、操作+动作。
      此外,在动作类的命令前,加上number为可选项,可实现重复n次的效果:
  4. [number] + h/j/k/l左/下/上/右移动number个字符。比如,'2j',向下移动光标2个字符。

  5. 依旧使用dw来举例,d是删除,w是单词,dw代表删除一个单词,d2w代表删除两个单词。后面的命令,大多都可应用此种形式组合使用,大家多注意,养成这种操作 + [次数] + 范围的思维模式,举一反三,便可发挥最大功效。

移动进阶

单词级别的移动

这里有仅大小写不同的两组命令,两组命令的功能,是相同的:跳转光标到对应位置。但是对应的单位不同,分别为wordstring。具体区别是:

两组命令如下:(跳转光标至)

举个例子,当光标位于hehe111的第一个字符h时,前后的单词/字符串信息如下:

前一个 当前 后一个
单词 - hehe111 abcde
字符串 hello world-hehe111 abcde

那么以上各个敲击以上各个命令的结果,便一目了然(加粗字表示命令运行后光标位置):

image

句子,段落级别的移动

页面级别的移动

按行移动光标

要想用好上述几个命令,有两个简单的建议:

  1. 结合命令:ctrl-g。该命令的作用是显示当前行的位置信息(第几行,相对整个文本行数的百分比)。
  2. 在命令模式下输入以下命令,或在~/.vimrc中添加如下代码片段
set nu " 显示行号
set cursorline " 高亮光标所在行</pre>
显示页面内移动光标
滚动与翻页

匹配

Mark

编辑进阶

进入插入模式

在不同位置进入插入模式
使用修改命令进入插入模式

删除

剪切

剪切操作其实就是我们之前讲的删除。也就是d。删除的内容,默认会存放到剪切板中。也就相当于进行了剪切。

进阶操作符

从这里大家可以看出,ia的作用比较特殊,代表与区块相关的某种操作。区别就在于,i不包含区块边界符号。a包含。这两个操作符很重要,在后面的复制操作中还会用到。此外还有t/。此外,ia还可以接t,此时t表示一对xml标签。i:区块,不包含边界。a:区块,包含边界。t:"to",本行到哪里。/:接匹配,全文到哪里。

粘贴

为什么会有光标前后或上下一行两种情况呢?是因为我们复制或剪切的内容有可能是字符串或者整行:

复制

0y$: 命令意味着:

当然也可以结合我们刚刚介绍的进阶操作符来进行操作:

剪切板

vim 有 12 个剪切板,分别是 0、1、2、...、9、a、“、+。:reg:查看各个剪切板里的内容。yp默认使用 "剪切板中的内容。
"[n]y:复制到剪切板n中。"[n]p:粘贴剪切板n中的内容。

查看是否支持系统剪切板:

vim --version | grep "clipboard"

观看输出中,clipboard前面是+还是-。若是-,则说明不支持系统剪切板。
+号剪切板比较特殊,是系统剪切板,用于与系统其他应用互动:

可视模式

v:进入可视模式。V:进入行选择模式。Crtl + v:进入块选择模式。

进入可视模式后,可以通过之前的移动操作,来进行选择。比如:hjkl:前后左右选择。$:选择到行尾。i":选择两个引号之间。

选择后,可以使用

格式化

=:调整格式化缩进。gg=G:全文代码格式化。

自动补全

编辑模式下Ctrl + n/p出现提示,此时会出现补全的选项。按住Ctrl不放,用np来遍历提示选项,到达期待的选项后,无需其他操作,继续输入即可。

撤销

查找替换

命令模式下:

宏录制

qa 操作序列 q, @a, @@

命令

大家可以看到,!的作用便在于,强制。除此以外,他还有另一个很强势的功能,就是执行shell命令。具体信息,大家可以详细阅读下一节。

vimtutor

外部命令

这是vim的一个很神奇的功能,在编辑的时候可以与外部文本互动,甚至执行一些shell命令。

如果你觉得这种输入命令的方式还不够过瘾,vim还提供了保留当前工作现场,直接进入shell的方式。这种命令一个典型的工作场景是,如我们编辑了一个文件,但是发现无法保存(没有写权限),此时可以先进入到shell下,执行类似chmod u+w [filename],的命令,为当前用户获取该文件的写权限,然后再回到 vim 保存刚刚的修改。 有如下两种方法:

  1. :shell:sh,当退出当前 shell 时(比如exit),就会回到 vim。
  2. ctr-z 进入 shell,fg 退回 vim。

Config

这部分主要是一些vim的config。可以直接命令模式输入,也可以保存到~/.vimrc中,便可每次打开vim自动应用。(其中一些命令是互相冲突的,请自行选择有用的命令)。

syntax on # 开启语法高亮

set nu[mber] # 显示行号
set nonu[mber] # 隐藏行号

set cursorline # 高亮当前行
set ruler # 显示光标位置信息
set noruler # 隐藏光标位置信息

set hlsearch # 高亮匹配
set nohlsearch # 取消高亮匹配
nohlsearch # 临时取消高亮(只取消一次查询的高亮)
set incsearch # 在输入字符串过程中显示匹配点
set nowrapscan # 找到文尾后停止查找
set wrapscan # 恢复为到文尾后自动从头开始
set ic/ignorecase) # 忽略大小写
set noic/noignorecase # 区分大小写</pre>

VIM思想

这部分主要是一些我在使用vim过程中的一些思考和感悟,试图尽力阐述出来。如果大家能有一些思考和收获,说明我的思考是有意义的。如果大家有不同见解,十分欢迎拍砖交流。

Why Normal

合理的快捷键

精细化,多维度命令

快捷键应有尽有,各个维度移动,都切合使用者思维,几乎可以做到”指哪儿打哪儿“。
比如,移动、删除、复制、等等操作,都可以结合精细化的位置,根据符合人类思维的不同维度,进行操作。
比如,字符,单词,行,文章,屏幕,匹配(位置、文字、符号),以及类似书签的Mark等。

原子、组合命令

vim的大部分快捷键,都是院子操作,并通过与范围结合,排列组合,灵活多变,完成各种强大的功能。这也与unix的主要思想契合:每个命令做好,且只做好同一件事。
与此同时,通过用数字和宏,代替无意义的重复。
此外,对一些常用操作,提供了现成的宏,方便操作。比如,dd,是删除整行,同时也可以直接用D来完成。IA等,也是类似道理。

外部命令

类似栈的思路,可以放下当前操作,保存现场,然后进入另一个操作。当操作完成后,回到当前现场。

思维模式

vim的快捷键,或者说命令,不仅很符合我们的思维,而且还能在很大程度上扩展我们的思维。
拿编辑代码时最多的操作,移动光标来说。原来我们的移动,基本就是通过键盘的方向键,上下左右,或者通过鼠标,移动到想要去的位置。而在vim中,你会发现,光标除了上下左右,还可以移动到词首,词尾,句首,句尾,行首,行尾,页面首部,页面中部,页面尾部,文档首部,文档尾部,文档任意一行,甚至还可以移动到某个指定字母,某个tag,匹配大、中、小括号。度过最初的不适应后,通过刻意练习和日常使用,肌肉形成记忆,便无需刻意回想是用什么命令,而是潜意识完成操作。掌握了这些命令后,当你使用原来的编辑器时,也会去寻找这些快捷键。这就不仅仅是使用vim时候提供效率了,而是通过提高编辑操作的意识、思想,提高了整体的工作效率。

使用vim一段时间后,我在其他工具中进行编辑时,编再也无法忍受,一个一个自读地移动光标。于是也会主动去找单词、行级别移动的快捷键。

后记

这篇文章到这里也就结束了,洋洋洒洒写了这么多,一次读下来就接受,很难;仅仅通过阅读就掌握,更难。想要真正用熟vim,掌握思想,需要后续更多思考、实践。但是相信我,这些付出,一定是值得的。因为它不仅能让你掌握一个开发利器,更能带给你很有价值的思想。

上一篇 下一篇

猜你喜欢

热点阅读