这个简单的vim函数有什么问题?

时间:2014-09-30 12:48:49

标签: function vim call

请查看我在/.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}$//

请帮我找出问题所在。?

它给出了错误

2 个答案:

答案 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)时,它的工作正常。

谢谢你