2011-06-10 30 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>)