vim的ex模式用法

 

 文本輸入模式 (input mode/編輯模式)
  在命令模式下輸入插入命令i(insert)、附加命令a (append)、打開命令o(open)、修改命令c(change)、取代命令r或替換命令s都可以進入文本輸入模式。在該模式下,用戶輸入的任何字符都被Vi當做文件內容保存起來,並將其顯示在屏幕上。在文本輸入過程中,若想回到命令模式下,按"ESC"鍵即可。

 

本文是在學習《使用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命令由行地址(行號)和命令組成,它們都以回車鍵結束。

最基本的命令是用來打印(到屏幕)的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 #效果相同。


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