如何在一行上定义 vim 函数?

如何在一行上定义 vim 函数?

由于|用于分隔命令,所以我认为我可以这样做:

:function! SomeFunc() | return 0 | endfunction

当我在单独的行上输入它时,它工作正常(输入第一行会导致它提示输入剩余的行):

:function! SomeFunc()
  return 0
endfunction

我现在看到这个警告:help :bar

这些命令将 '|' 视为它们的参数,因此不能在其后跟另一个 Vim 命令:

:功能

有什么办法可以解决这个问题吗?

我看见它说的是...

您还可以使用 来分隔命令,方式与 '|' 相同。要插入,请使用 CTRL-V CTRL-J。将显示“^@”。

但这也不起作用:

:function! SomeFunc() <NL> return 0 <NL> endfunction

它给出了这个错误:

E488: Trailing characters

如果我手动输入 CTRL-V CTRL-J 序列,则会起作用:

:function! SomeFunc() ^@ return 0 ^@ endfunction

但这仍然不是一个可接受的解决方案,因为我希望能够简单地复制并粘贴命令function!,然后按 Enter...

答案1

一种选择是使用exe

exe ":function! SomeFunc() \n return 0 \n endfunction"

双引号字符串将这些\n字符解释为换行符。这意味着您应该小心转义任何特殊序列。

话虽如此,

我希望能够简单地复制并粘贴函数!命令并按 Enter...

正如 romainl 所说,你的最终目标不明确。如果你出于某种原因经常这样做,也许有更好的方法来实现你想要的目标。最好用以下方式描述你的问题为什么您需要这个功能。

答案2

我之所以研究这个问题,是因为我想在将函数添加到 .vimrc 之前,先在 vim 会话中测试一下我在线复制的函数。我试过了,source但这需要文件名。

答案部分中的一条评论说使用:@"。它将运行未命名寄存器中的所有内容。

如果你想运行从网上复制的内容,你可以这样做:@+。但如果你没有安装集成系统剪贴板的 vim,它将无法工作。

另一种无需剪贴板集成即可运行的方法是:normal :<PASTE YOUR COMMAND HERE WITH YOUR SYSTEM HOTKEY>。它以正常模式运行所有内容,就像您自己输入一样,每个换行符将继续到该功能的下一行。

答案3

我在尝试编写插件时遇到了类似(或者可能只是相关)的问题,因此我想在这里为任何感兴趣的人留下建议。

我的问题是,我想要定义一些非常简单的函数,但由于它们非常简单,所以我希望在一行中定义它。例如,这是一个检查行号是否有效的函数:

function! ValidLine(line_number)
    return line_number>=1 && line_number<=line("$")
endfunction

这个函数非常简单,不需要任何文档来解释,但它却占用了 3 行。当然,参考前面的答案,可以这样定义它:

exec "function! ValidLine(line_number) \n return line_number>=1 && line_number<=line('$') \n endfunction"

但是突然间,一个不需要解释的简单函数变成了一个长字符串(没有语法高亮),难以阅读。

我的解决方案是使用 Vim 的 lambda 表达式。因此该函数将如下所示:

let valid_line = { line_number -> line_number>=1 && line_number<=line('$') }

现在您有了一个函数引用valid_line(注意,它不需要大写),可以像任何普通函数一样使用。它不仅在一行中定义,而且语法也更加简洁。

相关内容