理念: 结合使用方法和应用场景。
注:Linux编译使用v7.4.2220版本。
基础
范围
t 截止位置
t指定截止位置,例如dts删除字符直到碰到字符s为止。
特殊位置
gg 文件头
G 文件尾
^ 行首
$ 行尾
`. 上次编辑位置
打开文件后,跳转到最近一次修改的位置。
’’ 回到上次位置
跳转
跳转前加数字。
窗口间跳转
ctrl + w + k/j/h/l
j向下,k向上
上下左右
移动到前一个访问的窗口: ctrl + w + p,代码窗口和quickfix窗口是高频访问切换的窗口。
在所有窗口中移动: ctrl + w + w
屏幕内跳转
c-d 下移半屏
c-u 上移半屏
光标移动到屏幕顶部 H
光标移动到屏幕中间 M
光标移动到屏幕底部 L
将所在行移动到屏幕中间 zz
注
- 搜索world,跳转到world,zz将所在行移动到屏幕中央;
行间跳转
j 向下, k 向上
EasyMotion行间跳转
fj 向下给行标记,然后选择标记字符跳转。fk向下标记。
字间跳转
w 向前,b 向后
EasyMotion字间跳转
fl 向右给word标记,然后选择标记字符跳转。
字符间跳转
l 向右, h 向左
搜索
渐进搜索
/ 向下搜索,?向上搜索。
搜索后,通过n或者N,选择待选项。
EasyMotion 渐进搜索
/ 向下搜索
正则搜索
vimgrep /patter/%
bo cw打开quickfix窗口显示搜索结果。
cscope 搜索
cs f s name
cs f t name
编辑
进入编辑模式
i 光标位置前插入, I 行首插入。
a 字符后面追加,A 行尾追加
o 前一行,O后一行
注:
- i光标前插入,a光标后追加;I行首插入,A行尾追加
- 剪切命令也能进入编辑模式
剪切 c
cw 剪切word
cl 剪切字符
粘贴 p
删除 d
复制 y
撤销 u
撤销 undo
重做 c-r
重做 redo
可视模式
选中一块编辑区域,执行删除、插入等操作。
进入
v
以字符为单位选择区域。
V
以行为单位选择区域。
ctrl+v
以列或块为单位选择区域。
gv 重复最近一次选择
quickfix
bo cw 打开窗口
o
t
q
小技巧
vi替代vim
目的:减少输入的字符数量。
$ ls -l /usr/bin/vi
lrwxr-xr-x 1 root wheel 3 11 15 20:52 /usr/bin/vi -> vim
大小写转换
先使用v模式选中待转换的单词。
gu/gU
gu 转换为小写,gU转换为大写。
转换光标到行尾 gu$
转换光标到行首 gu^
g~
范围选择
- 使用可视模式
- gu/gU后面跟范围,例如5w,^, $
环境变量
一台服务器有多人使用,自己想使用自己的专用工具,例如vim,系统的版本比较低,自己编译一个新版本。 在自己的目录下新建.myenv文件,添加环境变量修改,例如:
export PATH=/home/wuxiangwei/mytools/vim-v7.4.2220/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/mytools/clang+llvm-5.0.0-x86_64-linux-gnu-debian8/lib
然后在.bashrc或者.zshrc文件末尾添加source ~/.myenv
,连接控制台时自动初始化这些环境变量。
插件
ctags
启动
vim -t handle_peering_event 启动vim,直接跳转到handle_peering_event的定义的地方。
跳转
ctrl + ] 单屏显示 ctrl + w + ] 分屏显示
回跳
ctrl + o ctrl + t
Tagbar
说明:
- 标签已排序,不是tag在正文中出现的顺序;
- 配置了跳转到正文时关闭tagbar的功能;
- 管理精力,在tagbar中预览整体,在正文窗口聚焦某个子标题。
折叠
全部折叠 z + M
全部展开 z + R
单个折叠 z + c (close)
单个展开 z + o (open)
注:单个折叠、展开,o即可。
预览
p
不离开tagbar窗口
jump
回车,跳转到代码窗口
大窗口
x
退出
q
quickfix的影响
使用:cw打开quickfix,在有垂直分割窗口的情况下,quickfix窗口会出现在最右侧窗口的底部。 改用:bo cw打开quickfix,quickfix窗口会出现在整个窗口的底部。
leaderf的影响
光标在tagbar窗口时执行leaderf命令,leaderf会将文件在tagbar窗口打开。为减少影响,取消autofocus配置。
cscope
搜索符号或字符串有两种场景,一种是光标就近搜索,另一种是光标不在待查找字符。第一种使用快捷键,第二种使用:cs f s
。
准备工作
find `pwd` -name "*.cc" -o -name "*.h" -o -name "*.c" -o -name "*.hpp" > cscope.files
cscope -bkq -i cscope.files
ctags -R
修改环境变量:CSCOPE_DB
cs f s
Ctrl + \ + s
错误操作引起分屏的问题,将\误打成]。
cs f t
Ctrl + \ + t
cs f g
转到函数定义的地方
Ctrl + \ +g
cs f c
调用该函数的地方
Ctrl + \ +c
Surround
命令模式:原生命令 + s + text-object
text-object
i 和 a:
i
inner object 选中一个object的内部,不包括空格;
a
an object 选中一个object,包括空格在内;
aw a word
iw inner word
aw 和 iw的区别:
a word
1. a a a a a
2. aaaaa
假设光标在a中,yawppppp 的结果为1,yiwppppp的结果为2
w word字
p paragraph段落
s sentence
d s aw
y s aw
c s aw
Shift + ]
Shift + [
Shift + #
Shift + *
添加包围
ys
修改包围
cs
删除包围
ds
ctags插件
配置
set tags=tags;
set autochdir
在源码目录执行 ctags -R
命令。
快捷键
ctrl + ]
g ctrl + ]
Nerdtree
使用vim-nerdtree-tab插件,在新标签中显示同样的nerdtree窗口。
p 切换到父目录
t 新标签中打开
K 本目前第一个文件
和小k的方向一致,向上,只是向上到头。
J 本目录最后一个文件
和小j的方向一致,向下,只是向下到尾。
ultisnips
注意:不能设置set paste
选项,否则失效。
YouCompleteMe
编译安装
cd到YCM目录,执行build.sh脚本。
安装YCM时,如果不指定–clang-completer选项,Vim敲指针->
时会卡住,并且没有补全。
对Linux环境,编译过程中下载clang的速度很慢,可以先下载预编译好的,然后在build.sh中使用–system-libclang选项,不过前提条件是:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/mytools/clang+llvm-5.0.0-x86_64-linux-gnu-debian8/lib
错误1:
[100%] Linking CXX shared library /Users/wuxiangwei/.vim/bundle/YouCompleteMe/third_party/ycmd/ycm_core.so
ld: can't write output file: /Users/wuxiangwei/.vim/bundle/YouCompleteMe/third_party/ycmd/ycm_core.so for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [/Users/wuxiangwei/.vim/bundle/YouCompleteMe/third_party/ycmd/ycm_core.so] Error 1
执行./install.py --clang-completer
命令报上述错误,权限问题,命令前添加sudo即可。
错误2:
NoExtraConfDetected: No .ycm_extra_conf.py file detected, so no compile flags are available. Thus no semantic support for C/C++/ObjC/ObjC++. Go READ THE DOCS *NOW*,
在.vimrc
文件中添加.ycm_extra_conf.py路径。
行号 numbers
相对行号,光标所在行的行号为0。
注释 nerdcommenter
相同的命令,不同的文件类型,产生不同的注释。
支持:.vimrc .c .cc markdown .py文件类型。
添加注释 cc
多行注释:n
添加sexy注释:[count]
删除注释 cu
书签 vim-bookmark
注: \
.`切换到文件上次修改的地方。
打书签 mm
在要标记书签的地方,按mm即可;
显示所有书签 ma
清除所有书签 mx
清除书签 mc
跳转到书签位置,输入mc或mm,即可;
上个书签 mp
这个快捷键只能在同个文件内不同书签间切换,如果要切换到其它文件的书签,执行ma选择。