什么是 vim
vi 和 vim 是 Linux 中的文本编辑器。vi 是老式的文本编辑器,功能齐全,vim 可以认为是 vi 的高级版本。
为什么要学习 vim
在 Linux 中有些操作是需要在命令行中完成的,此时如果还要使用图形界面的文本编辑器,就会有些不合时宜了,所以就需要一个功能齐全的文本编辑器来完成我们的操作。从这里来看,学习 vi 和 vim 是有必要的:
- 所有的 UNIX-like 系统都会内置 vi 文本编辑器,其它的文本编辑器则不一定会存在
- 很多软件的编辑接口都会主动调用 vi
- vim 具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计
- 程序简单,编辑速度相当快速
vi 的模式说明
vi 存在三种模式,分别为一般命令模式、编辑模式和命令行模式:
- 一般命令模式:用 vi 中打开文件时就可以进入一般命令模式。此时可以移动光标、对文件进行删除、复制和粘贴等。
- 编辑模式:当按下(i,I,o,O,a,A,r,R)中任何一个字符之后都会进入编辑模式,此时会在操作窗口左下角出现(INSERT)和(REPLACE)。在此模式下,可以对文件内容做出编辑。按下(EEC)会推出编辑模式,回到一般命令模式。
- 命令行模式:在一般命令模式下,输入(:/?)中任何一个字符之后,就进入命令行模式。此时光标会移动到最下边一行,支持对文件内容的一些全局操作,如读取、保存、替换等。
三种模式的切换为:
vim 的一般命令
一般命令模式:
移动光标
h | 光标向左移动,对应于方向键 |
j | 光标向下移动,对应于方向键 |
k | 光标向上移动,对应于方向键 |
l | 光标向右移动,对应于方向键 |
ctrl+f | 屏幕向下移动一页,相当于 page down |
ctrl+b | 屏幕向上移动一页,相当于 page up |
ctrl+d | 屏幕向下移动半页 |
ctr+u | 屏幕向上移动半页 |
+ | 光标移动到非空格符的下一行 |
- | 光标移动到非空格符的上一行 |
n+space | n 为数字,光标会向后面移动 n 个字符 |
0/home | 移动到这一行的最前面字符处 |
$/end | 移动到这一行的最后面字符 |
H | 光标移动到这个屏幕的最上方那一行的第一个字符 |
M | 光标移动到这个屏幕的中央那一行的第一个字符 |
L | 光标移动到这个屏幕的最下方那一行的第一个字符 |
G | 移动到这个文件的最后一行 |
n+G | 移动到这个文件的第 n 行 |
gg | 移动到这个文件的第一行 |
n+enter | 光标向下移动 n 行 |
查找与替换
/word | 从光标后开始查找名称为 word 的字符串 |
?word | 向光标前开始查找名称为 word 的字符串 |
n | 字母 n,重复前一个查找的操作 |
N | 与 n 相反,为反向进行前一个查找操作 |
:n1,n2s/word1/word2/g | 在第 n1 行与第 n2 行之间寻找字符串 word1,并将字符串替换为 word2 |
:1,$s/words/words/gc |
在第一行和最后一行之间寻找字符串 word1,并将字符串替换为 word2,并提示用户确认操作 |
删除,复制和粘贴
x/X | x 为向后删除一个字符,X为向前删除一个字符 |
nx | 连续向后删除 n 个字符 |
dd | 剪切光标所在的那一行 |
ndd | 剪切光标所在的向下 n 行 |
d1G | 剪切光标所在到第一行的所有数据 |
dG | 剪切光标到最后一行的所有数据 |
d$ | 剪切光标所在处到该行的最后一个字符 |
d0 | 剪切光标所在处到该行的最前面一个字符 |
yy | 复制光标所在的那一行 |
nyy | 复制光标所在的向下 n 行 |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
p/P | p 为将已复制的数据在光标下一行粘贴,P 为贴在光标上一行 |
J | 将光标所在行与下一行的数据结合成同一行 |
c | 重复删除多个数据 |
u | 恢复上一个操作 |
ctrl+r | 重做上一个操作 |
. | 重复上一个操作 |
一般命令模式切换到编辑模式:
进入插入或替换的编辑模式
i/I | 进入(INSERT)模式 i 为从目标光标所在处插入,I 为在目前所在行的第一个非空格符处开始插入 |
a/A | 进入(INSERT)模式 a 为从目前光标所在的下一个字符处开始插入,A 为从光标所在处的最后一个字符处开始插入 |
o/O | 进入(INSERT)模式 o 为在目前光标所在的下一行处插入新的一行,O 为在目前光标所在处的上一行插入新的一行 |
r/R | 进入(REPLACE)模式 r 为替换光标所在的那一个字符一次,R 为一直替换光标所在的文字,直到 ESC 为止。 |
ESC | 回到一般命令模式 |
一般命令模式切换到命令行模式:
命令行模式的保存,退出等命令:
:w | 将编辑的数据写入到硬盘中 |
:w! | 强制写入 |
:q | 退出 vi |
:q! | 强制退出 vi,不保存 |
:wq | 保存后退出 |
:wq! | 强制保存后退出 |
ZZ | 若文件没有没有修改,则不保存退出,若文件已经被修改过,则保存后退出 |
:w filename | 将编辑的数据另存为一个文件 |
:r filename | 在编辑的数据中,读入另一个文件的数据,即将 filename 内容加载到光标所在行后面 |
:n1,n2 w filename | 将 n1 到 n2 的内容保存为 filename 这个文件 |
:! command |
暂时退出 vi 到命令行模式下执行 command 的显示结果 |
:set nu | 显示行号 |
:set nonu | 取消行号 |
vim 的额外功能
可视区块(Visual block)
v | 字符选择,会将光标经过的地方反白选择 |
V | 行选择,会将光标经过的行反白选择 |
ctrl+v | 可视区块,可以用矩形的方式选择数据 |
y | 将反白的地方复制起来 |
d | 将反白的地方删除掉 |
p | 将刚刚复制的区块,在光标所在处粘贴 |
可视区块的功能提供给我们了一个新的思路,对于文件内容某一区块内容的改变不需要多次的复制粘贴,按照可视即可见的思路去操作。
多文件编辑
当我们想要编辑多个文件的时候,可能会使用 vim 同时打开多个文件,此时文件的切换操作为:
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前这个 vim 开启的所有文件 |
多窗口功能
当某个文件过长时,可能需要对照上下文进行阅读,此时可以利用多窗口功能进行相关操作,操作为:
:sp filename | 有 filename 则为打开同一个文件内容,有 filename 则表示在新窗口创建一个新文件 |
ctrl+w+j | 先按住 ctrl 不放,再按下 w 后放开所有的按键,之后再按下 j ,则光标可以移动到下方的窗口 |
ctrl+w+k | 先按住 ctrl 不放,再按下 w 后放开所有的按键,之后再按下 k,则光标可以移动到上方的窗口 |
ctrl+w+q | 关闭所在的窗口,等效与:q 与 :close |
关键词补全
组合键 | 补齐的内容 |
ctrl+x -> ctrl+n | 通过目前正在编辑的这个文件的内容文字作为关键词,补全 |
ctrl+x -> ctrl+f | 以当前目录内的文件名作为关键词,补全 |
ctrl+x -> ctrl+o | 以扩展名作为语法补充,以 vim 内置的关键词,补全 |
环境设置与记录
vim 中还存在类似 log 的操作记录,它可以主动地将你曾经做过地操作记录下来,从而能够进行轻松地操作。文件目录为 ~/.viminfo。
vim 中还存在着环境设置,有点类似于首选项或者预设,参数主要有:
:set nu :set nonu |
设置与取消行号 |
:set hlsearch :set nohlsearch |
hlsearch(high light search),表示是否将查找的字符串反白的设置值,默认为 hlsearch |
:set autoindent :set noautoindent |
是否自动缩进 |
:set backup | 是否自动保存备份文件,一般为 nobackup。如果设置为 backup,则意味着当你修改一个文件时,源文件会被另存为一个文件名为 filename~ 的文件。 |
:set ruler | 是否显示状态栏右下角设置值 |
:set showmode | 是否显示状态栏左下角设置值 |
:set backspace=012 | 设置 backspace 的功能。0 或 1 时,只能删除刚刚输入的字符。2时,可以删除任意值 |
:set all | 显示目前所有的环境参数设置 |
:set | 显示与系统默认值不同的设置参数,即自行变动过的设置参数 |
:syntax on :syntax on |
是否显示不同颜色 |
:set bg=dark :set bg=light |
显示不同的颜色色调,默认是 light |
环境参数同样可以保存在名为 (.vimrc) 的文件中,一般放置在 /etc/vimrc 文件中。也可以新建立 ~/.vimrc 进行设置,作用是相同的,该文件中的注释符号为"。
vim 的缓存,恢复与打开时的警告
当使用 vim 进行编辑时,vim 会在被编辑文件的目录下,再建立一个名为(.filename.swp)的缓存文件。如果电脑突然掉电时,则可以用该文件还原。当打开源文件时,会被提醒警告信息:
- O(open read-only):以只读模式打开文件
- E(edit anyway):以正常模式打开要编辑的那个文件,并不会加载缓存的内容。
- R(recover):加载缓存的内容
- D(delete it):打开文件前删除缓存
- Q(quit):直接退出 vim,不进行任何操作
- A(abort):忽略该编辑操作,与 quit 类似。
题外话
vim 使用中还会存在许多别的问题,如编码格式,字符转换等,使用的时候需要自己慢慢探索。
参考资料
1.鸟哥的 LINUX 私房菜——基础学习篇(第四版):https://item.jd.com/12443890.html