Vim编辑器

Linux中文本编辑器有emacspiconanojoevim等,所有Unix Like系统都会内建vi文本编辑器,其他文本编辑器不一定会存在,很多个别软件编辑接口都会主动呼出vi,如crontabvisudoedquota等指令,且vi程序简单编辑速度快速

vi是老式的文本处理器,vim可视为vi的进阶版加入了正规匹配多文件编辑区块复制等额外功能,且vim具有程序编辑能力可主动以字体颜色辨别语法正确性方便程序设计,甚至一些Linux基础配置文件内的语法都能用vim来检查;CentOS 7中一般账号预设vi已被vim取代

vi共分为一般指令模式编辑模式底行模式三种工作模式,一般指令模式可与编辑模式底行模式切换,但编辑模式底行模式之间不可互相切换,这三种模式的作用如下:

  • 一般指令模式:以vi打开一个文件就直接进入该工作模式,该模式中可使用上下左右按键来移动光标,可使用删除字符删除整行来处理文件内容,也可使用复制粘贴来处理文件数据,无法编辑文件内容;
  • 编辑模式:按iIoOaArR等任一字母进入编辑模式,且在画面左下方会出现INSERTREPLACE的字样,按Esc按键即可退出编辑模式回到一般指令模式;
  • 低行模式:在一般模式中输入:/?等任一字符,即可将光标移动到最底下一行,在该模式中可提供内容搜索以及读取存盘大量取代字符离开vi显示行号等动作;
按键 说明
i, I 进入插入模式i为从光标所在处插入,I为从光标所在行第一个非空格字符处开始插入
a, A 进入插入模式a为从光标所在下一个字符处插入,A为从光标所在行最后一个 字符处开始插入
o, O 进入插入模式o为从光标所在的下一行插入新的一行O为从光标所在处的上一行插入新的一行
r, R 进入替代模式r只会替换光标所在的字符一次R一直替换光标所在的文字直到退出替代模式
Esc 退出编辑模式,回到一般指令模式中

按键说明

光标移动

按键 说明
h向左箭头键 光标向左移动一个字符,若想一次移动多个,加上想要进行的次数,按下动作即可
j向下箭头键 光标向下移动一个字符30j30向下移动30行
k向上箭头键 光标向上移动一个字符
l向右箭头键 光标向右移动一个字符
Ctrl + f 屏幕向下移动一页,相当于Page Down按键
Ctrl + b 屏幕向上移动一页,相当于Page Up按键
Ctrl + d 屏幕向下移动半页
Ctrl + u 屏幕向上移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n<space> n为数字,光标向右移动这一行的第n个字符,如20<space>光标会向后面移动第20个字符处
数字0Home功能键 移动到行的最前面一个字符
H 光标移动到屏幕的最上方那一行第一个字符
M 光标移动到屏幕的中央那一行第一个字符
L 光标移动到屏幕的最下方那一行第一个字符
G 移动到文件最后一行
nG n为数字,移动到文件的第n,如20G则会移动到文件第20行,可配合set nu
gg 光标移动到文件的第一行,相当于1G
n<Enter> n为数字,光标向下移动n
w 光标跳到下个字的开头
e 光标跳到下个字的字尾
b 光标回到上个字的开头
^ 移动到光标所在行的行首
$End功能键 移动到行的最后一个字符

搜索与替换

按键 说明
/word 光标向下搜索名称为word的字符串,如在文件内搜寻vbird字符串即就输入/vbird
?word 光标向上搜索名称为word的字符串
n 字母按键n表示重复前一个搜索动作,如执行/word,按下n后会向下继续搜索名称为word的字符串,
若执行?word,按下n则会向上继续搜索名称为word的字符串
N 字母按键N表示反向进行前一个搜寻动作,如执行/word,按下N则表示向上搜寻word
:n1,n2s/word1/word2/g n1n2为数字,在n1n2行之间搜索word1字符串,并将word1替换为word2
:100,200s/vbird/VBIRD/g表示在100到200行之间搜索vbird并取代为VBIRD
:1,$s/word1/word2/g 第一行最后一行搜索word1字符串,并将word1替换为word2
:1,$s/word1/word2/gc 第一行最后一行搜索word1字符串,并将word1替换为word2
在取代前显示提示字符给用户确认是否需要取代

删除复制粘贴

按键 说明
x, X x表示向后删除一个字符X表示向前删除一个字符
nx n为数字,连续向后删除n个字符,例:10x即连续向后删除10个字符
dd 删除光标所在一整行
ndd n为数字,删除包括光标所在行的向下n,例:20dd即删除20行
d1G 删除光标所在行第一行的所有数据
dG 删除光标所在行最后一行的所有数据
d$ 删除光标所在字符处该行的最后一个字符
d0 删除光标所在字符处该行的第一个字符
yy 复制光标所在的行
nyy n为数字,复制包括光标所在行的向下n,例:20yy即复制20行
y1G 复制光标所在行第一行的所有数据
yG 复制光标所在行最后一行的所有数据
y0 复制光标所在字符处该行行首的所有数据
y$ 复制光标所在字符处该行行尾的所有数据
p, P p表示将已复制的数据粘贴在光标下一行P表示将已复制的数据粘贴在光标上一行
J 光标所在行下一行的数据合并成同一行
c 重复删除多个数据,例:10cj向下删除10行
u 恢复前一个操作的修改撤销
Ctrl + r 重复上一个动作,仅能执行一次
. 重复前一个动作, 如想要重复删除、重复贴等动作,按下小数点即可

底行模式指令

按键 说明
:w 编辑的数据写入磁盘文件
:w! 若文件属性为只读时强制写入该文件,能否写入与该用户对该文件的文件权限有关
:q 离开vi
:q! 有修改不想储存,使用!强制离开不储存文件
:wq 储存后离开,若为:wq!则为强制储存后离开
ZZ 若文件没有修改不储存离开,若文件被修改过储存后离开
:w [filename] 编辑的数据储存成另一个文件
:r [filename] 在编辑的数据中读入另一个文件数据,即将filename文件内容追加到光标所在行后面
:n1,n2 w [filename] n1n2的内容储存成filename这个文件
:!command 暂时离开vi到指令列模式下执行command的显示结果,如:! ls /home

vim环境变量

按键 说明
:set nu 显示行号
:set nonu set nu相反,为取消行号显示

暂存与恢复

当使用vim时会在被编辑的文件的目录下,再建立一个名为.filename.swp的文件,如编辑/tmp/vitest/man_db.conf文件时,vim会主动创建/tmp/vitest/.man_db.conf.swp的暂存文件;对man_db.conf编辑就会被记录到.man_db.conf.swp文件中,若系统因某些原因中断导致编辑的文件没有保存,此时就能通过.man_db.conf.swp文件来恢复;

由于暂存文件的关系,vim会主动的判断该打开文件可能有问题,会提示主要的问题与解决方案,Linux是多人多任务环境,可能有多人同时编辑同一文件,若多人同时保存则该文件的内容错乱,为了避免该问题vim会出现警告窗口,解决的方法:

  • 找到另外编辑该文件的程序或人员,让其将该文件的vim工作结束,然后再继续处理
  • 只是查看该文件内容,则可以选择开启成为只读(O)文件

可能因某些原因导致vim中断,常见的处理方法为:

  • vim处理动作尚未储存,此时按下R(R)ecover,此时vim会载入.man_db.conf.swp的内容,让你来决定是否储存,这样就能救回未储存的内容,但.man_db.conf.swp并不会在结束vim后自动删除,需要手动删除.man_db.conf.swp暂存文件,才能避免每次打开该文件都会出现的警告
  • 确定该暂存文件没有用,可直接D删除该暂存文件,此时vim会载入man_db.conf且删除旧的.man_db.conf.swp文件,且再次生成新的.man_db.conf.swp文件

告警信息中的六个可用选项:

  • [O]pen Read-Only:以只读模式打开此文件,可用在只是想查阅该文件内容并不编辑时
  • (E)dit anyway:以正常方式打开要编辑的文件并不会载入暂存内容,但很容易出现两个使用者互相改变对方的修改等问题
  • (R)ecover加载暂存的内容,用于恢复之前未储存的内容,但当恢复后且储存离开vim后,需手动删除暂存文件
  • (D)elete it:确定暂存文件无用,则开启文件前会先将该暂存文件删除
  • (Q)uit:离开vim且不会进行任何动作
  • (A)bort:忽略这个编辑行为,与quit非常类似

额外功能

区块选择

按下v或者V或者[Ctrl]+v时,次时候光标移动过的地方就会开始反白

按键 说明
v 字符选择,将光标经过的地方反白选择
V 行选择,将光标经过的行反白选择
[Ctrl]+v 区块选择,即列操作,以长方形的方式选择内容
y 复制反白到剪切板
d 删除反白内容
p 将刚刚复制的区块粘贴到光标所在处

多文件编辑

vi可以使用:r filename来读入某个文件的内容,但是将整个文件读入,若想只要部分内容,通常要开两个vim窗口来复制,每个vim都是独立的,因此无法在A文件中执行nyy复制,再到B文件中通过p快捷键粘贴复制内容;这时多文件编辑就派上用场了;若想同时编辑多个文件直接在vim后面接多个文件路径即可,例:vim /etc/hostname /etc/hosts即同时编辑hosts和hostname文件;vim中使用:files查看编辑的文件数据;

按键 说明
:n 编辑下一个文件
:N 编辑上一个文件
:files 列出当前vim开启的所有文件
1
2
3
4
vim /etc/hostname /etc/hosts
:files
1 %a "hosts" 第 4 行
2 "hostname" 第 0 行

多窗口

vim中可通过在底行模式中输入:sp filename开启多窗口,filename是可选参数,若仅输入:sp则是在多个窗口打开同一个文件;两个文件同时在一个屏幕上面显示,还可利用ctrl+w+↑ctrl+w+↓在两个窗口之间移动,分区窗口的常用指令如下:

按键 说明
:sp [filename] 开启一个新窗口若有filename则在新窗口开启一个新文件,否则表示两个窗口为同一个文件内容
[ctrl]+w+ j
ctrl]+w+↓
先按下ctrl不放再按下w放开所有的按键,然后再按下j向下箭头键,则光标移动到下方窗口
ctrl+w+k
ctrl+w+↑
操作同上,光标移动到上面的窗口
ctrl+w+q退出当前窗口 若结束下方的窗口可通过ctrl+w+↓,移动到下方窗口后通过:q退出窗口,也可通过ctrl+w+q退出窗口

vim补全功能

组合按键 说明
[ctrl]+x -> [ctrl]+n 通过目前正在编辑文件的内容文字作为关键词,予以补齐
[ctrl]+x -> [ctrl]+f 当前目录内的文件名作为关键词,予以补齐
[ctrl]+x -> [ctrl]+o 扩展名作为语法补充,以vim内建的关键词,予以补齐

vim环境设定与记录

vim会主动记录操作记录到~/.viminfo文件中,该文件是自动生成,vim环境设定参数很多,可以在底行模式执行:set all命令查看当前设定值;可以通过配置文件~/.vimrc来直接设置默认的习惯的vim操作环境配置;

按键 说明
:set nu
:set nonu
设定与取消行号
:set hlsearch
:set nohlsearch
hlsearchhigh light search高亮搜索,设定是否将搜索字符串反白默认为hlsearch
:set autoindent
:set noautoindent
是否自动缩进,即按下Enter编辑新的一行时,光标不会在行首,而是在与上一行第一个非空格符处对齐
:set backup 是否自动储存备份,一般是nobackup,若设定backup则当变更任何一个文件时,则源文件会被另存为一个文件名为
filename~的文件,如设定:set backup编辑修改hosts时,在同目录下则会产生hosts~ 文件,记录原始的hosts文件内容;
:set ruler 右下角的一些状态栏是否显示
:set showmode 左下角的状态栏是否显示--INSERT--之类的字样
:set backspace=2 编辑模式中可使用退格键backspace删除任意字符,但某些distribution则不许,则可通过backspace来设定,
当置为2可删除任意值01仅可删除刚刚输入的字符而无法删除原本就已经存在的文字
:set all 显示目前所有的环境参数设定值
:set 显示与系统默认值不同的设定参数,一般是有修改过的设定参数
:syntax on
:syntax off
是否根据程序相关语法显示不同颜色
:set bg=dark
:set bg=light
可用以显示不同的颜色色调预设light

中文编码问题

因为编码问题vim很可能无法正常显示中文,中文编码有big5和utf8两种,若文件是使用big5编码制作,但是在vim终端使用utf8编辑,由于编码不同,中文内容会乱码;

  • Linux默认支持的语系数据/etc/locale.conf配置文件有关
  • 终端bash的语系LANG, LC_ALL两个变量有关
1
2
3
# 修改语系编码
LANG=zh_TW.big5
export LC_ALL=zh_TW.big5

可通过iconv指令将语系编码进行转换

1
2
3
4
5
6
7
8
9
10
iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list:列出iconv支持的语系数据
-f:即from即来源,后接原本的编码格式
-t:即to即后来的新编码格式
-o file:若要保留原本的文件,则使用-o 新文件名,可以建立新编码文件

# 将繁体中文utf8转换为简体中文utf8
iconv -f utf8 -t big5 vi.utf8 | iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8

Dos与Linux换行符

DOS使用的换行字符为^M$,即CR(^M)LF($)两个符号,Linux下只有LF($)这一个换行符,可通过dos2unix工具来进行格式转换;

1
2
3
4
5
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
选项与参数
-k:保留该文件原本的mtime时间格式
-n:保留原本的旧档,将转换后的内容输出到新文件