摘要:大部分Linux開發者對vi命令至關熟悉,但是遺憾的是,大部分開發者都只能掌握一些最經常使用的Linux vi命令,下面介紹的10個vi命令雖然不少鮮爲人知,可是在實際應用中又能讓你大大提升效率。web
在使用vi 編輯器時—不管是初次使用的用戶,仍是有經驗的用戶—大多數人每每只掌握核心命令集,這些命令能夠執行最經常使用的功能:導航或保存文件;插入、更新、刪除或搜索數據;退出但不保存修改。正則表達式
可是,vi 編輯器極其強大,特性和功能很是豐富。即便在多年使用vi 以後,您仍然可能會發現有不知道的新命令。本文討論的命令就屬於不太爲人所知的命令,可是它們能夠簡化您目前採用的操做方法,讓您的工做方式更高效,或者 讓您可以完成原來不知道能夠用vi 完成的操做。shell
打開和關閉行號編程
vi 編輯器的許多選項能夠控制編輯會話的外觀和感受。使用 :set 命令修改vi 中的會話設置。按 Escape 鍵進入命令模式以後,可使用 :set all 命令顯示選項和設置的列表。能夠設置的選項之一是 number,它的做用是打開和關閉行號centos
#app
# Internet host table編程語言
#編輯器
::1 localhost函數
127.0.0.1 localhost loghost工具
192.168.0.6 centos5
192.168.0.10 appserv
192.168.0.11 webserv
192.168.0.12 test
192.168.0.5 solaris10 # Added by DHCP
~
~
~
:set number
這個vi命令 在當前編輯的文件中的每一個記錄上顯示行號。讓vi 進入命令模式以後,能夠輸入 :set number 並按回車來打開行號
#
# Internet host table
#
::1 localhost
127.0.0.1 localhost loghost
192.168.0.6 centos5
192.168.0.10 appserv
192.168.0.11 webserv
192.168.0.12 test
192.168.0.5 solaris10 # Added by DHCP
可使用 :set nonumber 命令關閉行號。還可使用這個命令和 :set number 命令的簡寫,即 :set nu 和 :set nonu。若是須要快速計算要用vi 函數處理的行數,顯示行號會很是有幫助。當行數不少,可能跨多個屏幕時,行號尤爲有用。另外,有時候您知道要處理的行範圍,可是須要查明要在vi 命令中使用的初始和結束行號。若是但願每次進入vi 會話時都顯示行號,那麼在主目錄中的.exrc 文件中添加 set number 行。
自動縮進
在用某些編程語言編寫代碼時,縮進是樣式的重要部分,能夠確保代碼的可讀性更好。若是須要,能夠在vi 編輯器中根據編程語言的樣式設置自動縮進。使用 autoindent 打開或關閉自動縮進.
#!/bin/ksh
#
#
for file in /etc/*
do
if [[ -f ${file} ]] ; then
echo 「${file} is a file」
~
~
~
~
~
:set autoindent
在此以後,若是在一行的開頭輸入空格或製表符,那麼後續的新行將會縮進到相同的位置。在命令模式下,輸入 :set autoindent,而後按回車打開自動縮進。經過設置 shiftwidth 肯定縮進級別。例如,:set shiftwidth=4 把每級縮進設置爲四個空格。
#!/bin/ksh
#
#
for file in /etc/*
do
if [[ -f ${file} ]] ; then
echo 「${file} is a file」
elif [[ -d ${file} ]] ; then
echo 「${file} is a directory」
fi
done
~
~
:set shiftwidth=4
在命令模式下,可使用>> 命令讓現有的一行增長一級縮進,使用<< 命令減小一級縮進。在這些命令前面加上一個整數,便可讓多行增長或減小一級縮進。例如,把遊標放在清單 4 中第 6 行的開頭,進入命令模式以後,輸入 5>> 就會讓下面五行增長一級縮進。
#!/bin/ksh
#
#
for file in /etc/*
do
if [[ -f ${file} ]] ; then
echo 「${file} is a file」
elif [[ -d ${file} ]] ; then
echo 「${file} is a directory」
fi
done
~
~
可使用 :set noautoindent 命令關閉自動縮進。還可使用這個命令和 autoindent 命令的簡寫,即 :set ai 和 :set noai。還可使用 :set ai sw=4 在一個命令中打開縮進並設置縮進級別。若是但願每次啓動vi 會話時都啓用自動縮進並把縮進級別設置爲四個空格,那麼在主目錄中的.exrc 文件中添加 set ai sw=4 行。
在搜索時不區分大小寫
如您所知,在 UNIX®中執行搜索時,模式匹配是區分大小寫的。可是,若是但願vi 不區分大小寫,那麼可使用 :set ignorecase 命令。使用 :set noignorecase 恢復區分大小寫。還可使用簡寫(:set ic 和 :set noic)。若是但願每次進入vi 會話時都啓用不區分大小寫的搜索,那麼在主目錄中的.exrc 文件中添加 set ignorecase 行。
複合搜索
在vi 中,可使用/命令搜索字符串,這須要以字面字符串或正則表達式的形式指定要匹配的模式。例如,要想在文件中搜索單詞 echo,只需進入命令模式,輸入/echo,而後按回車。這個命令會找到清單 6 所示文件的第 3 行的第一個單詞。
#!/bin/ksh
#
echo 「Starting」
file=${1}
echo ${file}
if [[ ${file} = 1 ]] ; then
((file=${file}+1))
echo 「Adding one gives 」 \
${file}
fi
echo 「Ending」
exit
可使用簡單的正則表達式指定尋找包含某一單詞並且後面有另外一個單詞的行。例如,要想尋找包含字符串 echo、後面有零個或更多字符、以後是字符串 file 的第一行,應該使用/echo.*file。在清單 6 所示的文件中,這個命令會找到第 6 行的第一個單詞。
可是,只有這兩個字符串出如今同一行上,這個命令才認爲是匹配的。若是但願搜索出如今另外一個模式或字符串後面的某個模式或字符串,無論這兩個模式或 字符串是否在同一行上,那麼能夠指定由分號(;)分隔的兩個搜索命令,從而執行復合搜索。例如,要想搜索出如今字符串{file}+1 後面的字符串 echo,應該使用/{file}+1/;/echo/。在清單 6 所示的文件中,這個命令會找到第 10 行的第一個單詞。複合搜索對於尋找代碼中出如今另外一個命令後面的某個命令尤爲有用—例如,在設置某個變量以後調用函數的地方。
重放搜索模式
當在文件中搜索要替換的模式時,可讓vi 把要匹配的任何模式保存在緩衝區中;而後,在執行替換時,能夠用緩衝區引用號重放它們。方法是把模式放在 \(和 \)之間,這會指示vi 把模式放在編號的緩衝區(1 到 9)中。在執行替換時,能夠用緩衝區引用號 \1 到 \9 引用這些緩衝區。
例如,假設要在清單 7 所示的文件中搜索以單詞 Martin 開頭的行並對每一個匹配添加前綴 Mr 和後綴 Wicks,那麼進入命令模式,輸入vi 命令 :%s/^\(Martin\)/Mr \1 Wicks/g,而後按回車。
Martin is an IT consultant. Martin likes
snowboarding and mountain biking. Martin has
worked on UNIX systems for over 15 years. Martin also
worked for many years before that on mainframes.
Martin lives in London.
~
~
~
~
:%s/^\(Martin\)/Mr \1 Wicks/g
下面把這個命令分解開解釋一下:
:%s —指示vi 執行替換。
/—模式分隔符。
^\(Martin\)—尋找以字符串 Martin 開頭的行並把這個字符串保存在緩衝區 1 中。
/—模式分隔符。
Mr \1 Wicks —把找到的字符串替換爲字符串 Mr,加上緩衝區 1 中的內容,再加上字符串 Wicks。
/—模式分隔符。
g —全局修改(即修改全部匹配的地方)
在搜索和替換字符串中均可以使用緩衝區引用。
Mr Martin Wicks is an IT consultant. Martin likes
snowboarding and mountain biking. Martin has
worked on UNIX systems for over 15 years. Martin also
worked for many years before that on mainframes.
Mr Martin Wicks lives in London.
~
~
~
~
:%s/^\(Martin\)/Mr \1 Wicks/g
書籤
可讓vi 在文件中的特定位置放上書籤。方法是按 Escape 鍵,再按 M 鍵,而後輸入另外一個表示書籤引用的字母表字符。所以,最多能夠有 26 個書籤,分別名爲 a 到z。要返回到上一書籤,按 Escape 鍵,再按反撇號(`),而後輸入書籤引用字符。
例如,按 Escape 以後按 M 和 A 鍵,就會把當前遊標位置保存在書籤 a 中。在編輯會話中,之後但願返回到這個遊標位置時,只需按 Escape,而後輸入 `A。可使用雙反撇號(「)命令在當前書籤和前一個書籤之間切換。
查找、更新、查找下一個、重複
在vi 編輯器中,最有用的搜索/替換特性之一是查找與某個模式匹配的字符串,更新它,而後繼續搜索下一個匹配的字符串,而後選擇是否以相同方式更新它。這與 Microsoft® Word 中的查找下一個/替換功能很類似。您可能已經知道能夠在vi 中搜索字符串模式,方法是進入命令模式,輸入/search_pattern(其中的 search_pattern 是字符串或正則表達式),而後按回車。這樣作就會找到與指定的模式匹配的第一個字符串。在此以後,能夠在找到的文本上執行任何操做。例如,按 Escape,再按 C 和 W 鍵,再輸入更多文本,就會把找到的字符串替換爲另外一個單詞。
要想快速地找到與模式匹配的下一個地方,應該按 Escape,而後按 N 鍵。在找到下一個匹配時,可使用點號鍵(.)在這個位置重複最近的文本操做,好比前一個示例中使用的修改單詞(cw)操做。而後,可使用這些鍵繼續尋 找其餘匹配(n)並選擇重複文本操做(.),操做方式與使用 Word 中的查找下一個/替換功能很類似。
切換大小寫
在vi 中,能夠切換遊標下的字母字符的大小寫,方法是按 Escape,而後按波浪號鍵(~)。這會在小寫和大寫之間來回切換。按着這個鍵,移動遊標通過行中的每一個字符,就會切換遇到的每一個字母字符的大小寫。可 以在波浪號前面輸入一個數字,表示但願改變多少個字母字符的大小寫。
篩選
您可能知道,在vi 中按 Escape,輸入 :!command(其中的 command 是要執行的 UNIX 命令),而後按回車,就能夠在 shell 中執行命令。例如,:!pwd 顯示編輯會話當前的工做目錄。
可是,還能夠把文件的一部分做爲標準輸入發送給 UNIX 命令,並用產生的輸出替換編輯緩衝區中的相同部分。例如,若是但願在vi 會話內對清單 9 所示的整個文件進行排序,能夠按 Escape,輸入 :1,$!sort 並按回車,這讓vi 把從第一行到文件末尾($)的全部內容傳遞給 sort 命令,用輸出替換指定的部分。
另外,還能夠在 shell 命令前面加上從當前遊標位置開始但願操做的行數。方法是按 Escape,而後輸入指定行數的數字,而後輸入兩個驚歎號(!!),最後輸入 UNIX 命令。
可使用管道分隔符(|)把 UNIX 命令鏈接在一塊兒,從而在vi 會話中執行復雜強大的篩選。例如,假設要把當前vi 會話的編輯緩衝區中的文件內容替換爲每行的第一個空格分隔的字段,按升序排序並轉換爲大寫,那麼在按 Escape 以後輸入:
:1,$!awk ‘{print $1}’ | sort | tr [:lower:] [:upper:]
保存部份內容
能夠保存當前編輯的文件的部份內容,方法是按 Escape,而後輸入 :start,endw file,其中的 start 是當前文件中要保存的第一行,end 是要保存的最後一行,w表示但願寫到另外一個文件中(或者覆蓋現有的文件),file 是指定的部分要保存到的文件。對於最後一行,可使用$表示文件的末尾。能夠在w後面使用兩個大於號(>>)表示但願把內容附加到文件中而不 是覆蓋文件。清單 12 中的示例把第 6 到第 9 行(含)附加到文件/tmp/newfile 中。
#
# Internet host table
#
::1 localhost
127.0.0.1 localhost loghost
192.168.0.6 centos5
192.168.0.10 appserv
192.168.0.11 webserv
192.168.0.12 test
192.168.0.5 solaris10 # Added by DHCP
~
~
~
:6,9w >> /tmp/newfile
結束語
vi 編輯器是一個極其強大的工具,本文提供了一些技巧和訣竅,但願可以幫助您更高效地編輯文件。請記住,vi 還有更多不太爲人所知的特性。祝工做愉快!
轉載請註明:編程文庫 » 10個你必須掌握的超酷VI命令技巧