Vim 和 Vi 都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 Vi 的所有指令,而且还有一些新的特性在里面。
下面讲解的 vim 功能都是基于以下的系统环境和软件版本:
Linux 内核版本:4.18.0-193.6.3.el8_2.x86_64 Linux 发行版本:CentOS Linux release 8.2.2004 (Core) VIM 版本:8.0.1763 注:查看 vim 的各个选项使用说明:vim -h 或 vim --help;查看 vim 的版本信息:vim -v 或 vim --version
一、基本使用流程
Linux 系统的命令终端中,经常会使用 vi 或者 vim 编辑器编辑文件,基本操作流程如下:
在命令终端输入 vim /etc/liaowenxiong.txt
打开指定的文件,默认进入 vim 的“普通命令模式”(Normal Mode) 在“普通命令模式”下输入i
进入编辑界面,也就是 vim 的“插入模式”(Insert Mode) 编辑好之后按 Esc
返回到 vim 的“普通命令模式” 按冒号 :
进入 vim 的“底行命令模式”(Last Line Command Mode or Ex Command Mode) 输入 q!
或者 wq
返回到命令终端(也叫控制器)
二、普通命令模式
normal mode.
vi/vim 的默认模式就是普通命令模式,启动 vi/vim 就进入普通命令模式,在插入模式和底行模式下按 Esc
回到普通命令模式,该模式下常用的命令如下:
(一)切换到插入模式(编辑/写入/输入)
命令 说明 i
切换到插入模式,i
在当前游标前(就是游标左边)插入字符 I
在行首插入 a
切换到插入模式,a
在当前游标后(就是游标右边)插入字符 A
在行末插入 o
切换到插入模式,o
在当前行后(就是当前行的下面)插入一个新行 O
在当前行前(就是上面)插入一个新行
技巧: 假如我要一次性输入 30
个等号 =
,可以在普通命令模式下,输入:30i=<esc>
,就是先输入数量 30
,接着按 i
切换到插入模式,接着输入 1
个等号 =
,最后按 esc
返回普通命令模式,就成功插入 30
个等号 =
啦!这在插入分割线时非常有用哦~
(二)切换到可视模式(选择文本模式)
命令 说明 v 切换到按字选择文本的可视模式,所谓“可视”,就是被选中的字符会“高亮”显示 V 或 Shift + v 切换到按行选择文本的可视模式,按上下箭头来选择行 Ctrl + v 切换到按块选择文本的可视模式,按上下左右箭头来选择矩形区域。它选中屏幕上的一个矩形区域。以按下 Ctrl + v 的位置为一个角,光标所在位置为它的对角。
(三)切换至底行命令模式
(四)替换/修改
1. 切换到替换模式
命令 说明 R
按下大写的 R 键,屏幕左下角出现 --REPLACE--
字样,说明你已经处于“替换模式”。此时输入字符可以连续替换光标及其后面的内容。注意:退格键(Backspace)在替换模式中被解释为:如果左边的内容被替换过,则恢复到原来的样子;如果没有被替换过,则光标向左移动。修改完毕后,按下 Esc 键回到“普通命令模式”。若新输入的字符数超过原有对应字符数,则多出部分就附加在后面。 #R
若在命令 R 之前加上一个数字,例如 5R,则表示新输入的文本重复出现 5 次,但只取代一个被输入文本所覆盖的字符序列,当前行中未被覆盖的内容仍保留下来,只是位置相应右移。这个命令其实没有意义
2. 替换命令
命令 说明 r
r 命令用于替换光标所在位置的字符,具体操作是,先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符,就完成了一次替换。再次替换需要再次按下 r 键才可以。注意,全程不会进入插入模式。其实整个操作还是在“普通命令模式”下完成的,所以这个命令并不算是切换到“替换模式”下 #r
光标所在位置的字符起 #
个字符被 r 后所输入的新字符替换掉
3. 修改替换(删除旧的,输入新的)
文本内容的修改是指在编辑过程中,可以对文本中的某些字符,某些行进行修改,即用新输入的文本代替需要修改的老文本,它等于先用删除命令删除需要修改的内容,然后再利用插入命令插入新的内容。所以在使用修改命令后,vi/vim 进入到“插入模式”下,当输入完新的内容后,再按 Esc
回到“普通命令模式”。
命令 说明 s
该命令表示用随后输入的文本替换当前游标所在的字符。如果只用一个新字符替换游标所在字符,则s
命令与r
命令功能类似,如sh
与rh
的作用都是将游标所在字符变为h
。但二者也有区别,r
命令是在命令模式下替换,而s
命令的工作模式是先删掉游标所在字符后进入插入模式,在插入模式
下输入文字完成替换。 #s
以输入的文本替换光标之后 #
个字符,包含光标所在位置的字符。即用 s
后输入的文本替换从光标所在字符开始及其后的 #-1
个字符(共 #
个字符) S
表示用新输入的文本内容替换光标当前行(整行,不管光标位于何列)。输入S
后,光标所在行成为空行,切换到“插入模式”,光标停在行的开头 #S
表示用新输入的文本替换光标所在行及其下面 #-1
行的文本内容。例如 3S
,则表示有 3 行(包括光标当前行及其下面 2 行)要被 S
命令之后输入的正文所替换 cw
输入该命令后,光标所在位置到词尾之间的字符被删除,并切换到“插入模式”,然后可以输入所需要的字符,输入完成之后按 Esc
回到“普通命令模式”,这样就完成了用所输入的内容替换光标位置至词尾的所有文本内容 c#w
或 #cw
替换游标后面 #
个词,包含游标所在位置的词在内。例如:c6w
,就会删除游标后 6 个词,同时切换到插入模式中,接着可以输入新的内容。什么意思呢?就是游标所在位置的词以及后面的 5 个词被删除了,然后切换到插入模式,接着输入的内容就相当于是替换掉被删的 6 个词的内容。 c#l
或 #cl
修改(改写/替换)游标后的 #
个字母,包含游标所在位置的字符在内。 c3j
j
表示向下,表示将游标所在行和下面3
行都删除,即游标所在行到往下数的第 3 行之间的文本删除,然后进入“插入模式”c3G
输入c3G
,游标所在行到第 3 行之间的文本删除,然后进入“插入模式”,注意是整个文档的第 3 行 c3k
k
表示向上,表示将游标所在行和上面3
行都删除,会进入“插入模式”c$
修改从游标当前位置开始到本行末尾范围内的内容,先删除旧内容,进入“插入模式”,再输入新内容完成修改替换 C
C
命令和c$
命令相同,可以修改从游标当前位置开始到行尾的内容。#C
当在命令C
之前加上数字 #
时,表示可以修改指定行数的内容。例如,3C
,表示把游标所在位置起之后(注意不是整行)直到下面两个整行的内容删除,替换成随后输入的内容 cc
和 S
相同,修改游标所在行(不管游标处于该行的何列)的内容,即先删除光标所在行的文本内容成为空行,再进入“插入模式”,光标会跳到行首准备输入 #cc
在cc
之前加上数字 #
,表示要从游标当前行算起,往后面数,一共修改 #
行的内容。例如,5cc
表示先删除游标所在行及其下面的 4
行,然后输入新的内容 #ch
或 c#h
改写游标前 #
个字符,包含游标所在位置的字符在内
(五)互换位置
命令 说明 xp
光标位置的字符和光标后面一个字符位置互换
(六)字符大小写切换
命令 说明 ~
反转光标下字符的大小写 gu
直接输入 gu 将游标所在行及其下一行的英文字母转成小写 gU
直接输入 gU 将游标所在行及其下一行的英文字母转成大写 guG
游标所在行到文档的最后 1 行的英文字母转成小写 gu0
或者 gu^
游标所在位置到行首的英文字母转成小写,不包含游标所在位置的字符 gu$
游标所在位置到行尾的英文字母转成小写 gU$
游标所在位置到行尾的英文字母转成大写 gu5k
游标所在行及其上面 4 行中的英文字母转成小写,大写同理 gu5j
游标所在行及其下面 4 行中的英文字母转成小写,大写同理 gu3l
游标所在位置的字符及其右边的2个字符中的英文字母转成小写,大写同理 guH
游标当前行至屏幕所显示文本的第 1 行的英文字母转成小写,大写同理 gUG
游标所在行到文档的最后 1 行的英文字母转成大写 guL
游标当前行至屏幕所显示文本的最后 1 行的英文字母转成小写,大写同理
总结:往左边的基本不包含游标所在位置的字符,而往右边的基本都会包含游标所在位置的字符
(七)选择文本
命令 说明 ggvG 按下 ggvG ,除了最后一行,选中剩余的全部文本,并进入可视模式下,选中的文本高亮显示 ggVG 按下 ggVG 才是真正的全选文本,并进入可视模式下,选中的文本高亮显示
(八)复制
Vim 的拷贝与大家预期的方式可能略有不同。拷贝命令不是大家料想的 c。因为 c 表示“修改”,已经被占用了。Vim 用拉取(yank)来表示拷贝,简写为 y。
命令 说明 yw
将游标所在位置的字符到词尾的字符复制到缓冲区中 #yw
或 y#w
复制游标所在位置的词及其后面的 #-1
个词到缓冲区 yy
复制游标所在行到缓冲区,所谓的缓冲区就是剪贴板,或者叫寄存器 y0
从游标所在位置复制到行首 y$
从游标所在位置复制到行尾 #yy
例如:6yy
表示拷贝从游标所在行往下数
6行文字 yl
复制游标后面的 1
个字符 #yl
或 y#l
复制游标所在位置及其后面 #-1
个字符 yh
复制游标前面的 1
个字符 #yh
或 y#h
复制游标所在位置及其前面 #-1
个字符 9,15 copy 16
或 9,15 co 16
或 9,15 t 16
将第 9
行至第 15
行的文本内容,复制到第 16
行的后面 9,15 move 16
或 9,15 m 16
将第 9
行至第 15
行的文本内容,移动(剪切)到第 16
行的后面 6 t .
把第 6 行复制到当前行下面 6 t
同上,只是省略了 .
. t $
把当前行复制到文本末尾 t $
同上 . m $
将当前行移动到文本末尾 ggyG
按下 ggyG 复制全部文本,注意:G 必须大写 y1G
或 ygg
复制游标所在行及其上面的所有行 yG
复制游标所在行及其下面的所有行 yaw
复制游标所在位置的词 yiw
复制游标所在位置的词,好像和 yaw
效果一样 yas
复制游标所在位置的句子 yit
复制游标所在位置的标签的内容。例如:<table><tr><td>sfd</td></tr></table>
,假设当前游标落在标签 <table>
上,那么按下 yit
则会复制 <tr><td>sfd</td></tr>
yft
复制游标所在行上从游标位置算起到后面第 1 个字符 t
。注意:指定字符也复制 yFt
复制游标所在行上从游标位置算起到前面第 1 个字符 t
。注意:指定字符也复制 ytk
复制游标所在行上从游标位置算起到后面第 1 个字符 t
的前一个字符 yTk
复制游标所在行上从游标位置算起到前面第 1 个字符 t
的后一个字符 y/t
复制游标所在行上从游标位置算起到后面第 1 个字符 t
之间的文本内容 。注意:指定字符没有被复制
(九)粘贴/恢复
命令 操作说明 p
将缓冲区(寄存器)的内容粘贴到游标所在位置的后面 P
将缓冲区(寄存器)的内容粘贴到游标所在位置的前面 #p
粘贴指定的寄存器的内容,常用来恢复被删除的内容,其中 #
为寄存器的名称,详见《vim 的寄存器/剪贴板》
(十)删除/剪切
命令 说明 x
删除游标所在位置的字符,注意此时没有进入“插入模式”,依旧是在“命令模式”下,相当于 dl
X
删除游标所在位置前面的 1 个字符,相当于 dh
Shift + x
删除游标所在位置前面的 1 个字符 #x
删除游标所在位置的字符及其右边 #-1
个字符,共计删除 #
个字符。相当于 #dl
。例如:6x
表示删除游标所在位置的字符及其后面 的 5
个字符,共计删除 6
个字符;即游标所在位置的及其右侧 5
个字符,共计 6
个字符被删除。注意:包含游标所在位置的字符 #X
表示删除/剪切游标所在位置的字符及其前面 #-1
个字符,共计删除 #
个字符。例如:6X
表示删除游标所在位置的字符以及前面 的 5
个字符,共计删除 6
个字符 #dh
或 d#h
表示删除/剪切游标所在位置的字符及其前面 #-1
个字符,共计删除 #
个字符。 #dw
删除游标所在位置的词及其后面的 #-1
个词,共计删除 #
个词。例如:输入 3dw,会将游标位置起后面的 3 个词的内容删除,包含游标所在位置的词 dw
删除从游标位置起到词尾的字符,包含游标所在位置的字符 dd
删除游标所在的行 #dd
从游标所在行开始向后删除 # 行,例如:2dd 表示删除游标所在的行以及下面的 1 行,合计删除 2 行;3dd 表示删除游标所在的行,以及下面的 2 行,合计删除 3 行 D
删除游标所在位置的字符到行尾 d$
效果和D
一样,删除至行尾,游标位置的字符一起删除 d0
删除(剪切)游标所在位置到行首的内容,游标所在位置的字符保留 d^
删除至行首,游标所在位置的字符保留 dj
删除游标所在的行和下面的一行 d+回车
和 dj
一样。删除游标所在的行和下面的一行 dG
删除游标所在行至文档结尾处,游标所在行也删除 1dG
或 d1G
删除游标所在行至文档开始处,游标所在行也删除 dgg
删除游标所在行至文档开始处,游标所在行也删除 d)
删除从光标位置起到本句尾的全部字符,包含光标所在位置的字符 d}
删除从光标位置起到本段落尾的全部字符,包含光标所在位置的字符 dH
使用命令 dH
将会删除从“游标所在行”至“屏幕所显示文本的首行”的全部内容,“游标所在行”也删除 dM
使用命令 dM
将会删除从“游标所在行”至“屏幕所显示文本的中间行”的全部内容,“游标所在行”也删除 dl
删除游标所在位置的字符,类似 x
#dl
或 d#l
删除游标所在位置的字符及其右边 #-1
个字符,共计删除 #
个字符。 dL
使用命令 dL
将会删除从“游标所在行”至“屏幕所显示文本的底行”的全部内容,“游标所在行”也删除 daw
删除游标所在位置的词 das
删除游标所在位置的句子 d/f
它将删除当前游标所在位置到下一个字符 f
之间的内容。输入完 d/f
后,要按下“回车键”才行。注意:指定字符保留 dfk
删除游标所在位置到下一个字符 k
。注意:指定字符也删除了 dFk
删除游标所在位置到上一个字符 k
。注意:指定字符也删除了 dtk
删除游标所在位置到下一个字符 k
的前一个字符。注意:指定字符也删除了 dTk
删除游标所在位置到上一个字符 k
的后一个字符。注意:指定字符也删除了
(十一)重复前一个操作
命令 说明 .
不要怀疑,这就是小数点,意思是重复前一个动作
(十二)标记(其实没啥用)
使用标记可以快速移动。到达标记后,可以用 Ctrl + o
返回原来的位置,按下 Ctrl + i
游标跳到后一个标记处
命令 说明 m{a-z}
使用小写英文字母标记光标所在位置,这是局部标记,只用于当前文件。貌似标记的名称只能取英文字母或者数字,而且是单个字符。例如:按下 m + a
,是指按下 m
键,然后再按 a
键,则表示在光标所在位置打了一个标记,该标记取名为 a
m{A-Z}
使用大写英文字母标记光标所在位置,这是全局标记。标记之后,退出 Vim,重新启动,标记仍然有效 `{a-z} 游标移动到标记位置。例如:按下撇符号,再按下标记名称 a,游标则会移动到标记 a 所在的字符上。其实打标记,就是给某个字符打标记 '{a-z}
移动到标记行的行首。例如:按下单引号,再按下标记名称 a
,游标就会移动到标记 a
所在的行的行首,这里的行首是指行的第 1
个字符 `` 双撇号,移动到上次编辑的位置。" 也可以,不过 `` 是精确到列,而 " 精确到行 。如果想跳转到更老的位置,可以按 Ctrl + o
,跳转到更新的位置用 Ctrl + i
`" 移动到上次离开的地方 `. 移动到最后改动的地方
(十三)多行合并
命令 说明 J
合并游标所在行及下一行为一行。合并后留有空格。如果在 J 命令之前给出一个数字n,例如3,则表示把光标当前行及其后面的2行(共3行)合并为一行 gJ
合并游标所在行及下一行为一行。合并后不留空格
(十四)文本行移动/缩进
命令 说明 >>
将光标所在行右移 8
个空格。如果在 >>
命令之前给出一个数字 n
,例如 4
,则表示光标当前行及其下面的 3
行(共 4
行)都右移 8
个空格 <<
其使用与>>
命令相同,只是移动方向相反 >G
光标所在行至文件末尾之间的所有行向右移动 8
个空格 <G
光标所在行至文件末尾之间的所有行向左移动 8
个空格 zz
将当前行移动到屏幕中央 zt
当前行移到屏幕首行,当前行后面的内容超过 1 屏才行 zb
当前行移到屏幕底行,当前行前面的内容超过 1 屏才行
(十五)撤回/撤销
命令 说明 u
如果您误执行一个命令,可以马上按下 u
,撤回到上一个操作。按多次 u
可以执行多次撤回 2u
撤销前面两次的操作 U
撤销当前行中所有的改动,撤回到最初的状态 undo 5
撤销 5 个改变,不知道怎么玩 undolist
你的撤销历史 Ctrl + r
重做最后的改动 earlier 4m
回到 4 分钟前 later 55s
前进 55 秒
(十六)游标移动
命令 说明 #G
例如:15G
表示移动游标至文章的第 15
行的行首 #↩
游标向下移动 #
行,例如输入 5
,再按下“回车键”,游标从游标所在行的下 1
行算起向下移动 5
行,即从光标所在行的下一行开始算起 5
行,不含光标所在行在内 G
移动游标到文档最后一行的首个字符处 Shift + g
移动游标到文档最后一行的首个字符处 gg
移到游标到文档开始位置,文档第 1 行的首个字符处 0
游标移动到所在行的第 1 个字符处,效果和 ^
一样 $
游标移动到所在行的最后 1 个字符处 #$
将游标移动到游标所在行起之后的第 #
行的最后 1 个字符处,从游标所在行算起。例如:3$
,将游标移至游标所在行起之后的第 3 行的最后 1 个字符处 ^
游标移动到所在行的第 1 个字符处 H
将游标移至屏幕所显示文本的第 1 行的第 1 个字符处。注意:是当前屏幕显示文本的第 1 行,而不是整个文档的第 1 行 #H
若在 H
命令之前加上数字 #
,则将游标移至第 #
行的第 1 个字符处,注:从文档第 1 行开始算起 M
将游标从屏幕的任意位置移至屏幕所显示文本的中间行的第 1 个字符处。如果当前屏幕已经充满,则移动到整个屏幕的中间行的第 1 个字符处;如果没有充满,则移动到所显示文本的中间行的第 1 个字符处 L
将游标移到屏幕所显示文本的最后 1 行的第 1 个字符处。如果当前屏幕已经充满,则将游标移至屏幕最底行的第 1 个字符处;如果没有充满,则将游标移至屏幕所显示文本的最后 1 行的第 1 个字符处 #L
若在 L
命令之前加上数字 #
,则将游标移至从屏幕所显示文本的底行算起第 #
行的第 1 个字符处 j
游标下移 #j
游标向下移动到第 #
行,且所在列的位置不变。注:从游标所在行的下一行算起。例如,5j
游标向下移动到第 5
行 k
游标上移 #k
游标向上移动到第 #
行,且所在列的位置不变。 h
游标左移 #h
游标向左移动到第 #
个字符处,从游标左边第 1 个字符算起 l
游标右移 #l
游标向右移动到第 #
个字符处,从游标右边第 1 个字符算起 %
移动到匹配的括号处。例如,光标现在处于左小括号 (
位置,按下 %
就会把光标移动到与之匹配的右小括号 )
处 Ctrl + m
游标跳到下一行首个字符处,效果与+
和 Enter
相同 +
或 Enter
游标移动到下一行的第 1 个字符处 -
游标移动到上一行的第 1 个字符处
1. 以词为单位移动
例如:{int k;
。 广义的词:两个词 {int
和 k;
。 狭义的词:有四个词 {
,int
,k
,;
。 Vim 中使用大写命令一般就是指将字作为广义来对待,使用小写命令就是作为狭义对待。
命令 说明 w/W
移动游标到下一个词的第 1 个字符处 e/E
移动游标到下一个词的最后 1 个字符处。如果游标起始位置处于词内(即非词尾处),则该命令将把游标移到本词词尾;如果游标起始位置已经处于词尾,则该命令将把游标移动到下一个词的词尾 b/B
移动游标到上一个词的第 1 个字符处。如果游标处于所在词内(即非词首),则该命令将把游标移至本词的词首;如果游标处于所在词的词首,则该命令将把游标移到上一个词的词首 ge
移动游标到上一个词的最后 1 个字符处 Shift + →
游标移到后面第 1 个单词的第 1 个字符处 Shift + ←
游标移动到前面第 1 个单词的第 1 个字符处
2. 以字符为单位移动
在命令模式中使用 h、j、k、l 这 4 个字符控制方向,分别表示向左、向下、向上、向右。
3. 按句子移动
在 Vim 中,一个句子被定义为是以逗号,
、句号.
、问号?
和感叹号!
结尾,且其后面跟着至少两个空格或一个换行符的字符序列。这个句子的定义有问题!!句子后面未必有空格或者换行符吧!
命令 说明 (
将游标移至上一个句子的开头 )
将游标移至下一个句子的开头
注意:要结合 Shift 键才行
4. 按段移动
在Vim中,一个段被定义为是以一个空白行开始和结束的片段
命令 说明 {
该命令将游标向前移至上一个段的开头 }
该命令将游标向后移至下一个段的开头
注意:要结合 Shift 键才行
5. 移动游标到匹配字符
命令 说明 f
向后(游标后面)查找指定的字符,游标移动到该字符处。例如,某行(háng)为 you can you up, no can no bb
,现在需要将游标移动到字符 p
处,则可以使用 fp
命令,这样游标就会迅速定位到字符 p
处。按下 ;
向后继续查找,按下 ,
向前继续查找 F
向前查找指定的字符,游标定位到该字符处。按下 ;
向后继续查找,按下 ,
向前继续查找 t
向后(游标后面)查找指定的字符,游标移动到该字符的前一个字符处。按下 ;
向后继续查找,按下 ,
向前继续查找 T
向前查找指定的字符,游标移动到该字符的后一个字符处。按下 ;
向后继续查找,按下 ,
向前继续查找
注意:是匹配单个字符,不是单词!!!
6. 查看游标所在行号
(十七)跨行移动文本内容/剪切文本内容
我们可以利用下面的步骤完成文本行(1行或者多行)从一个地方移至另外一个地方。
将光标移至待移动文本的首行 按 #dd
命令(其中 #
为待移动的行数),此时 vim 把光标所在行起下面的 #
行文本删除,将其放入到 "1
寄存器中 接着将游标移动到要粘贴文本的地方 按 1p
将 "1
寄存器的内容粘贴到游标所在行的下方
(十八)屏幕滚动命令
屏幕滚动命令是以屏幕为单位移动游标的,常用于文件的滚屏和分页。需要注意的是,屏幕命令不是游标移动命令,不能作为文本限定符用于删除命令中。
在普通命令模式下和插入模式下均可以使用屏幕滚动命令
1. 滚屏命令
命令 说明 Ctrl+u
将屏幕向前(文件头方向)翻滚半屏。可以在这命令之前加上一个数字 #
,则屏幕向前翻滚 #
行。并且这个值被系统记住,以后再用 Ctrl+u
命令滚屏时,还滚相应的行数 Ctrl+d
将屏幕向后(文件尾方向)翻滚半屏。可以在这命令之前加上一个数字 #
,则屏幕向后翻滚 #
行。并且这个值被系统记住,以后再用 Ctrl+d
命令滚屏时,还滚相应的行数 Ctrl + e
整个文档向上移动一行,但是光标所在位置不变。可以在这命令之前加上一个数字 #
,则文档向上移动 #
行 Ctrl + y
整个文档向下移动一行,但是光标所在位置不变。可以在这命令之前加上一个数字 #
,则文档向下移动 #
行
2. 分页命令
命令 说明 Ctrl+b
将屏幕向文件首方向翻滚一整屏(即一页)。在命令之前加上一个数字 #
,则屏幕向前移动 #
页 Ctrl+f
将屏幕向文件尾方向翻滚一整屏(即一页)。在命令之前加上一个数字 #
,则屏幕向后移动 #
页
(十九)文档状态/统计文档信息
命令 说明 Ctrl+G
在 vi/vim 状态行显示文档的状态信息,包括正在编辑的文件名、是否修改过、游标所在行号、文件的行数以及游标之前的行占整个文件的百分比 g + Ctrl + g
对文档的行数、字符数、字节数进行统计,字符数-行数≈中文字数,其实就是扣掉每行的换行符,如果是 Windows 系统格式的文档,则是字符数-行数x2 ≈ 中文字数,因为 Windows 中换行符占 2 个字节,1 个字节是 1 个字符,那么 1 个换行符就被统计为 2 个字符,那么每行就多了 2 个字符
(二十)查找/搜索字符串
命令 说明 *
向后查找游标所在位置的词 g* 向后查找游标所在位置的词,模糊查找 #
向前查找游标所在位置的词 g# 向前查找游标所在位置的词,模糊查找 /
从游标所在位置起向后查找指定的字符串,其实在输入字符的时就自动进行全文匹配了(匹配的字符串黄色高亮显示),只是将游标所在位置后面的第 1 个匹配的字符串黑色高亮显示,按下回车键后,光标会移动到第 1 个匹配字符串的第 1 个字符处。具体操作:先输入 /
,再输入要查找的字符串,再按下“回车键”。例如,输入 /people
,会在游标后面匹配查找字符串 people
,可以按n
移动游标到后一个匹配的字符串处或者按 N
移动游标到前一个匹配的字符串处 ?
从游标所在位置起向前查找指定的字符串。具体操作:先输入 ?
,再输入要查找的字符串,再按下“回车键”。例如,输入 ?people
,会在游标前面匹配查找字符串 people
,可以按n
移动游标到前一个匹配的字符串处或者按 N
移动游标到后一个匹配的字符串处 f
游标所在行上从游标位置起向后查找指定的字符,;
重复前一个搜索,即继续向后搜索,,
重复前一个搜索,但是方向相反,即向前搜索 F
游标所在行上从游标位置起向前查找指定的字符,;
重复前一个搜索,即继续向前搜索,,
重复前一个搜索,但是方向相反,即向后搜索 t
游标所在行上从游标位置起向后查找指定字符的前一个字符,;
重复前一个搜索,即继续向后搜索,,
重复前一个搜索,但是方向相反,即向前搜索 T
游标所在行上从游标位置起向前查找指定字符的后一个字符,;
重复前一个搜索,即继续向前搜索,,
重复前一个搜索,但是方向相反,即向后搜索
/
和 f/F/t/T
的区别:
/
能搜索字符串,f/F/t/T
只能搜索单个字符;与指令 d
、y
、c
配合使用时,/
指定的字符是被排除在外的,而 f/F/t/T
则是包含在内的
(二十一)查看历史命令
在普通命令模式下直接输入 q:
打开历史命令窗口,可以滚动鼠标滚轮上下滚动命令列表,或者使用上下箭头移动光标来选择命令,选择好命令后按下“回车键”即刻执行选中的命令。历史命令列表窗口如下图所示: 说明:
可以输入 :q
或者输入 <C-w>q
退出当前窗口 打开的其实是命令行历史缓冲区,在缓冲区中,可以像编辑文件一样编辑命令
(二十二)查看历史搜索记录
(二十三)保存退出
命令 说明 ZZ
大写的 Z
。若文档没有修改过,则不保存直接退出;若文档已经编辑过,则会保存文档后退出
(二十四)宏录制
命令 说明 qa
开始录制宏 a
(键盘操作记录) q
停止录制 @a
播放宏 a
(二十五)打开光标所在词的使用手册
三、可视模式
也称之为“文本选择模式”。
(一)字符可视模式
在“普通命令模式”下按 v
则进入“字符可视模式”,在屏幕底部出现标识:-- VISUAL --
。所谓“字符可视模式”就是选择文本的时候只能一个一个字符选择。
1. 选择文本
命令 说明 ↑↓←→
从“普通命令模式”下按 v
键进入“字符可视模式”后,直接通过上下左右箭头键选择文本 w
选择到下一个单词的开头 e
选择到下一个单词的词尾 b
选择到上一个单词的开头 gv
重新选中上次选中的文本,这个命令不一定要进入“可视模式”下再执行,在“普通命令模式”下就可以按下此命令,然后会自动选中上次选中的文本,并且进入“可视模式”下
2. 复制文本
命令 说明 y
选择好文本后,按下 y
复制文本,并且返回到“普通命令模式”下 Y
按下 Y
复制选中字符的所在行
3. 删除文本
命令 说明 d
选择好文本后,按下 d
删除文本,并且返回到“普通命令模式”下,当然你可以再按下 p
粘贴被删除的文本,所以实际上这个 d
相当于“剪切”功能 D
删除选中字符所在行 x
效果和 d
一样
4. 修改替换
命令 说明 c
更改被选中的文本。按下此命令后被选中的文本被删除,进入“插入模式”,此时可以在其中添加新文本,完成修改替换 C
更改被选中的字符的所在行,也是先删除文本,再进入“插入模式” s
效果和 c
一样 r
先按 r
,再输入新字符,则替换掉被选中的字符,并且返回到“普通命令模式”下
5. 文本行移动
命令 说明 >
按下 >
被选中的行向右移动8个空格,并返回到“普通命令模式”下 <
按下 <
被选中的行向左移动8个空格,并返回到“普通命令模式”下
6. 大小写切换
命令 说明 u
将选中的文本中的大写字母全部转换成小写 U
将选中的文本中的小写字母全部转换成大写 ~
大小写互相切换
7. 合并多行
命令 说明 J 按下大写的 J
可以将高亮显示的文本内容合并为一行,同时以空格来分隔各行 gJ 将高亮显示的文本内容合并为一行,行与行之间没有空格 .
将光标所在行下面的文本行合并到光标所在行后面
8. 加密文本
命令 说明 g?
使用 g?
命令,可以使用 rot 13 算法来加密高亮显示的文本;针对同一个文本再次执行加密命令,就可以进行文本解密
9. 保存文本
在可视化模式下选好文本,然后输入 :write filename
命令,就可以将选中的字符所在的行内容保存到文件 filename 中,文件存放在当前工作目录下
10. 文本排序
在可视化模式下选中多行文本,然后输入 :sort
命令,则可以对选中的文本进行排序
11. 移动光标
命令 说明 o
将光标在选中的文本区域首尾切换,例如,光标在选中的文本区域的末尾,按下 o
光标跳到文本区域的开头位置
12. 切换到插入模式
命令 说明 Shift + i 切换到插入模式,光标跳到选中字符所在行首,在行首插入字符 Shift + a 切换到插入模式,光标会后移一个字符,此时插入字符相当于是在光标后移前所在位置的后面插入字符
13. 退出可视模式
再次按下 v
退出“字符可视模式”
(二)行可视模式
在“普通命令模式”下按 V
或 shift + v
进入“行可视模式”,在屏幕底部出现标识:-- VISUAL LINE --
。所谓“行模式”其实就是指在这种模式下,每次的选择都是按“行”来选定。
1. 选择文本
命令 说明 ←
或 →
按左右箭头键,按“行”选择文本,被选中的文本会高亮显示 gv
重新选中上次选中的文本,这个命令不一定要进入“可视模式”下再执行,在“普通命令模式”下就可以按下此命令,然后会自动选中上次选中的文本,并且进入“可视模式”下
2. 复制文本
命令 说明 y
选择好文本后,按下 y
复制文本,并且返回到“普通命令模式”下
3. 删除文本
命令 说明 d
选择好文本后,按下 d
删除文本,并且返回到“普通命令模式”下,当然你可以再按下 p
粘贴被删除的文本,所以实际上这个 d
相当于“剪切”功能 x
效果和 d
一样
4. 修改替换
命令 说明 c
按下 c
可更改被选中的文本。按下此命令后被选中的文本被删除,进入“插入模式”,此时可以在其中添加新文本,完成修改替换 s
效果和 c
一样 r
先按 r
,再输入新字符,则替换掉被选中的字符,并且返回到“普通命令模式”下
5. 文本行移动
命令 说明 >
按下 >
被选中的行向右移动8个空格,并返回到“普通命令模式”下 <
按下 <
被选中的行向左移动8个空格,并返回到“普通命令模式”下
6. 大小写切换
命令 说明 u
将选中的文本中的大写字母全部转换成小写 U
将选中的文本中的小写字母全部转换成大写 ~
大小写互相切换
7. 合并多行
命令 说明 J
按下大写的 J
可以将高亮显示的文本内容合并为一行,同时以空格来分隔各行 gJ
将高亮显示的文本内容合并为一行,行与行之间没有空格
8. 加密文本
命令 说明 g?
使用 g?
命令,可以使用 rot 13 算法来加密高亮显示的文本;针对同一个文本再次执行加密命令,就可以进行文本解密
9. 保存文本
在可视化模式下选好文本,然后输入 :write filename
命令,就可以将选中的字符所在的行内容保存到文件 filename 中,文件存放在当前工作目录下
10. 文本排序
在可视化模式下选中多行文本,然后输入 :sort
命令,则可以对选中的文本进行排序
11. 移动光标
命令 说明 o
将光标在选中的文本区域首尾切换,例如,光标在选中的文本区域的末尾,按下 o
光标跳到文本区域的开头位置
12. 切换到插入模式
命令 说明 Shift + i 切换到插入模式,光标跳到选中字符所在行首,在行首插入字符 Shift + a 切换到插入模式,光标会后移一个字符,此时插入字符相当于是在光标后移前所在位置的后面插入字符
13. 退出可视模式
再次按下 V
退出“行可视模式”
(三)块可视模式
从“普通命令模式”下按Ctrl + v
进入到“块选择模式”下,在屏幕底部出现标识:-- VISUAL BLOCK --
。所谓“块模式”就是指在这种模式下,按上下左右箭头(↑↓←→
)可以选择矩形区域,它选中的是文本的一个矩形区域(block)
1. 选择文本
命令 说明 ↑↓←→
按上下左右箭头(↑↓←→
)可以在文本上选择一个矩形区域
2. 复制文本
命令 说明 y
选择好文本后,按下 y
复制文本,并且返回到“普通命令模式”下
3. 删除文本
命令 说明 d
选择好文本后,按下 d
删除文本,并且返回到“普通命令模式”下,当然你可以再按下 p
粘贴被删除的文本,所以实际上这个 d
相当于“剪切”功能 x
效果和 d
一样
4. 修改替换
命令 说明 c
按下 c
可更改被选中的文本。按下此命令后被选中的文本被删除,进入“插入模式”,此时可以在其中添加新文本,完成修改替换 s
效果和 c
一样 r
先按 r
,再输入新字符,则替换掉被选中的字符,并且返回到“普通命令模式”下
5. 文本行移动
命令 说明 >
按下 >
被选中的行向右移动8个空格,并返回到“普通命令模式”下 <
按下 <
被选中的行向左移动8个空格,并返回到“普通命令模式”下
6. 大小写切换
命令 说明 u
将选中的文本中的大写字母全部转换成小写 U
将选中的文本中的小写字母全部转换成大写 ~
大小写互相切换
7. 合并多行
命令 说明 J 按下大写的 J
可以将高亮显示的文本内容合并为一行,同时以空格来分隔各行 gJ 将高亮显示的文本内容合并为一行,行与行之间没有空格
8. 加密文本
命令 说明 g?
使用 g?
命令,可以使用 rot 13 算法来加密高亮显示的文本;针对同一个文本再次执行加密命令,就可以进行文本解密
9. 保存文本
在可视化模式下选好文本,然后输入 :write filename
命令,就可以将选中的字符所在的行内容保存到文件 filename 中,文件存放在当前工作目录下
10. 文本排序
在可视化模式下选中多行文本,然后输入 :sort
命令,则可以对选中的文本进行排序
11. 移动光标
命令 说明 o
将光标在选中的文本区域首尾切换,例如,光标在选中的文本区域的末尾,按下 o
光标跳到文本区域的开头位置
12. 切换到插入模式
命令 说明 Shift + i 切换到插入模式,光标跳到选中区域左上角 Shift + a 切换到插入模式,光标跳到选中区域右上角
13. 退出可视模式
再次按下 Ctrl + v
退出“块可视模式”
四、底行命令模式
It’s called command mode or ex mode.
在“普通命令模式”下输入 :
进入“底行命令模式”下。“底行命令模式”也称之为“ex 命令模式”,因为以冒号 :
开头的命令基本都是 ex
命令。所以“底行命令模式”下的相关命令详解请参见《vim 下的 ex 指令》。
五、插入模式
该模式也可以叫输入模式、编辑模式、写入模式等。
(一)选择文本
无法选择文本,只能返回到“普通命令模式”下,再进入“可视模式”下进行选择
(二)复制文本
快捷键 说明 Ctrl + y
对应正上方的行,挨个复印字符。非常有意思的命令。 Ctrl + e
与上个命令类似,但拷贝的是下方的行
(三)粘贴文本/插入寄存器的内容
快捷键 说明 <C r>{register}
将寄存器的内容插入到光标所在的位置
(四)运算表达式
命令 说明 C-r =
先按下 C-r
,接着按 =
,再输入运算表达式,再按下“回车”,就能在光标处插入计算结果
(五)删除文本
快捷键 说明 Back Space
退格键,删除光标后(光标右边)一个字符,Fn+Del
就是Back Space
Del
删除键,删除光标前一个字符 Ctrl + w
删除光标左边的单词 Ctrl + u
从此处删除到行首的第一个非空字符
注:上述不是命令,而是快捷键
(六)移动文本
好像不行
(七)移动光标
快捷键 说明 Home
移动光标到行首,MacBook 的键盘使用 Fn+←
就是Home
键 End
移动光标到行尾,Fn+→
就是End
键 Shift + ←
移动到前一个单词 Shift + →
移动到后一个单词
(八)临时切换到普通命令模式
快捷键 说明 Ctrl + o
进入命令模式并在执行一个命令后自动返回插入模式。很常用
(九)修改/替换
命令 说明 Insert
切换光标为输入/替换模式,光标将变成竖线/下划线,MacBook 内置键盘下没有此键
(十)搜索
好像不行
(十一)退出插入模式
退出插入模式,返回到普通命令模式。
命令 说明 Esc
退出输入模式,切换到“普通命令模式” <C [>
同上
(十二)自动补全
命令 说明 Ctrl + N
所谓补全,就是你按下这个组合键,会出来一个列表,当前所有打开的窗口中与光标所在位置的字符或字符串有关的词会出现在这个列表中
(十三)翻页
命令 说明 Page Up
上翻页,Fn+↑
就是Page Up
Page Down
下翻页,Fn+↓
就是Page Down
六、vim 命令打开文件及选项参数说明
命令 说明 vim -c command filename
在打开文件前,先执行指定的命令 vim -r filename
恢复上次异常退出的文件 vim -R filename
以只读的方式打开文件,但可以强制保存,因为不能增减内容,那这个保存意义又何在呢? vim -M filename
以只读的方式打开文件,不可以强制保存 vim -y num filename
将编辑窗口的大小设为 num 行 vim + filename
从文件的末尾开始。例如:vim + text.txt
,游标会默认停留在文档最后 1 行的第 1 个字符处 vim +num filename
从第 num 行开始。例如:vim +3 text.txt
,游标会默认停留在文档的第 3 行的第 1 个字符处。注意:加号 +
与数字之间不能有空格 vim +/pattern filename
打开文件后,游标会停留在第一个含有 pattern 的行的第 1 个字符处 vim +n filename
打开 filename 文件后游标跳到第 n 行的第 1 个字符处 vim + filename
打开文件 filename 后跳到最后一行 vim -x filename
开始编辑一个加密的文件 vim -o files
以水平分割的多个窗口形式同时打开多个文件。例如:vim -o a.txt b.txt c.txt vim -O files
以垂直分割的多个窗口形式同时打开多个文件 vim -O5 a.txt b.txt
打开 5 个垂直分割的窗口,其中两个显示 a.txt,b.txt 的内容,另外 3 个为空的窗口 vim -p files
以多标签形式同时打开多个文件,每个文件占用一个标签页 vim files
同时打开多个文件,打开后使用 next、previous 等指令切换 vim -d files
垂直打开多窗口,并且进行比较 vimdiff files
垂直打开多窗口,并且进行比较 vim -h
或 vim --help
查看命令 vim 的帮助文档
七、寄存器
"ayy
把游标所在行的内容复制到 a 寄存器中。大小写英文字母表示寄存器的名称。其实是创建了一个以名称为 a
的寄存器,该寄存器存放了当前游标所在行的文本内容,可以在底行命令模式下输入 reg
查看下
""yy
表示把游标所在行的内容追加到默认的寄存器中
"*yy
把游标所在行的内容放入当前选择缓冲区
"+yy
把游标所在行的内容放入系统剪贴板
关于寄存器的其它内容可以参见《vim 的寄存器/剪贴板》
八、查看 vim 编辑器的帮助文档
命令 说明 h[elp]
按回车,打开总的帮助 help {command}
对于任何一个 vim 指令,都可以输入 help
然后输入命令名称,查看相关的帮助文档 F1
打开总的帮助文档,这个不是 ex 指令,在“普通命令模式”下按下 F1 键,有些电脑要结合 Fn 键才行 help user-manual
打开用户手册。命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用;然后是进一步的信息 helptags somepath
为 somepath 中的文档生成索引,不知道干嘛的 helpgrep
可以搜索整个帮助文档,匹配的列表显示在 quickfix
窗口中。Ctrl + ]
跳到含有光标所在位置的词的 tag 主题,Ctrl + t
跳回。 ver
显示版本信息 help version#
#
是主版本号,例如 vim 8.0
,你可以输入 help version8
,再按 <Enter>
,查看版本信息。
注:没有特别说明的命令,都是在“底行命令模式”下执行的命令,记得按下“回车”哦~