已索引

本文有相应的视频教程: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……

-- By 许望(RHCA、OCM、VCP)
最后修改:2024 年 02 月 07 日 09 : 52 AM
如果觉得我的文章对你有用,请随意赞赏