Vim 实用技巧(持续更新中!)

Vim 实用技巧(持续更新中!)

转载请注明出处:https://blog.csdn.net/jpch89/article/details/85273813
最后更新于:2018.12.31



1. 认识 . 命令

. 命令作用

  • 重复上次修改。(参见 :h .

应用举例

  • x 命令会 删除光标下的字符,使用 . 会让 重复删除光标下的字符
    多次输入 u 撤销上述修改。

  • dd 命令删除一整行,使用 . 命令会 重复删除当前行

  • >G 增加从当前行到文档末尾处的缩进层级,使用 . 会重复该操作。

  • 每次 i 进入插入模式的那一刻,到返回普通模式为止, Vim 会记录每一个按键操作,做出这样一个修改再用 . 命令,它会重新执行所有这些按键操作。

. 命令是一个微型的宏 macro


2. 不要自我重复

var foo = 1
var bar = 'a'
var foobar = foo + bar

在行尾添加分号:

  • $ 移动到行尾,然后 a 编辑,输入分号,Esc 完成修改
  • 对剩下的两行可以使用两次 j$.
  • . 意味着 a;<Esc>,一个键顶三个键

有没有改进的余地?

  • 可以使用 A 代替 $aA$a 封装成了一个按键操作。
  • 然后输入分号,按 Esc
  • 之后就可以使用 j. 来重复操作了。

一箭双雕

复合命令 等效的长命令 作用
C c$ 删除到行尾并进入插入模式
s cl 删除当前字符并进入插入模式
S ^C 删除当前行内容并进入插入模式

3. 以退为进

需求:把 JavaScript 的字符串拼接的加号前后都加上空格。

var foo = "method("+argument1+","+argument2+")";

要改成:

var foo = "method(" + argument1 + "," + argument2 + ")";
  • f+ 查找加号
    注:f{char} 查找下一处指定字符出现的位置
  • s空格+空格<Esc> 进行修改
  • ; 重复查找上次 f 查找的字符
  • . 重复上次修改
  • ;.
  • ;.

注意:不用输入 4f+,用 ; 重复查找即可。

;. 重复查找 + 重复修改


4. 执行、重复、回退

重复很有用,但有时候多次按 . 或者 ; 的时候,容易出现多按的错误。

  • 如果多按了 . 可以使用 u 撤销上次修改。
  • 如果多按了 ; 可以使用 , 跳转回去,因为 , 会反向查找上次 f{char} 所查找的字符
目的 操作 重复 回退
做出一个修改 {修改} . u
在行内查找下一指定字符 f{字符} / t{字符} ; ,
在行内查找上一指定字符 F{字符} / T{字符} ; ,
在文档中查找下一处匹配项 /pattern回车 n N
在文档中查找上一处匹配项 ?pattern回车 n N
执行替换 :s/target/replacement & u
执行一系列修改 qx{修改}q @x u

注意:t{字符} 的在查找的字符前面停下来,而 T{字符} 在查找的字符后面停下来。


5. 查找并手动替换

需求
把文本中的 content 替换成 copy

...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...

:substitute 命令专门用于查找替换任务。

偷懒的办法:无需输入就可以进行查找
作者云:. 命令是我最喜爱的 Vim 单键命令,排在第二的是 * 命令,此命令 可以查找当前光标下的单词

  1. /content:查找到 content 单词
    或者直接把光标移动到这个单词上
  2. *:查找该单词
  3. cwcopy<Esc>:修改 contentcopy
  4. n:找到下一个
  5. .:重复修改
  6. n.n.n.:完成所有修改
  7. 如果不想修改,不按 . 直接按 n 跳转到下一个即可

移动光标到 content 上,然后按 *,会产生两个结果:

  • 光标跳到下一个匹配项上
  • 所有出现这个词的地方都被高亮显示
    如果没有高亮,试着运行 :set hls

6. 认识 . 范式

. 范式是最理想的编辑模式,用一键移动,另一键执行。

  • 只需要按一次键就能把光标移到下一个目标上
  • 都利用 . 命令重复上次修改

普通模式 normal modeVim 的默认状态。

7. 停顿时请移开画笔

画家在休息时不会把画笔放在画布上。
普通模式就是 Vim 的自然放松状态,其名字已经寓示了这一点。


8. 把撤销单元切成块

u 键会触发撤销命令,它会撤销最新的修改。
Vim 中,我们自己可以控制撤销命令的粒度。
从进入插入模式开始,直到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。
因此,只要控制好 <Esc> 键的使用,就可使撤销命令作用于单词、句子或段落。

多久离开一次插入模式?
作者喜欢让每个 “可撤销块” 对应一次思考过程。
不管停顿的时间有多短,每次停顿都是一个自然的中断点,提示作者该退出插入模式了。

当处于插入模式中,另起一行最快的方式是按 <CR>
但是有时作者更喜欢按 <Esc>o,这是因为作者有预感,也许在撤销时作者想拥有更细的粒度。

一般来讲,如果你停顿的时间长到足以问 “我应该退出插入模式吗?” 这个问题,就退出吧。

在插入模式中使用方向键移动光标会重置修改状态
如果在插入模式中使用了 <Up><Down><Left><Right> 这些光标键,将会产生一个新的撤销快。
你可以把这想象为先切换回普通模式,然后用 hjkl 命令对光标进行了移动,但是没有退出插入模式。
这会对 . 命令的操作产生影响。


9. 构造可重复的修改

Vim 中,评估哪种方式最好时,最显而易见的指标是效率,即哪种手段需要的按键次数最少(又名 VimGolf)。
VimGolf http://vimgolf.com/

然而在平局时如何选择胜者呢?

需求
The end is nigh
光标位于 h,现在要删除单词 nigh

反向删除Vim 高尔夫得分 3

  • db 删除从光标起始位置到单词开头的内容
  • x 删除 h

正向删除Vim 高尔夫得分 3

  • b 移动到单词开头
  • dw 删除整个单词

删除整个单词Vim 高尔夫得分 3
使用 aw 文本对象 text object

  • daw 删除一个单词(可以解读为 delete a word

决胜局:哪种方式最具重复性?
看哪种方式可以发挥 . 命令的最大威力。
反向删除 . == x
正向删除 . == dw
删除整个单词 . == daw
所以 daw 胜出!

猜你喜欢

转载自blog.csdn.net/jpch89/article/details/85273813