vim怎樣實現多行編輯?

在有些情況下,每行有一部分內容是一樣的,如:

name = models.CharField(maxlength=30)

address = models.CharField(maxlength=50)

city = models.CharField(maxlength=60)

state_province = models.CharField(maxlength=30)

country = models.CharField(maxlength=50)

這時怎樣實現多行同時編輯,就是我先輸入完

name

address

city

然後在第一樣末尾輸入models.charField的時候,以下的幾行,也可以實現同樣內容的輸入,好像TextMate中有這個功能。


說明1:下文中用 XXX 作為佔位符,方便接下來查找替換為所需要的參數,例如:30,50 等等。

說明2:游標起始位置為首行首列。

1. Visual Block

按 &,進入 Visual Block mode,按 G 到末行,按 $ 到所有行的行尾,按 A 在行尾添加,輸入添加的內容(只有第一行會顯示),按 & 退出編輯。完整命令如下:

&G$A = models.CharField(maxlength=XXX)&

2. 全局替換

將行尾 $ 替換為所需內容。命令如下:

:%s/$/ = models.CharField(maxlength=XXX)

3. Dot (.) 命令

按 A 在第一行行尾添加所需內容,按 & 退出編輯。然後連續按 j. 依次為每行添加相同內容。命令如下:

A = models.CharField(maxlength=XXX)&j.j.j.j.

4. 宏

按 qq 開始在 q 寄存器中錄製宏,按 A 在第一行行尾添加所需內容,按 & 退出編輯,並按 j 將游標移到下一行,按 q 退出錄製。然後,按 4@q 將宏執行4次。命令如下:

qqA = models.CharField(maxlength=XXX)&jq4@q

總結:

似乎只有第一種方法可以算作多行編輯,另外三種方法都只是實現了相同的結果,但不是多行編輯。


在可視化模式所選擇的行的末尾添加一些東西:

  • &
  • 跳到目的行 (jjj 或者 & 或者 /patternor%等等…)
  • $跳到行末尾
  • A, 寫入一些文本,[按] ESC 鍵.

    這上面的圖片應該是gif 動畫的,在知乎上不支持這個

  • 你可以看看這裡Vim學習指南 - 技術翻譯,這個有動畫演示


根據你這具體情況,我建議兩種方案:

  1. 輸入完整的一行,然後 yy 複製, 4p 粘貼然後再修改;
  2. 輸入等號左邊的字元後,在第一行按 A 進入插入模式,一次性寫完相同部分,然後游標下移,按 . 重做。


解決方案:

v進入 visual 模式,$移動到行尾,y複製所選內容。

在需要插入的地方,p。

若同時處理n行,就np,然後在前面插入特殊的文本,name,address這些。

個人觀點,

從編程實踐來說,大多數情況是自動補全比較好一些。

為了個別極其罕見的情況使用專門的處理方式,不值得。效率反而更低。

當然,如果自己頻繁接觸,自然是要優化了。


如果只是你上面的那些django代碼,vim的snipmate插件比上面textmate的方式更方便(我只用過幾天的textmate,也許textmate還有更簡單的方式)。安裝這個插件:https://github.com/robhudson/snipmate_for_django,然後在插入模式打:

char

然後按tab鍵,整個"? = models.CharField(?=30, ?=...) "都出來了,按tab可以分別打自動跳到各個參數。


這個技術很牛叉,叫做multiple cursors,聽說sublime的殺手鐧啊。sublime的出現,完爆TextMate啊,甚至一些用了7年以上vimer亦然拋棄vim。sublime確實有非常多優秀的特性。同時,這樣的技術也被vim引入了,你可以用這個terryma/vim-multiple-cursors · GitHub 來實現多游標編輯。最近有很多這種從sublime引進到vim的插件,極大提高了vim威力。


visual mode必須列對齊,感覺不大適合lz的要求。如果是我,會用如下兩種方法之一

方法1,全局替換

:%s/$/ = models.CharField(maxlength=)/gc

- %s : 所有行都進行替換

- /&/&/ : 將&文本,替換為&文本,這裡$不代表特定文本,而是表示行尾錨點

- g和c分別代表全局替換以及替換前confirm,這個例子里你要你confirm時你直接按a(ll)就好了

方法2,宏

現將游標移到第一行末尾,然後輸入

qai = models.CharField(maxlength=)&j$q

很長一段,其實分解一下很好理解,qa表示錄製一個宏a(如果要錄製另一個名叫b的宏則輸入qb),緊接著的i為切換到insert模式,後面直到&之前為你要輸入的內容。&切回normal模式,j切到下一行,$移動到行尾,最後一個q表示這個宏錄製結束。

換句話說,現在宏a的動作為「切換到insert模式,輸入 = models.CharField(maxlength=),切換回normal模式,並移動到下一行行尾"。

這時你要做的只是重複這個宏,用@a就好了。如果還有5行,你用5@a就行了。注意體會一下在連續使用宏時,最後的j$的作用。


@胡力 列編輯模式應該是使用ctrl-v,

1 esc, ctrl-v進入列編輯模式,選擇你需要編輯的行,並按$

2 shift -a

3 輸入重複的內容,最後按esc


vim有列編輯模式的,請按照以下步驟嚴格操作:

1. 需要保證要編輯的行長度均大於等於你要編輯的位置

具體來說,如果要在 = 號後面為多列插入相同的內容,文件應該像下面這樣

name =
city =
address =

而下面這種是不行的,因為沒有對齊

name=
city=
address=

2. 普通模式下,游標移動到第一行的=處,按 ctrl+v,進入列選擇模式,然後按兩下j,可以看到這三行的=號這一列被高亮

3. 按 shift + i 或者 shift + a,進入編輯模式,兩者的區別是shift+i會在=號前插入,shift+a會在等號後插入。| 如果是想把這三列的=刪除且插入新的內容,則按s,三列的=會被刪除,且進入編輯模式

4. 輸入你想輸入的內容,比如 「 models.CharField(maxlength=」,如下:此時只有第一行里新增了輸入的內容

5. 不要著急,此時按兩下ESC(部分GUI的vim只需要按一下),你會發現這三行都有了你輸入的內容,如下:

這個操作看起來稍微有點複雜,其實操作習慣了很簡單的。

大量適用於需要注釋掉代碼的情況,有了這種方式我都不怎麼用塊注釋了。直接在需要注釋掉的所有行首插入#或者//我媳婦教我用的。恩,家有賢妻,比我還geek


C-V列編輯模式,不光是插入重複內容,複製粘貼文本塊都可以。


google一下vim visual block。。。


後來sublime text 出現了。這個問題解決了。


非要拿vi做啊?拿shell會不會簡單一點?


1) 用宏

2) Ctrl+V 列編輯


比如state行是第三行,還要輸入兩行類似的,試試如下命令拷貝,還在用yy你就太OUT了

:2,3t4

然後0cw輸入你的欄位名,-20&A把行尾數字從60改成40


對於類似情況,我的解決方案是,自己寫了個插件。先寫一行出來,再把可以替換的部分替換成新的後,插在行後面。


可以用插件:vim multiple cursors 地址:https://github.com/terryma/vim-multiple-cursors


可以考慮用列編輯模式.

Ctrl-V 進入列編輯模式 (win下Gvim使用Ctrl-Q)

j or k 選擇要編輯的範圍

I or A進入編輯模式,輸入要編輯的內容

ESC 結束


少的話,就yy複製,多的話替換『
",或者用宏


按住 command,然後用滑鼠點你需要同時編輯的地方,然後輸入就可以了。


列編輯么

自打用了ultraedit的列編輯,我就拋棄了vi


推薦閱讀:

非科班的人是否適合做新媒體運營?
如何做一個優秀的音樂編輯?
怎樣成為一名優秀的圖書策劃編輯?
問題qu?xiao?
一個網路編輯每天是如何工作的?

TAG:編輯 | Vim | 文本編輯 |