Vim最少必要知识

服务器

浏览数:39

2019-1-31

一. Vim是什么

都说程序员只用两种编辑器,一种是编辑器之神Vim,一种是神的编辑器Emacs,可现实生活中,我发现真正用这两种编辑器的人很少,所以我开始有点怀疑这句话的真实性。

刚毕业那会,我对实际的软件开发了解甚少,于是糊里糊涂的进入了服务器开发领域,现在回想起来真是觉得既幸运又后怕。幸运的是,在我完全不了解的情况下竟然选择了后端开发,后怕的是,既然不了解,就很可能选择到其他方向,而另一个选择可能会造就一个完全不同的人生轨迹。虽然从现在的眼光去看软件开发的每个方向,都非常有趣和有挑战,但服务器领域才是我最向往的地方,且它极大程度的满足了我的好奇心。

不知道为什么,我对很古老的东西很感兴趣,服务器开发日常面对的是一个终端界面,没有图形化的丰富表现,只有常规的字符,让我着迷的肯定不是它的表现形式,更深层次的讲,它更接近于计算机最开始的样子,在这种环境下工作可以帮助我更容易的掌握机算机的原理和思想。

区别于Windows这样的操作系统,Unix/Linux系统的设计原则是简约(Kiss原则),可能有点违背直觉,大多数人认为Windows更为容易上手,确实如此,但这并不意味着它的设计就是简单的,使用起来就是高效的。而Unix不同,其中的每一个程序都只完成单一的功能,程序之间可以很容易的交互数据,这样,通过将不同程序进行任意组合,可以创造出任意的功能,既匹配了程序员这一创造性工作,又极大的提升了工作效率。试比较——在同一目录下,将所有jpg后缀转换为png后缀的操作——在哪个系统上操作更为方便。

Unix设计原则对于大多数程序员来说,是一种“信仰”,而Vim也是其中一个具备KISS原则的产品。

所谓程序员只用两种编辑器,我现在似乎明白为什么使用它们的程序员实际上并不多的原因了,这句话缺少了一个时间的维度,在过去,图形界面不发达,人们用计算机只能使用命令行,在命令行中也只能使用Vim或Emacs编辑器,而随着时代的变迁,人们更倾向于使用易于上手的图形化软件,他们希望速成,不愿意在编辑器上花成本,而逐渐忘却了Vim或Emacs。时至今日,这句话变成了:

程序员都用两种编辑器,大多数人使用图形化编辑器,少数人使用Vim或Emacs。

二. 我为什么使用Vim

我为什么会选择Vim,一是因为Vim可以在所有操作系统及终端中使用,真正做到了“一招鲜,吃遍天”。学会了Vim,你再也不需要学习其他编辑器。

相反,如果你使用IDE的话,可能这辈子要学习很多编辑器,例如当你使用C/C++时,你可能会用VS/SourceInsignt/SublimeText等,当你使用Java时,你可能会换成Eclipse/Android Studio,而当你做前端开发时,你需要学习使用WebStorm/Atom等。同时,这些IDE都无法在终端中运行,这时你要编码和调试,需要跨越两个环境,效率极低,如果你想改变这种现状,你还得学习Vim。

而对于程序员来说,一个顺手的开发环境决定了他的开发效率和幸福指数,有时为了一个稳定又一致的开发环境,我会放弃公司的办公电脑,取而代之的是背一部几公斤重的笔记本来来回回。

二是Vim的效率很高,它会想尽一切办法将你的双手放在主键盘区,甚至不需要碰小键盘或鼠标,更深一层,为了达到相同的目的,它会让你尽可能减少按键次数。这样做都是为了让你更加专注,集中精力去完成当前的工作,而右手经常在鼠标和键盘之间来回切换,无疑是一种“打断”。

最后一个原因,使用Vim真的很酷,因为Vim学习曲线比较陡峭,即便对于程序员同学来说,它不好用,或是一头难以驯服的猛兽,所以在这种情况下,如果你可以把它运用自如,你拥有的就是别人从未有过的一种体验。

三. 至少要掌握的知识

说Vim学习曲线陡峭,其实也是相对于其他编辑器来说的,其实也并没有多陡峭,下面主要从以5个概念,来谈一下Vim的最少必要知识,这是我平时使用Vim的过程中,总结出来的:对于一个新人,至少要知道哪些用法呢?

  1. 模式
  2. 命令
  3. 窗口,Buffer
  4. 配置
  5. 插件

模式

模式是Vim区别于其他编辑器的首要功能,它要解决的问题是“只使用键盘就可以完成所有工作”,你可以想象一下,当你在使用电脑时,克制自己不用鼠标或触控板时的感受:你也许会感觉非常无力吧。而当你在使用Vim时,这件事情不会给你带来任何不适,相反如果你适应了Vim的模式后,看到别人的右手在键盘和鼠标之间来回切换,你才会觉得那个人的效率和自己比起来是多么低效。

Vim中的三个模式分别是

  1. 普通模式normal
  2. 插入模式insert
  3. 可视模式visual

普通模式相对于插入模式,它用来控制光标移动、复制/粘贴文本、排版等,并将这些功能映射到指定的快捷键中,这样当你输入一个按键,它就会帮你完成以上功能。

<Esc>

<Esc>按键帮你从其他模式切换到普通模式,所以当苹果在最新版的macbook pro中取消<esc>按键时,一大批Vimer第一个反应就是macbook pro不适合开发者,不过我觉得这应该不是什么大问题,在切换到Vim时,肯定会弹出相应的虚拟按键,只是手感上应该会差很多,但如果要追求更好的手感,我推荐你去外接一个机械键盘,真的不一样。

h/j/k/l

这四个键在键盘的最中间,当你处于普通模式时,h/j/k/l这四个按键分别代表了光标向左/下/上/右移动一个字符,当然你完全不需进行刻意的记忆,打开电脑练习几次就习惯了。学会了这几个按键,你的手指再也不需要移动到小键盘上去了。

移动

ctrl+f/b/d/u

这四个快捷键,可以帮助你翻页,实现光标在文件中快速移动。

  • ctrl+f:向下翻一页
  • ctrl+b:向上翻一页
  • ctrl+d:向上翻半页
  • ctrl+u:向下翻半页

移动

b/w/e/shift+^/shift+$

普通模式下,h和l每次只能向左或向右移动一个字符,这无疑是非常慢的,下面几个快捷键,可以帮助你在行内快速移动

  • b:将光标移动到上一个单词的第一个字符
  • w:将光标移动到下一个单词的第一个字符
  • e:将光标移动到下一个单词的最后一个字符
  • shift+^:将光标移动到行首
  • shift+$:将光标移动到行尾

移动

f/F’a’

在行内快速移动的“升级版”,单引号中的内容可以用任意字符代替,例如f’b’/F’b’

  • fa:将光标移到右边的第一个字符a上,继续按’;’(分号),可以延相同的方向找到下一个a,继续按’,’(逗号),可以延反方向找到下一个a
  • Fa:将光标移到左边的第一个字符a上,继续按’;’(分号),可以延相同的方向找到下一个a,继续按’,’(逗号),可以延反方向找到下一个a

当你熟练使用这个快捷键,你就知道我为什么会说:

Vim会尽量减少你敲键盘的次数

移动

H/M/L

这几个快捷键,可以帮你把光标移动到屏幕的上方/中间/下方,注意是要打开大写锁定或按住shift

  • H(high):将光标移动到屏幕上方
  • M(middle):将光标移动到屏幕中间
  • L(low):将光标移动到屏幕下方

移动

[n]jk

中括号中的n可以用任意数字代替,例如10j表示将光标向下移动10行,而10k则相反

  • [n]j:将光标向下移动n行
  • [n]k:将光标向上移动n行

移动

[n]G

同[n]jk命令,[n]G命令会帮你把光标移动到指定的行数,例如100G,会将光标移动到文件的第100行

移动

gg/G

这两个快捷键,会将光标移动到文档的第一行或最后一行

  • gg:将光标移动到文档的第一行
  • G:将光标移动到文档的最后一行

移动

zz

这个快捷键会将当前光标所在行居中

移动

%

该快捷键实质上是shift+5两个键的组合,可以让你的光标在成对的括号间跳转,例如大括号、圆括号、方括号等,该功能在写代码时经常使用。

移动

*/#/n/N

  • *:在文件中查找光标下的单词(向下),如果要继续查找,可以按n向下查找,按N反向查找
  • #:在文件中查找光标下的单词(向上),如果要继续查找,可以按n向上查找,按N反向查找

移动

[[、]]、{、}

这套指令也特别容易记忆,因为大括号或花括号的方向即是你的光标所移动的方向

  • [[:将光标移动到上一个代码段(或函数)的行首
  • ]]:将光标移动到下一个代码段(或函数)的行首
  • {:将光标移动到上一个空行行首
  • }:将光标移动到下一个空行行首

以上是在普通模式中最常用的移动操作,熟练掌握以上操作,Vim便成了你手中的“六脉神剑”,可以任由你“指哪打哪”了。

u/ctrl+r

  • u:撤销
  • ctrl+r :重做

编辑

y/yy/p/P/”+y/”+p

这几个命令表示基本的复制和粘贴

  • y:复制,比较常用的是先进入可视模式,然后按y,复制所选文本
  • yy:复制一整行
  • p:从光标右边开始粘贴,注意不能粘贴到Vim外的程序中
  • P:大P,从光标左边开始粘贴
  • “+y:复制到系统剪贴板,这样就可以粘贴到Vim外面去了
  • “+p:将Vim外复制的内容粘贴进来

+”y/p这种三个键的快捷键不是很方便,所以我们可以在vim中建立按键映射,将它的操作简化,例如在~/.vimrc(没有该文件的情况下要手动创建)中加入:

" 定义快捷键的前缀,即<Leader>
let mapleader="'"
" 在可视模式下,'+y则为复制到剪贴板
vnoremap <Leader>y "+y 
" 普通模式下,'+p则为从剪贴板粘贴到Vim
nmap <Leader>p "+p

编辑

a/i/A/I/r/cc/cw

这几个快捷键可以帮助你编辑文本

  • a:从光标右边开始插入,进入插入模式
  • i:从光标左边开始插入,进入插入模式
  • A:从行尾插入,进入插入模式
  • I:从行首插入,进入插入模式
  • r:替换光标下的字符,不进入插入模式,例如rx,将光标下的字符替换为x
  • cc:修改光标所在行,进入插入模式
  • cw:修改光标开始以右的单词,这个组合键在编码的时候也经常使用,Vim中的组合键由动作+ 范围组成,如c为修改动作,w为一个单词的范围,再如d2j表示:删除光标所在行及下一行,其中d为删除动作,2j为下两行

编辑

.

点号键可以帮你重复上次编辑操作,例如你想手动将文件中所有的int转换为int64,只需要:

  1. 进入普通模式,将光标移到int下
  2. 敲击*查找int
  3. 敲击cw替换int,输入int64
  4. 按ESC继续进入普通模式
  5. 敲击n查找下一个int
  6. 敲击.重复执行替换,然后继续执行第5步骤

编辑

插入模式没什么可说的,在这种模式下和其他编辑器没有什么区别,下面说下可视模式

v/V/ctrl+v

vVctrl+v进入可视模式,在这种模式下你可以自由选择你需要操作的文本,然后进行批量操作

  • v:进入可视模式,按[n]hjkl调整范围,n代表分别对hjkl做的次数,例如v10l表示选择光标右边的10个字符
  • V:选择光标下的行,V10j表示选择光标及光标下的10行
  • ctrl+v:可以选择一个块状的区域,这个功能能够很好的帮你完成块注释或块反注释

下图展示了我将某一个代码块注释掉的动作

  • 首先ctrl+v,然后敲击6j,垂直选择6行
  • 输入:s,^,//,|noh将行首替换为注释符号//,noh是禁止高亮的意思

选择

命令

在Vim中可以通过输入命令的方式进行交互,在普通模式下,输入:调出命令栏——Vim最底部的一栏,命令分为两种

  1. Vim调用shell的命令,前面要加一个感叹号,例如输入:!pwd执行pwd
  2. Vim内置或用户通过插件实现的命令,例如下面的几个常用命令

:/ 😕

查找命令

  • :/id:从当前光标向下查找文件中的id字符串,为了方便,你可以直接敲击/id
  • :?id:从当前光标向上查找文件中的id字符串,为了方便,你可以直接敲击?id

:%s,Id,ID,g

:s为替换命令,上文可视模式中已经展示了批量替换的威力,另外一种比较常用的是全文替换,例如:%s,Id,ID,g表示将全文中的Id替换为ID,g的意思是一行里面如果有多个匹配项,则都进行替换,和sed中的替换是一个概念

:q :w 😡 :e

学到这里你已经掌握了Vim中的基本用法,现在可以退出休息一下了:)

  • :q 退出
  • :w 保存
  • 😡 保存并退出
  • :e 编辑文件,不存在则创建,例如:e ~/.vimrc会编辑~/.vimrc这个文件

:help

即便看完了以上内容,你可以顺使用Vim了,但最好还是浏览一遍帮助文档,这样当你遇到某个问题时,可以通过help进行查找。

Window,Buffer

Vim一次可以打开多个文件,同时打开的文件暂存在Buffer对象中,每个打开的文件对应一个buffer对象,你可以选择性的通过打开某个Buffer来显示对应的文件,而一旦该文件显示出来,用来显示该文件的窗口被称为Window,如果你的屏幕够大,你可以把Vim分成多个窗口,即实现了多个文件同时进行编辑的功能,非常方便你编写代码。这也是Vim和其他编辑器在理念上不一样的地方,其他编辑器使用Tab来打开多个文件,虽然Vim也有Tab功能,但Window+Buffer的方式更符合习惯

:split vsplit ctrl-w+h/j/k/l

这几个是Vim中操作窗口的命令

  • :split 将光标所在的Window分为上下两个窗口
  • :vsplit 将光标所在的Window分为左右两个窗口
  • ctrl-w h/j/k/l 帮助你在不同窗口间进行切换,h/j/k/l分别代表了切换到左/下/上/右窗口

看完了以上内容,再看这幅浓缩图,就会觉得格外清晰

配置

Vim是高度可定制的编辑器,你可以通过配置从而把它打造成一个非常强大的IDE,而所有的配置基本上都在~/.vimrc中完成,非常方便管理,网上讲配置的文章和文档非常多,相信你可以在网上找到你想要的内容。

插件

插件本质上是配置的一种,而掌握了Vim插件的安装和使用后,你就可以将Vim运用到实际工作中了,基本的逻辑是,先明确自己的需求,然后在google中搜索对应的关键字便可以找到你所需要的插件,这里就介绍一个非常重要的插件

NERDTree

NERDTree插件配合窗口功能非常好用,NERDTree插件可以帮你列出系统中的目录和文件树,打开其中文件的同时,还可以帮你进行分屏,有了这样的插件,你应该会更得心应手。

版权申明:
此文章首发于公众号程序员在深圳,搜索 studycode 即可关注
本文无需授权即可转载,甚至无需保留以上版权声明

原文地址:https://www.jianshu.com/p/881a168d454a