光标移动

h, j, k, l
w, W - 下一个词首(跳过标点)
e, E - 下一个词尾
b, B - 回退一个词(跳过标点)
0 - 到这一行的最开头
^ - 到这一行的非空白最开头
$ - 到这行的行尾
g_ - 到这一行的非空白行为
( - 句首
) - 句尾

段落移动

} - Move to end of next paragraph or code block.
{ - Move to start of previous paragraph or code block.
Ctrl+F - Move forward one screenful.
Ctrl+B - Move backward one screenful.
ctrl+d - 向下翻页(down)
ctrl+u - 向上翻页(up)
H, M, L - 屏幕位置,分别为顶部,中间,尾部
zz -  normal模式下区中
ctrl-o zz - insert模式下区中 (利用insert normal模式)

跳转

gg  - 到文件头
G   - 到文件尾

Ngg - 到N行
NG  -
:N  -

gi  - 返回上一次插入文本的地方。

gd       - 跳转到局部定义
gf       - 跳转到文件

tag 跳转:

ctrl + ]
ctrl + t

change list 记录文件修改位置,使用 :changes 打印跳转列表

g;  - 返回上一个修改位置
g,  - 返回下一个修改位置

jump list 记录跳转位置,使用:ju[mps]打印跳转列表

ctrl + o - 跳转到 jump list 上一位置
ctrl + i - 跳转到 jump list 下一位置(和ctrl + o配合在代码间跳转)

标记

这是一组很好的文档内标记方法,在文档中跳跃编辑时很有用,m代表mark

ma - 将当前位置标记为a,26个字母均可做标记,mb、mc等等
'a / `a - 跳转到a标记的位置(标记跳转,'a 与 `a 都可以跳转到 a 标记的位置)

标注可以分为以下两类:

  • a-z: 仅对当前的一个文件生效,也就意味着只可以在当前文件中跳转
  • A-Z: 全局标注,可以作用于不同文件。跳转时有可能会切换到另一个缓冲区

除了手动的标记,vim 还有以下内置的标记:

'. - 跳转到最后一次修改的地方(.代表最后一次修改的地方)
'" - 上一次编辑文件的地方
'' - 跳转到上次跳转之前的位置
'^ - 跳转到上次 insert mode 停止的地方
'( - 当前句子的开头
') - 当前句子的结尾
'{ - 当前段落的开头
'} - 当前段落的结尾
'[ - 上一次修改或复制的第一行的第一个字符
'] - 上一次修改或复制的最后一行的最后一个字符
'< - 上一次Visual area的开始位置
'> - 上一次Visual area的结束位置

gv 可以再次 visually select 上次的区域,映射 gp 再次 visually select 上次修改或复制的区域:

nnoremap gp `[v`]

:marks显示所有的标准,:h mark-motions获取帮助。

使用vim-signature可以让标记可视化

ctags

ctags 可以生成代码的标签文件,vim 可以根据标签文件在代码文件之间跳转查以找特定的 symbol。

生成标签文件

在当前目录下执行:

$ ctags -R .

为当前目录及其子目录中的代码生成标签文件。-R 表示 recursive,. 表示在当前目录。

运行完当前目录会多一个文件 tags,就是代码的索引文件。

跳转

用 vim 打开一个已经建过标签的代码文件

ctrl+]    - 找到光标所在位置的标签定义的地方
ctrl+t    - 回到跳转之前的标签处

<c-w> + ] - 分屏跳转到定义

<c-w> + } - 预览窗口跳转到定义
<c-w> + z - 关闭预览窗口

此时运行 vim,必须在 tags 文件所在的目录下运行。否则,运行它会找不到 tags 文件。

可以使用 :set tags= 命令设定 tags 文件的查找路径,其是一个以 , 分割的列表。

" `./tags;` - 从当前文件目录递归到根目录查找 tags 文件
" `tags`    - 在 vim 的当前目录(`:pwd`)查找 tags 文件
set tags=./tags;,tags

可以让生成的 tag 文件名为 .tags,默认隐藏

" `./.tags;` - 从当前文件目录递归到根目录查找 .tags 文件
" `.tags`    - 在 vim 的当前目录(`:pwd`) 查找 .tags 文件
set tags=./.tags;,.tags

增加生成 tags 的命令

command! MakeTags !ctags -o .tags -R .