Vim功能正常模式然后执行

时间:2016-02-17 07:33:44

标签: vim

我有以下代码:

function CSVTableFunc(command)
    let cursor = getpos('.')
    let l:winview = winsaveview()
    normal(ggVG)
    execute a:command
    call setpos('.', cursor)
    call winrestview(l:winview)
endfunction

基本上,它的作用是从上到下选择所有行,然后执行在函数中传递的命令。

但是,在执行命令之前,取消选择之前选择的行。

我错过了什么?

干杯!

1 个答案:

答案 0 :(得分:0)

这里有几个问题。

首先,您尝试使用normal(...),就好像它是一个功能一样。它不是(如果是的话,你还是错了,你错过了call命令)。

你实际上告诉Vim要运行以下正常模式命令:

( - 支持一句话

ggVG - 粗略地,选择缓冲区中的所有文本

) - 转发句子

一些实验表明,这可能实际上并没有引起任何问题,但这是错误的,并且可能在其他情况下引起问题。

更大的问题是,除非你告诉他们,否则命令实际上不会在某个范围内操作。在可视模式下(即,当您选择了一系列行)时,按时,会自动在命令行中插入'<,'>。这段文字说&#34;在视觉选择上运行命令&#34;。

使用execute不会自动插入此范围。如果命令支持范围,则需要手动将范围放在命令的开头。由于您没有这样做,因此您的命令仅以其默认范围运行,该范围通常是当前行。在您的情况下,由于您在运行命令之前执行了ggVG,因此您可能会看到命令仅在最后一行运行。

无论如何,你不需要视觉选择。只需使用特殊范围%而不是选择任何内容。 %表示每行#34;

问题是,某些命令可能不支持范围。对于这些命令,您可能需要使用循环或:g命令逐个在每个感兴趣的行上运行命令。