Vim入门教程

尽管网上有成打的Vim在线教程,但是要么艰深晦涩,要么太过肤浅。本教程的目标让每个阶段都有斩获,从理解它的哲学(将和你终身相伴)到超越现在编辑技巧,成为其中的牛人。

简单来说,本教程的学习方式将使你终身受益。

为什么选择vim

我相信大多数人可能由于以下三点原因而使用vim:

1、vim无所不在。学习vim你无需担心到了其他平台需要学习新编辑器。

2、可扩展性。你可以只用它来编辑配置文件,也可以将它当做你的开发平台。

3、功能强大。它的工作方式与自然语言类似。即使一开始你对vim一无所知,经过一段时间的使用学习,很快也会成为牛人。

一句话,我相信一旦你开始学习,你会觉得就像掌握母语还有基础数学这些基本技能一样,也能自然而然地掌握vim。好了,在了解这些知识之后,让我们正式开始vim技术的学习吧。

Approach

Kana大神说过,对vim的掌握有五个层次:

  • 层次0: 对vim一无所知
  • 层次1: 了解vim的基本使用
  • 层次2: 知道可视模式
  • 层次3: 知道多种移动动作
  • 层次4: 不再需要可视模式

对此我并不了解,不过我认为这种观点值得我们注意。毕竟,kana是vim大神。在本教程中,我将通过下面四个主要模块来向你展示vim。

  1. 基础介绍:这部分基础介绍能快速建立起你对vim的正确认知。
  2. 具体操作: 这块是干货。做好准备来享用吧。
  3. 进阶: 这部分我会教你怎样成为vim牛人。
  4. 常见问题: 这里会讲述一些常见问题解决技巧。

换句话说,如果你已经对vim有所了解的话,建议你从具体操作这部分开始。如果你熟练掌握这部分的话,就直接进入进阶开始学功夫。假如你看这篇教程是为了某个具体问题,那么请进入常见问题章节。

所以呢,建立vim世界观,vim基本操作,高手进阶以及常见问题——这几部分任君挑选。

配置

我曾说过,不希望这是一本超级vim配置手册,网上已经有很多这类教程了。本教程的目的在于强化你对vim的理解,帮助你熟练掌握这个工具。不过我们也会稍微介绍一些基本的配置。

首先,我建议你安装(几乎)自我管理的vim。我就曾试过Janus(vim的发行版),但是我无法确定它究竟在做什么,这让我感到很挫败。我偏好的配置就像vim自身一样,简单而优雅。

为了达到这个目的,我直接将用户主目录下的.vim目录和.vimrc作为配置文件。

A few key ~/.vimrc changes

./vimrc修改常用键

首先呢,我觉得使用<Esc>键来退出插入模式实在是太老土了。Vim关注的是效率,如果不是特殊情况,手指尽量不要离开键盘中间排。而这种ESC操作实在是没效率,所以不要用这个。

inoremap jk <ESC>

【注意: 有些人喜欢将<ESC>映射为jj,但是我觉得映射为jk可能更自然一点】

修改leader键

反斜杠也同样存在这种问题,所以就像其它指导文档推荐的那样,我也喜欢将引导键重映射为逗号(,)。

let mapleader = “,”

通过这样的配置,可以简化我们接下来的命令执行,比如执行映射的缩写命令时,只需右手中指往下一格就可以轻松输入逗号,而不需要向上再向右去远远地按反斜杠键。

重映射CAPSLOCK

大写键不在vim的配置文件中,不过这个键的位置比较好,而它的默认功能我们又常常用不上。对我来说,CAPSLOCK键没啥用处,所以我将它映射为Ctrl键(从操作系统层面来设置)。这样如果我要执行Ctrl-XX操作时只需将左小指左移就可以了。

此外,推荐其他几项基础设置,这样使用更加方便。

filetype plugin indent on

syntax on

set encoding=utf-8

要知道,优化vimrc文件是一个非常值得花时间去研究的问题,这里说的几个建议仅仅是皮毛。推荐查看我的设置或者阅读这几篇引用文章

使用Pathogen管理插件

【请注意:如果你不熟悉或者并不喜欢插件,可以跳过这一节。等你下次想通了再来看看。】

远离Janus

对我来说,Janus最能吸引我的地方在于它的插件管理,不过我可以通过Pathogen来实现。基本上,通过以下几步就可以了:

  1. 安装Pathogen
  2. 将你需要的插件git clone 克隆到~/.vim/bundle
  3. 在配置文件~/.vimrc中添加execute pathogen#infect()

利用github来实现备份和可移植性

为了备份vim设置,我将整个~/.vim目录通过git库保存在这里。这样即便我新装了系统,也可以很方便的使用git clone https://github.com/danielmiessler/vim获取我的偏好设置。

也许你也会喜欢这样做。

简单一步clone之后,将~/.vimrc软连接到~/.vim/vimrc就可以了。

Vim即语言

Vim最成功的闪光点莫过于一旦你开始使用它,它就会让你欲罢不能。Vim就像语言一样,拥有名词、动词、副词等属性。

虽然我的这种说法从技术层面可能并不准确,但是却能帮助你更好地理解vim的工作机制。重申一次,本教程的目的不是为了取代其他教程或帮助手册——而是为了帮助你理解其他这些文档晦涩难懂的部分。

动词

所谓动词指的是我们执行的动作,这些动作可以施加在名词之上。可以看看下面几个常见的动作:

  • d: 删除
  • c: 修改
  • y: 拖拉(拷贝)
  • v: 可视化选择 (V for line vs. character)

修饰语

定语用在名词之前,表明以哪种方式来执行动作。几个例子:

  • i: 内部
  • a: 周围
  • NUM: 数字 (e.g.: 1, 2, 10)
  • t: 查找到指定字符,并跳转到这个字符的前面
  • f: 查找到指定字符,并跳转到字符所处的位置
  • /: 查找字符串 (literal or regex)

名词

在英语中,名词用来表示你所操作的对象。它们都是客体。在vim中也是这样。下面列出vim中的名词:

  • w: 单词
  • s: 句子
  • ): 句子 (另一种操作方式)
  • p: 段落
  • }: 段落 (另一种操作方式)
  • t: 标签 ( HTML/XML)
  • b: 块 (编程语言)

Nouns as motion

同样,你也可以将名词视为移动动作,这意味着你可以用名词表示在文本的跳转范围。我们可以在“移动”章节中看到例子说明。

使用vim语言来组成语句(命令)

好了,现在我们有句子的不同组成部分,该怎样将这几部分组成完整的句子呢?就像英语一样,凭感觉将动词、修饰语和名词组合起来。

对于下面这些符号,根据颜色的不同来区分句子的不同组成部分:

删除两个单词

d2w

修改所在的句子(删除当前句子并进入插入模式)

cis

拷贝当前所在的段落

yip

修改当前光标所在位置到下一个括号之间的文本内容

ct<

记住,这里的“目标”是尖括号,除此之外还可以是任意字符。从语法上来说,使用单个字母”t”来表示这个向前查找的“目标”,这样我就可以使用“dt.”表示删除当前位置到下一个句号之间的内容,”yt;”表示拷贝当前位置到下一个分号之间的内容。

看起来多漂亮!当编辑文本时采用这样的思维方式可以使得操作更加优雅,符合我们的直觉思维,而且就像其他语言一样,熟能生巧。

具体操作

现在,在了解这些基本操作后,让我们结合具体操作来更进一步学习。

处理文件

一些对文件的基本操作。

  • Vi file :使用vim打开要编辑的文件
  • :w :保存修改
  • :q! : 退出vim,后面加感叹号表示不保存修改强制退出
  • :wq: 保存修改并退出
  • :saveas ~/some/path/: 将文件保存到其他位置

【注意:相比较:wq 我更喜欢使用ZZ,因为我觉得不需要输入冒号我觉得会快一点。也可以使用:x】

  • ZZ: 同:wq

查找文本

对于任意一款编辑器,查找文本都是最基本需求。Vim拥有很强大的文本搜索功能,这一节将着重讨论vim的文本搜索。

搜索字符串

Vim中最基本也是最强大的搜索方式是”/”命令,在窗口最底端输入你需要查找的字符串并回车就可以了。

查找include字符串

/include<CR>

查找结果如下所示,所以匹配结果都被高亮显示:

搜索完成后,输入”n”依次向下查找,或者”N”向上查找。如果想要逆向查找字符串也可以使用”?”来代替”/”.

跳转到指定字符

Vim有一招特别酷,不管你在哪儿,都能查找特定字符并直接跳转过去。比如说,我正在编辑HTML文件,

向前查找并直接跳转到<字符

f<

向前查找并跳转到<的前一个字符

t<

你可以这么理解,第一种找出目标(f),直接定位到查找对象;第二种到达目标(t),向着目标对象前进,定位到目标的前面。

比较怪异的一点是,可以将它们作为命令中的名词。就比如刚才我在编辑这句时:

修改到下一个”<”之间的内容

ct<

对任意字符都可以这么做,比如说,句号,尖括号,圆括号,普通字母等等。这样你就可以查找文本并跳转,或者你知道具体位置并直接跳转。

【注意:当你搜索指定字符时,可以使用分号跳转到下一处——不管是t搜索还是f搜索。逗号可以用来反向跳转到上一处。】

搜索总结

  • /{string}: 搜索字符串
  • t : 跳转到某一字符前
  • F : 跳转到某一字符处
  • *:搜索当前光标位置单词的其他实例
  • n : 搜索完成后,跳转到下一个匹配实例
  • N :搜索完成后,跳转到上一条匹配实例
  • ; : 跳转到指定字符时,使用分号跳转到下一实例
  • , :跳转到指定字符时,使用逗号跳转到上一实例

游走于文本中

提高编辑效率至关重要的一点是:在文本内的自由移动跳转。对vim来说,充分利用我们上文所说的vim语言的基本准则,就可以既简单又优雅地做到。首先,介绍基础概念。

基本移动动作

我们从键盘中间排开始介绍。受过训练的打字员一般都习惯将右手指放在jkl;这几个键上,就让我们从这里开始使用vim。

  • j : 向下移动一行
  • k :向上移动一行
  • h :向左移动一个字符
  • l :向右移动一个字符

刚开始可能使用得不太习惯,不过只需几分钟的练习之后,就会习惯成自然,你甚至会想要在word文档里面也这样用(顺便说一下,word文档不支持)。

总结起来就是:右手食指和中指用来上移下移,右手食指和无名指用来左移右移。

行内移动

你可以在当前行内自由的移动。

  • 0: 移动到行首
  • $: 移动到行末
  • ^: 移动到行首非空字符
  • t”: 跳转到下一个引号前
  • f”: 跳转到下一个引号处

【注意: 逗号和分号会重复之前的t和f跳转】

按单词移动

除了按行和字符移动外,还可以按单词移动:

  • w: 先前移动一个单词
  • b: 向后移动一个单词
  • e: 移动到当前单词末尾

当使用大写字母时,vim会忽略掉单词间的分隔符,这样原本被分隔符隔开的多个单词会因此被视为一个大单词。

  • W: 向前移动一个大单词
  • B: 向后移动一个大单词

这种大写命令的优势在我们实际工作中会频繁地碰到。

按句子或段落移动

  • ):向前移动一条句子
  • }: 向前移动一个段落

在屏幕间移动

  • H:向上移动一屏
  • M:移动到屏幕中间
  • L:移动到屏幕底端
  • gg: 移动到文件顶端
  • G:移动到文件结尾
  • ^U: 向上移动半屏
  • ^D: 向下移动半屏
  • ^F: 下一页
  • ^B: 上一页

来回跳转

在普通模式下,可以在两点间来回跳转,这在实际操作中非常有用。

  • Ctrl-i: 跳转到之前所在的位置
  • Ctrl-o: 跳回你实际的位置

其他动作

  • :$line_numberH: 移动到指定行号
  • M: 移动到屏幕中间
  • L: 移动到屏幕底端
  • ^E: 向上滚动一行
  • ^Y: 向下滚动一行
  • ^U: 向上移动半屏
  • ^D: 向下移动半屏
  • ^F: 向下移动一页
  • ^B: 向上移动一页

现在将所以移动动作总结到一起:

移动命令总结

  • j: move down one line
  • k: move up one line
  • h: move left one character
  • l: move right one character
  • 0: move to the beginning of the line
  • $: move to the end of the line
  • w: move forward one word
  • b: move back one word
  • e: move to the end of your word
  • ): move forward one sentence
  • }: move forward one paragraph
  • :line_number: move to a given line number
  • H: move to the top of the screen
  • M: move to the middle of the screen
  • L: move to the bottom of the screen
  • ^E: scroll up one line
  • ^Y: scroll down one line
  • gg: go to the top of the file
  • G: go to the bottom of the file
  • ^U: move up half a page
  • ^D: move down half a page
  • ^F: move down a page
  • ^B: move up a page
  • Ctrl-i: jump to your previous navigation location
  • Ctrl-o: jump back to where you were

【注意:前面说过我将CAPSLOCK键映射到Ctrl,所有这些基于Ctrl的命令,我都可以用CASLOCK来代替】

修改文本

好了,了解一堆在文本中移动的命令后,我们可以开始学习对文本的修改了。需要记住这一点:这些移动命令会一直陪伴着我们——它们是vim语言的一部分(它们是上文提到的修饰语)。

Understanding modes

首先我们要弄清楚模式的概念。刚开始说到模式可能有点违反我们的直觉,不过一旦习惯之后就会使用得非常的自然。很多vim指南都从介绍模式开始,不过我发现如果直接从模式开始有点不好理解,从普通模式与插入模式之间的切换入手会好一点。

  • 从普通模式开始。对新手来说vim最让人郁闷一点莫过于打开文档却不能直接编辑。其实,你也可以输入一些个东西,不过如果你真这么做的话你的文档可能会变得一团糟。
  • 普通模式也叫命令行模式,因为通常在这个模式下输入vim命令。这些命令可以是移动、删除或者其他操作,之后进入插入模式。
  • 插入模式下可以直接对文件进行修改,有很多种方式可以从普通模式切换到插入模式。不过不用担心,虽然方式多样,只要多加练习就可以熟练使用了。
  • 可视化模式下可以选择文本。这个模式看起来与普通模式非常像,不过这个模式下移动操作会改变高亮选择的区域。你可以逐行选择也可以逐字符选择,不管哪种选择模式下,移动操作都会高亮选择更多的文本内容。
  • 选中之后,可视化模式的优势就体现出来了,我们可以对选中的全部文本做操作,大大提高了效率。
  • Ex模式下,光标处于屏幕最下方,冒号后可以输入命令。具体内容在后面做介绍。现在只需要知道在这种模式下可以运行一些命令行任务就可以了。

除了上面介绍的模式外vim还有一些其他的模式,不过本教程不做介绍因为它们不是首要任务。

记住vim语言

现在让我们一起回忆vim语言: 动词、修饰符、名词。假设我们从普通模式开始,现在想要切换到插入模式下修改文本。

动词可以实现这种切换,并且有好几种选择。我们可以修改(c),插入(i),或者追加(a),还有其他变种。

基础修改/插入命令

让我们从这几个可选命令开始。

  • i : 从当前光标位置之前插入
  • a : 从当前光标位置之后插入
  • I :从当前行开始位置插入
  • A :从当前行行末插入
  • o : 在当前行下新增一行,并从新行插入
  • O :在当前行上新增一行,并从新行插入
  • r : 替换当前光标所在字符
  • R :替换当前光标的字符,并一直向后替换(替换模式)
  • cm:修改文本,其中m表示移动的动作,比如,一个单词,一句或者一个段落。
  • C :修改当前所在行
  • ct?: 修改问号前的这条问句内容
  • s:替换当前字符
  • S: 替换整行

修改句子

cis

移动到行首并进入插入模式

I

在当前光标位置之后进入插入模式

a

从上面例子可知,有多种方式可以进入插入模式输入文本。还有一些简写来执行多条操作,比如说删除并进入删除模式。

删除从光标所在位置开始到行末的所有内容,并进入插入模式

C

删除当前行并进入插入模式

S

修改大小写

可以通过波浪符来变更大小写。就像你猜想的那种方式工作:不管你光标所在字符还是可视模式下选择的文本都可以。

格式化文本

Vim还可以快速格式化文本,比如格式化一整段文本,使用下面这个命令就可以很容易实现:

格式化当前段落

gq ap

gp根据预设的文本宽度testwidth以及参数指定的文本范围来工作,这意味着对于你指定的任意范围的文本,gp都可以自动校准宽度,使得文档看起来干净又整洁。

【注意: ap表示文本对象”整个段落”的覆盖范围】

删除文本

在了解怎样修改文本后,接下来看看怎样直接删除文本。可能你已经知道了,跟前面差不多——只不过实现的动作不同罢了。

基本删除命令

  • x: 删除当前光标的字符
  • X:删除当前光标的前一个字符
  • dm: 根据定义的m来确定删除范围,一个单词或者一句话或者一个段落。
  • dd: 删除当前行
  • dt. : 删除当前位置到下一个句号之间的所有内容
  • D: 删除当前光标位置到本行末的所有内容(对比上面的C,D不会进入插入模式)
  • J: 将上下两行合并(删除两行之间的换行符)

足够简单吧?

撤销与重做

如果一个编辑器连撤销和重做的功能都没有,你肯定不会用它。vim就像我们前面注意到的那样,尽其所能让我们更顺手地操作,撤销与重做也不例外。

  • u: 撤销上一个动作
  • Ctrl-r: 重做上一个动作

【注意:记得将CAPSLOCK键映射为Ctrl,这样你才能更方便快速的使用组合键。】

这两个动作都可以重复操作,你可以一直撤销啊撤销回到最初保存点,也可以一直重做啊重做到撤销前的状态。

重复动作

Vim所有命令中最强大的那个莫过于点命令,听起来有点奇怪是不是?解释一下,通过“.”这个小点可以让你做一些很棒的事情——重复之前你的任何一个操作。

使用“.”来重复上一次操作

你所做的许多操作可能都有重复的价值。比如进入插入模式添加一些文本内容。你只需执行一次,然后一直执行点命令来重复就可以了。请看下面的例子。

删除一个单词

dw

紧接着执行,再删除5个单词

5.

多么给力! 如果结合可视化模式,发挥的能力更让你大开眼界。

复制与粘贴

快速拷贝与粘贴文本同样也是文本编辑器的必备功能,vim当然也是这方面的高手。

【注意:除了点命令外,&也是一种强大的重复命令,用于重复ex模式下的上一条命令(还记得ex模式吗?)】

拷贝文本

Vim的拷贝与大家预期的方式可能略有不同。拷贝命令不是大家料想的c。不知你还记不记得,上文提到c表示“修改”,已经被占用了。Vim用拉取来表示拷贝,简写为y。

  • y: 拷贝选中内容
  • yy: 拷贝当前行

记住,这种拷贝动作与你熟悉的那种拷贝并无不同——你只是在目的处复制了一份而已。

剪切文本

剪切很简单:跟删除操作差不多。所以呢,剪切实质上就是将删除的内容挪到缓冲区,然后将这段删除的内容再粘贴就可以了。

粘贴文本

粘贴跟我们想的一样——使用p命令。所以呢,如果你执行dd命令删除了一行,你可以用p粘贴回去。

有一点要记住:粘贴的起始位置从你当前光标位置之后开始,根据你拷贝的内容,你要么粘贴字符或单词,要么粘贴行或列。如果想撤销粘贴,使用通用撤销命令“u”就可以了。

拷贝复制命令总结

  • 从当前行拷贝到下一个命令(名词)
  • 拷贝当前行的快捷键
  • 在当前光标所在行下一行黏贴拷贝或者删除的内容
  • 在当前光标所在行前一行黏贴拷贝或者删除的内容

交换两行的位置

ddp

使用这条命令可以很快速的交换两行的位置。第一部分删除你所在的行,第二部分将它粘贴回之前所在位置的下面。(ps:文章中用的是above,但是实际上拷贝回下方位置)

拼写检查

如果没有拼写检查的话,感觉会很糟糕,还好vim这方面做得很好。当然我们需要先在配置文件中配置拼写检查选项。

在~/.vimrc的某个位置中添加

找出拼写错误

如果在配置文件中设置了拼写检查的选项,那么拼错的单词会自动添加下划线。你也可以手动输入:set spell和:set nospell来启用或禁用。

不管怎么说,一旦开启了拼写检查,如果存在拼写错误的话,你就可以使用以下命令来跳转:

跳转到下一处拼写错误

]s

跳转到上一处拼写错误

[s

若光标处是错误单词,给出修改建议

z=

将识别的错误单词标记正确

zg

将vim视为正确的单词标记为错误单词

zw

我习惯在~/.vimrc中添加一些拼写相关的简写命令。首先就是让修正拼写错误的命令变得简单:

将拼写修正标记为<leader>f

在某些情况下,比如说我需要创造性的拼写一些单词时,我会使用下面的命令来取消拼写检查。想要重新打开拼写检查只要再执行一次这个命令就可以了。

Toggle spelling visuals with <leader>s

nnoremap <leader>s :set spell!

替换

Vim的另一个强大的功能是替换。命令分为三部分,首先指定将要被替换的字符串,之后是替换的新字符串,最后指定替换范围。

基本设置为:%s

将每行的foo替换为bar

:%s /foo/bar/g

将当前行中的foo替换为bar

:s /foo/bar/g

【注意: 两个命令的不同之处在于,单行替换s前少了%】

还有许多其他的选项,不过这些是最基本的。

PS: 前面&命令重复此类操作(:进入ex模式后执行的命令)

进阶

太棒了。我们已经讨论了大部分文本编辑器的基本功能,以及在vim中如何使用这些功能。现在可以进行高级vim的任务了——请注意,我说的高级进阶是对初学者而言,不是Kana这样的大神级人物。

重复操作

在稍早之前我们讨论了“.”点命令的重复功能。有些命令适合使用点命令来重复,有些则不适合,区分这两种命令很重要。

通常,如果你想要使用“.”(或者如Drew Neil称之为点命令)实现命令重复,说明你想用点命令缓存的命令来做比较细致的操作。

比如说你要向若干行行末添加一些内容,但是添加的前提是被添加的行包含指定的字符串。你可以使用如下方式来实现:

搜索字符串

/delinquent

现在,只要你按下“n”键都会跳转到下一个搜索到的实例。那么,从第一个匹配实例开始,我们给它追加文本。

在行末添加文本

A[DO NOT PAY] [Esc]

好,这条命令执行完成了。不过接下来还有12个地方需要你来做。点命令允许我们简单地重复执行上一条命令,而且我们还需要保存搜索结果,可以将这两条命令结合起来。

跳转到下一个匹配实例并向行末添加文本

n.

注意,这种方式将动作与缓存的命令结合起来,所以我们能按照预期地那样跳转并执行命令。

文本对象

文本对象很特殊。这些文本对象的存在使得你可以操作(动词)更加复杂的对象(名词)。比起选中某个单词并删除、跳转到句首并删除句子等简单操作来说,不管你在何种文本对象的区域内,你都可以对它们执行这些操作。

说是说不清,实践出真知嘛,我们可以看几个例子。

单词文本对象

首先来看基于单词的对象

  • iw : 单词内
  • aw :单词周围

这些都是目标(名词),所以我们可以对它们做一些操作,比如说删除、修改等等。

删除单词(包括单词周围的空格)

daw

【注意: 对象内部与对象周围这两者之间的区别在于单词旁边是否有空格】

句子文本对象

  • is: 句子内部
  • as: 句子周围

句子对象的工作原理与单词对象是一致的,想象一下,你敲了一大段句子,敲了一半后悔了想要删掉。你就可以简单的使用下面这条命令,而不用回到句子开头来申明删除整行。

修改整条句子

cis

这条命令杀伤力还是挺大的,它会删除整条句子并进入插入模式等待你输入新的内容。

更多对象类型

还有许多其他的对象类型,我只简单的来介绍一下。

  • 段落 : ip 和ap
  • 单引号 : i’和a’
  • 双引号: i”和 a”

当我编辑代码或者HTML文件时,时常会用到这些命令。关键是如果这些对象文本存在问题,你甚至并不需要处于这些对象内部就可以操作它们;如果光标当前位置在双引号外面(经测试,跟双引号处于同一行并在双引号前面),只需要输入ci”就可以删除双引号内部的所有内容,并将你挪到双引号中间进入插入模式等待你的输入。简直不要太酷。

对其他类型的某些对象同样适用,比如说各种括号(圆括号、尖括号、大括号)和标签(html)。

比如说编辑HTML链接时,URL地址一般在双引号之间,链接文本在标签中定义;通过vim这两条命令可以很方便地修改:ci”(修改URL)和cit(修改链接文本)。

文本对象总结

下面列出常见的文本对象:

  • 单词: iw 和 aw
  • 句子: is 和 as
  • 段落: ip 和 ap
  • 单引号: i’ 和 a’
  • 双引号: i” 和 a”
  • 反勾号 : i· 和 a
  • 圆括号: i( 和 a(
  • 方括号: i[ 和a[
  • 大括号: i{ 和a{
  • 标签: it 和at

总的来说,我使用最多的是单词,双引号和标签。

进入可视化模式

Vim的有许多迷人之处吸引着我们,不过它们相比较可视化模式的技能来说,还是太弱了。

也许可视化模式的最强大之处在于:我们前面学到的所有的一切命令,通过结合可视化模式使用,能力都会大有提升。这是由于在可视化模式下选中的高亮文本,可以全部作为命令的操作对象。

首先,学会进入可视化模式并选择文本。通过“v”进入可视化模式,有三种选择。

  • 基于字符选中: v
  • 基于行选中: V
  • 段落选中: Ctrl-v

在容器内部选中文本

有时候你会处于一段文本中,两头被,.({[之类的符号所包围。你可以使用下面的命令来选中这部分的内容:

选中圆括号中的内容

vi(

选中中括号之间的内容

vi[

你还可以加数字限定选择的层数(比如说你处于嵌套层)

选中两层大括号之间的所有内容

v2i{

【注意: 你也可以使用va来代替vi。请不要被这些迷惑。它们与我们所知的名词和动词没有什么不同】

基于字符的可视化选择

从基于字符的可视化开始介绍(从普通模式输入v进入可视化模式),在这种模式下你可以选中单个字符、多个字符、单词等等。相比较行选择模式来说,我比较少使用这种模式,不过只是相对而言,其实用的也还是挺多的。

这里最主要的是要理解这一点: 处于可视化模式中,你的移动动作会修改被高亮选择的文本。这就意味着,w或)之类的动作也会起作用,它们可以扩展当前高亮选择的范围。之后,这部分高亮文本就可以作为命令执行的目标。

基于行选择的可视化模式

普通模式下输入V进入这种模式,之后我们会讨论在这种模式下的操作。

基于列选择的可视化模式

可视化模式中还可以垂直地选择文本,这对操作列数据来说很给力。

可视化模式下对选中文本的执行动作

对这些文本做什么操作都是你的自由,不过最普遍的操作是删除、拷贝和粘贴。想一下你平常用鼠标选中一片文本会做什么操作?

进入可视化模式,选中两个以上单词并拷贝

vwwy

拷贝之后你可以在任何你希望的地方输入p来粘贴。

或者你可以做一些基于行的操作。

进入行选择模式,删除几行文本

Vjjd

你也可以使用文本对象,不过这种操作不太安全,最好别做。

可视化模式下选中一整个段落

vip

可视化模式下选中一整段文本并粘贴到当前段落之下。

vipyjjp

不要因为命令很长而感到崩溃。要记住,这些命令跟我们平常说话是一样的。你可以没有任何困难地、很随意地念叨:

我想去商店。

这条命令也是一样的:

拷贝这一段,下移两行,再粘贴。

将可视化模式与重复结合

可视化模式还有一个很神奇的地方,对于选中的文本,你可以通过点命令来执行之前缓存的命令。请看下面这个例子:

foo
bar
thing
other
yetanother
also

如果想在每行前面都加个冒号,可以现在第一行foo之前添加,然后可视化模式下选择之下所有行,执行点命令就可以了。

:foo
:bar
:thing
:other
:yetanother
:also

【注意:要想使用这个功能,必须要在配置文件中添加映射 vnoremap . :norm.<CR>】

BAM!

觉得这功能没有那么酷炫? 那就想象一下: 你有个六万行的文件,每行都与例子一样,需要追加个冒号。你会怎么做?

对整个文件添加分号

0i:j0vG.

wut

大大简化了我们的操作,大杀器一枚。步骤如下:

  1. 走到第一行行首并插入一个冒号(0i:)
  2. 走到下一行定位到行首位置(j0,注意之前是插入模式,需要先回到普通模式)
  3. 选中当前行到文件末尾的内容(vG)
  4. 给选中的内容添加冒号(.)

这样对六万行文件的操作就全部完成了。你甚至不需要去记一些乱七八糟的口诀——就像学骑单车会摔倒一样,摔着摔着你就会了。相信我。

使用宏

有些人会觉得宏很可怕,其实不然。宏只用来完成这样一件事: 记录你做的一切,在你需要的时候帮你再做一次。下面是一个简单总结:

  • qa: 开始记录接下来要执行的动作,并命名为a
  • q: 停止记录
  • @a :将宏代表的动作再执行一次

很简单啊是不是?你可以保存多个宏,比如说宏a、宏b、宏c等等。当你需要的时候执行@a或者@c之类的就可以了。

什么场景下使用宏?

你可能会问:

既然可视化模式与点命令的结合已经这么强大了,我们为什么还要使用宏呢?

问得好,不过答案挺复杂。宏可以做你所做的一切,来看看这样一个流程

  1. 在当前行搜索“widget”
  2. 找到最后一个匹配到的单词并添加–maker
  3. 走到行首并添加一个分号
  4. 走到行末再添加一个点号
  5. 如果行末有空格则删除

这么一堆工作,咱们还是假设文件有六万行,试着在Microsoft word之类的工具里完成这些操作,照样会让人感到万分痛苦。

不过在vim中,这都不算事儿,你只需要把这些动作都做一遍(recording模式下),然后对每一行重新执行宏就可以了。

【注意:如果想要对可视化选中文本执行宏的话,可以执行:normal @a(或者其他你所定义的宏的名字),这条命令会临时将你切换到普通模式,针对每一行执行宏命令】

技巧

下面我们来看一些大家经常问的一些问题,总结出来节约大家时间。

删除行末空格

根据打开文件的类型不同,可能需要你对回车符和换行符做一些处理。这里介绍如何删除行末那些烦人的Ctrl-M字符。

删除行末的Ctrl-M字符

:%s/s+$//

修改文件类型

set ft=unix

set ft=html

set ft=dos

【注意:如果要显示当前文件类型,在配置文件中添加:set filetype,或者在vim中直接执行这条命令就可以了】

包装文本

借用Surround插件,我们可以很

  • cs”‘: 将光标所在单词两边的双引号修改成单引号
  • cs’<q> :做同样的事,不同的是将单引号修改成<q>
  • ds” : 删除两边的的配对双引号
  • ysiw[ :在当前单词两边加上中括号
  • ysiw<em>: 给当前单词(其他文本对象也可)添加强调标签!!!知道我为什么这么激动吗?因为这个操作可以使用点命令来重复!
  • Visual Mode: 可视化模式下,选中任意文本,输入S。vim会带你跳转到窗口最底端。这时候你可以输入任何你想给这段文本打上的标签,比如说<a href=”/images”> ,回车试试?

总结

通过本教程我希望大家能明白以下两点:

  1. vim 是可以学会的
  2. vim 很强大

上面介绍的那些vim基础用法,即便你只喜欢其中一部分,我想可能也会加深你对编辑文本的热情——这可不是小事。你对操作的编辑器越熟练,思维也就越发散,我想这是堪比史诗级的大事了。

更为重要的是,这也是为什么要求你得精通你选择的编辑器。只有精通编辑器,不被编辑器的操作所阻滞,当你脑内思绪奔腾时,你才能激扬文字跟紧思绪跳跃的步伐。

或者,你也可以将这一切都抛开,成为那些被人所取笑的人——不管怎样,我希望本教程能对你有用。

【如果你喜欢这篇文章,可以去我的地盘看看其他技术指导文章】

引用

  1. 推荐大家阅读Drew Neil的这本书《Practical Vim: Edit Text at the Speed of Thought》这是vim爱好者必备书籍。
  2. 强烈推荐《Your Problem with vim is that you don’t grok vi》,它不光对vim一般用法做了非凡概述,还介绍了一些漂亮的vim技巧。
  3. 如果你还没看过Steve Losh的《Coming Home to Vim》,强烈推荐。
  4. 一定要去看看 Kana 大神的《True Power of Vim》。
  5. 另外还有Drew的 Vimcasts.org. 这两者都从实际操作角度让你认识到vim的强大。
  6. 如果想要vim简明命令资源,下载 Vim Quick Reference
  7. 当然不要忘了 Vim Wiki,这也是学习vim的重要资源。
  8. 如果你对vimscript感兴趣, 一定去看看Steve Losh的《Learn Vimscript the Hard Way》。这是迄今为止关于vimscript的最好学习资料。
  9. 还有Openvim的《This is a really well done interactive tutorial》。
  10. The help 非常棒,不过内容有点多,如果你真的非常想要学好Vim的话,那么一定要从头到尾通读。
  11. 本文文字及图片出自 伯乐在线

余下全文(1/3)
分享这篇文章:

请关注我们:

共有 1 条讨论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注