最初使用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))
* %
% *
* %
% *