2013-11-24 121 views
8

我正在做很多不同的數據源的剪切和粘貼。我試圖在多行代碼中插入多行代碼,以便粘貼代碼的第一行位於原始代碼的兩個特定位置之間,第二行位置與第二行位置相同。這就像在分割的多行代碼之間插入代碼塊一樣。 .gif注意下面的圖片說明我的意思:如何在多行代碼中的多行中插入代碼?

enter image description here

我怎樣才能做到這一點?我正在嘗試使用VIM CTRL + V但我無法粘貼多行代碼。

下面是示例:

VIOLET=SpectralBand([0.380,0.450],'violet') 
BLUE= SpectralBand([0.450,0.495],'b') 
GREEN= SpectralBand([0.495,0.570],'g') 
YELLOW=SpectralBand([0.570,0.590],'y') 
ORANGE=SpectralBand([0.590,0.620],'orange') 
RED= SpectralBand([0.620,0.750],'r') 

"viol3et", 45839, 
"bl3ue" , 43903, 
"gre3en" , 28392, 
"y3ellow", 23049, 
"o3range", 12389, 
"r3ed" , 32840, 
+0

也許看看多個遊標,它可能會爲您提供一些關於爲您的任務編寫自定義函數的一些想法:https://github.com/magnars/multiple-cursors。el – lawlist

回答

2

你應該用光標選擇左上角,輸入Control + V,然後轉到最後一行,然後輸入$以獲得所有行的結尾(這在其他答案中是錯過的)。 然後你用d刪除,去目的地,並使用p。

爲您詳細的樣本,在vim的解決方案是:

G0<c-v>{j$dggf(p 

分解爲:

G  go to last line of file 
0  go to its first character 
<c-V> to start a blockwise selection 
{  go to previous empty line 
j  go to next line (hence the beginning of block) 
$  extend the blockwise selection to end of ALL lines (that was my point) 
d  delete and store the block 
gg go to first line of file 
f( go to next character '(' if on same line. 
p  to paste the block after the column of current character. 

至$另一種方法是使

:set virtualedit=all 

,並會做如果你不能將光標放在目的地(當它超出行的末端)時,該作業。

+0

謝謝你能解釋一下G0 {j $ hdggf(p我是VIM的新手,這似乎是一個很好的答案.. –

+0

如果你有一個小時投資VIM,你應該試試命令:vimtutor – user2987828

+0

+ 1非常感謝!(PS我已經做了兩次,我應該再試一次。) –

3

它的工作原理我使用CTRL + V爲,選擇具有箭頭或運動字母(hjkl)整個塊,然後切它與d,把光標放在第一行的第一個括號後以及使用時p

+1

你確定,當我走下去時,他選擇了下一行,當我粘貼時,他把所有的東西放在同一行...... – Johan

+1

@Johan:當然。我測試過了。我的版本:'VIM - Vi在Linux中提升了7.4'。 – Birei

+0

@Johan對我來說,它是如何工作,如何說Ingo一定要先用CTRL + V選擇'viol3et'block,然後複製它,而不是使用CTRL + V插入它......謝謝Birei! –

4

您可以使用copy-rectangle-as-kill(C-x r M-w)和yank-rectangle(C-x r y)來實現你描述的行爲。

有關詳細信息,請參閱emacs手冊中的Rectangles部分。

4

Vim如何在粘貼期間的行爲取決於yank期間的選擇類型。一定要在塊模式選擇viol3et塊(在許多Windows安裝或Q按Ctrl +V

或者,你可以用我的UnconditionalPaste plugin只抽出/刪除整個線路(例如6dd而在viol3et線),然後用gbp粘貼(目標線之間)。