Vim解决问题的方式

Tip1:Meet the Dot Command

结识 . 命令

. 命令可以重复上次的修改, Vim 中最为强大的多面手。

每次我们进入插入模式时,就会形成一次修改。从进入插入模式的那一刻起,直到返回普通模式, Vim 会记录每一个按键操作。做出这样一个修改后再用 . 命令的话,它将会重新执行所有这些按键操作 。

Tip2: Don’t Repeat Yourself

不要自我重复,不少vim命令是两个甚至多个命令的组合

例如:

行移动:

  • $: 将光标移动到当前行的行尾

  • 0: 将光标移动到当前行的行首

  • ^: 将光标移动到当前行的第一个非空字符(行首和当前行非空字符不是一个位置)

文本操作:

  • i: 在当前光标的前面插入字符

  • a: 在当前光标的后面追加字符

  • o: 在当前光标的下一行行首插入字符

  • I: 在一行的开头添加文本

  • A: 在一行的结尾处添加文本

  • O: 在光标当前行的上一行插入文本

  • s: 删除当前光标处的字符并进入到插入模式

  • S: 删除光标所在处的行,并进入到插入模式

  • u: 撤销修改

  • c or C : 表示修改当前行上光标后面的部分. 进入编辑状态.

Tip4 Act, Repeat, Reverse

执行、重复、回退

在面对重复性工作时,我们需要让移动动作和修改都能够重复,这样就可以达到 一个最佳编辑模式。 Vim会记住我们的操作,使最常见的操作触手可及。

​ . 命令会重复上次修改。@: 可以用来重复任意 Ex 命令,或者我们也可以输入 &来重复上次的:substitute命令(它本身也是一条 Ex 命令)。

​ 当 Vim 让一个操作或移动可以很方便地重复时,它总是会提供某种方式,让我们在不小心做过头时能回退回来。

对 . 命令而言,我们永远可以按 u 键撤销上次的修改。如果在使用 f{char} 命令后,不小心按了太多次 ; 键,就会偏离我们的目标。不过我们可以再按 , 键跳回去,这个命令会反方向查找上次 f{char}所查找的字符。

目的 操作 重复 回退
做出一个修改 {edit} . u
在行内查找下一个指定字符 f{char}/t{char} ; ,
在行内查找上一个指定字符 F{char}/T{char} ; ,
在文档中查找下一个匹配项 /pattern n N
在文档中查找上一个匹配项 ?pattern n N
执行替换 :/s/target/replacement & u
执行一系列修改 qx{changes}q @x u

Tip5 Find and Replace by Hand

查找并手动替换

一般的查找替换命令:%s/content/copy/g(以copy替换所有行中的content)。

偷懒方法:无需输入就可进行查找。* 命令。

把光标移动到content单词上,然后用 * 命令对他进行查找。

这会产生两个结果:

  • 一是光标会跳到下一个匹配项
  • 二是所有出现这个词的地方都会被高亮显示。

执行一次查找后,只需按 n 键就可以跳转到下一个匹配项。使修改可重复

Tip7 Pause with Your Brush Off the Page

停顿时请移开画笔

​ 插入模式专注于文本修改,停顿时进入普通模式。

Tip8 Chunk Your Undos

大步撤销,把撤销单元切成块

u键会撤销最新的修改。一次修改可以是改变文档内文本的任意操作,其中包括在普通模式、可视模式以及命令行模式中触发的命令。

在vim中,可以控制撤销的力度。从进入插入模式开始到返回普通模式,在期间插入或删除任何内容都会被当成一次修改。因此,只要控制对<Esc>键的使用就可以使撤销作用于句子、段落或单词。

注:在插入模式中,使用<up> <Down> <Left> <Right>移动光标会重置修改状态,将会产生一个新的撤销块。

Tip9 Compose Repeatable Changes

构造可重复的修改

配合 . 命令选择最优的方案

以删除一个单词为例:

  • 反向删除 dbx

  • 正向删除 bdw

  • 删除整个单词 daw

命令有助于 . 命令发挥最大威力。反向删除 . == x ; 正向删除 . == dx; 删除整个单词 . == daw

Tip11 Don’t Count If You Can Repeat

能重复,就不要用数数

以删除5个单词为例,有两种风格:

  • 次数风格(d5w)
  • 重复风格(dw….)

对于两种风格的使用存在争议,各有优缺,作者鼓励重复风格,数完估计都操作完了。应用过程中由程序员自由选。

Tip12 Combine and Conquer

动作组合

在Vim 中,操作符 + 动作命令 = 操作

d{motion} 命令可以对一个字符 dl、一个完整单词 daw或一整个段落 dap 进行删除操作,它作用的范围由动作命令决定。 c{motion}y{motion}以及其他一些命令 也类似,它们被统称为操作符operator

g~、 gu 和 gU 命令要用两次按键来调用,我们可以把上述命令中的 g 当做一个 前缀字符,用以改变其后面的按键行为。

学习新的动作命令及操作符,就像是在学习 Vim 的词汇一样。如果掌握了这一简单的语法规则,在词汇量增长时,就能表达更多的想法。用 daw 删除一个单词,然后又学到 gU 命令。它也是个操作符,所以我们可以用 gUaw 把当前单词转换成大写形式。进一步扩充,学会了作用于段落的 ap 动作命令,就会发现我们可以进行两个新的操作:用 dap 删除整个段落,或者用 gUap 把整段文字转换为大写。

常见VIM操作符命令

命令 用途
c 修改
d 删除
y 复制到寄存器
g~ 反转大小写
gu 转换为小写
gU 转换为大写
> 增加缩进
< 减小缩进
= 自动缩进
! 使用外部程序过滤{motion}所跨越的行