1 使用 vim 初步

1.1 vim 命令格式

vim [OPTION]... FILE...

常用选项

+N        #打开文件后让光标处于第N行的行首,+默认尾行 
+/PATTERN #让光标处于第一个被PATTERN匹配到的行行首
-b file   #二进制方式打开文件
-d file1 file2… #比较多个文件,相当于 vimdiff
-m file   #只读打开文件
-e file   #直接进入ex模式,相当于执行ex file 
-y file   #Easy mode (like "evim", modeless),直接可以操作文件,ctrl+o:wq|q! 保存和不保存退出

说明:

  • 如果该文件存在,文件被打开并显示内容

  • 如果该文件不存在,当编辑后第一次存盘时创建它

范例:

[root@rocky8 ~]# vim f1.txt     #光标在第一行
[root@rocky8 ~]# vim +3 f1.txt  #光标在第3行
[root@rocky8 ~]# vim + f1.txt   #光标在最后一行
[root@rocky8 ~]# vim +/^abc f2.txt   #模式匹配定位
[root@rocky8 ~]# vim +/^bc* f2.txt   #模式匹配定位

1 三种主要模式和转换

vim 是 一个模式编辑器,击键行为是依赖于 vim的 的 “模式”

三种模式:

  • 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本

  • 插入(Insert)或编辑模式:用于修改文本

  • 扩展命令(extended command )或命令(末)行模式:保存,退出等

三种模式之间的切换:

vim 是 一个模式编辑器,击键行为是依赖于 vim的 的“模式”,就是说,在不同模式下,相同的按键,是不同的意思;

插入模式和扩展命令模式之间不能直接切换,要走命令模式中转;

打开vim 默认就是命令模式;

#命令模式 --------------------------> 插入模式
#下列按键皆可

#i       insert, 在光标所在处输入 
#I       在当前光标所在行的行首输入 
#a       append, 在光标所在处后面输入
#A       在当前光标所在行的行尾输入
#o       在当前光标所在行的下方打开一个新行 
#O       在当前光标所在行的上方打开一个新行

#命令模式 --------------------------> 扩展命令模式
#直接敲冒号 :


#################################################################


#插入模式 -------------------------> 命令模式
#按ESC键


#################################################################


#插入模式 -------------------------> 扩展命令模式
#按ESC到命令模式,再按冒号 : 到扩展命令模式


#################################################################


#扩展命令模式 ----------------------> 命令模式
#ESC键或Enter键或退格健


#################################################################


#扩展命令模式 ---------------------> 插入模式
#ESC|Enter|退格键 到命令模式,再i|I|a|A|o|O 到插入模式

范例: 插入颜色字符

[root@rocky8 ~]# echo -e '\e[1;31mhello\e[0m'
[root@centos7 ~]# echo -e '\e[1;31mhello\e[0m'
\e==^[

vim 中实现

1   切换至插入模式
2   按ctrl+v+[ 三个键,显示^[
3   后续输入颜色信息,如:^[[32mhello^[[0m
4   切换至扩展命令模式,保存退出
5   cat 文件可以看到下面显示

2 扩展命令模式

按:进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧

2.1 扩展命令模式基本命令

w      #写(存)磁盘文件
wq     #写入并退出
x      #写入并退出
X      #加密
q      #退出
q!     #不存盘退出,即使更改都将丢失
r filename    #读文件内容到当前文件中
w filename    #将当前文件内容写入另一个文件
!command      #执行命令
r!command     #读入命令的输出

范例:

:w       #保存当前更改,不退出
:q!      #不保存退出
:r /etc/fstab  #将/etc/fstable
:w test        #将当前打开的文件保存至另外一个文件
:!hostname     #执行hostname
:r!uname -a    #将 uname -a 的命令执行结果读到当前文件中

:X             #加密码
Enter encryption key: ******
Enter same key again: ******

2.2 地址定界

格式:

:start_pos,end_pos CMD

2.2.1 地址定界格式
N         #具体第N行,例如2表示第2行
M,N       #从左侧M表示起始行,到右侧N表示结尾行
M,+N      #从左侧M表示起始行,右侧表示从光标所在行开始,再往后+N行结束
M,-N      #从左侧M表示起始行,右侧表示从光标所在行开始,-N所在的行行结束
M;+N      #从第M行处开始,往后数N行,2;+3 表示第2行到第5行,总共取4行
M;-N      #从第M-N行开始,到第M行结束
.         #当前行
$         #最后一行
.,$-1     #当前行到倒数第二行
%         #全文, 相当于1,$
/pattern/          #从当前行向下查找,直到匹配pattern的第一行,即正则匹配
/pat1/,/pat2/      #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
N,/pat/      #从指定行开始,一直找到第一个匹配pattern的行结束
/pat/,$      #向下找到第一个匹配patttern的行到整个文件的结尾的所有行
2.2.2 地址定界后跟一个编辑命令
p     #输出
d     #删除
y     #复制
w file    #将范围内的行另存至指定文件中
r file    #在指定位置插入指定文件中的所有内容
t行号      #将前面指定的行复制到N行后
m行号      #将前面指定的行移动到N行后

范例:

[root@rocky8 ~]# seq 10 > 10.txt

:2d     #删除第2行
:2,4d   #删除第2到第4行
:2;+3y  #复制第2到第5行,总共4行
:3;+4w test      #将第3到第7行,总共5行内容写入新文件
:5r /etc/issue   #将/etc/issue 文件读取到第5行
:t2         #将光标所在行复制到第2行
:2,+3t10    #将第2到第5行,总共4行内容复制到第10行之后
:.d    #删除光标所在行
:$y    #复制最后一行
:2,4move9    #将第2行到第4行的内容移动到第9行的下一行
:2,4copy9    #将第2行到第4行的内容复制到第9行的下一行

3 查找并替换

格式

:s/要查找的内容/替换为的内容/修饰符
:%s  表示全文查找替换

说明:

要查找的内容:可使用基本正则表达式模式
替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容

修饰符:

i     #忽略大小写
g     #全局替换,默认情况下,每一行只替换第一次出现
gc    #全局替换,每次替换前询问

查找替换中的分隔符/可替换为其它字符,如:#,@

范例:

:s/root/ROOT/    #替换当前行第一个root
:s/root/ROOT/g   #替换当前行所有root
:%s/root/ROOT/g  #全文替换
:%s/root/test/ig #不区分大小写全文替换
:%s/#//          #将每行第一个#替换成空

4 定制vim的工作特性

扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存;

写配置文件必须保证能识别,有些短格式在配置文件;

/etc/vimrc #全局配置
~/.vimrc   #个人配置
4.1 行号
:set number|set nu          #显示行号
:set nonumber|set nonu      #取消显示行号
4.2 忽略字符的大小写
:set ignorecase|set ic      #忽略字符大小写
:set noignorecase|set noic  #不忽略
4.3 自动缩进
:set autoindent|set ai      #启用自动缩进
:set noautoindent|set noai  #禁用自动缩进
4.4 复制保留格式
:set paste     #复制时保留格式
:set nopaste   #禁用复制时保留格式选项
4.5 显示Tab ^I和换行符 和$显示
:set list      #显示系统字符
:set nolist    #隐藏系统字符
4.6 高亮搜索
:set hlsearch         #高亮显示搜索结果
:set nohlsearch|nohl  #不高亮显示搜索结果
4.7 语法高亮
:syntax on    #语法高亮
:syntax off   #关闭语法高亮
4.8 文件格式
:set fileformat=dos|set ff=doc     #启用windows格式
:set fileformat=unix|set ff=unix   #启用unix格式
4.9 Tab 用空格代替
:set expandtab|set et      #使用空格代替Tab,默认8个空格
:set noexpandtab|set noet  #禁用空格代替Tab
4.10 Tab用指定空格的个数代替

:set tabstop=N|set ts=N #指定N个空格代替Tab

4.11 设置缩进宽度
>>    #向右缩进 命令模式
<<    #向左缩进 命令模式

:set shiftwidth=4     #设置缩进为4个字符
4.12 设置光标所在行的标识线
:set cursorline|set cul       #给光标所在行加下划线
:set nocursorline|set nocul   #取消光标下划线
4.13 加密
:set key=password   #加密文档
:set key=           #取消加密

centos7系统:
#vi/vim 可以给文件加密码,即在打开时会提示输入密码,输入错误的密码则会打开乱码;具体操作为:使用vi打开需要加密的文件后,在命令模式下(即正常模式)输入 :X 回车,提示输入密码(需输入两次密码)后,保存退出(没保存退出加密不生效),使用x保存退出不生效。

#在默认情况下输入:X时会提示Warning: Using a weak encryption method; see :help 'cm',解决办法是把默认的zip加密模式改成blowfish或者blowfish2,具体如下:

:setlocal cm?              " show encryption method for the current file
:setlocal cm=zip           " weak (default for backwards-compatibility)
:setlocal cm=blowfish      " better
:setlocal cm=blowfish2     " best (requires Vim version 7.4.399 or higher)
4.14 了解更多

set 帮助

:help option-list
:set|:set all