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:]]\+@#&@
作業題:
1.如何設置tab縮進為4個字符?
在末行模式輸入set ts=4即可
2.復制/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init為/var/log
3.刪除/tmp/functions文件中所有以#開頭,且#后面至少有一個空白字符的行的行首的#號
原創文章,作者:zhai796898,如若轉載,請注明出處:http://www.www58058.com/32859