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 修饰词
-
i
innerdip
:(delete inner paragraph) 删除一段文字(空行分隔),删除操作不包括空行di(
:删除括号内内容 -
a
arounddap
:删除一段文字,删除操作包括空行 -
t
tilldt)
:删除从当前光标到本行下一个)
处,删除操作不包括)
-
f
finddf)
:删除从当前光标到本行下一个)
处,删除操作包括)
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