vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富而被广泛使用。基本上 vi 共分为三种模式,分别是“一般指令模式“、“编辑模式”与“命令行命令模式”。

这三种模式的作用分别是:

  • 一般指令模式 (command mode)

以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模式中, 你可以使用“上下左右”按键来移动光标,你可以使用“删除字符”或“删除整列”来处理文件内容, 也可以使用“复制、贴上”来处理你的文件数据。

  • 编辑模式 (insert mode)

在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到你按下“i, I, o, O, a, A, r, R”等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面的左下方会出现“ INSERT 或 REPLACE ”的字样,此时才可以进行编辑。而如果要回到一般指令模式时, 则必须要按下“Esc”这个按键即可退出编辑模式。

  • 命令行命令模式 (command-line mode)

在一般模式当中,输入“ : / ? ”三个中的任何一个按钮,就可以将光标移动到最下面那一列。在这个模式当中, 可以提供你“搜寻数据”的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!如下图所示:

一般指令模式键位表

键位 键位功能
h 或 向左箭头键(←)光标向左移动一个字符
j 或 向下箭头键(↓)光标向下移动一个字符
k 或 向上箭头键(↑)光标向上移动一个字符
l 或 向右箭头键(→)光标向右移动一个字符
如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f]屏幕『向下』移动一页,相当于 [Page Down]按键
[Ctrl] + [b]屏幕『向上』移动一页,相当于 [Page Up] 按键
[Ctrl] + [d]屏幕『向下』移动半页
[Ctrl] + [u]屏幕『向上』移动半页
+光标移动到非空格符的下一行
-光标移动到非空格符的上一行
n那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键[Home]这是数字『 0 』:移动到这一行的最前面字符处
$ 或功能键[End]移动到这一行的最后面字符处
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个档案的最后一行
nGn 为数字。移动到这个档案的第 n 行。
gg移动到这个档案的第一行,相当于 1G 。
nn 为数字。光标向下移动 n 行
搜索替换
/word向光标之下寻找一个名称为 word 的字符串。
?word向光标之上寻找一个字符串名称为 word 的字符串。
n这个 n 是英文按键。代表重复前一个搜寻的动作。
N这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。
使用 /word 配合 n 及 N可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/gn1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 。
:1,$s/word1/word2/g或:%s/word1/word2/g从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !
:1,$s/word1/word2/gc或:%s/word1/word2/gc从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!
删除、复制与贴上
x, X在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键)
nxn 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd删除游标所在的那一整行
nddn 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除游标所在处,到该行的最后一个字符
d0那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy复制游标所在的那一行
nyyn 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行
y1G复制游标所在行到第一行的所有数据
yG复制游标所在行到最后一行的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p, Pp 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!
J将光标所在行与下一行的数据结合成同一行
c重复删除多个数据
u复原前一个动作
[Ctrl]+r重做上一个动作。
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次
.重复前一个动作的意思。

编辑模式键位表

键位 键位功能
i, I进入插入模式(Insert mode):i 为“从目前光标所在处插入”, I 为“在目前所在列的第一个非空白字符处开始插入”。
a, A进入插入模式(Insert mode):a 为“从目前光标所在的下一个字符处开始插入”, A 为“从光标所在列的最后一个字符处开始插入”。
o, O进入插入模式(Insert mode):这是英文字母 o 的大小写。o 为“在目前光标所在的下一列处插入新的一列”; O 为在目前光标所在处的上一列插入新的一列!
r, R进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;
上面这些按键中,在 vi 画面的左下角处会出现“--INSERT--”或“--REPLACE--”的字样。
[Esc]退出编辑模式,回到一般指令模式中

命令行模式键位功能表

键位 键位功能
:w将编辑的数据写入硬盘文件中
:w!若文件属性为“只读”时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的文件权限有关啊!
:q离开 vi
:q!若曾修改过文件,又不想储存,使用 ! 为强制离开不储存盘案。
感叹号 (!) 在 vi 当中,具有“强制”的意思
:wq储存后离开,若为 :wq! 则为强制储存后离开
ZZ这是大写的 Z 喔!若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:w [filename]将编辑的数据储存成另一个文件(类似另存新文件)
:r [filename]在编辑的数据中,读入另一个文件的数据。亦即将 “filename” 这个文件内容加到光标所在列后面
:n1,n2 w [filename]将 n1 到 n2 的内容储存成 filename 这个文件。
:! command暂时离开 vi 到命令行界面下执行 command 的显示结果!
vim 环境的变更
:set nu显示行号,设置之后,会在每一列的字首显示该列的行号
:set nonu与 set nu 相反,为取消行号!

区块选择键位表

键位 键位功能
v字符选择,会将光标经过的地方反白选择!
V列选择,会将光标经过的列反白选择!
[Ctrl]+v区块选择,可以用长方形的方式选择数据
y将反白的地方复制起来
d将反白的地方删除掉
p将刚刚复制的区块,在光标所在处贴上!

多文件编辑键位表

键位 键位功能
:n编辑下一个文件
:N编辑上一个文件
:files列出目前这个 vim 的打开的所有文件

多窗口编辑键位表

键位 键位功能
:sp [filename]打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容(同步显示)。
[ctrl]+w+ j [ctrl]+w+↓按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下方向键),则光标可移动到下方的窗口。
[ctrl]+w+ k [ctrl]+w+↑同上,不过光标移动到上面的窗口。
[ctrl]+w+ q相等于 :q 结束离开!

编辑补全键位表

键位 键位功能
[ctrl]+x -> [ctrl]+n通过目前正在编辑的这个“文件的内容文字”作为关键字,予以补齐
[ctrl]+x -> [ctrl]+f以当前目录内的“文件名”作为关键字,予以补齐
[ctrl]+x -> [ctrl]+o以扩展名作为语法补充,以 vim 内置的关键字,予以补齐

vim编辑故障处理

编辑文件中因意外导致未保存文件,系统会生成.文件名.swap的隐藏交换类型文件,这时重新编辑文件会出现以下警告:

E325: ATTENTION
Found a swap file by the name ".test.txt.swp"
          owned by: root   dated: Sun Oct 10 15:55:21 2021
         file name: ~root/test.txt
          modified: YES
         user name: root   host name: server01
        process ID: 18198 (still running)
While opening file "test.txt"
             dated: Sun Oct 10 15:55:10 2021

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r test.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".test.txt.swp"
    to avoid this message.

Swap file ".test.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

上面警告提示了两点出现交换文件的主要问题和解决方案

  • 问题一:可能有其他人或程序同时在编辑这个文件:

由于 Linux 是多用户多任务的环境,因此很可能有很多人同时在编辑同一个文件。如果在多人共同编辑的情况下, 万一大家同时储存,那么这个文件的内容将会变的乱七八糟!为了避免这个问题,因此 vim 会出现这个警告窗口! 解决的方法则是:

  1. 找到另外那个程序或人员,请他将该 vim 的工作结束,然后你再继续处理。
  2. 如果你只是要看该文件的内容并不会有任何修改编辑的行为,那么可以选择打开成为只读(O)文件, 亦即上述画面反白部分输入英文“ o ”即可,其实就是 [O]pen Read-Only 的选项啦!
  • 问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed):

这就是常见的不正常结束 vim 产生的后果。解决方案依据不同的情况而不同喔!常见的处理方法为:

  1. 如果你之前的 vim 处理动作尚未储存,此时你应该要按下“R”,亦即使用 (R)ecover 的项目, 此时 vim 会载入 .man_db.conf.swp 的内容,让你自己来决定要不要储存!这样就能够救回来你之前未储存的工作。 不过那个 .man_db.conf.swp 并不会在你结束 vim 后自动删除,所以你离开 vim 后还得要自行删除 .man_db.conf.swp 才能避免每次打开这个文件都会出现这样的警告!
  2. 如果你确定这个交换文件是没有用的,那么你可以直接按下“D”删除掉这个交换文件,亦即 (D)elete it 这个项目即可。 此时 vim 会载入 man_db.conf ,并且将旧的 .man_db.conf.swp 删除后,创建这次会使用的新的 .man_db.conf.swp 喔!

至于这个发现交换文件警告讯息的画面中,有出现五个可用按钮,各按钮的说明如下:

  • [O]pen Read-Only:打开此文件成为只读文件, 可以用在你只是想要查阅该文件内容并不想要进行编辑行为时。
  • (E)dit anyway:还是用正常的方式打开你要编辑的那个文件, 并不会载入交换文件的内容。
  • (R)ecover:载入交换文件的内容,救回之前未储存的工作。最后保存退出后要手动自行删除交换文件。
  • (Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
  • (A)bort:忽略这个编辑行为。

vim环境配置

配置文件路径:~/.vimrc

参数表

环境参数(下表为命令行模式指令,在文件中配置时去掉:) 参数描述
:set nu
:set nonu
设置与取消行号
:set hlsearch
:set nohlsearch
hlsearch 就是 high light search(高亮度搜寻)。 这个就是设置是否将搜寻的字串反白的设置值。默认值是 hlsearch
:set autoindent
:set noautoindent
是否自动缩排,autoindent 就是自动缩排。
:set backup是否自动储存备份文件,一般是 nobackup 的, 如果设置 backup 的话,那么当你更动任何一个文件时,则原始文件会被另存成一个文件名为 filename~ 的文件。
:set ruler设置是否显示状态列说明
:set showmode是否要显示 --INSERT-- 之类的提示在左下角的状态列。
:set backspace=(012)当 backspace 为 2 时,删除键可以删除任意值;0 或 1 时,仅可删除刚刚输入的字符。
:set all显示目前所有的环境参数设置值。
:set显示与系统默认值不同的设置参数,即自定义参数。
:syntax on
:syntax off
是否依据程序相关语法显示不同颜色。
:set bg=dark
:set bg=light
可用以显示不同的颜色色调,默认是“ light ”。
:set tabstop=(n)
:set expandtab
设置默认缩进单位,n为空格( 当设置成 expandtab 时,缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进)长度