Vim实用技巧_1.vim解决问题的方式

技巧001:结识.命令

. 命令可以让我们重复上次的修改,它是 Vim 中最为强大的多面手

Vim 文档只是简单地提到 . 命令会重复上次修改(参见 :h .),"上次修改"可以指很多东西,一次修改的单位可以是字符、整行,甚至是整个文件

  • 1.普通模式
# x 命令会删除光标下的字符
# dd 命令也做删除操作,但它会把整行一起删掉
# >G 命令会增加从当前行到文档末尾处的缩进层级

使用.的效果截图

在这里插入图片描述

  • 2.命令模式

示例:从进入插入模式的那一刻(包括进入的按键也会记录,例如,输入 i),直到返回普通模式时为(输入<Esc>),Vim 会记录每一个按键操作

做出这样一个修改后,再用 . 命令的话,它将会重新执行所有这些按键操作

  • 3..命令是一个微观的宏

Vim 可以录制任意数目的按键操作,然后在以后重复执行它们;我们可以把 . 命令当成一个很小的宏(macro);第11章会有宏的详细介绍

技巧002:不要自我重复

对于行尾添加内容这样的常见操作,如添加分号,Vim 提供了一个专门的命令,可把两步操作合并为一步

示例:一共有3行,想在每行的结尾添加一个分号

var foo = 1 
var bar = 'a' 
var foobar = foo + bar
  • 1.常规操作

先得把光标移到行尾($),接着就可以执行 a;<Esc> 完成修改了;对另外2行执行同样的操作

  • 2..思路

由于 . 命令可以重复上次的修改,因此对另外2行直接执行j$.即可

# j 命令使光标下移一行
# $ 命令把光标移到行尾
# 一个键(`.`)顶 3 个(`a;<Esc>`)
  • 3.优化思路
# a 命令在当前 光标之后 添加内容
# A 命令则在当前 行的结尾 添加内容

不管光标当前处于什么位置,输入 A 都会进入插入模式,并把光标移到行尾;换句话说,A$a 封装成了一个按键操作;优化后操作如下:

在这里插入图片描述

从普通模式切换到插入模式的等价命令整理如下

复合命令等效命令说明
Cc$C:删除光标位置到行尾,且开始插入
c{motion}:删除{motion}文本(即重复删除多个数据),且开始插入
示例:cgg,删除当前行到行首所有,c$,删除光标位置到行尾
scls:删除字符,且开始开始插入
S^c^:行首的第一个非空字符字符;0:行首;$:行尾
I^i
A$a本技巧中的示例
oA<CR>
Oko

技巧003:以退为进

我们可以用一种常用的 Vim 操作习惯在一个字符前后各添加一个空格。乍一看,这种方法有点古怪,不过其好处是可重复,这将使我们可以事半功倍地完成工作

示例:在加号左右加上空格(实现思路:用s␣+␣,<Esc>替换掉加号

在这里插入图片描述

key1:定位到特定字符

  • 1.定位:f{char} 命令让 Vim 查找下一处指定字符出现的位置,如果找到了,就直接把光标移到那里(参见 :h f )。因此,当我们输入 f+ 时,光标会直接移到下一个 + 号所在的位置

  • 2.下一个:; 命令会重复查找上次 f 命令所查找的字符(上一个用,

key2:.命令记录修改并执行

思路:先将加号删除掉,在用的形式替换加号,然后将这个操作用点号.记录下来

  • 1.s命令,把两个操作合并为一个:它先删除光标下的字符,然后进入插入模式
  • 2.在删除 + 号后,我们先输入␣+␣表示空格),然后退出插入模式

技巧004:执行、重复、回退

在面对重复性工作时,我们需要让移动和修改都能够重复,这样就可以达到一个最佳编辑模式

本节将介绍 Vim 可以重复执行的每个操作,并学习如何回退这些命令

vim 中可重复执行的命令,以及相应的回退方式。在多数场景中,撤销(undo)都是我们想要使用的命令

在这里插入图片描述

扩展:你是否曾经使用过撤销命令(u),然后紧接着又重做(<C-r>)呢?

这两条命令的结果会相互抵消,不过却会带来一个副作用,即最终光标会停留在上次修改过的地方;
但是这也有一个额外效果:最终光标会停留在上次修改过的地方

技巧005:查找并手动替换

Vim 提供了一个:substitute 命令专门用于查找替换任务,不过用上面介绍的技术,我们也可以手动修改第一处地方,然后再一个个地查找替换其他匹配项。

. 命令可以把我们从繁重的工作中解放出来,而即将登场的另一个有用的单键命令,则能够让我们方便地在匹配项间跳转

示例:用单词“copy”(意义同“copywriting”)来替代“content”,即第二行不替换

...We're waiting for content before the site can go live... 
...If you are content with this, let's go ahead with it... #这个content不进行替换
...We'll launch as soon as we have the content...

常规思路

:%s/content/copy/gc,查找字符,然后替换

  • 1.第一个被替换的要输入y,然后<Esc>,此时.命令记录了替换动作
  • 2.后面的只需要用n找到替换的字符,然后输入.命令即可

偷懒:无需输入进行查找

简单地把光标移到这个单词上,然后按 * 键,操作示例

在这里插入图片描述

操作解释

  • * 键会产生两个结果:一是光标会跳到下一个匹配项上,二是所有出现这个词的地方都会被高亮显示出来(没有高亮,试着运行一下 :set hls
# 使用 * 或者 # 命令时,这两条查找命令分别用于 正向 或 反向 查找光标下的单词
  • n 键:可以跳到下一个匹配项

  • cwcopy<Esc> :当光标位于“content”的开头时,我们就可以着手修改它。两步操作:首先要删除单词“content”,然后输入替代的单词

# 说明:cw 命令会删除从光标位置到单词结尾间的字符,并进入插入模式,接下来我们就可以输入单词“copy”了
  • .命令:Vim 会把离开插入模式之前的全部按键操作都记录下来,因此整个 cwcopy<Esc> 会被当成一个修改

重复替换建议:在按了 n 之后,要审视一下当前的匹配项,然后决定是否把它改为“copy”。如果需要修改的话,就按 . 命令,反之则不用

技巧006:结识 . 范式

本节,我们将对上面技巧进行比较,并找出它们共有的模式:一个我称之为 . 范式的最佳编辑模式

回顾前面 3 个 . 命令编辑任务

技巧 2

  • 1.想在一系列行的结尾添加分号。我们先用 A;<Esc> 修改了第一行,做完这步准备后,就可以使用 . 命令对后续行重复此修改

  • 2.使用了 j 命令在行间移动,要完成剩余的修改,只需简单地按足够多次 j. 就可以了

技巧 3

  • 1.想为每个 + 号的前后各添加一个空格。我们先用 f+ 命令跳到目标字符上,然后用 s 命令把一个字符替换成 3 个

  • 2.做完这步准备后,我们就可以按若干次 ;. 完成此任务。

技巧 5

  • 1.想把每处出现单词“content”的地方都替换成“copy”。我们使用 * 命令来查找目标单词,然后用 cw 命令修改第一处地方

  • 2.做完这步准备后,就可以用 n 键跳到下一匹配项,然后用 . 键做相同的修改。要完成这项任务,只需简单地按足够多次 n. 就行了

总结:用一键移动,另一键执行(把它叫做“. 范式”)

参考

  • 《Vim实用技巧》,书籍写的很好,强烈建议读一读
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值