进阶我的Vim

这两天做了一个很繁琐的需求,简单的来说,就是把一个产品配置的复杂的excel表,转入为json, 然后再用 javascript 脚本拼接为对应 php 页面可执行代码。繁琐的是配置多且杂,并且产品的归类excel 转换为的 json 并不可用。于是我还需要在他们的excel表里,进行更改。其实这个工作应该做一个配置台,让产品去维护。 以后就不用开发手动维护这个配置表。

总之是提前做完了,虽然做的过程中, 不是怀着非常愉快的心情做的。晚上剩了点多的时间,把 vim 稍微进阶了一点。以前的基本命令都已经熟练使用了。现在总结下用的不是很熟的几个地方。


几个还没有用熟练的指令

cw 替换从光标所在位置后到一个单词结尾的字符, 不同于a,i,o哦。

0,$,^,g_ 的区别和联系。0,$是到行头和行尾,^,g_到非blank字符位置。

ctrl+ru, 因为 WebStorm 里这些都还可以用以前的 ctrl+z 之类的执行。所以这两个命令有点被我忽略了。其实应该改过来。

w 到下一个单词的开头。e 到下一个单词的结尾。如果你认为单词是由blank字符分隔符,那么你需要使用大写的E和W。


查找超能力

  1. fa 到下一个为a的字符处,你也可以fs到下一个为s的字符。
  2. t, 到逗号前的第一个字符。逗号可以变成其它字符。
  3. 3fa 在当前行查找第三个出现的a。
  4. F和Tf和t 一样,只不过是相反方向。
  5. /pattern 搜索 pattern 的字符串, 如果又多个,按n到下一个。
  6. t, 到逗号前的第一个字符。逗号可以变成其它字符。
  7. dt. 删除当前字符到.为止的所有内容。

注意补充下normal模式下按/即可进入查找模式, n为下一个,N为上一个。如果是 /singer\c代表查找singer,并且大小写不敏感。因为默认情况下,它是大小写敏感的。相应的,\C代表大小写敏感。

你还可以在此模式下加入正则表达式,比如/inger$ ,这时以inger结尾的都会被查出来。

normal模式下的查找,还可以使用直接按*,来查找当前光标所在的单词。这时候的查找的单词前后都是空白字符或者标点符号。例如当前为foo, 可以匹配foo bar中的foo,但不可匹配foobar中的foo经常用于查找函数。如果想要包含关系,使用g*即可。


替换能力

刚刚提到了查找的能力,normal下使用/即可进入查找模式。替换模式则是使用:s。具体情况如下:

1
:{作用范围}s/{目标}/{替换}/{替换标志}

:%s/singer/author/g会在全局范围(%)查找singer并替换为author,所有出现都会被替换(g)。如果使用:s/singer/author则只会在当前行替换一个。

这里的作用范围可以总结如下:

  1. %全文查找, 如 :%s/singer/author/g
  2. 不填写默认当前行,如:s/singer/author/g
  3. :5,12s/singer/author/g, 第5-12行
  4. :.,+2s/singer/author/g, 当前行和接下来的2行。 注意.是当前行, ,是分隔符
  5. :’<,’>s/singer/author/g把选区内的内容替换。注意下:在Visual模式下选择区域后输入:,Vim即可自动补全为 :'<,'>。WebStorm也会做同样的事情。

这里的替换标识可以总结如下代表:

  1. %s/singer/author, 空标识表示:只替换从光标位置开始,目标的第一次出现
  2. %s/singer/author/g, global 表示全局
  3. i表示大小写不敏感查找,I表示大小写敏感
  4. :%s/singer/author/gc c表示全局查找后替换需要被确认。它可能会弹出一句:Replace with author ? (y/n/…)之类的东西。

区域选则 <action>a<object>以及 <action>i<object>

其实这个我已经很熟了,今天看到了别人的总结(注:下面的这段为引用内容,引用地址为:coolshell)。

action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。

object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:"、 '、 )、 }、 ]。

a和i的区别也很好分。i不包括,a包括了。看下面这个例子。

假设你有一个字符串 (map (+) ("foo")).而光标键在第一个 o 的位置。

  • vi" → 会选择 foo.
  • va" → 会选择 "foo".
  • vi) → 会选择 "foo".
  • va) → 会选择("foo").
  • v2i) → 会选择 map (+) ("foo")
  • v2a) → 会选择 (map (+) ("foo"))

VIM 的Visual模式

vim 分为3中 visual 模式,分别是:

Visual 默认模式:

normal 下 ,按 v 进入 visual 默认模式。这个模式下可以 hjkl 进行各种上下移动。选中文本后,可以进行 y,d,p,^,$等操作。

Visual Line 模式

normal下,按 V 进入 visual line模式。 使用 j/k键可以选中一行或者多行。进行正行操作。

Visual Block 模式

按住 ctrl + v, 进入 visual block模式。此模式下,选中想要选中的内容(可以结合$^)。选中后,输入I,i,A,a,C,c等操作,输入想要输入的内容。再按下Esc键,即可全部行都有填入的内容。类似于 sublime。

注意 I,A,C 的区别,就跟他们原来的意思一样,比如I,A是插入,只是插入的地方可能不同。C是替换。

比如Ctrl+v jj$到每一行行末,再I,填入;,就可以几行一起填分好了。

Visual Block 模式下,还可以做下面这些事情

  • 可以结合<>进行移动。
  • 使用J把选中的行连接起来变成 一行。
  • 使用=自动给缩进。

这些功能都很好用。


总结

这里面的东西,有些大多我都用过,也知道。但是每次去用的时候有时候还要再去查下命令。怪不好的。总结下,以后忘记了就在博客里翻翻吧。开心。