最初使用Vim时,初学者经常会感到不适应,因为它的移动方式和一般的编辑器差别很大。但是Vim的魅力就在于,当你学会Vim的移动方式后,你能迅速的把光标移动到你想要的位置。

本文介绍Vim中的移动方式:Vim中熟练的移动并不是指用hjkl移动,当你越熟练的掌握vim的移动方式,你会越少的使用hjkl移动方式。

hjkl are the tip of the top of the iceberg and very rarely used, at least in my case.


1、行内移动

Test: This is a line with example text


最基础的移动方式是w/e/b/ge


w是向前移动到下一个单词的第一个位置,大写的W表示只使用空格作为分隔


" * 代表了光标的初始位置
" 每个字母代表了如果按下这个键会跳转的位置
Test: This is a line with example text

*   w w    w  w w    w    w       w
*     W    W  W W    W    W       W

w前面可以加上数字,表示w命令重复几次,比如3w等同于按下三次w

e是向前跳动到下一个【单词的末尾】,这意味着如果当前光标在单词的中间,按下e会跳转到当前单词的末尾。大写的E表示只使用空格作为分隔

" * 代表了光标的初始位置
" 每个字母代表了如果按下这个键会跳转的位置
Test: This is a line with example text

*  ee    e  e e    e    e       e    e
*   E    E  E E    E    E       E    E 

b是向后移动到上一个【单词的开头】,这意味着如果当前光标在单词的中间,按下b会跳转到当前单词的开头。大写的B表示只使用空格作为分隔

" * 代表了光标的初始位置
" 每个字母代表了如果按下这个键会跳转的位置
Test: This is a line with example text
b   b b    b  b b    b    b       b *
B     B    B  B B    B    B       B *

ge是向后移动到上一个【单词的末尾】。大写的gE表示只使用空格作为分隔

" * 代表了光标的初始位置
" 每个字母代表了如果按下这个键会跳转的位置
" & 表示按下gE
Test: This is a line with example text
  ee    e  e e    e    e       e   *
   &    &  & &    &    &       &   * 

Notice:w/e/b/ge都是可以跨行移动的!


快速移动到行的开始和结束


$ 移动到行的末尾
0 移动到行的开头
^ 移动到第一个非空白字符
g_ 移动到最后一个非空白字符

0不能使用数字参数;但是$可以,$等同于1$,2$表示移动到下一行的末尾,同理3$…


行内移动到特定字符


【f+字符】表示移动到行内当前光标后面的第一个这个字符

【t+字符】表示移动到行内当前光标后的的第一个这个字符的前一个位置

【F+字符】为【f+字符】的反向

【T+字符】为【t+字符】的反向


这种移动方式不能跨行


" * 代表了光标的初始位置
" 每个字母代表了如果按下这个键会跳转的位置
" & 表示按下fe
" ! 表示按下te
Test: This is a line with example text
*&                 &      &     &  &

 +               !

注意到一个奇怪的现象,在第二行操作中,按下te会定位到line中的e,光标会移动到e的前一个字符n,如果再一次按下te,会定位到line中的e,光标会移动到e的前一个字符n,也就是说光标不会移动。


这样就告诉我们:连续按下两次【t+字符】和按下一次到达的位置一定是一样的。

f/t/F/T均可以接受数字参数,3fe相当于按下三次fe

事实上,重复操作有另一种方式:【; 】代表了重复查找字符,【, 】是【; 】的反向:

【fe; 】等同于【fefe】等同于【2fe】【fe, 】等同于【feFe】


2、行间移动


滚动屏幕

<Ctrl-b> 向下移动一个屏幕

<Ctrl-f> 向上移动一个屏幕

<Ctrl-u> 向下移动半个屏幕

<Ctrl-d> 向上移动半个屏幕

文件位置移动


【数字+G】表示移动到文件的特定行

比如30G表示移动到第三十行

gg表示移动到文件的第一行

G表示移动到文件的最后一行


3、其他移动方式


【%】:找到当前光标 下或者之后 的第一个括号,并移动到它匹配的括号的位置

括号包括:

([{}])
/* */
#if, #ifdef, #else, #elif, #endif


" * 代表了光标的初始位置
" 每个字母代表了如果按下这个键会跳转的位置
int f(1, g(2, 3))
*              %
   %          *

     *      %

       % *