一、概述
vim(vi improved)编辑器是vi的增强版,主要用来查看文件中的行,以及查找、移动、编辑、替换文本。
vim有三种操作模式:
命令模式:刚打开文件时,vim编辑器会进入命令模式,此模式下键盘操作会被理解为编辑命令。
插入模式:这种模式下,vim会将键盘输入的字符都插入到缓冲区。
末行模式:此模式下可执行查询操作,而读取和输出文本、大量替换字符、显示行号、保存、离开vim也是在此模式中进行。
三种模式之间的切换:
命令模式→插入模式:
i键:在光标所在处的前方转为插入模式
I键:在光标所在行的行首转为插入模式
a键:在光标所在处的后方转为插入模式
A键:在光标所在行的行尾转为插入模式
o键:在光标所在行的下方新建一个空行并转换为插入模式
O键:在光标所在行的上方新建一个空行并转换为插入模式
命令模式→末行模式:
:键:与内容定界、读取或输出文本及保存、退出vim相关
/和?键:与查找相关
插入模式和末行模式返回命令模式均按ESC键;插入模式和末行模式之间不能直接切换,需经过命令模式。
二、vim打开和关闭文件
1、打开
vim [option]… [file]…
vim命令后若不加任何文件名,则直接显示其版本等信息
2、关闭
命令模式下:ZZ
末行模式下: :q(未编辑过文件的情况下,直接退出) ,:q!(不保存退出),:wq(保存并退出),:x(保存并退出),:wq!(强制保存并退出)
三、vim常用操作
1、光标移动
在命令模式中,可使用方向键[或h(左)、j(下)、k(上)、l(右)]移动光标。有时一行一行移动会比较麻烦,因此vim还提供了一些命令提高移动速度:
单词间移动:
w:下一个单词词首 e:当前单词或下一个单词词尾 b:当前单词或上一个单词词首 #{w|e|b}
行内移动:
^:行首(第一个非空白字符) 0:绝对行首 $:绝对行尾
句子间移动:
):下一个句子句首 (:上一个句子句首
段落间移动:
},{
行间移动:
#G:直接跳转至第#行
G:跳转至最后一行
gg:跳至第一行
#{h|j|k|l}:向指定方向跳转#个字符
PageUp(或ctrl+f):上翻一屏数据
PageDown(或ctrl+b):下翻一屏数据
ctrl+d:上翻半屏数据
ctrl+u:下翻并屏数据
2、命令模式中常用的编辑命令
x/X:x为删除光标所在处的字符,X为删除光标前的一个字符
#{x/X}:x和X命令可结合数字键使用
d+光标移动命令:删除跳转范围内的字符或行
dd:删除光标所在行
#dd:结合数字键使用,表示删除光标所在行后的#行(包含光标所在行)
dw:删除当前字符到单词尾(包含空格)的所有字符
de:删除当前字符到单词尾(不包括单词尾部的空格)的所有字符
d$:删除当前字符到行尾的所有字符,相当于D
d^:删除当前字符到行首的所有字符
J:删除当前光标所在行的行尾的换行符(拼接行)
c+光标移动命令:修改,先删除光标跳转范围内的文本,再转换为插入模式
cc或C:删除光标所在处的整行并进入输入模式
r char:用char替换当前光标所在字符
R text:用text覆盖当前光标所在数据,直到按下ESC键为止
u:撤销前一条命令
#u:撤销之前的#次操作
ctrl+r:撤销前一次的撤销操作
.:重复前一条命令
3、复制与粘贴
p:paste 粘贴
vim会将最后一次删除或复制的数据保存在一个单独的寄存器中,可用p或P命令取回
字符级别粘贴:使用p(P)命令会将字符插入到光标所在字符之后(前)
行级别粘贴:使用p(P)命令会将行插入到光标所在行之后(前)
y:yank 复制
可以与y使用与d相同的第二字符(如yw表示复制单词,y$复制到行尾),复制文本后,再使用p(P)命令粘贴
4、末行模式中的相关操作
命令模式中按【:】键进入末行模式,输入:
#:跳转到第#行 $:跳转到末行
内容定界:格式为startpos,endpos 例如10,$-1
#:第#行 .:当前行 $:末行 %:全文,相当于1,$
内容定界后:
1)w /path/to/somefile:将选定范围内的内容保存至某文件中
2)r /path/to/somefile:将指定文件中的内容读取到当前文件中的指定位置
3)可结合c,d,y等命令使用,实现区域文本编辑
查找:
格式:/pattern(从光标所在处向后查找) ?pattern(从光标所在处向前查找)
要继续查找同一文本,按n键(下一个)或N键(上一个)
查找模式可使用正则表达式
替换:
替换命令的格式是:
:s/查找模式/要替换成的新内容/gi
g:global,表示全文替换
i:ignore,忽略字符大小写
要替换的内容不能使用使用模式,仅能使用引用
例1:替换/tem/functions文件中的/etc/sysconfig/init为/var/log
%s/ \ /etc\ /sysconfig\ /init/ \ /var\ /log/gi (注:因避免要替换的内容中的/与分隔符相混淆,需要用\进行转义;另外,分隔符可自定义,不会混淆则不用转义,因此也可写成%s@/etc/sysconfig/init@/var/log/gi)
例2:复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#号
%s@^\([[:space:]]\{1,\}.*\)@#\1@g或者%s@^[[:space:]]\{1,\}.*@#&@g (引用模式匹配到的所有内容,可使用&符号)
四、vim的可视化模式
有时执行复制操作时,没法看清到底复制了什么,而可视模式会在移动光标时高亮显示文本。在复制的起始位置按下v(V)键进入可视模式,然后移动光标覆盖需要复制的文本,光标移动过程中,vim会高亮显示复制区域的文本,覆盖完需要复制的内容之后,按y键激活复制命令。(注:v键为字符选择;V键为行选择)
五、vim窗口属性定义
:set nu(显示行号) :set nonu(取消显示行号)
:set ai(自动缩进) :set noai
:set ic(忽略字符大小写) :set noic
:set sm (显示匹配的扩号的另外半边)
:syntax off(关闭语法高亮) :syntax on
:set nohlsearch(关闭搜索高亮)
默认只对当前进程有效,若需持久有效,应修改vim的配置文件
六、vim的多文件模式
vim可同时编辑多个文件,直接将文件名列于vim命令后即可,如vim /etc/inittab /etc/passwd
多文件模式中文件之前的切换:
:next(或:n) :previous(或:N) :last :first :files(列出此vim目前开启的所有文件) :wqall(全部保存并退出)
七、vim的多窗口模式
1、多窗口单文件模式
打开文件后,按ctrl+w,再按s(v)为水平(垂直)分割 的多个窗口,并且可以对子窗口以同样的方式再次执行分割
2、多窗口多文件模式
vim -o :水平分割 vim -O:垂直分割
3、补充:在一个窗口中,可使用:sp [filename]水平开启一个新窗口,如果有加filename,表示在新窗口开启一个新文件,否则表示两个窗口为同一文件内容。
4、窗口之间的切换
先按ctrl+w,再按方向键
八、vim的配置文件
全局级:/etc/vimrc
用户级:~/.vimrc(若不存在,可手动创建)
九、补充说明
1、多个编辑器不能同时编辑一个文件
2、vim +# file:打开文件后光标直接处于第#行
十、vim使用示例
1、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;
%s/^[[:space:]]\+//gi
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
%s/^[[:space:]]/#&/gi
3、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
%s@/etc/sysconfig/init@/var/log@gi
4、删除/tmp/functions文件中所有以#开头,且#后面至少跟了一个空白字符的行的行首#;
%s/^#[[:space:]]/[[:space:]]/gi或%s/^#\([[:space:]]\)/\1/gi