[What] vim 基本操作总结

基本知识

脚本

vim 的设置可以写入脚本文件中来达到批量配置的目的, 在 vim 中使用 :scriptnames 命令查看作用的脚本及其路径.

一般情况下, vim启动脚本路径为 ~/.vimrc (linux) 或 $HOME/_vimrc, $VIM/_vimrc (windows), 其示例文件位于 $VIMRUNTIME/vimrc_example.vim

脚本文件可以包含任何冒号命令, 其注释使用 " 开头.

文件恢复

当文件编辑时出现了崩溃, 则可以使用 vim -r filename 来恢复文件,或者在启动编辑时,vim会自动查看是否有 .sw? 文件, 而自动提醒进入恢复模式.

vim会自动为正在编辑的文件建立对应的 .sw? 文件, vim在你停止大约4秒不输入的时候或者输入大约两百个字符以后才会更新交换文件. 时间可以通过 updatetimeupdatecount 选项来调整.所以, 如果系统崩溃前 vim 没有更新交换文件, 最后一次更行后的编辑的内容就会丢失.

交换文件的位置通常是原文件所在的目录, 在目录下输入 vim -r , vim 会列出所有它能找到的交换文件.

设置 意义
swap-file 解释交换文件在什么地方以及创建的名字是什么
:preserve 手工刷新交换文件
:swapname 查看当前文件的交换文件
'updatacount' 多少个键被敲下后执行一次交换文件刷新
'updatetime' 交换文件刷新后的超时时间
'swapsync' 交换文件刷新后是否执行磁盘同步
'directory' 列出用于保存交换文件的目录
'maxmem' 写入交换文件前的内存使用限制
'maxmemtot' 用于所有文件的交换文件内存限制

基本操作

基本快捷键操作

基本快捷操作命令 前面 都是可以加入一个数字, 代表此命令重复执行的次数.

通常在数字的前面还可以加入其他的命令, 比如 d4w, 代表删除 4个单词.

使用这些组合技巧的法则除了记忆外, 更多的是大胆的尝试!有 u 在, 尽管尝试!

插入与改动(在 Normal 模式中使用)

快捷键/命令 说明
i 在当前光标所在 字符前 插入编辑
I 在当前关标所在 行首 插入编辑
a 在当前光标所在 字符后 插入编辑
A 在当前光标所在 行尾 插入编辑
o 在当前光标所在 行下插入新行 并编辑
O 在当前光标所在 行上插入新行 并编辑
   
~ 修改光标下 字符的大小写,并移动到下一个字符
cw 修改一个词, cd 一样,后面可以跟很多种命令
x 删除当前 光标所在的字符, 与 dl 一样
X 删除当前 光标所在的左边的字符 , 与 dh 一样
D 删除当前 光标所在的字符直到行尾, 与 d$ 一样
daw 删除当前 光标所在的单词, das 删除 光标所在的句子.
cis 修改当前 光标所在的句子,不包括句子后的空白, cas 包括空白.
C 修改当前 光标所在的字符直到行尾, 与 c$ 一样
s 修改当前 光标所在的字符, 与 cl 一样
S 修改当前 光标所在的行, 与 cc 一样
dd 删除当前 光标所在的行 ,当前面接双引号加字母, 则代表 拷贝到寄存器中!, 使用 "<reg>p 来粘贴
cc 删除当前 光标所在的行, 保留缩进,并进入编辑模式
yy 拷贝当前 光标所在的行, 与 Y 一样,当前面接双引号加字母, 则代表 拷贝到寄存器中!, 使用 "<reg>p 来粘贴
"\*yy 拷贝一行到剪切板
"\*p 从剪切板粘帖
J 删除当前 光标所在行的换行符, 也就是将此行与下一行拼接为一行
r 替换当前光标处的字符, 并自动退回 Normal 模式
R 替换当前光标处开始的字符, 直到 <ESC> 退回 Normal 模式
. 重复最后一次的修改操作
p 插入缓存的内容到光标后面, 使用 xp 即可交换两个字符
P 插入缓存的内容到光标前面
gUw 将当前单词替换为大写
guw 将当前单词替换为小写
g~w 交换大小写
gUU 整行大写
guu 整行小写
g~~ 整行交换大小写
   
u 撤销上次操作
CTRL-R 重做刚才撤销的操作, 是 撤销的撤销
U 消除对 光标所在行的编辑操作, 也就是行撤销
   
:e! 放弃当前文件的更代并 重新装载当前文件
:read filename 读取文件内容并插入到光标下面
   
CTRL-G 显示正在编辑的文件名称,以及当前光标所处的位置
CTRL-L 重画整个屏幕
   
:vertical diffsplit filename 将当前文件与 filename 相比较
   
gqap 重新排版当前段落
gggqG 重新排版全文
gqj 重新排挡当前行和下一行
   
zh 向右滚动
zH 向右滚动半个窗口的宽度
ze 向右滚动使光标处于行尾
zl 向左滚动
zL 向左滚动半个窗口宽度
zs 向左滚动使光标处于行首
g0 移动光标到当前行的第一个可见字符
g^ 移动光标到当前行的第一个非空白的可见字符
gm 移动光标到当前行的中点
g$ 移动光标到当前行的最后一个可见字符

折叠

折叠可以嵌套

操作 说明
zfap 折叠一个段落(fold creation)
zf 选中区域折叠
zo 打开折叠(Open a fold)
zc 关闭折叠(Close a fold)
zr 减少嵌套折叠
zm 增加折叠
zR 打开所有嵌套折叠
zM 关闭所有嵌套折叠
zn 禁止折叠功能
zN 恢复折叠功能
:set foldcolumn=4 查看已经定义的折叠
zO 打开所有光标行上的折叠
zC 关闭所有光标行上的折叠
zd 删除光标行上的折叠
zD 删除所有光标行上的折叠
:set foldopen=all 光标遇到折叠时, 折叠就自动打开
:set foldclose=all 光标离开折叠时自动关闭
:set foldmethod=indent 自动为相同缩进创建折叠, 使用此选项后不能使用 zf 快捷键
:set foldmethod=marker 自动根据标志创建折叠

插入模式下使用的快捷键

操作 说明
CTRL-P 补全单词 (向上匹配), 使用 CTRL-N 向下匹配
CTRL-W 更正一个单词 (在插入模式下使用)
CTRL-U 更正光标及之前的所有单词 (在插入模式下使用)
CTRL-X CTRL-F 补全文件名
CTRL-X CTRL-L 补全整行
CTRL-X CTRL-D 补全宏定义
CTRL-X CTRL-I 补全当前文件以及所包含的文件
CTRL-X CTRL-K 补全字典文件内的单词
CTRL-X CTRL-T 补全同义词词典文件内的单词
CTRL-X CTRL-] 补全标签
CTRL-X CTRL-V 补全VIM命令行
CTRL-X CTRL-O 补全源代码
CTRL-A 将上次在插入模式下输入的文本再输入一次, 使用 CTRL-@ 会完成一次此命令然后退出插入模式
CTRL-V 按本义插入下一个字符(在 Windows 中, 使用 CTRL-Q 替代), 当后面输入数字时, 显示的是对应的字符
CTRL-K xx 显示特殊字符, 使用 :digraphs 查看
CTRL-O {command} 不退出插入模式而执行普通模式下的命令
CTRL-R {register} 插入寄存器的内容
:iabbrev ad advertisement 设置当输入 ad<Space> 时就自动替换为 advertisement, 使用此功能快速插入注释
:abbreviate teh the 当输入 teh<Space> 时就自动更正为 the ,使用 :unabbreviate teh 删除此缩写, :abclear 删除全部的缩写

可视操作(在 visual 模式中使用)

快捷键 说明
v 进入可视模式, 'V' 进入按行选择的可视模式
CTRL-v 进入块选择可视模式
o 在选择的块中移动光标到另一端, O 用于在块可视的同一行另一个角
as 选中一个句子
I 进入插入模式, 退出后将字符串插到可视块的每一行左边
A 进入插入模式, 退出后将字符串插到可视块的每一行右边
$ 在可视块中使用, 代表可视块扩展到行尾
c 删除选中区域, 并在每行增加新字符串
C 删除 *从块左边界开始的所有行的后半段, 然后每行增加新字符串.
~ 交换大小写
U 转换为大写
u 转换为小写
r 将可视块中的内容替换,并补充其他行
> 把选中文档向右平移一个单位, 中间用空白填充, '<' 为向左平移
J 将可视块 *涉及的行连接为一行

移动(在 Normal 模式中使用)

快捷键 说明
w 移动到 下一个单词的首字符上, 切换为大写, 则以空格分隔的字符串为最小单位
b 移动到 前一个单词的首字符上, 切换为大写, 则以空格分隔的字符串为最小单位
e 移动到 下一个单词的尾字符上, 切换为大写, 则以空格分隔的字符串为最小单位
ge 移动到 前一个单词的尾字符上, 切换为大写, 则以空格分隔的字符串为最小单位
$ 移动到光标所在 行尾
^ 移动到光标所在 行的第一个非空白字符上
0 移动到光标所在 行首
f char 向后移动到 char 字符上, F 则为向前移动, 使用 ';' 重复, ',' 为反向重复.
t char 向后移动到 char 字符的 前一个字符, T 为向前, ';' 重复, ',' 反向重复
% 跳转到匹配的符号上去, 当前面接数字时, 代表移动到文件的百分之多少的位置
G 加数字,代表跳转到对应行去. 不加数字, 跳转到最后一行
gg 跳转到第一行
CTRL-u 向上滚动半屏
CTRL-d 向下滚动半屏
CTRL-e 向上滚动一行
CTRL-y 向下滚动一行
CTRL-f 向下滚动一屏
CTRL-b 向上滚动一屏
zz 将光标所在行, 置于屏幕中央
zt 将光标所在行, 置于屏幕顶端
zb 将光标所在行, 置于屏幕底端
H 移动光标到当前视图顶部
M 移动光标到当前视图中部
L 移动光标到当前视图尾部
`` 将光标定位到跳转前的位置,与 marker 联合使用, 小写标记是局部的, 大写标记是全局的
`" 跳转到上次编辑的位置
`[ 跳转到最后一次修改的起始位置
`] 跳转到最后一次修改的结束位置
[# 跳转到 #if, ']#' 为跳转到 #else 或 #end
[[ 跳转到上一个代码块首, '[]'跳转到上一个代码块尾
]] 跳转到下一个代码块首, ']['跳转到下一个代码块尾
[/ 跳转到注释首, ']/' 跳转到注释尾
CTRL-O 跳转到之前的位置
CTRL-I 跳转到较新的位置
:marks 查看标记列表

查找(在 Normal 模式中使用)

快捷键/命令 说明
/word 查找 包含 word 的字符串, ' . * [ ] ^ % / \ ? $ ' 有特殊含义, 查找这些字符需要在它们前面加上 '\'转义
:set ignorecase 查找不区分大小写, :set noignorecase 关闭
* 取得光标上的单词,并进入向下查找模式. '#' 使用向上查找
/\<word\> '\<' '\>' 分别代表匹配头部和尾部
:set hlsearch 高亮查找的字符串, :set nohlsearch 关闭
:set smartcase 如果键入字符串中有大写字母, 则自动转为大小写敏感模式
:nohlsearch 仅仅 去掉本次高亮显示.
:set incsearch 在输入字符串过程中就显示匹配点
:set nowrapscan 找到文件两端后停止查找
/one|two|three  #匹配 one / two / three 中的一个, 使用或运算符  | 

多文件编辑

命令 说明
:split 将当前文件进行上下分隔, :vsplit 代表左右分隔
:close 关闭当前光标所在窗口
:only 仅保留当前窗口
:new 上下分隔打开一个空缓冲区, :vnew 代表左右分隔
:args 显示正在编辑的文件列表
:previous 移动到前一个文件
:next 移动到下一个文件
:last 移动到最后一个文件
:first 移动到第一个文件
:view file 以可读的方式打开文件
:saveas filename 另存为文件
:file name 改变当前文件名
:tabedit filename 以标签页的方式编辑文件, 通过鼠标切换各个标签, tabonly 关闭除当前标签页外的所有标签页

退出/帮助/离开/回来(在 Normal 模式中使用)

信息文件 viminfo 设计用来存储状态信息:

  • 命令行和搜索模式的历史记录
  • 寄存器内的文本
  • 各种文件的标记
  • 缓存器列表
  • 全局变量

每次退出 vim , 它就把此种信息存放在一个 .viminfo 文件内, 当 vim 重启时, 就读取这个文件.

vim 会话存放所有跟编辑相关的信息, 包括文件列表,窗口布局, 全局变量,选项等等.

快捷键/命令 说明
ZZ 保存并关闭当前文件
:q! 放弃当前文件的修改并关闭当前文件
:help something 获取某个主题的帮助(退出帮助使用 ZZ), 关于如何使用 help, 使用 :help helphelp
CTRL-Z 将VIM挂起,并进入 shell 中, 执行完相应命令后, 使用 fg 回到 VIM(命令行版)
:shell 启动一个shell窗口
:set viminfo=string string 规定 .viminfo 要存储什么信息
'0 启动vim 后执行, 让 vim 回到当初离开的位置
:browse oldfiles 列出以前编辑过的文件
:mksession vimbook.vim 创建一个会话文件, 使用 source vimbook.vim 还原

撤销树

如果撤销了一些改变然后又进行了一些新的改变, vim 就在撤销树里建立了一个分支.

操作 意义
:earlier 1f 恢复此文件到最近写入时的状态

命令行编辑

当用冒号(:)命令或用 / 或 ? 搜索字符串时, vim 就会把光标置于屏幕下方, 此处称为命令行.

在命令行上移动光标编辑时除了基本的方向键和 <Home> <End> 最常用的键有:

操作 说明
<S-Left> / <C-Left> 左移一个单词
<S-Right> / <C-Right> 右移一个单词
CTRL-W 删除光标前的整个单词
CTRL-U 删除命令行上的全部文字
CTRL-C / <Esc> 取消命令输入
:history 显示历史记录里所有的命令
q: 打开命令行窗口,然后可以选择之前的命令编辑并执行

寻找要编辑的文件

操作 说明
:edit . 显示当前目录下的文件和文件名
:buffers / :ls 显示缓冲区列表 , 使用 :b2 来编辑 2好缓冲区
:bn 编辑下一个缓冲区
:bp 编辑前一个缓冲区
:bf 编辑第一个缓冲区
:bl 编辑最后一个缓冲区
:bd<num> 关闭一个缓冲区

编辑特殊文件

使用 VIM 编辑经过压缩,加密,二进制等等文件.

各种系统的换行符格式为:

  • unix <LF>
  • dos <CR><LF>
  • mac <CR>
操作 说明
:set fileformats=unix,dos,mac VIM 先尝试使用UNIX格式,其次再用 MS-DOS 格式
:set fileformat? 显示当前文件格式
:edit ++ff=unix file.txt 强制以 UNIX 格式打开文件 file.txt
:set fileformat=unix 将当前文件转换为 UNIX 格式
gf 链接上使用 用于下载远程文件并打开
vim -x file.txt 以加密的方式编辑文件
:X 为当前文件加密/解密
vim -b datafile 以二进制编码打开一个文件
:set display=uhex 以HEX格式显示当前的值
:%!xxd 把文件以16进制显示 :%!xxd -r 回到二进制

在程序中编辑

vim 通过 ctags 来生成的标签文件可以快速搜寻到标识符的位置.

使用 说明
:tag function 找到函数 function
CTRL-] 跳到函数定义处
:tags 显示经过的标签列表
CTRL-T 跳转到上一个标签
:tag 跳转到标签列表中最上面的标签
:stag tagname 从新窗口显示跳过去的标签
CTRL-W ] 分割当前窗口并跳转到光标下的标签
:set tags=./tags,../tags,… 关联多个标签文件
:tnext 跳到函数的其他重载函数处
:ptag function 预览函数定义,使用 :pclose 关闭预览
[{ 跳转到当前代码块的开始处, ]}跳到结尾处
[I 查找当前光标处的全局标识符
:set path+=/usr/local/.. 指定vim 查找文件的路径
:checkpath! 查看包含的文件
[<Tab> 跳转到 '[I' 产生的列表处
[D 查找宏定义标识符
gD 查找局部标识符
gd 只在当前函数查找
   
:make makefilepath 构建代码
:cnext 跳到下一处错误所在行
:cprevious 跳到上依次错误所在行
:cc 查看错误详细信息
:clist 查看所有错误信息
:set makeprg=nmake 设定编译器为 nmake
:colder 查看上一个出错列表
:cnewer 查看下一个出错列表
:compiler msvc 更换编译器
   
:set cindent shiftwidth=4 设置C风格文件缩进
:filetype indent on 根据文件类型设置不同缩进
gq]/ 在注释开头使用, 排版注释
:set comments=:// 定义注释

代码合并(vimdiff)

除了使用 git, 使用 vimdiff 来比对个别文件, 实现合并相当方便.

  • 在一开始启动 vim 时, 使用命令 vim -d <file1> <file2>vimdiff <file1> <file2>
  • 在使用git的情况下, 使用命令 git conifg --global diff.tool vimdiff
  • 在 vim 已经打开的情况下, 使用命令 :diffthis 打开比对功能, 使用 :diffoff 关闭比对.
快捷键 意义
do 在当前光标处, 将参考文件内容合并过来
dp 在当前光标处, 将此处内容合并过去
]c 跳到下一个有差异的位置
[c 跳到上一个有差异的位置
:diffupdate 更新高亮显示

替换

替换命令形式为: :[range]substitute/from/to/[flags] (把 [range] 指定范围的中的字符串 "from" 修改为字符串 "to".

如果在字符串 from 或 to 中使用正斜杠, 需要在前面加上一个 反斜杠. 或者使用 加号代替替换中的正斜杠.

#将字符串 "one/two", 替换为 one 
:s+one/two+one 

与替换相似的还有 global 命令,形式为: :[range]global/pattern/command (在 [range] 范围中找到符合 pattern 的字符串, 然后执行命令 command).

#找到 "//" 开头的行, 然后执行替换命令, 将 foobar 替换为 barfoo(+ 代替命令斜杠)
:g+//+s/foobar/barfoo/g

range

形式 意义
% 作用于全部行
(空) 仅仅作用于当前行
{number1},{number2} 在行 {number1} 至 {nember2} 上执行替换
{number} 仅仅在行 {number} 上执行替换
't,'b 在标记 t 和 b 之间执行替换
'<,'> 在可视模式下选择要替换的范围, 然后按下 ':', 则 自动出现此符号, 代表选中部分的开始和结尾
'<,$ 从选中部分的开始,到文末执行替换
.,.+4 先输入数值5,然后按下 ':', 则 *自动出现此符号, 代表从当前行开始到后面的4行做替换

falgs

形式 意义
g 作用于一行中的所有匹配字符串
p 打印最后一个被修改的行
c 每次替换前确认是否替换

基本配置

基本常用设置(在脚本文件中, 需要去掉冒号!)

命令 说明
:set showmode 在编辑器下方显示当前处于什么模式
:set number 显示绝对行号, set nonumber 关闭
:set ruler 在窗口右下角显示光标位置
:edit $MYVIMRC 编辑启动脚本, :version 显示vim查找路径
:set nocompatible 设置与 vi 不完全兼容
:set backspace=indent,eol,start 指定在插入模式下可以用 <BS> 删除光标前的字符
:set autoindent 启动新行与前一行一样缩进
:set history=50 保存50个命令和50个查找模式的历史
:set showcmd 在窗口右下角显示未完成的命令
:set nowrap 关闭行回绕
:set sidescroll=10 vim 自动滚动的字符, 为了显示未看到的文字
:set whichwrap=b,s,<,>,[,] 在行首和行尾移动可以进入下一行
:set list 显示TAB按键
:set listchars=tab:>-,trail:- 指明 TAB 显示的字符为 '-'
:set cmdheight=3 显示消息空间的高度
:syntax enable 语法高亮
:set filetype 查看自动检查的文件类型
:set background=dark 设置背景色, 需要在 :syntax enable 下使用
:colorscheme evening 设置配色方案为 evening
:hardcopy 打印当前文件
:TOhtml 将当前文件另存为 html 格式
:set autowrite 自动保存
:set backupext=.bak 设置备份文件后缀为 .bak
:set noscrollbind 取消在比较两个文件时的滚动绑定
:set shiftwidth=4 每次平移4个空格
:set expandtab 将<TAB>扩展为空格
:set softtabstop=4 把4个连续的空格转为<TAB>
:set tabstop=4 编辑<TAB>占用的空格数
:set guioptions+=b 显示水平滚动条
#当覆盖一个文件的时候保留一个备份,但 VMS 系统除外, 因为它会自动产生备份.(备份文件是在原来文件名后加 '~' 字符)
if has("vms")
  set nobackup
else 
  set backup
endif
#文件类型探测, 使用文件类型相关插件, 使用缩进文件
filetype plugin indent on
#限制 vim 在一行长于 78 个字符的时候自动换行, 但仅仅对文本类型文件有效 (autocmd Filetype text).
autocmd FileType text setlocal textwidth=78.

GUI配置

设置 意义
:set guioptions-=T 默认不显示工具栏
:behave xterm 鼠标的行为和 X Windows 一致, 当为 behave mswin 则行为与 Windows 一致

键盘映射(用于脚本文件中)

映射用于把一系列的 vim 命令绑定为一个单独的一个或几个按键, 可以在 vim 运行中来指定按键映射, 不过更多的是在脚本中提前使用.

在 vim 中使用 :map 命令可以查看当前的按键映射.

定义格式为: map 映射键 被映射键, 通常为了让定义的快捷键不与默认快捷键冲突, 所以需要在快捷键前加入 前导键.

"定义前导键为 ','
let mapleader=","
"定义切换 buffer 快捷键(需要安装 MiniBufExplorer 插件)
"<> 包含的就是控制按键, <leader> 代表前导键, <CR> 代表回车
map <leader>n :bn<CR>
map <leader>p :bp<CR>

删除映射使用 :unmap 即可.

map 种类

命令 说明
:map 普通,可视,操作符等待模式
:vmap 可视模式
:nmap 普通模式
:omap 操作符等待模式
:map! 插入和命令行模式
:imap 插入模式
:cmap 命令行模式

当输入 :map 时可以查看已经映射的列表

重映射

重映射就是利用已经映射的结果再次映射, 类似于宏定义下的调用.

在实际执行时, 可以让 vim 在执行时不检查与之相关的映射, 在 map种类map 前加入 nore 即可, 比如: :noremap, inoremap

自定义命令

自定义命令行命令使用格式: :command Name <command>, 执行 :Name 时, 就会执行 :<command>

注意: 用户定义的命令必须以大写字母开始, 但不能用 :X, :Next, :Print, 也不能用下划线.

使用 :command 来查看用户定义的命令

  • 定义带参数的命令 :command -nargs=0 Name <command>
    • -nargs=0 无参数
    • -nargs=1 一个参数
    • -nargs=* 任意数目的参数
    • -nargs=? 没有或一个参数
    • -nargs=+ 一个或更多参数

自动命令

自动命令时一类特殊命令, 当某些事件发生时, 它们会被自动执行.

软件包

软件包是一组可加入 vim 的文件, 有两种软件包: 可选的和启动时自动载入的.

加入插件时, 使用命令 packadd! packName.

有些软件包, 需要从网上下载压缩文件, 需要在 .vim 中创建对应的文件夹并解压.

#建立软件包 fancy 目录
mkdir -p ~/.vim/pack/fancy 
#解压
cd ~/.vim/pack/fancy 
unzip fancy.zip 

插件

vim 可以通过插件增强功能, 插件其实是 一个当 vim 启动的时候能被自动执行的脚本, 简单的把插件放到 vim 的 plugin 目录就可以使它生效.

vim 中有两种插件:

  • 全局插件: 用于所有类型的文件
  • 文件类型插件: 仅用于特定类型的文件

全局插件

添加一个全局插件只要两步:

  1. 获得一个插件的拷贝
  2. 把它放进合适的目录
  • 全局插件位置

    插件的位置有几个:

    • 与 vim 一起发布的, 在 $VIMRUNTIME/macros 目录或其子目录中找到
    • 官网插件 中下载
    • 在 vim 的邮件列表中找 : maillist
    • 自己写一个
  • 使用全局插件

    将插件放进合适的目录即可.

    系统 插件目录
    Unix ~/.vim/plugin/
    PC 和 OS/2 $HOME/vimfiles/plugin 或 $VIM/vimfiles/plugin
    Amiga s:vimfiles/plugin
    Macintosh $VIM:vimfiles:plugin
    RISC-OS Choices:vimfiles.plugin

    在 Unix 中:

    mkdir ~/.vim 
    mkdir ~/.vim/plugin 
    cp /tmp/yourplugin.vim ~/.vim/plugin 

    也就是将插件放入 plugin 中即可, 当然也可以放入子目录中, 以分类处理.

    或者也可以使用 bundle 来管理插件.

文件类型插件

文件类型插件的名称前缀, 即为文件类型, 比如 c.vim, cpp.vim. 对应的路径为(filetype 必须对应, name 可以随意取名):

  • ftplugin/<filetype>.vim
  • ftplugin/<filetype>_<name>.vim
  • ftplugin/<filetype>/<name>.vim
  • 文件类型插件位置
    • 与 vim 一起发布, 在 $VIMRUNTIME/ftplugin 目录或其子目录中找到
  • 使用文件类型插件

    与全局插件对应的是, 放于 ftplugin 文件夹中.

    mv thefile ~/.vim/ftplugin/stuff.vim 

添加帮助

将帮助文件导入 vim 即可,如下例所示:

#新建存放帮助文件的目录
:!mkdir ~/.vim/doc 
#拷贝文件
:!cp /tmp/doit.txt ~/.vim/doc 
#添加帮助文件
:helptags ~/.vim/doc 
#查看本地的帮助文件
:help local-additions 

选项

选项也就是当前配置, 使用 :options 来查看所有的参数配置, 并且都可修改.

获得选项的帮助说明, 使用 help 命令获得更多帮助. 需要在选项命令前后加上单引号. 例如 :help 'wrap'

如果一个选项设置错误后, 使用 '&' 恢复到默认值, 例如 :set iskeyword&

技巧

单词替换

  • 在单个文件中, 将单词 four 替换为 4: :%s/\<four\>/4/gc
  • 当需要在多个文件替换时, 一般在单个文件进行一次 宏录制 然后再在其他文件重复即可.

单词顺序交替

  • 想将 last, first 替换为 first,last , 使用命令: %s/\([^,]*\),\(.*\)/\2 \1/

from部分: \([^,]*\),\(.*\):

  • \( \) 匹配 last
  • [^,] 匹配除逗号外的任何东西
  • * 匹配任意多次
  • \( \) 匹配first
  • . 匹配任意字符
  • * 匹配任意多次

to部分:\2 \1/ : 将匹配的第一对和第二对结果替换

排序

例如将 Makefile 中的文件列表进行排序:

OBJS = \
     version.o \
     pch.o \
     getopt.o \
     util.o \
     getopt1.o \
     inp.o \
     patch.o \
     backup.o 

要对这个文件列表排序,可以使用外部过滤命令:

#移动到 "OBJS" 开头的行
/^OBJS
#向下移一行
j
#一行行过滤直到最后一行, 然后执行 sort 
:.,/^$/-1!sort

反转行顺序

:g/^/m 0 ,先匹配行首, 然后执行 move 命令,将该行放在第0行,如此依次执行, 最后就是 文件被按行反转了次序.

单词统计

g<CTRL-G> , 用于统计多少个词

查询 man 信息

  • 在需要查询的函数上按下 K, 便会查询 man .

删除多余的空格

  • :%s/\s/+$// : 删除行末的多余的空格

查找单词的使用位置

  • :grep string *.c : 在 c 文件中查找包含字符串 string 的行并显示出来. 使用 :cnext 跳到下一个点, :cprev 跳到上一个点, :clist 列出所有匹配点.

组合高级功能

宏录制

宏录制可以记录一段操作, 然后重复这一操作.

开始与结束

vim 通过在 normal 模式下按下 q 开始录制, 然后输入一个寄存器(a ~ z 的任意一个字母),则开始使用此寄存器开始录制,与此同时屏幕左下角会显示 recording 提示.

在操作完成后, 再次按下 q 结束录制.

调用

  • @ + 寄存器 : 重复依次宏
  • @ + @ : 重复上次使用的宏
  • <num> + @ + 寄存器 : 重复宏 <num> 次

修改

当进行宏录制的时候, 有可能设置的命令有误, 而重新输入一次则会浪费时间并且也会容易犯错.

比较好的解决方法是, 将保存到寄存器的操作以文本的形式编辑修改即可.

#移到行尾
G
#建立一个空行
o<Esc>
#拷贝n 寄存器中的文本, 这样将命令拷贝到此处
"np
#然后编辑这些命令
#回到行首
0
#把正确的命令再次拷贝到 n 寄存器
"ny$
#删除此行
dd

然后便可以通过 @n 来执行命令序列了.

追加命令到寄存器

当需要追加新的命令到寄存器时, 除了使用上面的方法, 还可以使用其 对应的大写寄存器进行录制命令,将命令追加.

使用外部程序(在 normal 中使用)

替换文本

使用外部程序格式为: !{motion}{program} (用一个文本块作为输入, 执行一个由 program 指定的外部命令, 然后用该程序的输出替代选中的文本块)

注意: 当最开始使用":",则代表 仅仅执行外部程序,然后查看输出结果, 当不使用 ":", 则代表让程序结果替换选中范围

#从当前行开始到第5行进行重新排序
#!5代表选中当前开始到第5行, sort 用于排序
!5Gsort<Enter>

读入一个命令的输出

使用 :read 命令即可,

#在Unix 中读入目录的内容
:read !ls
#在Windows 中读入目录内容
:read !dir 

文本输出到一个命令

使用 :write 命令即可,

#在 Unix 中统计当前文件的单词数
:write !wc 

快速配置

spf13 是比较全面的配置了,在按照其说明下载配置文件后,还需要做以下两点配置以优化操作。

  • 编辑文件(.vimrc.before.local),安装ycm
let g:spf13_bundle_groups=['general','youcompleteme','programming','misc']
  • 编辑文件(.vimrc.local),个性化配置
"""""""""""""""""""""""""""""""""""""""""""
"           说明(leader键是 ',')
"""""""""""""""""""""""""""""""""""""""""""
"此文件与 spf13-vim(https://github.com/spf13/spf13-vim) 联合使用
"
"spf13的基本操作
"1. 本地定制个性化的设置, 写入到文件 ~/.vimrc.local ~/.gvimrc.local
"2. 在启动 spf13-vim 脚本前的设置, 写入到文件 ~/.vimrc.before.local
"3. 启动脚本的顺序为:
".vimrc.before 
".vimrc.before.fork
".vimrc.before.local  插件加载选项, 修改完后使用(:BundleInstall!)
".vimrc.bundles
".vimrc.bundles.fork
".vimrc.bundles.local 新装插件, 使用格式 Bundle
"'githubusername/githubprojectname'
".vimrc
".vimrc.fork
".vimrc.local
"4. 使用 <leader>ev 来查看vim 配置文件脚本
"5. 使用 <leader>sv 来重新载入脚本


"""""""""""""""""""""""""""""""""""""""""""
"           个性化配置说明
"""""""""""""""""""""""""""""""""""""""""""
"设置终端版的主题(推荐 ir_black/molokai/peaksea)
colorscheme  atom
"取消拼写检查(因为很多缩写被报错...)
set nospell
"使用相对行号(神器)
set relativenumber

"""""""按键映射""""""""""
"在行尾增加分号,并重新进入到 <normal> 模式
map <leader>; A;<ESC>

"""""""""""""""""""""""""""""""""""""""""""
"           插件配置说明
"""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""
" Undotree(撤销树)
" 默认使用方式:
" 1. <leader>u   启动撤销树
"""""""""""""""""""""""

"""""""""""""""""""""""
" NERDTree(文件浏览器)
" 默认使用方式:
" 1. <leader>e   启动
" 2. <C-E>  启动或关闭
" 3. <leader>e 或 <leader>nt 查看当前文件的路径
"""""""""""""""""""""""

"""""""""""""""""""""""
" ctrlp(快速打开文件)
" 默认使用方式:
" 1. <C-p>   启动
"""""""""""""""""""""""

"""""""""""""""""""""""
" Surround(快速替换符号)
" 默认使用方式:
"""""""""""""""""""""""

"""""""""""""""""""""""
" NERDCommenter(快速注释)
" 默认使用方式:
" 1. <leader>c<space>   添加注释
"""""""""""""""""""""""
let g:NERDAltDelims_c = 1

"""""""""""""""""""""""
" neocomplete(智能补全)
" 默认使用方式:
" 1. <C-k> 强制补全
"""""""""""""""""""""""

"""""""""""""""""""""""
" YouCompleteMe(快速智能补全)
" 首次使用需要进入 youcompleteme 文件夹,然后进行编译
" ./install.py --clang-completer
"
" 在需要编辑的工程中,拷贝一份 .ycm_extra_conf.py 到目录并设置
"""""""""""""""""""""""
"let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf=0

"""""""""""""""""""""""
" syntastic(语法检查)
" 默认使用方式:
"""""""""""""""""""""""

"""""""""""""""""""""""
" autoclose(自动关闭)
" 默认使用方式:
"""""""""""""""""""""""

"""""""""""""""""""""""
" Fugitive(git 状态)
" 默认使用方式:
" 1. <leader>gs 等于 git status
" 2. <leader>gd 查看修改
"
"""""""""""""""""""""""

"""""""""""""""""""""""
" ack.vim()
" 默认使用方式:
"""""""""""""""""""""""

"""""""""""""""""""""""
" Tabularize()
" 默认使用方式:
"""""""""""""""""""""""

"""""""""""""""""""""""
" Tagbar(标记列表, 与 ctags 联合使用)
" 默认使用方式:
" 1. CTRL-] 跳到定义处
" 2. CTRL-T 跳回原处
" 2. <leader>tt 打开
"""""""""""""""""""""""

"""""""""""""""""""""""
" EasyMotion()
" 默认使用方式:
"""""""""""""""""""""""

"""""""""""""""""""""""
" airline(状态栏)
" 默认使用方式:
"""""""""""""""""""""""


"""""""""""""""""""""""
" minibufexpl(显示缓存)
" 默认使用方式:
"""""""""""""""""""""""
"切换到下一个缓存区和上一个缓存区
map <leader>n :bn<CR>
map <leader>p :bp<CR>


"""""""""""""""""""""""
" cscope(符号表查询)
" 默认使用方式:
"""""""""""""""""""""""
"自动检测并设置
if has("cscope")
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
    cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
    cs add $CSCOPE_DB
endif
set csverb
endif
"查找调用这个函数的函数
map <leader>c :cs find 3 <C-R>=expand("<cword>")<CR><CR>
"查找这个符号出现的位置
map <leader>s :cs find 0 <C-R>=expand("<cword>")<CR><CR>
Last Updated 2018-11-05 Mon 07:36.
Render by hexo-renderer-org with Emacs 26.1 (Org mode 9.1.14)