【譯】學習vi編輯器——第一章vi編輯器

第一部分  vi基礎以及高級技巧

第一部分是爲你快速上手vi編輯器而設置的,並且提供令你工作效率倍增的高級技巧。這些章節涵蓋了vi源起,核心vi,並提供在任何版本可用的vi命令。後面的章節介紹流行的vi克隆版本。本部分包括下面的章節:
 
第一章, vi 編輯器
第二章,簡單編輯
第三章,快速移動
第四章,基礎之外
第五章,ex編輯器介紹
第六章,全局替換
第七章,高級編輯技巧
第八章,vi的克隆版本
 

第一章    vi 編輯器

 
unix中有許多的編輯器可以處理文本內容,無論這些文件包含數據,源代碼,還是句子。有些是行編輯器,例如ed和ex編輯器,它們顯示一行的文件內容到屏幕上;有些是屏幕編輯器,例如vi和emacs,可以再你的終端屏幕上顯示一部分文件內容。基於X Window系統的編輯器也普遍可用,並且變得愈發流行起來。GNU emacs和它的衍生物XEmacs,提供多個X 窗口。兩個很有趣的選擇是來自貝爾實驗室的sam 和 Acme 編輯器。Vim也提供基於X Window的界面。
 
vi是你係統上最有用的文檔標準編輯器之一。(vi是visual editor的縮寫,發音爲vee-eye,見圖1-1.)不像Emacs,vi在unix系統上是幾乎完全相同的形式出現,因此提供了許多文字編輯語言。你也許會說ed和ex也一樣,但是屏幕編輯器一般來講更加易用。(其實行編輯器幾乎沒人在用了。)有了一個屏幕編輯器,你可以上下滾動頁面,移動光標刪除行,插入字符等等許多操作,同時也可以立即可見結果。屏幕編輯器非常地受歡迎,因爲它們允許你瀏覽和修改文件內容,假如你想編輯一個打印頁,你會非常迅速完成任務。
 
許多新人,vi用起來很直觀但笨拙,而不是用特殊的控制鍵來完成字處理且一直在正常地打字,它幾乎使用了所有的常規按鍵來組織命令。當鍵盤用作組成命令時,vi就進入了命令模式。你必須要在插入模式中才能打出文字到文檔中。另外,vi其實有很多的命令,多乎哉不多也(哇咔咔偷笑)
 
圖1-1 [待整理]
 
只要你一開始學習,你就會認識到vi是一個設計優良的編輯器。你可以只用幾個按鍵就可以讓vi完成複雜的任務。你學習vi,就是學習完成各種工作的快捷鍵,它們傳達給vi完成各種計算。vi不是一個所見即所得的編輯器,如果你想寫出格式化文檔,你必須敲出控制其他程序顯示方式的輸出格式的代碼。如果你想要段落縮進,比如說,你放了一段代碼在縮進的起始和終止處。格式化代碼允許你測試或者修改打印的樣式,並且從許多方面來講,它給你許多控制文本表現方式的自由。unix支持troff格式的包,the TeX和Latex格式非常流行,也是可選的。vi 支持一些簡單的格式化機制,例如,當到達行尾的時候,你可以讓它自動纏繞。或者自動縮進。此外vim7提供自動拼寫檢查。
 
就像所有的技巧一樣,練得越多,基礎就變得越簡單了,熟能生巧嘛。當你掌握了強大的vi力量的時候,你就很難回到那些“簡單”的編輯器了。
 
什麼纔是編輯器的組成部件呢?首先,你可以插入文本;其次可以刪除文本,當然也不需能修改文本。你或許會想將文本從一處移向另外一處。有時,你也會想要將文本複製然後黏貼到各個地方。不像許多其他字處理軟件,vi的命令模式纔是常規模式。往復雜地說,交互式的編輯器可以用幾個鍵就能進行。你可以敲進幾個非常簡單的“插入”命令,然後繼續打字。
 
一個或者兩個字符被用來作爲基本的插入命令,例如:
i  插入
cw  編輯單詞
 
把字母當命令來用,你可以快速地編輯文件了。你不用去記住一大堆的功能鍵或者把你的手指移動到處尋找組合鍵了。當然你也可以再也不用鼠標了,你完全可以手不離開鍵盤了(很酷吧),也不用去擺弄一些菜單了。很多的命令都可以輕鬆地記住,幾乎所有的命令都用簡單的模式並且相互關聯。
 
一般來說,vi命令:
1、 大小寫敏感 大寫和小寫是不同的例如 G和g是不同的
2、不會被輸出,也就是說你看不到你輸入的命令
3、不用在命令結束按下enter鍵,因爲當你按下的時候,它已經起作用了
 
當然也有一組的命令用來在屏幕底部輸入。底部命令以不同的標號開頭。斜槓號“/”和問號“?”是查找命令的開頭,我們將會在第三章詳細討論。一個冒號“:”是所有的ex命令的開頭。ex命令是用來進行ex行編輯的命令。當你使用vi的時候,ex命令是可用的,因爲ex是vi的底層,只不過vi是ex的可視化形式而已。ex命令和概念會在第五章討論,但是本章介紹一個退出編輯文件的命令":q"。
 
【一個歷史的透視】
 
在進入vi的世界之前,需要了解你的環境這樣會幫助你理解vi的世界觀。特別是能讓你理解vi,而不是得到一些莫名其妙的錯誤,當然也能瞭解vi的克隆版本在vi之上的改進。
 
vi的歷史應該追溯到程序員們在計算機終端上工作時,好幾百個不同的終端在同時使用。每個終端都做同樣的事情(清屏,移動鼠標等等),但是完成這些操作的命令卻是不同的。除此之外,unix系統讓你可以選擇一些字符作爲退格鍵,然後產生一箇中斷信號,還有其他的命令在終端非常有用,就像那些吊起或者恢復輸出。這些在stty(終端)努力的舉措仍然在繼續。
 
原始的UCB版本的vi將終端的控制信息抽象出來,將它們從代碼變成一個終端文本文件類型的數據庫。這個數據庫由termcap管理着。在1980年代系統V推薦了一個二進制終端信息數據庫以及終端信息庫。兩個庫很大程度上在功能上是等價的。爲了告訴vi編輯器哪個是你的終端,你需要設置好TERM環境變量。這類工作一般在shell啓動文件中已經完成了,例如.profile或者.login就是這類文件。
 
如今,每個人都使用圖形界面下的終端模擬器(例如xterm)。系統很可能在設置TERM的時候照顧你。(你依然可以在沒有圖形界面的終端使用vi,當然這在單用戶環境下做系統恢復工作時很有用,當然也沒有人想在這樣的環境下使用它)。在日常的使用中,你很大可能會選用一個圖形界面vi 編輯器,例如vim編輯器或者其他拷貝版本。在windows或者mac系統中,圖形界面的vi是默認的,然而,當使用圖形終端模擬器的時候,還是會使TERM和termcap或者terminfo的信息且同樣和stty設置密切相關。使用時,相比其他環境,vi運行在終端模擬器提供了一條比較省力的路徑。
 
另一個需要知道的事實是vi是在unix系統被認爲還不如今天這樣穩定的時候。過去的vi用戶要隨時防備計算機突然崩潰。所以vi編輯器包含了恢復所編輯文件的支持,如果編輯中間發生了錯誤導致停機了,則可以恢復。因而當你學習vi編輯器的時候,如果出現了問題,記住這個歷史記錄的工具。
 
【打開和關閉文件】
 
你可以用vi來編輯任何文本文件,vi把待編輯文件拷貝到一個緩衝區(一片內存空間),然後顯示該緩衝區到屏幕上(這也是爲啥你只能每次看到一屏的緣由)。然後你可以 增、刪、查、改。當你保存文件的時候,vi把緩衝區的內容拷貝到一個臨時文件中,並且以原文件的名稱替換之前的文件。記住你永遠在編輯一份源文件的拷貝,你的編輯不會改變原文件,直到你保存修改爲止。保存也叫做“保存緩衝區”或者更通俗地講“保存文件”。
 
【打開文件】
 
$vi [filename]
 
上面這條命令在unix系統中,是調用了vi編輯器,然後可以編輯原有文件或者新建一個文件。語法如上所示。
中括號表明filename是可選的,中括號本身不用敲出來。美元符號是unix系統的命令提示符,舉一個例子:
打開一個叫做test.txt的文件
 
$vi test.txt 立馬可以打開test.txt文件
 
$vi newfile.txt 生成一個新文件,名字叫做newfile.txt
 
也可以什麼都不寫,直接$vi進入編輯器,編輯完後,可以爲文件命名。現在,讓我們用命令行來爲文件命名。
 
一個文件名必須要是在該目錄下唯一的,一個文件名可以包括任何字符除了斜槓(/),因爲斜槓是保留字符,被用來作爲路徑的分界符。在ASC2 NUL,是所有位全爲0的字符。你甚至可以在文件名中包含空格,只要打一個反斜槓“\”在空格前就可以了。在練習中,文件名可由大小寫字母、數字、下劃線、點符號隨意組合而成。請記住unix是大小寫敏感的:大寫和小學字母是不同的。另外,你還要按下 【Enter】鍵告訴Unix你完成$vi [filename]的命令。
 
當你想要打開一個目錄下的某個新文件時,通過vi命令給你的文件一個新名字,這樣就生成了一個新的文本文件了。例如,如果你想創建一個叫做 practice的文件,那麼只需:
$vi practice 
因爲這是一個新文件,緩衝區是空的,所以屏幕顯示如下:
~
~
~
~
"practice"  [New file]
 
每一行前面的波浪號表示改行沒有任何文本,甚至連空格都沒有。最下面的提示行,或者說是狀態行,會顯示文件的名稱和當前狀態,現在可看到該文件是一個新創立的文件。
 
你可以編輯任何當前目錄下存在的文件,只需要輸入其文件名。假設unix下有一個文件的路徑名是/home/john/letter 如果你在/home/john目錄下
那麼直接使用相對路徑,如下:
$vi letter
將會產生一份拷貝,並顯示到屏幕上。
如果你在別的目錄下,那麼只需要給出全路徑名就可以開始編輯了:
$vi /home/john/letter
【打開文件可能碰到的問題】
*當你調用vi,消息[open mod]將會顯示出來。
你的終端沒有正確的鑑定,立刻用:q命令退出編輯會話。檢查你的環境變量$TERM。它應該設置成爲你的終端名稱。或者叫你的系統管理員提供可行的終端類型設置。
 
*你看到了如下的任何一條信息:
 
Visual needs addressable cursor or upline capability
Bad termcap entry
Termcap entry too long
terminal: Unknow terminal type
Block device required
Not a typewriter
你的終端要麼未定義,或者你的terminfo或termcap入口出了什麼問題。按下 :q命令退出。檢查你的$TERM環境變量,或者問你的管理員爲你提供一個終端環境。
 
*一個[New file]信息顯示,但你認爲這是一個早已存在的文件
首先檢查你的文件名拼寫和大小寫是否有誤,如果沒有,那麼看看你是否進錯了目錄。按下:q命令退出。然後檢查你是否在正確的目錄下,如果你在正確的目錄下,檢查你的文件列表(使用ls命令)看看是否有存在不易察覺的文件名相似。
 
*你調用了vi,但是你看到的是一個冒號,意味着你正在ex行編輯器模式下
你可能是在vi命令前面打了一箇中斷,在vi繪製屏幕之前發生了。沒關係,在ex的提示後面(:)按下vi命令。
 
*如果看到了下面的信息:
[read only]
File is read only
Permission denied
read only意味着你只能瀏覽文件,而不能編輯。你不能保存任何的修改到文件中,你可能用vi的view模式打開文件(vi -R),或者你沒有寫該文件的權限。查看第十頁的“保存文件的錯誤”一節。
 
*出現如下信息:
Bad file number
Block special file
Character specail file
Directory
Executable
Non-ascii file
file non-ASCII
你所調用編輯的文件不是一個常規的文本文件,退出編輯( 用命令:q! ),然後檢查你要編輯的文件,可以使用file命令。
 
*當你打:q命令想要退出的時候,下面的信息出現了:
No write since last change (:quit! overrides).
你可能不經意間修改了文件,按下:q!離開編輯,你的修改將不會保存到文件。
 
【模式手法】
之前提過,當前模式就是vi工作的基本原理。vi有兩個狀態,命令模式和插入模式。你一開始進入vi的時候是命令模式,任何一個鍵都是命令。在插入模式,你敲打的任何字符都會插入到你的文件裏。
 
通常,你可以立即進入插入模式,或者離開插入模式。在其他情況下,你按下的鍵使得你的文件修改了,並且這種修改時你不想要的。
 
按下 ESC 鍵可以強制vi從插入模式退出到命令模式,如果你早已在命令模式下,那麼如果你按下ESC,可以聽到系統發出的beep聲音。這也是爲什麼命令模式被叫做 beep模式。
 
當你安全到達命令模式的時候,你可以修復一些意外的修改,然後繼續你的編輯。
 
【保存後退出文件】
你可以隨時退出你的作業,保存你的文件,然後返回到unix的命令行。vi編輯器的保存並退出命令是ZZ,兩個Z都是大寫的。
 
讓我們假設你創建了一個叫做practice的文件,然後你在裏面輸入了6行。要保存文件,首先要確保你在命令模式下,如果不是,按下ESC鍵回到命令模式。然後輸入ZZ命令。
 
 
你也可以用ex的命令,輸入:w可以保存文件,但是還沒退出,輸入:q可以直接退出。輸入:wq可以保存後退出。(:wq等價於ZZ)我們將會在後面第五章詳細講解怎樣使用ex命令,現在,你只需要記住幾個保存文件的命令就可以了。
 
 
【不保存直接退出】
當你初次學習vi編輯器,特別是如果你初生牛犢不怕虎,有兩個非常趁手的ex命令,可以讓你免受各種亂七八糟的修改(當然這是你做的)。如果你想要擦掉所有的編輯,不保存你做的任何修改的話,下面的命令:
:e! ENTER鍵
將你帶回最後一次保存的狀態,然後你可以重新開始
 
如果你只是想要回到最初始的狀態,那麼直接退出不保存就行了:
:q!  ENTER鍵 強制退出
退出後將回到unix的命令提示,用了這些命令,你就可以忽略在buffer中的修改,回到你最後一次保存的狀態。vi一般不會讓你丟失修改,但是這兩個命令可以讓你突破禁令,儘管緩衝區被修改了。
 
【保存文件存在的問題】
 
* 你試圖寫文件,但是你得到下面的消息:
File exists
File file exists -use w!
[Existing file]
File is read only
輸入:w! 文件名 可以覆蓋已存在文件,或者可以:w 新文件名 把文件內容保存到一個新的文件中。
 
* 你想寫文件,但是你沒有寫的權限。你會得到這類的信息“Permission denied.”
 
用:w 新文件名 把內容寫入到一個新文件中,如果你有該目錄的寫權限,那麼可以用mv命令將原有文件移除,然後用你的文件覆蓋原文件。如果你沒有該目錄的寫權限,那麼使用:w 路徑名/文件名 將你的文件寫入到你有寫權限的文件中去(例如你的home目錄,或者根目錄下的/tmp目錄)。
 
* 你試圖寫文件,但系統提示你文件系統已滿。
 
可以輸入 :!rm 垃圾文件名 來刪除不需要的垃圾文件以騰出空間(以!開頭的ex命令表示讓終端命令行執行一個unix/linux命令,在vi中輸入:!ls和在unix終端輸入 ls的效果是一樣的)。 或者,你可以輸入 :!df 來看看別的文件系統有沒有剩餘的可用空間。如果有,那麼恭喜你,可用選擇一個目錄把你的文件寫入到文件中:w 路徑名 (df是unix系統上查看磁盤空餘空間的命令 df = Disk's Free space)。
 
* 系統把你置於開放模式下,並告訴你文件系統滿了
 
可能vi編輯下的目錄所在的磁盤已經滿了,輸入:!ls /tmp 看看臨時空間裏有什麼可以刪除的以獲取空間。如果有,創建一個臨時的unix shell,然後輸入一些命令完成文件的組織工作。你可以用:sh命令來創建一個shell,按下 CTRL+D 或者輸入 exit 來退出shell回到vi編輯器中。(在現代unix操作系統中,你可以使用工作控制shell,簡單地按下CTRL+Z就可以掛起vi編輯器的進程,然後回到unix的提示命令行。輸入fg返回vi)當你釋放了一些空間的時候,使用:w!命令寫入文件。
 
* 你試圖寫文件,但是你發現磁盤共享已經被鎖了
 
用ex的:pre命令(:preserve的縮寫)強制你的系統保存你的文件,如果無效,那麼移除一些文件,如果你正在使用一個作業控制器,使用:sh 或者 CTRL+Z,進入shell移除一些文件,按下CTRL+D(或者fg)來返回vi編輯器。然後用:w!寫文件 。
 
【練習】
 
學習vi的唯一方法就是練習,你現在應該明白了怎樣創建一個新文件然後回到unix提示命令行。創建一個叫做practice的文件,插入一些文字,然後保存然後退出編輯。
 
打開一個叫做practice的文件        vi practice
插入文本                     按下 i  然後輸入你想插入的文本
返回到命令模式     ESC鍵
退出vi,保存文件             ZZ
translated by bibodeng 《learning the vi and vim editors》   2012-09-07   有誤之處還請多指教討論 bibodeng think beyond
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章