2015-08-08 65 views
1

我測試與我的腳本代理,看起來像:Vim:如何在文本的不同列後粘貼一列文本(來自剪貼板)?

$proxy = "http://name:[email protected]:80"; 
$proxy2 = "http://name:[email protected]:80"; 
$proxy3 = "http://name:[email protected]:80"; 
... 
$proxy100 = "http://name:[email protected]:80"; 

我通過電子郵件獲得新的代理所以我複製新的代理和Vim插入它,而不是舊的:

"http://name:[email protected]:80"; 
"http://name:[email protected]:80"; 
"http://name:[email protected]:80"; 
... 
"http://name:[email protected]:80"; 

權利知道我在做它,因爲這頁How do I paste a column of text after a different column of text in Vim?

使用視覺塊(CTRL-v)上被描述削減信列。然後移至號碼列的第一行 。移動到最後並創造一個空間。 然後粘貼字母列。

我很好奇,如何在沒有額外步驟的情況下完成,只需從剪貼板粘貼數據?

+1

Vim可能不適合這項工作。您應該從電子郵件中複製代理並將其粘貼到文本文件中,並使用腳本處理該文件。 – romainl

回答

5

簡短版本:你不行。有辦法繞過它,但它們並不一定簡單。更長的版本如下。

Vim有標記文本區域的三種方式:面向行(當你按下V啓動該模式),面向字符(當你按下v觸發),並逐塊(當你按下CTRL-V )。被標記的區域被複制到一個寄存器中,並且該寄存器具有屬性「類型」,該屬性反映了您進行標記的方式,線條,字符或塊狀。從寄存器粘貼時發生的情況取決於此類型。

現在,當您從系統的剪貼板複製結果存儲在*寄存器,並且類型始終設置爲linewise。因此,您無法粘貼「無額外步驟」的列模式。但是,您可以設置*寄存器的類型粘貼之前列塊:

call setreg('*', @*, 'b') 

因此,免去您的代理服務器列表會去是這樣的:

  • 複製新的列表到剪貼板,從郵件消息
  • 運行:call setreg('*', @*, 'b')設置*寄存器的類型列塊
  • 去老列表中,按CTRL-v並標記它;假設沒有什麼別的從代理一邊在該文件中,這樣做的Vim的高爾夫球手的方法可能是沿着線的東西:
    1. ˚F - 轉到第一"
    2. 按Ctrl - v - 啓動標誌着
    3. ;輸入 - 轉到最後;
    4. 0123?
  • 粘貼新名單上的選擇,與*p

可以簡化最後一步一點,通過使*+寄存器始終是指相同的值。要做到這一點,它添加到你的vimrc:

set clipboard=unnamedplus,autoselect,exclude:cons\\\\|linux 

使用此設置的咒語變成:

  • 從郵件複製到新的列表
  • 運行:call setreg('+', @+, 'b')
  • 去舊名單,標記爲Ctrl-v同上
  • p粘貼新列表ov呃。

,如果你有一個文件中的新的列表,你可以用Vim打開你不需要這個舞蹈:

  • 打開該文件與舊名單
  • 打開該文件與Vim中的一個單獨的副本新的列表
  • 標記與CTRL-v新的代理和與猛拉他們Ÿ
  • 在其他的Vim
  • 紀念醇d列表與Ctrl-v並粘貼新的與p

這仍然涉及在引擎蓋下使用系統剪貼板,但Vim的第二個副本負責將相關寄存器的類型設置爲blockwise。

0

我不知道有任何直接的方法來做到這一點。如果它對你來說真的很重要,那麼在你進行實際的編輯之前,你可能需要做一些設置,這隻會增加你必須做的打字量(不過你可以向你的vimrc添加命令以使其永久)。你可能會設置一些鍵盤宏,或者使用下面的命令地圖:

:imap <CR> <Esc>j011lC 

現在移到第一"標誌,按C,然後開始粘貼(僅適用於一個終端)。無論何時粘貼換行符,地圖都會將您移動到下一行的第11列。

當您完成時請記住:iunmap <CR>

相關問題