Vi 中的光标操作是其他众多命令,如(d-delete, c-change, yy) 的基础。它犹如汇编中的寄存器/寻址方式,成为了许多 Vi 的初学者望而却步的一主要原因,特别是在某些系统版本的 Vi 中无法正常使用方向键移动光标的情况。那么好的习惯还是请试着用 h, j, k, l 来当方向键,对于键盘控来说,把手从字母上移动到方向键上去都是在浪费时间。
本来是想直接记录一下在 Vi 中怎么进行删除、修改操作的,然而却发现 Vi 的光标操作是无法逾越的一道沟。在这里,我会试着去理解每一个按键的更自然的意义,现在开始拉清单
k h l j |
k: 上,h: 左, l: 下, j: 右。也不知道为何选择右手横向上的 h, j, l, j 来分别表示 左右上下, 取键盘上的 ijkl 还好理解。总之适应这个方向的节奏。 |
h, j, k, l | (May 11, 2017), Vi 用过一段时间后,再回味方向键的设计。h 和 l 分列两边,代表左和右,这个好理解; j 最常用,右食指的本位,余下 k 键向上。顺序依次是 左,下,上,右 |
w | 以字(单词)为单位向右移动光标, 可以理解为 word。光标停在下一个字的结尾 |
b | 与 w 相反,按字向左移动。光标停在上一个字的开始 |
^ | 光标移到当前行首(第一个非空字符上),这个好理解,正则表达式就是。数字 0 也一样的效果 |
$ | 光标移到当前行尾,这也是正则表达式的用法。如果最后一个是空格也要跳上去 |
g_ | 光标移到当前行最后一个非空字符上 |
% | 光标跳到与当前括号相匹配的括号,对花括号,中括号,圆括号都有效 |
( 或 ) | 当前的句子的开头或末尾 |
{ 或 } | 当前段落的开头或末尾 |
G | 光标移到最后一行的行首,G 是行的跳跃操作。也可用命令 :$ |
nG | 光标移到第 n 行的行首, 所以移到第一行的行首就用 1G,或 gg。也可用命令 :n, 如 :2 回车跳到第二行 |
/p | p 表示模式, 向后查找。回车后光标跳到第一个匹配到的位置上,n 跳到下一个匹配处 |
?p | 与上类似,只不过是向前查找。之所以把模式查找放到移动光标的内容中,是因为它的重要性,可以让你快速准确的跳到想要位置,在删除或修改时配合 / ? s 就更妙了 |
我想,大部分 Vi 内置命令都支持数字加命令的操作,同样对于上面可被量化的移动操作,可以在前面加个数字来进行重复操作,它们包括 k, h, l, j, w, b, ^, $ 和 G。
举例来说
10k 光标向上移十行,保持在纵向相同的位置上
3w 光标向后移动三个字,停在第三个字的结尾
5$ 光标跳到从当前行算起第 5 行的行尾,所以 1$ 与 $ 是一个效果。因为 $ 是指行尾,所以自然是向下移的趋势。
2^ 光标跳到从当前行算起第 2 行的行首,1^ 与 $ 也是一个效果
nG 的操作前面表格中有提到。
这里的数字都必须写在命令的前面,即 10G,不能写成 G10
有了这篇的铺垫,接下来可以步入 dw, d2w, 2dw, d/abc, c3w 这样的操作。
参考:1. http://lxs647.iteye.com/blog/1245948
2. http://www.cs.colostate.edu/helpdocs/vi.html
3. 技巧:快速提高 Vi/Vim 使用效率的原则与途径
4. 每日一Vi
本文链接 https://yanbin.blog/vi-cursor-location-move/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。