共计 2966 个字符,预计需要花费 8 分钟才能阅读完成。
1)一些常用的 Vim 配置,在~/.vimrc 中
syntax on 支持语法高亮
set nu 显示行号,也可以写成 set number
set nonu 不显示行号,也可以写成 set nonumber
set nonu 不显示行号,也可以写成 set nonumber
set ai 设置自动缩进,也可以写成 set autoindent
set shiftwidth=4 设置自动缩进 4 个空格, 当然要设自动缩进先.
set sts=4 即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格,也可以写成 set softtabstop
set tabstop=4 实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
set expandtab 在输入 tab 后, vim 用恰当的空格来填充这个 tab.
:set hls 打开搜索高亮
:set nohls 取消搜索高亮
:set list:显示特殊字符
:set nolist
2)多文件编辑
:e filename vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
:sp filename vim 将分割出一个横向窗口, 并在该窗口中打开新文件.
:vsp filename vim 将在右边分割出一个窗口, 并在该窗口中打开新文件.
如果:sp 或 :vsp 没有指定文件,则在新窗口中打开原文件。
ctrl+w w 来在 vim 打开的多个窗口中切换.
ctrl+w q 来关闭多个窗口中当前的窗口.
打开的两个文件上下窗口分布: vim -o file1 file2
打开的两个文件左右窗口分布: vim -O file1 file2
打开的两个文件左右窗口分布: vim -O file1 file2
3) 查找
/xxx(?xxx) 表示在整篇文档中搜索匹配 xxx 的字符串, / 表示向下查找, ? 表示向上查找. 查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
*(#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下 (上) 一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方向查找. (可以使用 shift+* 或 shift + #来查找当前光标所在单词)
g*(g#) 此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而是匹配包含该单词的所有字符串.
% 本命令查找与光标所在处相匹配的反括号, 包括 () [] {}.
在 vim 中一般查找 :/str, 如果有空格则需要:/str str2/
在 vim 中一般查找 :/str, 如果有空格则需要:/str str2/
4) 光标移动
h,j,k,l 左,下,上,右移动
w(e) 移动光标到下一个单词. b 移动光标到上一个单词.
0 移动光标到本行最开头. ^ 移动光标到本行最开头的字符处. $ 移动光标到本行结尾处.
向前向后翻页 ctrl+f 和 ctrl+b.
% 跳转到相配对的括号.
G(shift+g) - go to the last line in the vim editor (文件的末尾)
1G - goto line number 1(文件的开始)
20G - goto line number 20
5)拷贝, 删除与粘贴
yy 复制当前行
5yy 复制 5 行
p 粘贴(paste)
ZZ 保存退出
ZQ 不保存退出
5yy 复制 5 行
p 粘贴(paste)
ZZ 保存退出
ZQ 不保存退出
x 表示删除当前字符。
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令结合的, 看几个例子就能够明白了.
yw 表示拷贝从当前光标到光标所在单词结尾的内容. dw 表示删除从当前光标到光标所在单词结尾的内容. y0 表示拷贝从当前光标到光标所在行首的内容. d0 表示删除从当前光标到光标所在行首的内容. y$ 表示拷贝从当前光标到光标所在行尾的内容. d$ 表示删除从当前光标到光标所在行尾的内容. yfa 表示拷贝从当前光标到光标后面的第一个 a 字符之间的内容. dfa 表示删除从当前光标到光标后面的第一个 a 字符之间的内容.
特殊地: yy 表示拷贝光标所在行. dd 表示删除光标所在行. D 表示删除从当前光标到光标所在行尾的内容.
删除整个文档 :1,$d
删除某行后面的换行符号:在命令状态下,在某一行上按 "J" 键将 Join 下一行,呵呵
u 撤销上次的操作,ctrl+ r 恢复上次的撤销。
删除所有空白行(^ 是行的开始,\s* 是零个或者多个空白字符;$ 是行尾) :g/^\s*$/d
6)替换
单个字符替换用 r,覆盖多个字符用 R,用多个字符替换一个字符用 s,整行替换用 S.
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/)替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g)替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+(使用 + 来 替换 /):/oradata/apras/ 替换成 /user01/apras1/
:2,50s/part1/part2 # 用 part2 替换第 2 行到第 50 行中每行第 1 个 part1
:2,50s/part1/part2/g # 用 part2 替换第 2 行到第 50 行中所有的 part1
:.,+3s/part1/part2 # 用 part2 替换当前行以及当前行后面的三行中每行第 1 个 part1
:.,+3s/part1/part2/g # 用 part2 替换当前行以及当前行后面的三行中所有的 part1
高级用法:例如将每行增加 xxx: :%s/\(.*\)/\1 xxx/g
7)visual block 状态
ctrl+ v 进入,列块选择,例如 4l 选中光标接下来的 4 列,7j 光标开始的 7 行,执行 4l 和 7j 后选中 7 行 4 列的块,也可以在 ctrl+ v 后使用 hjkl 来控制选择的行和列,可以使用 y,d 等进行拷贝删除操作。例如删除多行前面的空格。(块编辑:编辑一行,效果被应用到所有选中的行)例如注释多行:ctrl+ v 选择块后,然后 I 进入编辑状态在第一行的开始输入 #,然后两次 esc 退出后,刚才选中的所有行前面自动加#,从而达到注释所有行的目的。
shift+ v 可以用来选中多行,然后:s/aaa/bbb/g, 对选中的行中进行替换。
shift+ v 选中多行后,执行 d 直接删除选中的多行。
8) 其他
查看当前 vim 打开的文件:vim 下:f
vim 中去除空行或行末的 ^M:dos2unix ufile
VIM 中 sort 不能用:只能在 terminal 下执行 sort -u file > file_new
vim 中 diff 文件:如果已经打开了一个文件,则 :vert diffsplit file2,如果还没有打开文件,则直接执行 vi -O test_vi.txt test_vi2.txt,此时两个文件左右排列,如果需要两个文件上下排列的话,执行 vi -o test_vi.txt test_vi2.txt。vimdiff 最多可以同时比较 4 个文件。
不退出 vim,直接执行命令,例如在 perl 文件中,直接执行不退出,:!perl %。如果前面已经执行过了,则重复前面的命令时,只需要:!!
正文完
扫码赞助
