Vim 进阶1
所有你觉得简单重复,可以自动化实现的操作,都是可以自动化实现的。
Vim光标移动拾遗
w:下一个单词的开头,e:下一个单词的结尾,b:上一个单词的开头,
0:行首(最行首,不管行首字符是否为空),$:行尾,^:非空字符行首,
%:匹配括号处,前跳后,后跳前都可,
gd:跳到某变量定义处(其实是当前函数体内,该变量第一次出现的位置),gD:整个文件内该变量第一次出现的位置,*,#,n,N
[{:移动到前一个没有匹配的左大括号处,(用于跳到函数、循环等作用域的开头)
r:normal 模式下替换一个字符,如 ra 将当前字符替换为 a,R:normal模式下从当前到行尾替换
cw:删除单词并进入编辑模式,C:输出到行尾并进入编辑模式。S:删除整行并进入编辑模式,s:删除当前字符并进入编辑模式,
~:替换大小写,并后移一个字符
自定义计数操作
-
d2w:删除(其实d都是剪切)两个单词 -
2dw:删除单词,做两遍。4dd==d3j
Vim 修饰词
-
iinnerdip:(delete inner paragraph) 删除一段文字(空行分隔),删除操作不包括空行di(:删除括号内内容 -
aarounddap:删除一段文字,删除操作包括空行 -
ttilldt):删除从当前光标到本行下一个)处,删除操作不包括) -
ffinddf):删除从当前光标到本行下一个)处,删除操作包括)
vim mark标签
- m 生成一个 mark 标签,如 a ,生成一个名为 a 的标签
- ` 跳转到一个 mark 标签,如 a ,跳转到名为 a 的标签处,恢复行列位置
- ’ 跳转到一个 mark 标签,如 a ,跳转到名为 a 的标签处,仅恢复行位置,即跳到标签所在行行首
- `` 或 ‘’ 在起跳点和标签 a 间反复横跳
mark 还有很多用法,可参考 https://vimjc.com/vim-mark.html
vim多标签页
对于vim这个来说, 单纯的用多子窗口(sp、vsp)来操作, 感觉还是不够的, 还要结合标签页tab pages来,才能更好的操作。
所有关于标签的命令都是以 :tab 开始的, 可以用tab键来查看提示
-
:tabnew新建标签 -
:tabedit fileName在新标签中打开文件,简写为:tabe -
:tabc关闭当前标签,:tabo关闭其他所有标签 -
:tabfirst切换到第一个标签 -
:tablast切换到最后一个标签 -
:tabp切换到前一个标签 tab previous -
:tabn切换到下一个标签 tab next -
:tabs查看标签 -
gt,gT常规模式下直接切换标签
visual模式
v:逐字符选中V:整行选中C-v:矩形块 block 选中
搜索替换
:[range]s/from/to[flags]:在 range 范围内,将 from 替换为 to。 range、flags 常用含义如下
flags
| flag | 作用 |
|---|---|
% | 复制上次替换命令的flags |
g | 替换每行所有的匹配值(默认只替换每行的第一个匹配值) |
c | 替换前需确认 |
e | 替换失败时不报错 |
i / I | 大小写不敏感 / 敏感 |
range
| range | 功能 |
|---|---|
21 | 21行 |
$ | 最后一行 |
% | 全部行 |
21,25 | 从21行到25行 |
. | 当前行 |
.+3 | 当前行后的第3行 |
.,$ | 当前行到最后一行 |
.,.5 / .,.+5 | 当前行及之后5行 |
多个文件内替换
:args *.c *.h
:argdo %s/ext4/ext5/g
:argdo update
:argdo exit
注意 Vim 中的替换与 sed 中的替换其实是很像的:
sed -i "[range]s/from/to/[flags]" filename 将⽂件 filename 内的 from 替换为 to
-i 表示直接编辑文件内容,不加将会打印输出到 stdout。
Vim 宏
如生成从 1 到 1000 的序列等多次雷同的操作
- 录制宏:
q,如qa表示开始录制名称为a的宏。 - 运行宏:
@,如@a表示执行名称为a的宏,10@a表示执行 10 次。
详见:Vim 重复操作的宏录制
安装插件
mkdir -p ~/.vim/pack/vendor/start- 将插件 clone 到该目录下即可
ctags
生成 tags 方便跳转看代码,支持多种语言
- 安装 ctags:
sudo apt install exuberant-ctags - 创建 tags 文件
ctags -R . - 若查找
inode_operations的定义- No tags file
- 当前目录不存在 tags 文件
- 在父目录中寻找 tags 文件:在
.vimrc中添加set tags=./tags;,tags
- No tags file
- 使用:
- 查找当前文件中的某个变量的定义:光标在该变量上,
Crtl+] - 列出所有某个变量的定义及引用:
g] - 直接打开定义
inode_operations的文件:直接在当前目录下,命令行中vim -t inode_operations
- 查找当前文件中的某个变量的定义:光标在该变量上,
shell使用vim键位
-
bash :
set -o vi -
zsh :
bindkey -v -
fish :
fish_vi_key_bindings
这里说一下 bash 中默认是 emacs 模式,具体当前是什么模式可以用 set -o 命令查看,然后通过 set -o enacs 和 set -o vi 来回切换。
键位图中文版

其他常用插件
- gitgutter
- easymotion
- fzf
- Vim-linux-coding-style
- cscope
- …
Ref:
https://www.bilibili.com/video/BV1PL411M7bg?from=search&seid=12655157522675339145&spm_id_from=333.337.0.0