我有以下代码:
function CSVTableFunc(command)
let cursor = getpos('.')
let l:winview = winsaveview()
normal(ggVG)
execute a:command
call setpos('.', cursor)
call winrestview(l:winview)
endfunction
基本上,它的作用是从上到下选择所有行,然后执行在函数中传递的命令。
但是,在执行命令之前,取消选择之前选择的行。
我错过了什么?
干杯!
答案 0 :(得分:0)
这里有几个问题。
首先,您尝试使用normal(...)
,就好像它是一个功能一样。它不是(如果是的话,你还是错了,你错过了call
命令)。
你实际上告诉Vim要运行以下正常模式命令:
(
- 支持一句话
ggVG
- 粗略地,选择缓冲区中的所有文本
)
- 转发句子
一些实验表明,这可能实际上并没有引起任何问题,但这是错误的,并且可能在其他情况下引起问题。
更大的问题是,除非你告诉他们,否则命令实际上不会在某个范围内操作。在可视模式下(即,当您选择了一系列行)时,按:时,会自动在命令行中插入'<,'>
。这段文字说&#34;在视觉选择上运行命令&#34;。
使用execute
不会自动插入此范围。如果命令支持范围,则需要手动将范围放在命令的开头。由于您没有这样做,因此您的命令仅以其默认范围运行,该范围通常是当前行。在您的情况下,由于您在运行命令之前执行了ggVG
,因此您可能会看到命令仅在最后一行运行。
无论如何,你不需要视觉选择。只需使用特殊范围%
而不是选择任何内容。 %
表示每行#34;
问题是,某些命令可能不支持范围。对于这些命令,您可能需要使用循环或:g
命令逐个在每个感兴趣的行上运行命令。