已索引
本文有相应的视频教程:https://edu.51cto.com/sd/a7889 【文章免费,视频收费】
在对 VIM 不了解的情况下,推荐使用图形化编辑器 gedit。
VIM - Vi IMproved,即VI的增强版,默认,普通用户的 vi 命令就是 vim 的别名,root 用户需要显式使用 vim 命令。
获取帮助
# vimtutor
执行 vimtutor 可以打开 vim 内置教程的拷贝,这是一份快速的学习文档,可以直接在该文档中进行练习。掌握文档中的命令足以让人轻松的使用 vim,教程时间约 30 分钟左右。
如果想获取更详情的帮助,可以查看其文档:
/usr/share/doc/vim-common-7.4.160/docs/help.txt
Demo: 最简单的 VIM 使用
打开文件,编辑文件,(不)保存并退出。
三种模式
红帽教材把 VIM 模式分为三种:command mode, insert mode, extended command mode。
命令模式(Command Mode)
官方文档也称为 Normal mode。在命令模式下所敲的任何字符都会被当作命令来处理。任何时候连续按下两次Esc键就可以返回到命令模式(你可以多按几次以确保进入到了命令模式)。
插入模式(Insert Mode)
也称编辑模式。在插入模式下,所见即所得。按下 i 即进程插入模式。
扩展命令模式(Ex Mode)
也称为底行命令模式、扩展命令模式。输入:后,即进入扩展模式
- :w writes (saves) the file to disk
- :wq writes and quits (:x或者ZZ)
- :q! quits, even if changes are lost
其它进入编辑模式的技巧
- a append after the curse
- I insert at beginning of line
- A append to end of line
- o insert new a line (below)
- O insert new line (above)
- s 删除光标所在字符并进入编辑模式
光标的移动
基本方向键:
方向键,h (左), j (下), k (上), l (右)
行首与行尾:
行首:^, home 键
行尾:$, end 键
行内快速移动:
n-方向键/hjkl:按下 n 次该方向键
w/ b:向后/向前移一个单词,在一行非常长时很有用,每次跳到单词的开头
e:一个单词一个单词向后移,每次跳到单词的结尾
说明:单词之间的分隔符是空格,制表符,标点符号和特殊符号,跟 oracle 规则类似。
文件头与文件尾:
:n 跑到第 n 行
gg 或者 :1 跳到文件头
G 跳到文件尾
撤销与恢复
u, ctrl + r
可以撤销到文件打开的时候,也就是说,即使做了w操作,也可以撤销,但是如果做了wq操作,就不行了。
查找与替换
/, n, N 或?, n, N
:1,5s/cat/dog/g
将第1行至第5行的所有cat替换为dog,没有范围则只替换光标当前所在行,如果没有 g 则只替换每一行的第1个匹配。1,$ 表示所有行,可以缩写为 %。
:1,10s/login/LOG/gc
replace with LOGIN (y/n/a/q/l/^E/^Y)?
y 表示替换当前匹配,光标移至下一匹配,n 表示不替换当前匹配,光标移至下一匹配,a 表示将当前匹配至文件末尾的所有匹配都替换,q 表示结束,不替换当前匹配也不再继续,l 表示当前匹配是最后一个,替换完成后结束。^E 和^Y 表示按下 ctrl+e 和 ctrl+y 来上下查看文件内容(注意:xshell不支持)。
复制、剪切、粘贴
删除和剪切是一个操作
x, nx ——> p, P 在同一行粘贴
dd, ndd, 2,5d ——> p, P 另起一行粘贴
yy, nyy, 2,5y ——> p, P 另起一行粘贴
ygg 从当前行复制到文件第一行
yG 从当前行复制到文件的末尾
dgg 从当前行删除到文件第一行
dG 从当前行删除到文件的末尾
dw:从当前光标处删除到单词的词尾
yw : 从当前光标处复制到单词的词尾
d$ : 删除当前光标位置及其后的该行所有字符 (shift + d)
d^:从当前光标处删到该行的行首
vim 中执行 shell 命令
:!command 执行命令,回车即可回到文件。
:r !command 执行命令并把命令输出插入到光标所在行的后面。
:20r !command 执行命令并把命令输出插入到20行的后面。
:sh 在 vim 中获得一个 shell,执行 exit 离开。
常用的扩展命令
:set nonu <-----> :set nu
:syntax on <-----> :nohls
:set noic <-----> :set ic <-- 默认,在 vim 中查找是区分大小写的
:set noai <-----> :set ai <-- 自动缩进
:set paste <-----> :set nopaste <-- set paste 可以纯粘贴拷贝,这样格式不会乱掉
:set cindent <-- 设置使用C/C++风格的缩进方式
:set shiftwidth=2 <-- 设置缩进的空格数为2,配置前面的 cindent 使用
:set smartindent
:set ts=2 <-- 设置 TAB 宽度为2个空格
:e! <-- 不保存修改并重新打开文件
自定义 VIM
如果想将上面的设置永久保留,可以将其写到 ~/.vimrc 中,注意在配置文件中不要写冒号。
REPLACE 模式
连续按两次insert键将进入REPLACE模式。
visual 模式
v/V,进入 VISUAL/VISUAL LINE 模式
Ctrl + v,进入 VISUAL BLOCK 模式
使用这些 visual 模式选择内容后,就可以批量操作了,例如按d键删除。
典型用法:给配置文件批量增加注释(VIM)
ctrl + v,方向键选择内容,I(输入#号),ESC。
当然,可也以通过替换命令来添加或者删除行首的注释符号。
多窗口编辑
vim -O|-o file1 file2 <-- 上下屏|左右屏 打开两个文件
:vs file <-- 左右屏 添加新文件
:sv file <-- 上下屏 添加新文件
Ctrl + w, 左右方向键 <-- 切换当前屏
Ctrl + w, c <-- 关闭当前屏(:q)
Ctrl + w, o <-- 关闭其它屏
如果一次打开了多个文件,想要全部退出,使用:qa。
使用 vimdiff 作文件比较
使用 vimdiff file1 file2 可以显示两个文件不同的行及显示不同的地方。
临时文件
如果多次异常退出 vi,就会产生多个临时文件:.swp, .swo, .swn……