什么是vi/vim
Linux绝大部分的配置文件都是纯文本形的,vi是linux下的一个文本编辑器,所有linux发行版都会默认安装。vim是vi的增强版本,功能更强大,比如:高亮显示,高级搜索、多文件编辑、区块复制等等。如果你习惯了windows窗口编辑器,那vim还是有很大挑战的。从根本上说vim是一个程序开发工具,不是文字处理工具,命令行环境中,没有图形界面,所有操作都通过命令按键完成。
vi 快速入门
vi 共分为三种模式,分别是命令模式、编辑模式和命令行模式。
- 命令模式 vi 启动后默认进入命令模式,你可以通过方向键上下左右移动光标,可用通过命令完成删除、复制、粘贴等等操作。
- 编辑模式 命令模式不能追加或修改新内容,只能删除/复制/粘贴的命令完成操作。你按下任意下面的一个键(i,I,a,A,o,O,r,R),就可以切换到编辑模式,这时候就可以在光标位置编辑文本。也可以使用“Insert” 键,进入编辑模式。编辑完后,按"Esc"键就可以退出编辑模式,进入命令模式,然后就可以进行相应的命令操作。
- 在命令模式下,输入 冒号(:)、斜杠(/)、问号(?)中任意一个键,光标就移动到最下面一行第一列。冒号(:) 表示输入相应的vi命令,比如 保存、退出、替换等等;斜杠(/)表示向前查找输入的字符串;问号(?)反方向查找输入的字符串。
使用vi 第一步就要清楚,vi模式的切换,要不你输入不了内容,也不知道怎么保存,不知道怎么退出。
我们快速体验一下,新建一个hello.txt 文件,然后输入 Hello Vi !,最后退出保存。
# 传入新建的文件名,左下角会有 "hello.txt" [New File] 提示
[root@localhost ~]# vi hello.txt
#输入i,进入编辑模式,你可以发现在左下角状态栏中会出现 –INSERT- 的字样
#输入 Hello Vi !
# 按 Esc,退出编辑模式,进入命令模式. – INSERT – 不见了
#输入 冒号(:),然后输入 wq,回车。w是保存命令,q是退出命令 wq保存退出或者直接x,如果退出不想保存,那就输入q!
[root@localhost ~]# cat hello.txt
Hello Vi !
x 和 wq 有区别,wq是强制写入,更新文件修改时间,然后退出;x在没有内容修改时不会修改文件修改时间。
w 命令后面可以跟文件名,保存成指定文件名
vi 常用命令
vi 是个强大的编辑器,支持大量命令,不用死记硬背,记住一些常用的,其它的用到时候查查就可以,用多了就熟悉了。可以打印一张vi的命令图表方便查询。
命令 | 说明 |
---|---|
h或向左箭头键 | 光标向左移动一个字符 |
l或向右箭头键 | 光标向右移动一个字符 |
k或向下箭头键 | 光标向上移动一个字符 |
j或向下箭头键 | 光标向下移动一个字符 |
[Ctrl] + [f] | 向下移动一屏 |
[Ctrl] + [b] | 向上移动一屏 |
0或功能键[Home] | 光标移动到第一列 |
$或功能键[End] | 光标移动到最后一列 |
G | 光标移动到最后一行 |
gg | 光标移动到第一列 |
n[Enter] | n表示数字,光标向下移动n行 |
/word | 从光标位置向下搜索 word 这个字符串 |
?word | 从光标位置向上搜索 word 这个字符串 |
n | 表示英文字母n按键,向下查找下一个 |
N | 表示英文字母N按键,向上查找下一个 |
:n1,n2s/search/replacement/g | 表示从第n1行到第n2行范围内查找给定search字符,使用replacement 字符串替换,g 表示全局替换,最后一行可以用 $ 表示 |
:%s/search/replacement/g | 这个和 1,$s/search/replacement/g 效果是一样的,这个文件全局替换 |
x | 向后删除一个字符 |
X | 向前删除一个字符 |
nx | n表示数字,向后删除n个字符 |
dd | 删除一整行 |
ndd | n表示数字,向后删除n整行 |
yy | 复制光标所在当前行 |
nyy | 复制光标所在后面n行 |
p | 为将已复制的数据在光标下一行粘贴 |
u | 相当于 undo,取消上一操作 |
[ctrl] + r | 相当于 redo,重做上一操作,和按键 点"." 有时操作效果一样 |
i | 进入编辑模式,左下角处会出现 "--INSERT--",i表示光标当前位置插入,I 表示当前位置第一个非空格位置插入 |
a | 进入编辑模式,左下角处会出现 "--INSERT--",a表示光标位置下一列插入,A 表示在光标所在行的尾部插入 |
o | 进入编辑模式,左下角处会出现 "--INSERT--",字母o表示光标位置下一行第一列插入,字母大O 表示在光标所在位置上一行的第一列插入 |
r | 进入编辑模式,左下角处会出现 "--REPLACE--",r 只会取代光标所在的那一个字符一次,R会一直取代光标所在的字符,可以多次,直到按 Esc |
:w | 将数据写到磁盘文件中 |
:w! | 强制保存,忽略只读文件的警告,将数据写到磁盘文件中 |
:q | 退出 vi |
:q! | 强制退出,不保存数据 |
:wq | 保存并退出 |
:w [filename] | 保存成另外一个新文件 |
网上找到一个比较全的vi命令表,可以打印出来练习使用。
vi 异常退出恢复机制
当我们在使用vi编辑时, vi会在与被编辑的文件的目录下,再建立一个名为 .filename.swp 的 文件。最新的修改和录入都在这个 .swp文件中。如果在没有正常保存之前vi异常退出,比如 宕机,vi 被异常kill掉,这样下次在打开这个文件的时候,vi发现有.swp文件,就会给予警告提示:
E325: ATTENTION
Found a swap file by the name ".hello.txt.swp"
owned by: root dated: Sun Sep 18 09:16:15 2016
file name: /data/hello.txt
modified: YES
user name: root host name: localhost.localdomain
process ID: 1933 (still running)
While opening file "hello.txt"
dated: Sun Sep 18 09:03:36 2016
(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 hello.txt"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file ".hello.txt.swp"
to avoid this message.
Swap file ".hello.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
最简单的模拟方式就是你当前vi编辑文件不退出,然后再另外的shell终端再用vi 打开这个文件,这时就会有这个提示。这也是多人编辑同一文件产生冲突的场景。
- [O]pen Read-Only:按 o 键,只读方式打开文件,只是看不修改
- (E)dit anyway:按 e 键, 不管三七二十一,照常打开文件,不载入临时文件。这样不太好,容易产生数据丢失或存储错乱
- (R)ecover:按 r 键,从.swp 文件中恢复未存档的内容。但是编辑完退出后你还要手工删除掉哪个 .swp文件,否则下次编辑还会提示。
- (D)elete it:如果你确定哪个临时文件没有用,那就按 D 键,直接删除临时文件
- (Q)uit: 按 q 键直接退出,离开,放弃编辑
- (A)bort: 按 a 键直接退出,和q的效果一样
这个.swp 文件只要产生就需要你完成恢复或确认后将其删除,否则下次打开文件还会提示。
vim 增强功能
颜色标注
你使用vim打开文件,vim会对一些语法进行颜色标注方便查看,比如 #号开头的注释行会用蓝色标记;查找的时候会用黄色标高亮标记搜索词;特殊类型文本也会颜色标记。可以打开一个文件试试。
[root@localhost data]# vim /etc/passwd
你会发现,不同列会用不同颜色标记,这样防止串行或看错 更方便更人性化。
列编辑
如果你想对文件实现列编辑,那就可以用区块选择实现。在命令模式下按下[ctrl] + v,你就可以看的左下角 -- VISUAL BLOCK -- 字样,这个时候上下左右移动光标就可以白色选中相应列。然后可以将选中列删除,复制,插入新列等等
区块命令:
命令 | 说明 |
---|---|
[ctrl] + v | 按字符的方式选择,光标经过的地方白色选择 |
[ctrl] + V | 按列的方式选择,光标经过的地方白色选择 |
y | 将白色选择区域复制 |
d | 将白色选择区域删除 |
x | 将白色选择区域删除 |
p | 粘贴 |
I | 在选择区域前,增加一列字符,输入 I后,白色会消失,这时候进入编辑模式,你可以输入内容,输入完成后,按两下Esc退出编辑模式,这时候选择的每行前面都会增加你输入的字符。经常用在比如批量注释 |
多文件编辑
如果你想实现把文件A的内容选择一部分复制到文件B,怎么实现?最简单的是打开多个shell终端,分别打开 A,B文件,然后通过屏幕复制的方式,把选择的内容粘贴到B文件。这方法可行,但不专业,有时会遇到一些符号问题。
vim 功能 支持多文件编辑,使用多文件编辑更自然方便。
命令 | 说明 |
---|---|
:r filename | 载入一个新文件 |
:files | 列出所有当前打开的文件 |
:n | 切换到下一个文件 |
:N | 切换到上一个文件 |
x | 将白色选择区域删除 |
可以实践一下:
#一次打开两个文件
[root@localhost data]# vim hello.txt new_hello.txt
#输入 [:files],列出文件列表
:files
1 %a "hello.txt" line 33
2 "new_hello.txt" line 0
#输入 [6yy] 从hell.txt 中复制 6行
#输入 [:n],切换到new_hello.txt 文件
#输入 [p],粘贴到 new_hello.txt 文件
#输入 [:wq],保存退出
[root@localhost data]# cat new_hello.txt
多窗口编辑
时常有需求需要对文件对比编辑,或者参考某一文件进行配置,这时候就希望在一屏中拆出不同的窗口来显示同一文件或不同文件的内容。
多窗口命令:
命令 | 说明 |
---|---|
:sp filename | 用新窗口载入一个新文件,不指定文件名则载入当前文件 |
[ctrl]+w+ j 或者 [ctrl]+w+向下剪头键 | 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向 下箭头键),这时光标可移动到下方的窗口完成窗口切换。 |
[ctrl]+w+ k 或者 [ctrl]+w+向上剪头键 | 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 k (或向 上箭头键),这时光标可移动到上方的窗口完成窗口切换。 |
ctrl]+w+ q | 移动到某一窗口后,输入 :q 完成退出 |
每个窗口可以理解为独立的vim,切换到当前窗口后,就可以像正常vim一样使用了。
vim环境设置
细心的朋友可能会注意到,vim 会记住你的一些操作历史,比如上次文件编辑的位置,再次打开光标自动在上次编辑的位置;上次搜索的关键词等等。这些是比较人性化的功能,这些信息vim会把它存储在 ~/.viminfo 文件中。这文件是vim自动创建的,每次启动会查询里的相关信息。
vim 还支持定制一些编辑器样式,比如显示行号,语法高亮,版本格式等等。这些配置也是记录在文件中,这配置分两部分一部分是全局配置,配置在/etc/vimrc 文件中,一般是由系统管理设置,对所有使用vim的用户有效。当然你对全局配置不满意可以自己定制自己的样式,在你自己home目录下创建~/.vimrc文件,在这个文件中设置你自己喜好的样式,不会影响别人。在使用vim开发应用时,一般需要设置统一的缩进,高亮等选项。
比如你要设置,默认显示行号:
#编辑或创建~/.vimrc,输入 set nu,保存退出,这个文件用 “ 号表示注释
[root@localhost ~]# vim ~/.vimrc
[root@localhost ~]# cat ~/.vimrc
set nu
再次用vim打开文件看看是不是有变化,每行前面会自动增加行号。
常用的设置选项:
命令 | 说明 |
---|---|
set nu | 开启显示行号 |
set nonu | 关闭显示行号 |
set hlsearch | 开启搜索高亮,默认值 |
set nohlsearch | 取消搜索高亮 |
set autoindent | 开启自动缩进排版 |
set noautoindent | 关闭自动缩进排版 |
set ruler | 显示右下角的一些状态栏说明 |
set showmode | 显示左下角的模式变换说明 |
syntax on | 开启语法高亮 |
syntax off | 关闭语法高亮 |
set bg=dark 或 set bg=light | 设置颜色方案,默认是light,如果蓝色注释看不清,可以设成dark试试 |
总结
vim是一个强大的文本编辑器,它的功能且不止本文列举的。如果想深入学习掌握vim 可以参考这个网址上的文档:vimcdc。
使用vim的时候还会遇到一些编码问题,比如中文乱码,这个要设置好语言环境 一般设置成zh_CN.UTF-8 就可以了,或者安装的时候选好中文环境;还有就是windows下面的文件默认是回车和换行两个字符来表示行结束的,而Linux是只用回车符表示行结束,如果看到行尾特殊符号,可以通过 dos2unix转换一些文件格式。