summary
vim基础
常用的设置
ps: vim的设置, 针对当前用户的设置, 需要修改~/.vimrc, 如果没有可以自行创建
针对所有用户设置, 需要修改 /etc/vim/viminfo
set ts=4 | ts是tabstop的缩写,设TAB宽度为4个空格。 |
set softtabstop=4 | 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。 |
set shiftwidth=4 | shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。 |
set expandtab | expandtab表示缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。 |
set autoindent | autoindent自动缩进 |
set nu | nu 设置显示行号 |
set hlsearch | 设置搜索的关键词高亮 |
set list | 显示所有的不可见字符(空格, tab, 换行符), 用来解决在Linux/Window上出现的对齐问题 |
set cursorline | 在光标所在行下划线 |
set cursorcolumn | 显示光标所在列对齐线 |
基础操作:
vim 常用的模式有: 命令模式 ===>> vim txt 进入或者ESC 之后的状态就是此模式
插入模式====>> 当处于修改文件的状态, 就是此模式
底行模式====>> 进入命令模式后, 键盘输入:在此之后可以输入一些命令
视图模式====>> 在命令模式下, 键盘输入v, 就进入此模式
shift + a == A | 从命令模式进入插入模式, 并且光标会跳到行尾 |
shift + i == I | 从命令模式进入插入模式, 并且光标会跳到行尾 |
a | 从命令模式进入插入模式, 在当前光标位置的下一个字符插入 |
i | 从命令模式进入插入模式, 在当前光标位置的下一个字符插入 |
o | 从命令模式进入插入模式, 在当前行的下一行插入一行 |
O | 从命令模式进入插入模式, 在当前行的上一行插入一行 |
J | 将当前行的下一行合并到当前行 |
K | 跳转到光标所在函数或命令的man手册 |
gd | 跳到局部的变量定义处,不能跨文件 |
:r hello | 将hello文件读入当前文件中 |
:n1,n2 w>>fox | 将n1至n2追加到fox文件中 |
:w fileName | 文件另存为,当我们编辑了很多却发现当前文件是read only 时候使用 |
zt | 当前行跳转为第一行 |
zb | 当前行跳转为最后一行 |
ZZ | 保存并退出当前编辑文档 |
光标的转移:
小写英文字母 h j k l | 分别控制光标左 下 上 右移动,也可以使用箭头 |
Ctrl+b | 屏幕往后移动一页 |
Ctrl+ f | 屏幕往前移动一页 |
Ctrl+u | 屏幕往后移动半页 |
Ctrl+d | 屏幕往前移动半页 |
Shift+g == G | 移动到文章的最后 |
Shift+4 == $ | 移动到光标所在行的行尾 |
Shift+6 == ^ | 移动到光标所在行的行首 |
0 | 移动到光标所在行的行首 |
w | 光标跳到下个字的开头 |
e | 光标跳到下个字的字尾 |
b | 光标回到上个字的开头 |
gg | 进入到文本的开始 |
Shift+g == G | 进入到文本的末端 |
2g=15G | 第二行至第15行代码格式化(重置缩进) |
zf 100 | 折叠100 行 |
zf% | 把光标放在{或者(位置, 前后都行, 输入zf%, 折叠此块代码 |
Ctrl + g | 显示当前文件名字 |
]] | 跳转到函数结尾} |
[[ | 跳转到函数开始{ |
删除操作
- x 删除光标所在位置字符
- X 删除光标所在位置前一个字符
- dw 删除光标所在位置到下一个非字母
- D 删除光标所在位置到行末的所有字符
- dd 删除当前行
以上操作均可以在在命令前面加数值, 就是把此操作重复N此的意思
复制操作
-
yy 粘贴当前行
-
yw 粘贴当前word
以上操作可以在命令前加数字,如10yy, 意为复制10行到粘贴板, 同时此操作需要与p(粘贴)结合使用
3. 更复杂的非整行的复制粘贴操作:
j键入v 进入视图模式, 用光标转移操作来框选内容, 然后y(复制), 然后移动到目标位置, p 粘贴
Vim进阶
1.自动推断
在Windows 中使用vs/Qt等IDE, 会有自动推断功能, 在vim中也可以有类似的功能:ctrl + p。
键入Ctrl + p 就会出现上图的结构, 可以推断我们自己写的函数, 变量, 也能推断C库的内容, 只要包含了头文件就可以
; 然后可以通过⬆/ctrl +p 逐条向上, 或者⬇/ctrl + n 逐条向下 跳转到自己想要的item
ps: 根据个人的实践, Ctrl + p 的推断并不像Qt那么智能, 只是根据你已经输入的字符, 机械的匹配单词(字符串, 只有数字和字母),对定义的结构体和类的推断, 还是力不从心的。
2. 跳转
在vim的使用中, 我们经常会查找某个函数或者变量, 光标就会到处跳转,比如:
step 1: 光标在100行;
step 2: 光标在300行;
step 3: 光标在500行;
step 4: 光标在50行;
step 5: 光标在250行;
在如上场景中, 我现在到了第五步, 光标处在250行, 如果想回到第四步的位置怎么办呢??
Ctrl + o 闪亮登场, Ctrl + o 组合键可以让光标回到上一个位置;
Ctrl + i 如果希望回到下一个位置, 则用 ctrl + i.
PS: 根据本人的实践, Ctrl + o, Ctrl + i 的光标位置跳转, 不记录j/k的逐行光标移动, 记录的是G/100G/:100/查找/gg 这几类光标跳转
3. 列模式:
在word 的编辑中, 如果我们需要把N行同时输入活删除若干列的内容, 我们可以借助Alt 键的帮助, 在Vim中也可以方便的使用。
同时在N插入:
step 1:将光标移动到您想要插入的第一行第一个字符位置:
step 2:Ctrl + v 进入virtual block 模式
step 3:通过j/k上下移动光标, 至第N行
step 4:shift + i ====I, 输入想要的内容
step 5:按两次ESC 退出插入模式
删除N行M列:
step 1:将光标移动到您想要插入的第一行第一个字符位置:
step 2:Ctrl + v 进入virtual block 模式
step 3:通过h/j/k/l上下左右移动光标, 至第N行M列, 框选出一个NxM的矩阵
step 4:键入x, 完成删除操作
step 5:按两次ESC 退出插入模式
4.录制宏
在实践中, 经常需要重复的操作, 一些简单操作, 我们可以使用sed来搞定, 对于有一定复杂性的操作, 可以考虑用录制宏来完成, 事半功倍,操作步骤如下:
step 1:在命令模式下依次键入qa,此时在左下角有一个 recording 单词;
step 2:此时已经开始录制了, 接下来会记录你的所有的vim动作;
step 3:动作结束,按ESC退出插入模式, 键入a结束录制, 此时一系列的动作已经保存完成,接下来就是执行已经保存了的动作;
step 5:键入@a执行已经保存的动作,也可以用 n@a 来连续执行n次.
5. vimdiff
在Linux中可以使用vimdiff来查看版本之间的差异:
vimdiff a.1 a.2 进入vimdiff
]+c(右方括号 + c) 跳转到下一个不同的位置
[+c(左方括号 + c) 跳转到上一个不同的位置
Ctrl + 两次w 光标在对比的文件间切换
d+p 把光标所在窗口的差异改到另一个窗口(:diffput)
d+o 把光标所在窗口的差异改为另一个窗口的(:diffget) o=obtain
z+o 打开光标下面的一个折叠(open)
z+O 打开光标下面的所有折叠
z+c 关闭光标下面的一个折叠(close)
z+C 关闭光标下面的所有折叠
:set noscrollbind 取消文件比较中的同步滚屏功能,此时移动光标, 另一个文件不会跟着上下翻页
:diffupdate 在对比过程中, 又时候会手动的改变文件的内容, 此时需要更新一下对比的结果