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按 &&
:%s/$/ = models.CharField(maxlength=XXX)
A = models.CharField(maxlength=XXX)&
qqA = models.CharField(maxlength=XXX)&
總結:
似乎只有第一種方法可以算作多行編輯,另外三種方法都只是實現了相同的結果,但不是多行編輯。在可視化模式所選擇的行的末尾添加一些東西:
- &
- 跳到目的行 (jjj 或者 &
或者 /patternor%等等…) - $跳到行末尾
- A, 寫入一些文本,[按] ESC 鍵.
這上面的圖片應該是gif 動畫的,在知乎上不支持這個
- 你可以看看這裡Vim學習指南 - 技術翻譯,這個有動畫演示
根據你這具體情況,我建議兩種方案:
- 輸入完整的一行,然後 yy 複製, 4p 粘貼然後再修改;
- 輸入等號左邊的字元後,在第一行按 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 : 所有行都進行替換 - /&這時你要做的只是重複這個宏,用@a就好了。如果還有5行,你用5@a就行了。注意體會一下在連續使用宏時,最後的j$的作用。
@胡力 列編輯模式應該是使用ctrl-v,
1 esc, ctrl-v進入列編輯模式,選擇你需要編輯的行,並按$
2 shift -a3 輸入重複的內容,最後按escvim有列編輯模式的,請按照以下步驟嚴格操作: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只需要按一下),你會發現這三行都有了你輸入的內容,如下:
這個操作看起來稍微有點複雜,其實操作習慣了很簡單的。大量適用於需要注釋掉代碼的情況,有了這種方式我都不怎麼用塊注釋了。直接在需要注釋掉的所有行首插入#或者//我媳婦教我用的。恩,家有賢妻,比我還geekC-V列編輯模式,不光是插入重複內容,複製粘貼文本塊都可以。
google一下vim visual block。。。
後來sublime text 出現了。這個問題解決了。
非要拿vi做啊?拿shell會不會簡單一點?
1) 用宏 2) Ctrl+V 列編輯
比如state行是第三行,還要輸入兩行類似的,試試如下命令拷貝,還在用yy你就太OUT了
:2,3t4
然後0cw輸入你的欄位名,-20&對於類似情況,我的解決方案是,自己寫了個插件。先寫一行出來,再把可以替換的部分替換成新的後,插在行後面。
可以用插件: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?
※一個網路編輯每天是如何工作的?