h 向左一字符j 下一行k 上一行l 向右一字符w or W 向右移动到下一单词开头e or E 向右移动到单词结尾b or B 向左移动到单词开头gg 到文档第一行G 到文档最后一行0 到行首(第 1 列)^ 到第一个非空白字符$ 到行尾H 移动到屏幕顶端M 移动到屏幕中间L 移动到屏幕底部Ctrl-d 向下移动半页Ctrl-u 向上移动半页Ctrl-f 向下移动一页Ctrl-b 向上移动一页: or gg 跳转到第 N 行:+ or j 向下跳 N 行:- or k 向上跳 N 行:e 打开名为 filename 的文件,若文件不存在则创建之:Ex 在 Vim 中打开目录树,光标选中后回车打开对应文件(提示:- 进入上级目录)* 向后查找光标当前所在单词# 向前查找光标当前所在单词/ 向后查找指定字符串? 向前查找指定字符串n 继续查找下一个N 继续查找上一个f 当前行内向行尾方向查找并定位到字符 Xt 当前行内向行尾方向查找并定位到字符 X 之前F 当前行内向行首方向查找并定位到字符 XT 当前行内向行首方向查找并定位到字符 X 之后; 继续向当前方向查找下一个字符, 向当前相反方向查找下一个字符Vim 中可以使用 % 对 ( 和 ),[ 和 ],{ 和 } 进行匹配查找
当光标位于其中一个符号上时
按下 %,光标会跳到与之匹配的另外一个符号上
i 当前字符前插入a 当前字符后插入I 行首插入A 行尾插入o 在下一行插入O 在上一行插入s 删除当前字符,并进入 INSERT 模式S 删除当前行并保存到 Vim 剪贴板,同时进入 INSERT 模式(等同于 cc)x 删除当前字符,相当于 insert 模式下的 DeleteX 删除前一个字符,相当于 insert 模式下的 Backspacedd 删除当前行,并将删除的内容保存到 Vim 剪贴板dw/de 删除一个连续的字符串,区别是删不删空格d 删除指定内容并保存到 Vim 剪贴板cc 删除当前行并保存到 Vim 剪贴板,同时进入 INSERT 模式c 删除指定内容并保存到 Vim 剪贴板,同时进入 INSERT 模式xp 非行尾交换两个字符,如从bs变成sbdf" 删除到出现的第一个双引号yy 复制当前行到 Vim 剪贴板y 复制指定内容到 Vim 剪贴板yw 复制光标开始的一个单词y$ 复制光标到行尾yfA 复制光标到第一个大写A中间的内容y2fA 复制光标到第二个大写A中间的内容p 在当前位置后粘贴P 在当前位置前粘贴J 将当前行与下一行合并r 将当前字符替换为 Xgu 将指定的文本转换为小写gU 将指定的文本转换为大写:%s/// 查找 search 内容并替换为 replace 内容cw 替换一个单词u 撤销Ctrl-r 重做:w 保存当前文件:wa 保存全部文件:wq or ZZ 保存并退出:q! or ZQ 强制退出,不保存:saveas 文件另存为:w 文件另存一份名为 的副本并继续编辑原文件%s/$/sth/ 在行尾追加sth%s/^M//g 替换掉dos换行符,^M使用ctrl+v + Enter即可输入g/^\s$/d* 删除空行以及只有空格的行%s/#.*//g 删除#之后的字符:set number 显示行号:set relativenumber 显示相对行号(这个非常重要,慢慢体会):set hlsearch 搜索结果高亮:set autoindent 自动缩进:set smartindent 智能缩进:set tabstop=4 设置 tab 制表符所占宽度为 4:set softtabstop=4 设置按 tab 时缩进的宽度为 4:set shiftwidth=4 设置自动缩进宽度为 4:set expandtab 缩进时将 tab 制表符转换为空格:filetype on 开启文件类型检测:syntax on 开启语法高亮>> 向右缩进当前行<< 向左缩进当前行== 自动排版当前行gg=G 当前文档全文自动排版== 对从当前行开始的 N 行进行自动排版=j 对当前行以及向下 N 行进行自动排版=k 对当前行以及向上 N 行进行自动排版:split 缩写 :sp or Ctrl-w s 上下分屏:vsplit 缩写 :vs or Ctrl-w v 左右分屏:diffsplit 缩写 :diffs diff 模式打开一个分屏,后面可以加上 {filename}Ctrl-w w 激活下一个窗口Ctrl-w j 激活下方窗口Ctrl-w k 激活上方窗口Ctrl-w h 激活左侧窗口Ctrl-w l 激活右侧窗口Ctrl-w L 移动到最右侧Ctrl-w H 移动到最左侧Ctrl-w K 移动到顶部Ctrl-w J 移动到底部Ctrl-w = 平均窗口尺寸Ctrl-w + 增加高度Ctrl-w - 缩减高度Ctrl-w _ 最大高度Ctrl-w > 增加宽度Ctrl-w < 缩减宽度Ctrl-w | 最大宽度:tabnew or :tabedit 缩写 :tabe 打开新标签页Ctrl-w gf 在新标签页中打开当前光标所在位置的文件名注意::tabnew 和 :tabedit 后面都可以跟一个 <空格><文件名> 用以在新标签页中
打开指定文件,还可以在 : 后面加一个数字,指出新标签页在列表中的位置(从 0 开始)。
gt or :tabnext 缩写 :tabn 下一个标签页(最后一个会循环到第一个)gT or :tabprevious 缩写 :tabp 上一个标签页(第一个会循环到最后一个):tabrewind 缩写 :tabr or :tabfirst 缩写 :tabfir 到第一个:tablast 缩写 :tabl 到最后一个标签页:tabclose 缩写 :tabc 关闭当前标签页:-tabc 关闭上一个标签页:+tabc 关闭下一个标签页:tabonly 缩写 :tabo 关闭其他标签页" 定义保存退出函数
func! SaveExit()
exec "wq"
endfunc
" 映射Ctrl+z键调用保存退出函数
map :call SaveExit()
imap :call SaveExit()
vmap :call SaveExit()
" 定义保存编译并执行代码函数
func! ComplieCode()
exec "w"
if &filetype == "c"
exec "!gcc -std=gnu99 % -lm && ./a.out"
endif
endfunc
" 映射Ctrl+x键调用编译并执行函数
map :call ComplieCode()
imap :call ComplieCode()
vmap :call ComplieCode()
" 定义添加头文件和Main函数
func! InsertMain()
if &filetype == "c"
call setline(1,"#include ")
call setline(2,"")
call setline(3,"int main(int argc,const char* argv[])")
call setline(4,"{")
call setline(5,"\t")
call setline(6,"}")
exec "5"
endif
endfunc
map :call InsertMain()i
" 自动添加头文件卫士
func! InsertIfndef()
call setline(1,"#ifndef ".toupper(expand("%:t:r"))."_H")
call setline(2,"#define ".toupper(expand("%:t:r"))."_H")
call setline(3,"")
call setline(4,"#endif//".toupper(expand("%:t:r"))."_H")
endfunc
autocmd BufNewFile *.h :call InsertIfndef()