天天看點

vim ex模式指令

本文出自   http://blog.csdn.net/shuangde800

本文是在學習《使用vi編輯器, Lamb & Robbins編著》時在evernote寫的其中一章筆記,現在整理好,一方面溫故而知新,一方面希望對大家能有些幫助。ex的指令在vim程式設計中都是非常常用的,熟練這些指令對于提高程式設計效率有很大的幫助。

主要内容: 1. 使用行号在檔案中移動 2. 使用ex指令對文本塊進行複制,移動和删除 3. 儲存檔案和部分文本 4. 操作多個檔案(讀入文本或指令,在檔案間切換)

本文約定: $ + 指令 表示在普通的bash的指令行下 :  + 指令 表示在vim的ex(指令)模式, 按"Ctrl" + ":" 進入

-----------------------------------------------------------------------------------------------------------------------------

我們知道vim有3種模式:普通模式,插入模式,ex(指令)模式。 ex并不是另一個編輯器,應該說vi是更一般更基本的ex行編輯器的可視模式,是以ex算是vi的底層行編輯器。由于一些ex指令可以節省大量的編輯時間,是以在使用vi時它們是非常有用的。這些指令的大部分都可以在不離開vi的情況下使用。

我們知道可以把檔案看成一系列以編号的行。ex可以使你更靈活,更有選擇地執行編輯指令。使用ex,可以容易地在檔案之間移動,并以各種方式把文本從一個檔案移動到另一個檔案,還可以快速地對大于單個螢幕的文本塊進行編輯。通過全局替換,可以在整個檔案中使用給定的模式進行替換。等

在指令行中:   $ ex  filename 可以看到有關檔案總行數資訊

ex指令由行位址(行号)和指令組成,它們都以Enter鍵結束。

最基本的指令是用來列印(到螢幕)的p.    : 2 p  顯示目前檔案的第二行内容

如果要顯示多行,可以指定行号範圍:    :2 , 10 p 顯示2~10行的内容

沒有行号的指令被認為作用于目前行。 假設目前光标在12行,輸入指令 : s/hello/hehe 會把第12行的第一個"hello"改為"hehe"

使用ex進行編輯

ex常用編輯指令: d     (delete)   删除行 m   (move)    移動行 co  (copy)      複制行 t    複制行,和co同義

定義行的範圍: ex可以使用行号明确地定義一行或連續數行範圍。使用明确數字的位址成為絕對行位址。 使用行範圍,可以行範圍内的行進行指令操作,例如: :3, 18 d              删除3~18行 :11, 15 m 23      把11~15行移動到23行下面。 :23, 29 co 100   複制23~29行并把它們粘貼到100行下面

:set nu  或 :set number  顯示行号 :set nonu  或:set nonumber 不顯示行号

: =                   顯示總行數 : . =               顯示目前行号 : /pattern/=   顯示地一個與模式pattern想比對的行号

行位址符

.(點)  代表目前行 $           代表檔案的最後一行; %          代表檔案的每一行,等同于1, $的組合    這些符号可以與絕對行位址組合使用,例如: : . ,  $ d    删除從目前行到檔案末尾 :20, . m $  把20~目前行的文本移動到檔案末尾 :% d         删除檔案中的所有行 :% t $        複制所有行并把它們粘貼到檔案的尾部(成為連續的副本)

除了絕對行位址外,也可以指定一個相對目前行的位址。符号+和-就像數學運算符一樣,當将其放置在數字前面時,這些符号就會加上或減去跟在它們後面的數值。例如: :. , . + 20 d    删除從目前行到目前行以下20行 :226 , $  m  .-2   把226行到檔案末尾的文本移動到目前行的上面兩行的後面。 :. , +20 #      顯示從目前行下面20行的行号 事實上,由于目前行是假定的開始位置,是以在使用+或-時不需要輸入圓點

如果在+或-後面沒有數字,那麼就等價于+1和-1

數字0代表檔案的開頭(等于0行)。

:-, + t 0   複制三行(目前行,前一行,後一行),并粘貼到檔案開頭

搜尋模式

ex定位行的另一種方法是使用搜尋模式。例如:

:/pattern/ d     删除下一個包行模式pattern的行 :/pattern/+ d   删除下一個包行模式pattern的行的下一行(也i可使用+1來代替) :/pattern1/,/pattern2/ d  删除第一個包行pattern1的行與第一個包行pattern2的行之間的所有行 :. , /pattern/ m 23    從目前行到第一個包行pattern的行之間的文本移動到23行後面。

重新定義目前行的位置

假設目前光标在第一行。 :100, +5 p 會發生錯誤, 因為這個指令等價于:100, 6p,  而我們是希望顯示100~105行, 為了達到這個目的,我們要把目前行為第一行變成目前行為100,然後+5.

ex提供了這個方法, 當使用“分号”代替“逗号”時,就會将第一個行位址當成“目前行”。 :100 ; +5 p   就會顯示100~105行

分号也可以用于搜尋模式的相對位址中,例如,顯示下一個包行模式pattern的行和它下面的10行: :/patter/ ; +10 p  

全局搜尋

我們已經知道在vi中使用/(斜杆)來搜尋檔案中的字元模式。ex也有全局指令g, 可以讓你搜尋模式并顯示找出的所有包含該模式的行。指令:g!的作用與:g相反,使用:g!(或它的同義詞:v)可以搜尋不包行該模式的行

可以對檔案中的所有行使用全局指令,也可以使用行位址把全局搜尋限定在指定的行或行範圍内。

:g /pattern             尋找(移動到)模式pattern在檔案中最後出現的位置 :g /pattern/ p         尋找并顯示檔案中所有包含模式pattern的行 :g!/pattern/nu       尋找并顯示檔案中所有不包行模式pattern的行,并顯示這些行号   :20, 40g/pattern/p  尋找并顯示第20到40行之間所有包含模式pattern的行

組合ex指令

你不必一直輸入冒号來開始新的ex指令。在ex中,豎直線(|)是指令的分割符,它允許使用者把多個指令組合在同一個ex提示符下(與此類似的是分号分隔符UNIX shell提示符下的多個指令)。同時使用|時,要注意制定的行位址。如果一個指令影響到檔案中行的順序,那麼下一個指令将使用新的行位置進行工作。例如: :1 , 3d |  s/thier/their/  把第1行到第3行删除,然後在目前行(該行是調用ex提示符以前的第4行)進行替換

:1 , 5 m 10 | g/pattern/nu 把第1行到第5行移動到第10行後面,然後顯示所有包含模式pattern的行。

注意,使用空格會使指令更容易閱讀

儲存和退出檔案

:w   把緩沖區寫(儲存)到檔案中但不退出,可以(和應該)在編輯會話期間使用:w來保護編輯操作以避免系統癱瘓或重大的編輯錯誤 :q    退出編輯器,傳回系統提示符 :wq  寫檔案并退出編輯器,即使沒有修改檔案,寫操作也會無條件的進行 :x 寫檔案并退出編輯器,隻有修改了檔案寫操作才能進行

有時候vi編輯器會有警告,可以在指令後面加上感歎号!來強制執行,忽略警告

儲存部分檔案到新檔案中

有時候,希望把目前檔案的一部分儲存為一個新的單獨檔案。 :20 , $w  newfile   把第20行到檔案末尾文本儲存到新檔案newfile中 :. , 500 w newfile   從目前行到500行文本儲存到新檔案newfile中

添加到現有檔案中

可以使用重定向添加符(>>)和w把緩沖區的全部或部分内容添加到現有檔案尾。 :30 , $w >> file 把30行到檔案末尾添加到檔案file的末尾

把檔案複制到另一個檔案中

有時想把系統中已有的文本或資料複制到正在編輯的檔案中,在vi中可以使用ex指令讀取另一個檔案的内容: :read  filename 或者使用縮寫形式 :r  filename 這個指令會把filename檔案的内容插入目前編輯文本的光标位置後面一行。 如果想指定其它行,隻需要在read或r指令之前輸入行号即可。 例如: :10 r filename   将會把filename的文本輸入到目前第10行後 。

如果檔案在其他目錄下,隻需要加上路徑即可。例如: :r  /home/time/data    把/home/time目錄下的data内容插入目前編輯檔案

應用位址符組合或搜尋模式可以更靈活: :$r  /home/tim/data  把讀取的檔案内容加到目前編輯檔案的末尾 :0r  /home/tim/data   把讀取的檔案内容加到檔案開頭位置 :/pattern/r  /home/tim/data  将讀取的檔案内容加到目前檔案包行模式/pattern的行的後面

編輯多個檔案

ex指令可以在多個檔案之間切換。同時編輯多個檔案的好處是速度快。在同一編輯會話中,在檔案之間切換不僅能加速通路,而且還能保留已制定的縮寫和指令序列,以及複制緩沖區,這樣可以在檔案之間複制文本。

1. 調用vi打開多個檔案 在首次調用vi時,可以制定要編輯的多個檔案,然後使用ex指令在檔案之間進行切換。例如: $ vi  file1  file2    首先編輯file1,完成第一個檔案的編輯後,ex的:w指令寫(儲存)file1,:next 指令(縮寫:n)調用下一個檔案(file2)

2. 使用參數清單 除了使用:n移動到下一個檔案。還有其他參數可以使用 :args指令(縮寫:ar)列出在所有編輯的檔案,目前檔案使用方括号括起來。 :rewind(縮寫:rew)  把目前檔案設定為上一個編輯的檔案 :last(縮寫:la)       把目前檔案設定為最後一個檔案

3. 調用新檔案 你不必在編輯會話的開始就調用多個檔案,可以使用ex的:e指令在任何時候切換到另一個檔案。如果想在vi中編輯另一個檔案,那麼首先需要儲存目前檔案(:w),然後給出指令: :e  filename 使用這個指令切換到新檔案filename時,vi把之前的檔案名記為#, 目前檔案名記為%,使用這兩個檔案可以迅速切換 :e #  切換到上一個檔案中 :r  #  把上一個檔案的内容粘貼到目前檔案中 :e! #  放棄目前檔案編輯,并傳回上一個檔案中

:e #的快捷鍵: 由于切換到前面的檔案會經常發生,是以不必在ex指令行下進行這種操作。 可以使用快捷鍵Ctrl + ^來使用,和:e #效果相同。