2011-06-10 50 views
2

有沒有辦法選擇下列代碼中的第二列,即
,結果是非矩形。vim - 非矩形可視塊

我試過「CTRLv 3jE」,但那不起作用。

int var_one = 1; 
int var_two = 2; 
int var_three = 3; 
int var_very_long = 4; 
+0

已經回答了,但你想要做什麼?如果你在選擇後告訴你假裝做什麼,也許還有另一種方法。 – sidyll 2011-06-10 01:26:44

+0

@sidyll:我想複製該列,然後在另一個位置重現它。 這只是一個例子,實際上我需要這個特性來爲我的單元測試編寫腳本,這些腳本有很多重複的列。 – 2011-06-10 01:59:39

回答

4

你可以使用對齊插件的一個對準你的專欄,選擇並複製它,後來撤消對齊(或將其對齊)

+0

或者不使用插件,只需選擇四行並輸入':!column -t'。當然,如果你有'專欄'。 – freitass 2011-06-10 11:34:11

+0

這種方法的危險是如果你開始複製額外的空間。根據具體情況,不應該成爲問題。 – sidyll 2011-06-11 01:20:59

0

基礎上的評論,我覺得要走的路正在編寫一個自定義函數,它將 將任務傳遞給awk。它也可以用一些正則表達式來完成,將每個空行的 行分開,但awk應該更容易。這是我第一次嘗試:

function! ExtractColToRegister(reg, ...) range 
    let input = join(getline(a:firstline, a:lastline), "\n") 
    if a:1 | let column = a:1 
    else | let column = 1 | endif 
    exec "let @". a:reg . " = system(\"awk '{ print $" . 
     \ column . " }'\", input)" 
endfunction 

你應該沒有問題,理解它,如果你已經寫的Vim然而 腳本:-)讓我知道,如果它的某些部分不明確,如果有 東西以改善。

基本上,函數所做的是將特定列保存到寄存器。如果您 視覺選擇的問題給出的示例代碼,然後:

:'<,'>call ExtractColToRegister("a", 2) 

註冊一個現在將包含:

var_one 
var_two 
var_three 
var_very_long 

您可以輕鬆地"ap別處。注意,如果省略參數 ,那麼該列默認爲1。

創建自定義命令「列註冊」使這一過程甚至nicier到 境外使用的Vim的腳本:

:command! -range -nargs=+ CTR <line1>,<line2>call ExtractColToRegister(<f-args>)