由于|
用于分隔命令,所以我认为我可以这样做:
: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
(注意,它不需要大写),可以像任何普通函数一样使用。它不仅在一行中定义,而且语法也更加简洁。