vim 快速光标跳转

vim 被誉为编辑器之神, 通过让程序员完全脱离鼠标, 将双手保留在键盘的主键盘区, 甚至不用移动到键盘的数字区, 提高编程效率

可能很多人已经会使用vim最基本的操作了, 如基本的hljk的移动, ia 插入, 但更多的时候, 还是最基本的移动和插入编辑, 效率甚至不如普通的文本编辑器, 糟蹋了vim的很多特性

以下, 是在平常使用中, 能够提高vim效率的一些常用快速跳转定位光标的实践技巧, 希望能提升各位在使用vim时的信心和兴趣

基本的光标移动使用jljk 这几个键, 但这种方式在大范围定位光标时还是太慢了, 甚至还有仍然使用方向键的, 从问价第一行, 移动到最后一行, 按住一个键, 等半天, 岂可忍?

以下的操作均在正常模式

文件内光标跳转

文件首行定位

不论我们在文件的什么位置, 快速双击g 键(即gg), 即可直接定位到文件首行, 如下

文件结尾定位

不论我们在文件的什么位置, shift+g 键(即G), 即可直接定位到文件结尾, 如下

指定文件行号的定位

如果想跳到文件指定的行, 有两种方式

  1. <line>gg, <line> 位置填充行号, 即可跳转到文件第line行
  2. <line>G, 即可跳转到文件第line行

如下

还有一种在命令行模式下的文件行号定位, 上面两种足够用了, 后续再补充

当前文件行后指定行数的定位

比如我当前处在文件第56行, 我想定位到当前行后的第4行

4j 即可将光标向后定位4行

同理, 如果要往前定位4行

4k 即可

屏幕内行跳转

屏幕首行定位

如果我们想定位光标到屏幕的首行, 注意, 不是文件, 是可视的屏幕的首行, 该怎么做呢

使用shift + h, 即H

屏幕中间定位

使用shft + mM 即可快速定位光标到屏幕的中间一行

屏幕底部定位

使用shift + lL 即可快速定位到屏幕底部

指定屏幕行号定位

如果我想定位光标到当前屏幕内容的第3行(从屏幕顶部往下数第3行), 如何定位呢

<line>H, 通过这种方式即可

屏幕倒数几行定位

如果我想定位光标到当前屏幕内容的导入第3行(从屏幕底部往上数3行), 如何定位

<line>L, 即可

当前屏幕行后指定行号定位

假如有一段文字很长, 在文件中虽然是作为一行, 但屏幕中会以多行的形式展示出来,

如下,

可以看出来, 464行是一串很长的文字, 展示时被vim自动换行展示了

我想从1位置直接跳到HTTP(S)位置2的位置, 通过<line>j 不好使了

正确的方法是5gj, 如下

同理, 往前跳转是5gk, 如下

单行内跳转

单个字符光标定位

基本的字符左右移动光标我们都知道, hl(跟我读哎偶), 无他

基于多个字符的光标定位

如果我想将光标向后移动15个字符该怎么移动呢

15l即可, 如下,

向前呢? 15h

基于单个单词定位光标

常用的单词跳转有w, e, b, 区别是什么呢

w 是向后跳转到下个单词的首个字母的位置

b 是向前跳转到上个单词的首个字母的位置

e 是向后跳转到下个单词的词尾的字母的位置

没有直接向前跳转到上个单词词尾字母位置的跳转, 不过可以通过ge实现该跳转,

如下

基于多个单词定位光标

如果想向后跳转3个单词的位置, 该怎么跳转呢

3w 即可实现向后跳转3个单词, 并定位到最后一个单词的首字母的位置, 如下

同理 3b, 3e, 3ge 可以向前或向后跳转到对应单词的起始位置或结束位置, 各位自己试试感受一下吧

基于字串的跳转

字串和单词的区别在于, 一个单词由字母, 数字, 下划线或其他非空白字符的序列组成, 单词间以字符分隔(参见 :h word), 而字串的定义更简单, 他由非空白字符序列组成, 字串之间以空白字符分隔

比如(用[]表示空格)

sha-1,[]sha-224,[]sha-256,[]sha-384[]and[]sha-512

sha是作为单词存在的, sha-1 是作为字串存在的(因为之间用空格隔开了)

如何基于字串跳转呢

W, E, B即可, 没错, 就是w, e, b的大写形式, 至于分别跳转到什么位置, 参考web的跳转吧(gE 的行为同样可以参考ge哦)

如下

基于某个字符跳转

在一行内, 我们如果通过某个单字符快速定位,

比如下面
The WebSocket server embedded in aria2 implements the specification, 我们想快速定位到aria这个单词的位置

直观可以看到, aria 在一个2的旁边, 而且这一行只有这一个2, 如果直接定位到2, 也就能直接定位到aria

通过f<char>我们可以在行内向后搜索字符<char>, 如下

如果一行内有数个数量较少的独特单字符, 如果重复向后检索呢:

在使用f<char>检索<char>后, 在用;(分号)即可继续向后检索, 用,(逗号)即可向前检索, 如下

如果我们的光标已经在一行的结尾了, 如果直接在改行向前检索呢, 也简单, F<char> 即可, 同样可以使用;, 控制重复检索的方向

或许有同学听过说t<char> 也可以实现类似的行内检索,

没错, t<char>的行为与f<char>行为类似, 但检索后的光标定位的位置有区别,

t<char> 是定位到<char>前面一个字符的位置, 而f<char>是跳转到<char>所在位置 如下

行尾跳转

如何直接跳转到行尾呢,

$(跟我读刀勒), 如下

行首跳转

这里的行首有两种情况, 如下

[]表示空格

[][][][]print(`hello world`)

跳转到第一个非空字符

即直接跳转到printp, 这时用^(我也不知道读什么...), 见下图(跳转到行首所在图)

跳转到行首(不区分空字符)

即跳转到第一个字符的位置, 即便是一个空格, 这里用0(是个, 不是啊), 如下图

总结

以上是vim中常用的快速跳转和光标定位的方法, 大家别再按着一个hjkl 跑啦, 更别再用方向键啊

跟着光标, 在vim里飞来飞去吧(两只小蜜蜂啊, 在花丛中啊, 左飞飞, 右飞飞, 上飞飞, 下飞飞.......)

right