vi 命令常見問題解答(轉)
vi 命令常見問題解答(轉)[@more@]作者:譯者Elale [vi-faq中文版] 0.0 - 引言 -- 我怎樣用這個FAQ 這個文件分為了幾個部分.首先,第0節和第1節介紹了什麼是vi;第2節則收錄了很多新 學者的問題,一些對vi沒有很多經驗的人也經常問這些問題.這裡麵包括諸如“命令模式和插入 模式之間的區別”,以及“我怎樣複製和貼上”之類的問題.第3節是面向vi的中級使用者的,它從 問題“我如何查詢和替換”開始,逐步深入,直到對vi裡面的宏(Macro)的用法討論為止.第3 節還包括了一個vi的快速參考,有一個規範的vi命令列表.再下面,是一個有關“:set”命令的 列表,包含了所有能定製vi環境的變數,這些變數也可以在.exrc檔案中定義. 我們已經在一個執行SunOS和UCB版本vi的機器上驗證了快速參考.除了SunOS帶的vi外, 每個命令都可以在系統V和UCB版本vi執行,但是我個人並沒有驗證這一點. 除非我們在文件中指明,預設我們假定你處在命令模式下. 我們還嘗試保留儘可能多的術語,因為在原始的vi文件中使用了這些術語,儘管我可能 忘了它的本來含義. 0.1 - 索引 第一個檔案: 0.0 - 引言 -- 我怎樣用這個FAQ? 0.1 - 索引 0.2 - 我可以散發這個FAQ嗎? 0.3 - 你能為這個FAQ做什麼? 1.0 - 什麼是vi? 1.1 - 關於vi有什麼重大的交易嗎? 為什麼大家都用它? 更進一步說,為什麼我要用它? 1.2 - 噢! 這聽起來不錯! 有沒有理由不用vi? 1.3 - vi能在多少不同的作業系統下面執行? 1.4 - 好吧, 你說服了我. 我決定開始使用vi. 我該從哪兒開始? 1.5 - vi有其他一些可用的變種嗎? 2.0 - vi入門 2.1 - 有什麼遊戲幫助我們學習vi嗎? 2.2 - 命令模式和插入模式有什麼區別? 2.3 - 等等,我的鍵盤沒有鍵,我該怎麼辦? 2.4 - 那些~s是什麼東西? 2.5 - 我無法習慣用 hjkl, 你有什麼建議嗎? 2.6 - 我如何才能不存檔就退出? 2.7 - 我怎樣插入一個檔案? 2.8 - 我怎樣查詢文字? 2.9 - 我怎樣搜尋一個控制序列? 2.10 - 我怎樣重新格式化文字? 2.11 - 我怎樣複製文字? 2.12 - 啊! 我剛才敲了一個dG,然後我的論文就沒有了! 我該怎麼辦? (或者,我剛才犯了個錯誤,我該怎麼辦?) 2.13 - 我正在寫我的論文,被告知我必須將每一節都放在不同的檔案裡,我該怎麼辦? 2.14 - 所有的:命令都是怎樣處理的? 3.0 - 怎樣查詢和替換? 3.1 - 我怎樣在vi中執行一個程式? 3.2 - 啊! 我正在寫我的論文, 系統崩潰了! 怎麼辦? 3.3 - 有沒有使vi對程式設計師更友好的竅門? 3.4 - 宏 -- 我怎樣寫宏? 3.5 - 我怎樣將一個功能鍵定義成一個宏? 3.6 - 有沒有辦法縮寫文字? 3.7 - 我怎樣在當前文件中做拼寫檢查? 3.8 - 我手頭有一個硬複製的終端, 我還能用vi嗎? 3.9 - 好了,是不是處在開放模式下的原因呀?! 但是我現在沒有用硬複製終端,它還是在 開放模式呀? 第二個檔案: 4.0 - vi檔案的線上幫助在哪兒? 5.0 - 好玩的vi訣竅,無聊的宏 5.1 - 好玩的vi訣竅 5.2 - 好玩的宏 6.0 - 依字母順序的vi快速參考 6.1 - 命令模式的輸入選項(:命令) 6.2 - 設定選項(set) 7.0 - 建立 .exrc檔案 7.1 - .exrc檔案的樣本 8.0 - vi的漏洞 9.0 - 術語表 10.0 - 關於vi的參考書目 0.2 - 我可以散發這個FAQ嗎? 可以!只要你沒有對它做任何修改,或者用它來賺錢. 0.3 - 你能為這個FAQ做什麼? 首先, 把你發現的錯誤告訴我. 如果你有什麼建議我們也很歡迎. 你認為還不清楚的地方 告訴我們,我們同樣歡迎. 還有, 使用vi! (Spread the word) 我很抱歉我無法將所有對這個FAQ有貢獻的人都列出 來, 因為許許多多的人都給過我建議和幫助,如果我將他們都列出來的話,那麼恐怕這張貢獻 者的清單將和這個文件本身一樣長了. 1.0 - 什麼是vi? vi是個視覺化的編輯器(vi就意味著視覺化--VIsual). 那麼,什麼是視覺化的編輯器呢? (相對於非視覺化的編輯器來說)?視覺化的編輯器就是可以讓你在編輯文字的時候看到它們. 今天,這聽起來似乎非常普通,反之,非視覺化的編輯器似乎很奇怪. 非視覺化的編輯器的例子 可以舉出不少:如ed, sed和edlin(直到相當近的一段時間內,它是DOS自帶的最後一個編輯器) 等. vi是威廉.僑伊寫的,作為BSD UNIX的一部分. 後來AT&T也開始用vi, 於是標準UNIX也開始 用vi了. 1.1 - 關於vi有什麼重大的交易嗎? 為什麼大家都用它? 更進一步說,為什麼我要用它? vi是UNIX下面的預設編輯器, 因此幾乎近來所有的UNIX都捆綁了vi(近來是指1984年左右). 這意味著無論何時你跨平臺使用某種UNIX,你都知道在你指尖下面有一個強力的編輯器.為什麼 不是別的呢? vi是個強大的編輯器.同樣,一旦你瞭解了vi,你就能很快的編輯你的檔案,因為它 非常能節省你的敲鍵次數. 由於它在插入和命令兩種情況下使用不同的模式,它比大多數的不 基於這種模式的編輯器要快. 而且,vi非常小(我機器上面的版本只有200K).還有,vi幾乎能做 任何事,只要你知道如何使它做你想做的事. 1.2 - 噢! 這聽起來不錯! 有沒有理由不用vi? 有. 有一個非常好的理由: vi稍微有些難學, 如果你開始學的話,vi又慢又讓人痛苦, 當然,一旦你學會了, vi就快多了. 但是學習的過程很慢. 有人曾經問我, 如果vi是個比較 易學的編輯器, 它是否直觀(intuitive)呢? 我一般這樣回答:"是的,我們有些人是這樣認為. 但是大多數人認為我們瘋了." 1.3 - vi能在多少不同的作業系統下面執行? UNIX. 就是它. 儘管如此,還是有很多vi的變種執行在不同的作業系統上. 我就在以下一些 作業系統上用過vi: UNIX, DOS, OS/2, MAC SYSTEM 7.(後面有一個有關細節的列表) 1.4 - 好吧, 你說服了我. 我決定開始使用vi. 我該從哪兒開始? 好吧, 狡猾的傢伙. 關於vi有很多很好的書:大多數講UNIX的書至少有一章給了vi,而且 有不少是專門講vi的書.我沒有什麼偏愛. 所以你最好是問問你們那兒的vi高手們他們是從 哪兒學來的. 還有,到處試. 用vi開啟一個不重要的文件(你的論文不象是個學vi的好實驗品), 然後再到處試. 我無法想象有人學習vi卻不花相當多的時間去到處試試. 記住:如果你有些 地方不明白了, 只要敲兩次鍵,你就又回到命令模式下了. 我要提到的一點是,我想在這裡提比較合適,就是如果要成為系統管理員或者其他對UNIX配置 做什麼修改的話,最好是學學ed或者ex,因為有些版本的UNIX沒有把vi放在根分割槽裡面,這樣你 就可能無計可施了. ed是個不錯的選擇. 1.5 - vi有其他一些可用的變種嗎? 只能列出一部分:STvi (STevie), elvis, vile, vim, 和nvi, xvi. elvis適用於:Amiga, DOS, OS/2, Unix, VMS, Atari. STevie適用於: Atari ST, DOS, Unix, Mac System 7. Mac System 7可以在很多info-mac的鏡象站點獲取,在/info-mac/text下. (例如ftp.hawaii.edu) nvi是將和BSD 4.4捆綁在一起的vi. vim適用於: Amiga, DOS, Mac System 7, Unix. Amiga, DOS,和原始碼可以在以下站點換取:ftp.fu-berlin.de /misc/editors/vim Mac System 7可以在很多info-mac的鏡象站點獲取,在/info-mac/text下. (例如ftp.hawaii.edu) vile適用於: DOS, OS/2, Unix, VMS. xvi適用於: DOS, Unix. vi的變種之間很有很多差異.很多都改進了vi,大多數都可以使用在這個文件 種列出的命令,但是有一些不同的地方.更進一步的細節,你可以參考這些變種 附帶的相應的文件. 2.0 - vi入門 對vi的初學者來說,有些基本的提示.第一,任何時候,手頭都要有一份命令摘要. 我們將在後面給出一個快速參考/命令摘要. 第二, 找一本vi方面的比較好的書. 這個文件不是學vi的最佳途徑(最起碼現在還不是),我不敢保證這個文件能教會一個 對vi一無所知的人, 而很多書已經做到了這一點. 但是,我們這裡還是給出了不少 提示. 對選擇書籍來說,有一個標準的原則:買之前一定要仔細閱讀. 要了解這本書 對你是否有意義.確信它能在你練習vi的時候有用. 和其他的書做個比較 -- 不管怎樣, vi可能讓你感到非常莫名其妙, 而且你要確信這麼一點:是書讓你糊塗,而不是 你低估了學vi的難度. 還有, 找一些諸如"學vi"(vilearn),"vi嚮導"(vitutor)之類的軟體來幫助你掌握 vi的基本知識. 2.1 - 有什麼遊戲幫助我們學習vi嗎? 這似乎很無聊, 但是事實上UNIX系統裡面有不少遊戲可以幫助你學習使用vi.這些幫助 主要是一些基本知識. 雖然我還不知道有哪個遊戲可以幫你學習vi的所有命令, 但我 確實知道有一些可以幫助你學習使用 hjkl來移動游標. NetHack,一個類Rogue的遊戲, 就對這非常有幫助. 而且它是一個很大的遊戲,能玩很長一段時間. 我沒有貶低其他遊戲 的意思,這些遊戲是: rogue, moria, omega, worm, snake. 2.2 - 命令模式和插入模式有什麼區別? vi將命令模式和插入模式區分開來,這經常被認為是vi的一個大問題,但往往這也被認為是 vi的優勢所在. 理解其中的區別是掌握vi的關鍵.vi啟動時,開始處於命令模式;在這種模式 下,我們可以在檔案中到處移動,改變文字的某個特定區域, 剪下, 複製和貼上文字,還有更 多. 插入模式是指使用者可以真正插入文字.換句話說,命令模式是用來在檔案中移動,而插入 模式是用來在檔案中鍵入文字. 有些命令,例如: a, i, c, C, O, o和其他一些可以從命令模式切換到插入模式. 鍵或者^C(CRTL+C)可以脫離插入模式而返回到命令模式. 你要適應這種差別. 它使得vi區別於其他的編輯器. 它也使你能在你的手不離開標準 鍵盤做很多事情. 2.3 - 等等,我的鍵盤沒有鍵,我該怎麼辦? 試試敲 ^[(CTRL+[). 如果你的鍵盤有一個鍵,再試試它.如果還不行,再試試^3. 2.4 - 那些~s是什麼東西? 它們僅僅是用來讓你知道你的文件末尾在哪兒.實際上它們並不在你的文件裡面,所以 你用不著擔心它們. 2.5 - 我無法習慣用 hjkl, 你有什麼建議嗎? 首先,如果你的終端設定正確而且你連線的也沒有問題的話,你可以使用箭頭鍵.但是, 如果你認為你要經常使用vi,那麼最好是習慣使用 hjkl,因為它們敲起來更快. 而且, 有時候連線出問題了,使得ESC序列都可能丟失了.(這樣你可能就無法使用箭頭鍵了--譯註) 2.6 - 我如何才能不存檔就退出? :q!可以做到這一點. 如果vi看起來凍住了,確信你沒有錯敲了個 ^S. 敲^Q可以解開^S. 2.7 - 我怎樣插入一個檔案? :r 例如,要插入檔案/etc/motd, 可以敲 :r /etc/motd. 這將把檔案插入到游標處.如果你在r前面指定了一個數字,那麼這條命令將把檔案插入 到那個位置. 2.8 - 我怎樣查詢文字? /將向前查詢, ?將向後查詢. ??或者//將重複上次查詢. 在UNIX下,這已經 是個可愛的標準用法了. 而且, 在vi中, n將查詢文字下一次的出現位置. N重複上次查詢, 不過逆轉了查詢的方向. 在查詢中可以使用規正規化. 2.9 - 我怎樣搜尋一個控制序列? /^V^ ^V會告訴vi照字面理解下一個字元,不要把它看作是一條命令. 2.10 - 我怎樣重新格式化文字? 如果你的計算機有一個名叫fmt的程式, 你要做的僅僅是在命令模式下面敲!}fmt(記住, 不要在前面加. 這可以重新格式化你的檔案,從游標所在的位置一直到當前段落的結尾. 如果你的機器裡面沒有fmt這個程式, 你就得去找個類似的軟體了(我記得在公共域裡面有 不少這樣的程式,但是我對此瞭解不多) 2.11 - 我怎樣複製文字? 這有點複雜.把這節拿出來,多看幾遍;還有,一定要多做實驗. "yy可以把一行文字複製到暫存器中(這裡的暫存器是vi的術語,指可以存放剪下和 複製下來的東西的地方), 裡面的字母必須是a到z之間的一個. "dd可以把一行 剪下下來放到暫存器裡面. 你可以在yy或者dd前面用數字指明要複製或者剪下的行數.如果 中的字母是大寫的話,意味著把文字插入到暫存器中已有的文字之前. "p把文字插入到游標之後,"P把文字插入到游標之前.如果暫存器中含有某 一行的開頭或結尾,這一行將會被放到另一合適的行上. Y是yy的快捷方式. 還有, y$, yH, yM,等等,都是可以用的.d命令也是一樣的.如果要快速的剪下和貼上, 你就無須指定暫存器 了.如果這樣的話,你就不能往暫存器裡面新增文字了.而且只要有一個刪除命令的話,暫存器 中的東西就沒有了(包括x命令). 舉例來說,如果要移動上一段的話,你可以把游標移到段落的開頭,敲"a13dd,再把游標移到 你想要放文字的地方,敲"ap,就可以把那段文字放到游標所在的行後面. 現在,大概你想要剪下和貼上文字到不是行末尾的區域去.我們來看如何做到這一點:我們 可以使用 m 命令來標記一個區域,這個字母可以和剪下/貼上暫存器的字母相同,因為 它們是儲存在記憶體中的不同位置. 然後,敲"`[yy或者dd], 這裡的暫存器就是 要儲存文字的那個暫存器,是用來標記的,yy和dd是你的操作. 2.12 - 啊! 我剛才敲了一個dG,然後我的論文就沒有了! 我該怎麼辦? (或者,我剛才犯了個錯誤,我該怎麼辦?) u可以撤消你剛才的操作.U可以撤消你對當前行的修改(當然,一行對於一篇論文來說當然 很不夠了). :e!可以不儲存修改而重新把你的檔案調進來. 還有,你刪除的文字都儲存在從 0到9編號的暫存器裡.所以,"p就可以把上第n次的刪除文字貼上出來.你可以按如下的 方法迅速地檢視所有刪除的文字. 先試一個,不對的話,敲u,再試下一個.(為加速這個過程, 這時vi中的.命令和通常的用法不一樣了.它不是重複上次操作,而是試下一個暫存器,這樣 你要做的無非就是: "1p u . u .,直到你撤消了你想撤消的刪除操作) 2.13 - 我正在寫我的論文,被告知我必須將每一節都放在不同的檔案裡,我該怎麼辦? :[m],[n]w 可以將從第m行到第n行之間的文字儲存到所指定的檔案中. 這種行序號方法幾乎在所有的:命令下都可以使用. 如果你用命令:[m],[n] w >>, 這些文字將新增到檔案的後面. 2.14 - 所有的:命令都是怎樣處理的? :後面的命令都是從ex編輯器裡面過來的. 這就給vi加入了很多靈活性,也使vi功能更強 大. 例如, 有很多的方法可以用來查詢和替換,它們有很多的類似地方(事實上,它們在某種 意義上說都是一樣的) 3.0 - 怎樣查詢和替換? 有很多方法. 最簡單的是: :s/old/new/g, 但是,這僅對當前行起作用..., 所以,我們用 :%s/old/new/g, 更一般的,我們還可以用 :[範圍]s/old/new/[cg],這裡,[範圍]是任意的行範圍,包括行號,$(檔案末尾),.(當前行), %(當前檔案),或者兩個行號之間加個破折號(或者可以這樣: .,+5,這表示下面5行).[cgi]是 c,g,i中間的一個或者什麼也沒有.c告訴vi每次替換的時候要給提示,g是說對所有一行中出現 的地方都做替換.i則是指在查詢時不區分大小寫.如果最後一個斜槓(/)後面沒有東西的話,那 麼vi只替換在行中第一次匹配的地方. 我比較喜歡這樣做: :g/foobar/s/bar/baz/g, 這個命令首先搜尋foobar,然後把它變成foobaz. 它沒有改變 jailbars, 而其他的一些命令可能會改變jailbars. 這是我的方法,但是可能比較難記. 當然,你還可以在查詢的的時候使用正規式,以及在替換文字的時候使用其他一些命令.如果 你在正規式裡用(和)來剝離一個序列的話,你會發現你可以做很多好玩的事情. 例如: :g/(foo)(bar)/s/2/1baz/g 將foobar替換成foobaz 還有一些特殊的序列: & 所有查詢時匹配到的東西 [1-9] 1到9號用(和)括起來的東西 u 下一個字元將被變成大寫. U 以後的字元都變成大寫,直到遇到e或E l 下一個字元將被變成小寫. L 以後的字元都變成大寫,直到遇到e或E [Ee] 更改大小寫的選擇區域的終點 3.1 - 我怎樣在vi中執行一個程式? :!命令 可以在vi中執行程式. :sh會啟動一個互動式的外殼(SHELL).在這個外殼 裡面, 如果你願意,你還可以再次執行vi. 當你在編輯Makefiles和配置檔案來編譯 某個程式的時候,這可能比較有用. 這比:e優越之處在於它無須儲存檔案,而且如果 你退出外殼的時候,vi還回到原來的地方.(當然,我還是建議你先儲存一下檔案) 3.2 - 啊! 我正在寫我的論文, 系統崩潰了! 怎麼辦? 不要怕! 你會收到一封電子郵件,裡面就是你的論文.敲入vi -r (這個檔名就是系統崩潰時你正在編輯的檔案)你就可以恢復出你的論文來.只敲 vi -r將把所有可能恢復的檔案都列出來. 3.3 - 有沒有使vi對程式設計師更友好的竅門? :set ai可以讓vi自動對齊. :set sw=#,#是移動的寬度(shiftwidth),或者說TAB鍵的寬度(tabwidth);你可以 用<>命令來左移或右移某一行. 還有, 你可以使用 %來將{,(或[等符號 括起來的文字都左移或右移;這時候,你必須把游標放在這些符號({,(或[)上面. :set sm會在你敲},]或)顯示出對應匹配的{,[或(來. :set lisp會對lisp程式設計有些幫助. ()被移到s表示式(s-expressions)外面,如果 原子(atoms)沒有停止則{}將被移走. 3.4 - 宏 -- 我怎樣寫宏? :map , 其中最多10個字元,最多100個字元. 以後,如果 你敲了,vi就會用來取代它.所有的宏都是在命令模式下開始的,但是可以 在你想在的模式下終止. 記住,在你想用的控制字元前面加上^V. :unmap 將刪除這個宏. :map! 使得將插入到文件 中去. 3.5 - 我怎樣將一個功能鍵定義成一個宏? 如果是#n,n是0-9之間的一個數,那麼這個宏就對映成某一個功能鍵了.(你 可以試一下F1-F10之間的鍵--譯者) 3.6 - 有沒有辦法縮寫文字? 當然了. 這可是vi呀,它能做任何事情! :ab email ellidz@midway.uchicago.edu 可以在你敲完email後,把那個沒有縮寫 的文字插入到檔案中. :una email取消縮寫. 3.7 - 我怎樣在當前文件中做拼寫檢查? 這兒有一個宏可以做到這一點. 這些應該放在你的.exrc檔案中(後面我們將對.exrc 進一步討論). 它是一個相當簡單的宏. 它僅僅是呼叫ispell來處理當前檔案.當然,你 的系統裡面一定得有ispell這個程式. 使用它的時候,只需要敲個V鍵就行了(因為vi並 沒有用V,所以V是一個比較合適的鍵) map V :w^M:!ispell % ^M:e!^M^M 第二個^M使你在拼寫檢查完之後無須敲回車就可以到vi中. (譯註, 在我的系統裡,沒有ispell,只有spell,我用它替換了ispell,工作的不錯;還有, ^M不是兩個字元,而是一個字元,透過^V^M敲進去的;另外,我個人認為第二個^M還是不要 的好,因為直接回到vi後你就無法看到拼寫檢查的結果了) 3.8 - 我手頭有一個硬複製的終端, 我還能用vi嗎? 好了,好了. 我並認為有人會真的問這個問題.這個問題太偏了,我們大可不必理 它.(而且,它回答了一個非常普通的問題) vi啟動的時候處於一種特殊的模式下面,叫做"開放模式"; 在這種狀態下,事情或多或少 的有些不同. 刪除的字元在你面前顯示成一些',vi會認為你的終端視窗只有一行. ^r 可以把當前行重新輸出. z則把當前行周圍的視窗重畫一遍. 3.9 - 好了,是不是處在開放模式下的原因呀?! 但是我現在沒有用硬複製終端,它還是在開放 模式呀? 這兒的問題就是vi沒有認出你用的終端的型別. 於是它假定你有的是個最爛的終端, 所以它決定依然處在開放模式下.這似乎沒什麼用處.因為沒有多少人喜歡開放模式,但是開放 模式還是需要知道你的終端的一些最起碼的資訊的. 現在,我們來看如何解決這個問題.我們有可能把它分成幾種特殊的情形,但是,一般情況下, 這並沒有用處. 如果你直到你的終端的型別, 你可以在UNIX提示符下面設定終端型別(在CSH 及其變種下面,使用命令setenv TERM ;在SH及其變種下面,使用命令TERM=; export TERM) 最好你能把上面的命令寫在.profile檔案或者.cshrc檔案裡面,這樣你一登入它就自動地給 你設定好了.(當然,你應該知道如何使用ed,或者你能在UNIX提示符下面設定好終端型別以便能 使用vi, 這樣你才有可能去編輯這些檔案) 如果你確實不知道你地終端型別,試一試vt100.現在大多數地終端或者終端模擬器都能模擬 vt100. 如果這還不能生效的話,你只好去找個高手來幫你了. 4.0 - vi檔案的線上幫助在哪兒? 有一個vi的FAQ,其中列出了vi檔案的所有線上檔案. 同時它還列出了這些文件 的鏡象站點. 最主要的一個地址是alf.uib.no,但是這些文件在很多很多地地方 都儲存著. vi-archive faq把它們都給列出來了.你在下載這些檔案之前一定要 核對一下這個FAQ.因為很有可能有一個站點比去挪威的站點更近更快些. 一個鏡象站點是cs.uwp.edu/pub/vi, 另一個是monu6.cc.monash.edu.au/pub/Vi, 這些站點上有很多有關vi的檔案,還有一些vi的變種版本;當然,UCB版本的vi是 肯定有的, 還有許多的宏. 5.0 - 好玩的vi訣竅,好玩的宏 這一節主要講述一些無聊的訣竅和一些無聊的宏.事實上,任何vi的訣竅和宏我們 都歡迎,只要它們不是過分冗長. 如果有人向我建議而我也認為確實值得加的話, 我會考慮加進去的. 5.1 - 好玩的vi訣竅 xp 刪除游標下的字元,再把貼上到後面去.換句話說,它交換了當前兩個字元 的位置. ddp 和xp類似,不過是交換兩行的位置. uu 撤消和重複上次所做的修改.(這可以使你不改變什麼東西就可以到你上次所 做的修改處) 5.2 - 好玩的宏 和垂直上方的字元交換位置 map * kxjphxkP 折行 map g $80|F r (譯註,我對這條宏表示疑問!) 改變大多數單詞的大小寫 map v ywmno:s/./~/g (譯註,這條好象也不大對!) 在當前的單詞周圍加上`和' map *` i`' 在當前的單詞周圍加上'和' map *' i'' 在當前的單詞周圍加上"和" map *" i"" (這幾條也太無聊了吧--譯註) 在當前的單詞周圍加上``和`` map! `` `' (咦,好象又有問題?--譯註) 從游標處把當前行分開,在下一行開頭加上一個>號(例如,引用USENET).如果加上了單詞的折行 功能那麼最後一個單詞可能被折在第一行. map g may0O`ay$:s/./ /g (不對吧--譯註) 插入一個字元 map g i$^[r 6.0 - 依字母順序的vi快速參考 ... 是指有些東西需要在命令之前或之後指明.這通常是說游標的移動鍵 (h,j,k,l,w,b等等)或者是指行號. # (這裡#代表一個數字) 執行n次後面的命令... : 進入ex模式 ) 下一句 ( 上一句 } 下一段 { 上一段 ]] 下一節 [[ 上一節 0 行的開頭 $ 行的末尾 ^ 行的第一個非空白字元 + 下一行的開頭 - 上一行的開頭 (空格) 下一個字元 (回車) 下一行 / 向前搜尋 ? 向後搜尋 % 查詢當前小(中,大)括號的匹配字元 , 逆向重複上一個f,F,t或T操作 ; 重複上一個f,F,t或T操作 . 重複上一個操作 ` 轉到標記處 ' 轉到標記所在行的開頭 `` 查詢前回到上一個做標記的地方 '' 查詢前回到上一個做標記所在行的開頭 ~ 切換字元的大小寫 " 儲存到暫存器中 !! 重複上一次SHELL命令 ! 把後面的文字送給命令, 取代輸出(例如, !}fmt把當前的段落 送給命令fmt處理,然後用fmt返回的東西替換輸出.) >> 右移當前段落一個移動寬度(shiftwidth) << 左移當前段落一個移動寬度(shiftwidth) >% 從當前到匹配小(中,大)括號之間的文字右移 (似乎漏了一個符號|, 移動到某一列----譯註) a 在當前位置之後新增 A 在當前行的末尾新增 ^a 沒有使用 b 上一個單詞的開頭 B 上一個單詞的開頭,忽略標點符號 ^b 上移一屏 c 覆蓋... C 覆蓋到行末尾 ^c 終止插入模式,在命令模式沒有用 d 刪除... D 刪除到行末尾 ^d 下移半屏,如果在插入模式下則移到上一個移動寬度(ShiftTab)處 e 單詞的末尾 E 單詞的末尾,忽略標點符號 ^e 螢幕下卷一行 f 查詢... F 向後查詢... ^f 下移一屏 g 未用 G ...跳至[預設是到檔案末尾] ^g 顯示狀態列 h 左移 H 螢幕上的第一行 ^h 在插入模式下是退格,命令模式下是左移 i 在當前的位置前面插入 I 在本行的第一個非空白字元前面插入 ^i 插入模式下是製表鍵,命令模式下未用 j 下移 J 把下一行合併到本行 ^j 命令模式下是下移,插入模式下是建一個新行 k 上移 K 未用 ^k 未用 l 右移 L 螢幕中的最後一行 ^l 重繪螢幕 m 把當前位置標記到暫存器中 M 螢幕的中間行 ^m 回車 n 重複上次查詢 N 逆向重複上次查詢 ^n 命令模式下是下移 o 在當前行的下面建一個新行 O 在當前行的上面建一個新行 ^o 未用 p 在當前行的下面貼上 (譯註--應為在當前位置的後面貼上) P 在當前行的上面貼上 (譯註--應為在當前位置的前面貼上) ^p 命令模式下是上移 q 未用 Q 退出並且啟動ex ^q 未用 r 覆蓋當前的字元 R 在插入模式下一直覆蓋字元 ^r 在命令模式下面重繪螢幕 s 替換 S 替換整行 t 到... T 向後到... ^t 移到下一個移動寬度(shifttab)處 u 撤消上一次操作 U 撤消對本行的所有修改 ^u 上移半屏 v 未用 V 未用 ^v 未用 w 下一個單詞的開頭 W 下一個單詞的開頭,忽略標點符號 ^w 命令模式下未用,在插入模式下是到上一個單詞的開頭處 x 刪除當前字元 X 刪除前一個字元 ^x 未用 y 複製... Y 複製整行 ^y 螢幕上卷一行 z 重新配置當前行周圍的螢幕 ZZ 儲存之後退出 ^z 未用 (譯註--在命令模式下,^z執行了UNIX暫停操作) 6.1 - 命令模式的輸入選項(:命令) (注: 這不是一個規範的列表,, 我只是列出了一些最重要的命令) :r 把讀入到當前文件 :r ! 把的輸出插入到當前文字中 :nr 把插入到第n行 :! 執行,然後返回 :sh 轉到SHELL :so 讀取,再執行檔案裡面的命令 (譯註--檔案中的命令應該都是一些ex命令) 儲存之後退出 :wq 儲存之後退出 :l1,l2w 把第l1和第l2行之間的文字寫到中去,如果沒有指定, vi就假定是當前檔案,如果沒有指定l1,l2,就假定是整個檔案(就成了:w) :w >> 新增到末尾. 也可以使用行號 :w! 覆蓋當前檔案 :q 退出 :q! 不存檔就退出 :e 不離開vi編輯 :e! 重新編輯當前檔案,忽略所有的修改 :n 編輯下一個檔案 :e +n 從第n行開始編輯,如果超過了末尾,就從末尾開始編輯 :e# 編輯替換檔案(如果使用了命令:e,替換檔案就指的是原始檔案) :args 顯示所有要編輯的檔案 :rew 重新回到第一個編輯的文件 :map m n 建立一個宏(使 m 做 n) :map! m n 建立一個插入模式的宏(使 m 做 n) :unmap m 刪除宏m :unmap! m 刪除插入模式的宏m :ab <1> <2> 縮寫,敲<1>的時候用<2>取代 :unab <1> 取消縮寫<1> :set 設定... 6.2 - 設定選項(set) 可以使用括號中的縮寫形式. 語法: :set (如果需要引數的話) 也可以在一行中指定多個選項 :set ? 顯示出當前這個選項的引數值 :set all 則顯示所有的選項值 對那些無須引數的選項來說,使用:set no就可以把它給關了 選項: 預設值: 含義: autoindent (ai) noai 使新行自動縮排,和上(下)行的位置對齊 autoprint (ap) ap 每條命令之後都顯示出修改之處 autowrite (aw) noaw 在:n,:!命令之前都自動儲存檔案 beautify (bf) nobf 在輸入的時候忽略所有的控制字元 (除了製表鍵(tab),換行(newline),進紙(formfeed)) directory= (dir=) /tmp 存放緩衝區的目錄名 edcompatible noedcompatible 在替換的時候使用類ed的用法 errorbells (eb) errorbells 出錯的時候響鈴 exrc (ex) noexrc 允許在主目錄(home)外面之外放.exrc檔案 hardtabs= (ht=) 8 設定硬製表的邊界 ignore case (ic) noic 正規式裡忽略大小寫 lisp nolisp 開啟lisp模式 list nolist 顯示所有的製表鍵和行的結尾 magic magic 可以使用更多的正規表示式 mesg mesg 允許向終端傳送訊息 number (nu) nonumber 顯示行號 open open 允許開放和視覺化 optimize (opt) optimize 最佳化吞吐量,列印時不發回車 paragraphs= (para=) IPLPPPQPPLIbp 設定{ & }的分界符 prompt prompt 命令模式下的輸入給出:的提示符 readonly (ro) noro 除非用!號否則不準儲存檔案 redraw noredraw 當編輯的時候重繪螢幕 remap remap 允許宏指向其他的宏 report= 5 如果影響的行數>這個數的話就報告 scroll 1/2 window 下卷螢幕時滾動螢幕的數目, 同樣這也是z命令輸出的行數(z 輸出2倍滾屏的大小) sections= SHNHH HU 定義節的末尾(當使用命令[[ 和 ]] 時) shell= (sh=) /bin/sh 預設的SHELL,如果設定了環境變數SHELL的話,就使用變數 shiftwidth= (sw=) 8 當使用移動(shift)命令時移動的字元數 showmatch (sm) nosm 顯示{, }, (, ), [, 或者 ] 的匹配情況 showmode noshowmode 顯示你處在什麼模式下面 slowopen (slow) 插入之後不要立刻更新顯示 tabstop= (ts=) 8 設定製表停止位(tabstop)的長度 taglength= (tl=) 0 重要標記的字元個數(0表示所有的字元) tags= tag, /usr/lib/tags 定義包含標記的檔案路徑 term= 設定終端型別 terse noterse 顯示簡短的錯誤資訊 timeout (to) timeout 一秒鐘後鍵盤對映超時 ttytype= 設定終端型別 warn warn 顯示"No write since last change"資訊 window= (w=) 可視模式下視窗的行數 wrapmargin= (wm=) 0 右邊距,大於0的話最右邊的單詞將折行,留出n個空白位置 wrapscan (ws) ws 查詢到檔案尾後再重頭開始 writeany (wa) nowa 可以儲存到任意一個檔案去 (譯註--這些選項在各種vi版本中都基本上大同小異,以SunOS帶的vi為例,它沒有這裡列出來的open選項, scroll的引數值也不同,還多出來一些選項,如flash,modelines,novice,tagstack等等) 7.0 - 建立 .exrc檔案 所有命令輸入模式下的命令(即 :命令)都可以在.exrc檔案中使用,在.exrc中的命令在啟動vi的時候自動 載入.尤其是源命令(so),縮寫(ab)和宏定義都可以用.在.exrc中不允許有空行.以"開頭的一行vi將把它當成 註釋. 7.1 - .exrc檔案的樣本 以下的.exrc檔案是一個實際的例子, 我自己的. 因此,它就沒有有些人想象的那樣設定很多的選項.即便 如此,它還是給出一些基本的概念,而且它也相當易懂. 首先,記住你無須在命令前面加:號,因為它是預設就新增了的. "譯註--以下是.exrc檔案中的內容,為真實起見,而且事實上也相當淺顯,我沒有翻譯其中的註釋 " set wordwrap 9 characters from the right set wm=9 " show matching parenthesis. When },), or ] is hit, show the opening " {,(, or [ that matches it. set sm " set the shell to be /usr/local/bin/tcsh set sh=/usr/local/bin/tcsh " a few abbreviations " this makes -l automatically become -Larry, and zidlle to be my " name and email address. ab zidlle E. Larry Lidz - ellidz@midway.uchicago.edu ab -l -Larry " uppercase V will run ispell -x (-x tells it not to save backups) on current " file map V :w " K will center the line... (this doesn't work on SunOS -- ??) map K :s/^[ ]*// " v will reformat the current paragraph map v {0!}fmt " q runs a program to lock my terminal map q :!lock2 " Splits a line in two at current cursor location, puts a > at the "beginning of the line - useful for Usenet/email map g may0O`ay$:s/./ /g 8.0 - vi的bug 我很想說vi中沒有bug,但很不幸,它不是這樣的. 這些bug都是初始版本vi中的, 它其他的一些變種就不一定有. 例如 _宏有時就執行的有問題. 9.0 - 術語表 如果有人提議說某個術語他不明白,我們將更新這個術語表.如果你有什麼建議, 請一定要告訴我. 命令模式 command mode 命令模式是說我們在此模式下面可以向vi發命令(包括游標移動,編輯命令等等) ed UNIX裡面一個非視覺化的編輯器 escape鍵. 鍵盤上標記為escape(ESC)的一個鍵.有時候^[可以起到相同的作用. 如果沒有escape鍵,你可以試試Meta鍵 ex UNIX下的一個編輯器.所有vi中的:命令都是送給它處理的 插入模式 insert mode 插入模式是指我們可以在此模式下面鍵入文字. 宏 macro 宏是一些鍵的組合起來的快捷方式.例如,某個宏允許我們只敲一個鍵就可以執行 好幾個不同的命令. 開放模式 open mode 開始模式是說vi啟動的時候不能確定你的終端型別,或者它肯定你的是一個硬的或 電子管的終端 正規表示式 regular expressions (RegEx) 正規表示式,通常縮寫為"RegEx",是一些關鍵字的集合,它允許使用者在查詢的時候有更大的 控制力度. RegEx是在UNIX下面用的,但是在很多程式中也用到了它. sed 流-行式的編輯器.它沒有介面,所有命令都是透過命令列的形式給出的. vi 就是這個FAQ討論的編輯
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-940154/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Windows 98 常見問題解答(轉)Windows
- 專案管理常見問題解答(轉)專案管理
- APatch常見問題解答
- LINUX 常見問題詳細解答(轉)Linux
- Ubuntu 常見問題和解答Ubuntu
- Linux常見問題解答Linux
- C++語言常見問題解答(3) (轉)
- C++語言常見問題解答(1) (轉)
- [譯] HTTP/2 常見問題解答HTTP
- RapidWeaver 8常見問題解答API
- 小遊戲引擎常見問題解答遊戲引擎
- 【from MM】Flex 常見問題解答Flex
- Linux 29常見問題的詳細解答(轉)Linux
- Rhinoceros 6 for Mac的常見問題解答ROSMac
- 關於CleanMyMac常見問題與解答Mac
- NSIS 之 NsDialogs 常見問題解答
- 紅帽認證工程師常見問題解答(轉)工程師
- 犀牛Rhinoceros 6 for Mac的常見問題解答ROSMac
- 固態硬碟常見問題及其解答分享硬碟
- LINUX 常見問題1000個詳細解答(轉)Linux
- BREW常見問題解答(FAQ 4)-語言和作業系統 (轉)作業系統
- Screaming Frog SEO Spider常見問題解答IDE
- Python程式設計常見問題與解答Python程式設計
- SOLIDWORKS認證考試常見問題解答Solid
- 域名解析常見問題盤點及解答
- MongoDB常見問題解答:時間與時區MongoDB
- Oracle備份和恢復常見問題解答Oracle
- 關於Apache Hadoop的常見問題解答ApacheHadoop
- WebSphere Application Server 常見問題及解答:安全WebAPPServer
- WebSphere CloudBurst Appliance 常見問題及解答WebCloudAPP
- WinWebMail郵件伺服器 - 常見問題解答WebAI伺服器
- BREW常見問題解答(FAQ 5)-處理器和事件處理 (轉)事件
- SAP document builder一些常見問題的解答UI
- Hadoop科普文——常見的45個問題解答Hadoop
- Nginx 快取使用官方教程及常見問題解答Nginx快取
- WebSphere Application Server 常見問題及解答:叢集WebAPPServer
- WebSphere Application Server 常見問題及解答:遷移WebAPPServer
- 華為隨行WiFi 2暢享版常見問題解答WiFi