目录
一、简介
vi:Visual Interface,文本编辑器
文本:ASCII, Unicode
文本编辑种类:
行编辑器:sed
全屏编辑器:nano, vi
VIM - Vi IMproved
二、Vim的基本使用
vim:模式化的编辑
1.基本模式
编辑模式,命令模式
输入模式
末行模式:内置的命令行接口
2.打开文件
# vim [OPTION]... FILE...
+#:打开文件后,直接让光标处于第#行的行首
+:让光标在尾行
+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首
3.模式转换
①编辑模式 --> 输入模式
i:insert, 在光标所在处输入
a:append, 在光标所在处后面输入
o:在当前光标所在行的下方打开一个新行
I:在当前光标所在行的行首输入
A:在当前光标所在行的行尾输入
O:在当前光标所在行的上方打开一个新行
c
C
②输入模式 --> 编辑模式
[ESC]
③编辑模式 --> 末行模式
:
④末行模式 --> 编辑模式
[ESC]
P.S. 没有编辑模式转输入模式
4.关闭文件
:q 退出
:q! 强制退出,丢弃做出的修改
:wq 保存退出
:x 保存退出
:w /PATH/TO/SOMEWHERE
命令模式下
ZZ:保存退出
5.光标跳转
字符间跳转: h, j, k, l
h:左
l:右
j:下 食指在中指下
k:上 中指在食指下
#COMMAND:跳转由#指定的个数的字符
单词间跳转:
w:下一个单词的词首 word
e:当前或下一单词的词尾 end
b:当前或前一个单词的词首 before
#COMMAND:由#指定一次跳转的单词数
行首行尾跳转:
^:跳转至行首的第一个非空白字符
0:跳转至绝对行首
$:跳转至绝对行尾
行间移动:
#G:跳转至由#指定行
G:最后一行
1G, gg:第一行
句间移动:
) 下一句
( 上一句
段落间移动:
} 下一段
{ 上一段
括号匹配:
%
三、Vim的编辑命令
1.字符编辑(x)
x:删除光标处的字符 叉叉
#x:删除光标处起始的#个字符
xp:交换光标所在处的字符及其后面字符的位置
2.替换命令(r, replace)
r:替换光标所在处的字符
3.删除命令(d)
d:删除命令,可结合光标跳转字符,实现范围删除
d$:删除光标到绝对行尾
d^:
d0:
dw
de
db
#COMMAND
e.g 3dw
d#COMMAND
e.g. d3w 删除光标起的3个单词
dd:删除光标所在的行
#dd:多行删除
4.粘贴命令(p, put, paste)
p(小写):缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P(大写):缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
5.复制命令(y, yank)
y:复制,工作行为相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:复制行
#yy:复制多行
6.改变命令(c, change)
c:修改
编辑模式 --> 输入模式
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除并输入新内容
#cc:
7.其它编辑操作
可视化模式:
v:按字符选定
V:按行行定
Note:经常结合编辑命令:d, c, y
撤消此前的编辑u(undo):
#u:撤消指定次数的操作
撤消此前的撤消:
Ctrl+r:恢复
重复前一个编辑操作:
.
翻屏操作:
Ctrl+f:向文件尾部翻一屏
Ctrl+b:向文件首部翻一屏
Ctrl+d:向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
P.S. vim自带的练习教程:vimtutor
四、Vim中的末行模式
内建的命令行接口
1.地址定界
:start_pos,end_pos
#:具体第#行,例如2表示第2行
#,#:从左侧#表示行起始,到右侧#表示行结尾
#,+#:从左侧#表示的行起始,加上右侧#表示的行数
.:当前行
$:最后一行
.,$-1
%:全文, 相当于1,$
/pat1/,/pat2/:从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/
/pat/,$
使用方式:后紧跟一个编辑命令
d
y
w /PATH/TO/SOMEWHERE:将范围内的行另存至指定文件中
r /PATH/FROM/SOMEFILE:在指定位置插入指定文件中的所有内容
2.查找
同less的查找用法
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
3.查找并替换
s:在末行模式下完成查找替换操作
s / 要查找的内容 / 替换为的内容 / 修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容
修饰符:
i:查找时忽略大小写
g:全局替换;默认情况下,每一行只替换第一次出现
e.g. 1,$s/r\(..\)t/R\1T/g
e.g. 1,$s/linux/&er/g
e.g. 1,$s/ \ /etc\ /fstab / \ /var \ /log 地址中的/需要转义
P.S. 要给出地址定界
查找替换中的分隔符/可替换为其它字符,例如
s@ 要查找的内容 @ 替换为的内容 @ 修饰符
s# 要查找的内容 # 替换为的内容 # 修饰符
练习
①复制/etc/grub2.cfg至/tmp/目录,用查找替换命令删除/tmp/grub2.cfg文件中的行首的空白字符
%s/^[[:space:]]\+//g
②复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号
:%s/^[[:space:]]/#&/
:1,$s@^[[:space:]]@#&@g
五、其他
1.多文件模式
可以方便地在多个文件中进行复制粘贴删除等操作
vim FILE1 FILE2 FILE3 ...
:next 打开下一个文件
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 退出所有
:wqall 保存并退出所有
2.窗口分隔模式
vim -o|-O FILE1 FILE2 ...
-o:水平分割
-O:垂直分割
在窗口间切换:Ctrl+w, 箭头( h, j, k, l )
单文件窗口分割:
Ctrl+w, s:split, 水平分割
Ctrl+w, v:vertical, 垂直分割
3.定制vim的工作特性
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc 需要自己创建
末行:当前vim进程有效
①行号
显示:set number, 简写为set nu
取消显示:set nonumber, 简写为set nonu
②括号匹配
匹配:set showmatch, 简写为set sm
取消:set nosm
③自动缩进
启用:set ai
禁用:set noai
④高亮搜索
启用:set hlsearch
禁用:set nohlsearch
⑤语法高亮
启用:syntax on
禁用:syntax off
⑥忽略字符的大小写
启用:set ic
不忽略:set noic(默认no ignore case)
4.获取帮助
:help
:help subject
问题:如何设置tab缩进为4个字符?
set ts=4
set expandtab
练习
①复制/etc/rc.d/init.d/functions文件至/tmp目录;替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
$s@/etc/sysconfig/init@/var/log@g
%s@/etc/sysconfig/init@/var/log@g
②删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号
1,$s@^#\([[:space:]]\+\)@\1@g
%s@^#\([[:space:]]\+.*\)@\1@g
参考资料:
马哥随堂笔记
注:诚恳欢迎读者对本文提出批评意见,若发现存在错误,我定第一时间修改。如果读者觉得文章对您有帮助,欢迎点赞鼓励一下哟٩(๑❛ᴗ❛๑)۶。