Vim文本编辑器
vi简介
vi:Visual Interface,是一种功能强大的文本编辑器,工作在字符模式下,它可执行输出、输出、查找、替换、块等众多文本操作,不需要图形界面,因此执行起来效率会非常高,主要用来编辑纯文本文件,常见的编码有,ASCII,Unicode等等。
文本编辑器的种类:
行编辑器:逐行来对文本进行处理的工具,如sed
全屏编辑器:占据整个屏幕进行编辑,如nano,vi
vim工作模式
输入模式:在文本文件当中输入内容
命令模式:可执行一些编辑命令
末行模式:vim内置的命令行接口,执行vim的内置命令
vim的使用
打开文件
vim [OPTIONS] FILE...
+#:打开文件光标处在第#行
+:打开文件光标处在最后一行
+/pattern:打开文件光标处在第一次被pattern所匹配到的行
-b:二进制方式打开文件
-d:比较两个文件的不同之处
-m:制度方式打开文件
模式转换
默认为命令模式
命令模式 --> 输入模式
-i:在当前光标处输入
-a:在当前光标后方输入
-o:在当前光标下方新建一行转为输入
-I:在当前光标所在行的行首输入
-A:在当前光标所在行的行尾输入
-O:在当前光标上方新建一行转为输入
锁定和解锁:
ctrl+s:锁定
ctrl+q:解锁
输入模式 --> 命令模式
编辑模式 --> 末行模式
:
末行模式 --> 编辑模式
Esc、Esc
注意:输入模式需要先转为命令模式然后再转为末行模式
关闭保存文件:
命令模式
ZZ:保存并退出
ZQ:不保存退出
末行模式:
w:保存文本不退出
q:不保存退出
wq:保存并退出
wq!:强制保存并退出
x:保存并退出
w /PATH/TO/SOMEFILE:将文件内容保存至指定文件中
r /PATH/TO/SOMEFILE:将指定文件的内容读取至当前文件中
! COMMAND:可临时执行shell命令
r! COMMAND:将命令的执行结果添加至当前光标下方
光标跳转:
字符间跳转:
h:左
j:下
k:上
l:右
#COMMAND:跳转#个字符
单词间跳转:
w:跳转至下个单词的词首
e:跳转至下个单词的词尾
b:跳转至上个单词的词首
#COMMAND:跳转#个单词
行尾行首跳转:
^:非空白字符行首
0:绝对行首
$:跳转至行尾
当前页面跳转
H:页首
M:页中
L:页尾
行间跳转:
#G:跳转至第#行
G:跳转至尾行
gg:跳转至首行
句间跳转:以.为分隔
):跳转下一句
(:跳转上一句
段落跳转:以空行为分隔符
}:跳转至下一段落
{:上一段落
翻屏操作:
Ctrl+d:向文件尾部翻半屏
Ctrl+f:向文件尾部翻一屏
Ctrl+u:向文件首部翻半屏
Ctrl+b:向文件首部翻一屏
Enter:逐行向后翻
命令模式操作:
字符编辑:
x:删除光标处的字符
#x:删除光标以右的#个字符
xp:当前光标所在处的字符与光标后的字符做交换
~:转换大小写
替换命令:
r:替换光标所在处的字符
R:开启替换模式
删除命令:
d:删除,可结合光标跳转字符,实现范围删除
d^:删除当前光标所在行以左的所有字符
d$:删除当前光标所在行以右的所有字符
dw:删除当前光标所在处下一个单词
de:删除当前光标所在处的下一个单词
db:删除当前光标所在处的上个单词
dd:删除光标所在处的一整行
#dd:删除光标所在行开始向下#行
D:等于d$
复制命令:
y:复制,可结合光标跳转字符
y$:复制光标所在行以右的所有字符
y^:复制光标所在行以左的所有字符
yw:复制光标所在处下个单词
ye:复制光标所在处下个单词
yb:复制光标所在处上个单词
y0:复制光标所在行以左的所有字符,包含空白字符
yy:复制当前光标所在行
#yy:复制光标所在行向下#行
Y:复制光标所在行
粘贴命令:
p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,粘贴至当前光标所在处的后方
P:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,粘贴至当前光标所在处的前方
改变命令:
c:编辑模式 --> 输入命令,实现删除操作
c$:删除光标所在处以右的所有字符并转为输入模式
c^:删除光标所在处以左的所有字符并转为输入模式
c0:删除光标所在处以左的所有字符并转为输入模式,包含空白字符
cw:删除光标所在处下一个单词并转为输入模式
ce:删除光标所在处下一个单词并转为输入模式
cb:删除光标所在处上一个单词并转为输入模式
cc:删除光标所在行并转为输入模式
#cc:删除当前光标所在行向下#行并转为输入模式
C:删除当前光标至行尾并转为输入模式
一次性复制粘贴多次内容:
100i zhai Esc:zhai可粘贴100次
可视化模式:
v:按字符选定
V:按行选定
可结合编辑命令:d,c,p,y
Ctrl+v:面向块
撤销操作:
u:撤销前一次操作
#u:撤销前#次操作
U:撤销光标所在行所有此行的更改操作
.:重复前一次操作
n.:重复前n次操作
末行模式:
地址定界
:start_line,end_line
#:指定的单个行
#,#:从左侧的#行开始,到右侧之间的所有行
#,+n:从左侧的#行开始向后加n行
.:当前行
$:最后一行
$-1:表示倒数第二行
%:表示全文,相当于1,$
/pat1/,/pat2/:第一次被pat1所匹配到的行到第一次被pat2所匹配到的行结束,之间的所有内容
#,/pat/:从指定的行开始到被第一次被pat匹配到的行结束,之间的所有内容
/pat/,#:从第一次被pat匹配到的行开始到第#行结束,之间的所有内容
后面可跟编辑命令:
d:删除
y:复制
w /PATH/TO/FILE:将范围内���行保存至指定文件中
r /PATH/TO/FILE:将指定文件的内容插入指定的所有行处
查找:
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:光标跳转至下一个被查找到的内容
N:与n相反
vim寄存器:
有26个命名寄存器和1个无命名寄存器,存放至不同剪切板中
a,b,...,z用"寄存器表示,存放在数字和命令之间
如:3"ayy表示复制3行达到a寄存器中
"ap:表示将a寄存器中的内容粘贴
编辑二进制文件:
vim -b BINFILE
扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
编辑二进制文件
扩展命令模式下,利用xxd命令转换回二进制
:%!xxd –r
多文件模式:
vim FILE1 FILE2 FILE3 ...
:next 下一个文件
:prev 上一个文件
:last 最后一个文件
:first 第一个文件
:wall 保存所有
:qall 不保存退出所有
:wqall 保存所有并退出
使用多窗口:
多文件分割
vim -o|O FILE1 FILE2 FILE3 ...
-o:水平分割
-O:垂直分割
在窗口间切换:Ctrl+w,左右箭头
单个文件:
Ctrl+w,s:水平分割
Ctrl+w,v:垂直分割
Ctrl+w,q:取消相邻窗口
Ctrl+w,o:取消全部窗口
:qall 退出所有
定义vim工作特性:
配置文件:永久有效
全局:/etc/vimrc
用户:~/.vimrc
扩展模式:当前vim进程有效
(1)行号
显示行号:set number可简写为set nu
取消行号:set nonumber可简写为set nonu
(2)括号成对匹配
匹配:set showmatch可简写为set sm
取消匹配:set noshowmatch可简写为set nosm
(3)自动缩进
缩进:set ai
取消:set noai
(4)高亮搜索
启用:set hlsearch
禁用:set nohlsearch
(5)语法高亮
启用:syntax on
禁用:syntax off
(6)忽略字符大小写
启用:set ic
禁用:set noic
(7)文件格式
启用:fileformat=unix
禁用:fileformat=dos
vim内置帮助
:help
vimtutor
练习:
1.复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符
47 HOSTNAME=`
/bin/hostname
2>
/dev/null
`
48 HISTSIZE=1000
49
if
[
"$HISTCONTROL"
=
"ignorespace"
] ;
then
50
export
HISTCONTROL=ignoreboth
51
else
52
export
HISTCONTROL=ignoredups
53
fi
54
55
export
PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
56
57
# By default, we want umask to get set. This sets it for login shell
58
# Current threshold for system reserved uid/gids is 200
59
# You could check uidgid reservation validity in
60
# /usr/share/doc/setup-*/uidgid file
61
if
[ $UID -gt 199 ] && [
"`id -gn`"
=
"`id -un`"
];
then
62
umask
002
63
else
64
umask
022
65
fi
66
67
for
i
in
/etc/profile
.d/*.sh ;
do
68
if
[ -r
"$i"
];
then
69
if
[
"${-#*i}"
!=
"$-"
];
then
70 .
"$i"
71
else
72 .
"$i"
>
/dev/null
2>&1
73
fi
74
fi
75
done
76
77
unset
i
78
unset
-f pathmunge
:%s@^[[:space:]]\+@@
2.复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号
949
# [ -z "$key" ] && plymouth --hide-splash
950
# /sbin/cryptsetup $params ${key:+-d $key} create "$dst" "$src" <&1 2>/dev/null && success || failure
951
# rc=$?
952
# [ -z "$key" ] && plymouth --show-splash
953
# fi
954
# if [ $rc -ne 0 ]; then
955
# ret=1
956
# continue
957
# fi
958
# if [ -b "/dev/mapper/$dst" ]; then
959
# if [ "$makeswap" = "yes" ]; then
960
# mkswap "/dev/mapper/$dst" 2>/dev/null >/dev/null
961
# fi
962
# if [ "$mke2fs" = "yes" ]; then
963
# if mke2fs "/dev/mapper/$dst" 2>/dev/null >/dev/null \
964
# && mdir=$(mktemp -d /tmp/mountXXXXXX); then
965
# mount "/dev/mapper/$dst" "$mdir" && chmod 1777 "$mdir"
966
# umount "$mdir"
967
# rmdir "$mdir"
968
# fi
969
# fi
970
# fi
971
# done < /etc/crypttab
972
# return $ret
973 }
974
975
# A sed expression to filter out the files that is_ignored_file recognizes
976 __sed_discard_ignored_files=
'/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
977
978
#if we have privileges lets log to kmsg, otherwise to stderr
979
if
strstr
"$(cat /proc/cmdline)"
"rc.debug"
;
then
980
# [ -w /dev/kmsg ] && exec 30>/dev/kmsg && BASH_XTRACEFD=30
981
# set -x
982
fi
:%s@^[[:space:]]\+@
#&@
3.如何设置tab缩进为4个字符?
在末行模式输入
set
ts=4即可
4.复制/etc/rc.d/init.d/functions文件至/tmp目录;替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
5.删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号