请查看我在/.gvimrc
文件中编写的以下vim函数。
用于删除" n"的函数ID " start_line"指定的行范围内每行中的最后一个字符数和" end_line"。
function RLNC (n, start_line, end_line)
execute . a:start_line . "," . a:end_line . "s/.\{" . a:n . "}$//"
endfunction
但是当我和一个函数做同样的事情并在vim中调用它时
:call RLNC(3, 128, 203)
这是我在这里做的实际操作
:start_line,end_lines/.\{n}$//
这只不过是
:128,203s/.\{3}$//
请帮我找出问题所在。?
它给出了错误
答案 0 :(得分:3)
错误是:
E15: Invalid expression: . a:start_line . "," . a:end_line . "s/.\{" . a:n . "}$//"
所以,第一个时期是可疑的。 :execute
命令采用(一个或多个)表达式。通过.
进行的字符串连接只能在字符串之间完成,而不是在开头。
请离开第一个.
:
execute a:start_line . "," . a:end_line . "s/.\{" . a:n . "}$//"
手动连接很繁琐。更好地使用printf()
:
execute printf("%d,%ds/.\{%d}$//", a:start_line, a:end_line, a:n)
下一个问题是在双引号内,必须对反斜杠进行转义(加倍)。更好地使用单引号:
execute printf('%d,%ds/.\{%d}$//', a:start_line, a:end_line, a:n)
最后,Vim有一个特殊的语法来将范围传递给函数。见:help function-range-example
。您不需要使用它,但它使调用更自然:
:128,203call RLNC(3)
但是,我可能会继续定义一个包含该函数的自定义命令。
:command! -range -nargs=1 RLNC call RLNC(<args>, <line1>, <line2>)
如果你的功能实际上并不复杂,我们现在可以内联这个并完全摆脱这个功能:
:command! -range -nargs=1 RLNC execute printf('%d,%ds/.\{%d}$//', <line1>, <line2>, <args>)
(请注意,如果没有函数,最后一个搜索模式会被破坏。)
答案 1 :(得分:0)
感谢您的回复,我是vim功能的新手。所以我对“:command!
”和所有人都不太了解。所以我把它作为函数放在/.gvimrc文件中,如下所示:
function RLNC (start_line, end_line, n)
if (a:start_line <= a:end_line)
execute printf(':%d,%ds/.\{%d}$//', a:start_line, a:end_line, a:n)
else
execute printf('Start line %d is more than End line %d ', a:start_line, a:end_line)
endif
endfunction
在我的gvim文件中使用:call RLNC(128, 203, 3)
时,它的工作正常。
谢谢你