从 vnoremap 调用 input() 会添加一个 space

Calling input() from a vnoremap adds a space

考虑以下 vim我已添加到 ftplugin ("~/.vim/ftplugin/tex.vim") 的脚本:

vnoremap ,test <Esc>:call TestFunc(input("input:"))<CR> 
inoremap ,test <Esc>:call TestFunc(input("input:"))<CR>

fun! TestFunc(name)
        execute "normal! i" . a:name
endfun

我的问题是,从可视模式调用它会添加初始白色space,而在插入模式下不会这样做:

如果我在插入模式下键入 ,test,我会在命令行中得到 input:。但是,如果我在可视模式下键入 ,test,我会在命令行中得到 input: 请注意尾随的 space)。

这个 space 然后作为第一个字符添加到 TestFunc 的参数中,这样如果我输入 hello 作为输入,TestFunc 会添加 hello 如果我从插入模式启动到文档,但如果我从可视模式启动 hello

为什么添加了白色space,我该如何去除它?

(我正在使用带有 Vim 8.2 的 MacVim。)

:help input() 说:

Note: When input() is called from within a mapping it will consume remaining characters from that mapping, because a mapping is handled like the characters were typed.

第一行有尾随 space,因此 input()“使用”它,使其成为输入文本的第一个字符。这里的解决方案只是删除尾随 space.

建议的示例 inputsave()inputrestore() 对于这个特定案例来说有点过头了,但系统地使用该模式可能更安全。

FWIW,启用尾随 space 和其他特殊字符的显示始终是一个好主意:请参阅 :help 'list':help 'listchars'

你的第一行

vnoremap ,test <Esc>:call TestFunc(input("input:"))<CR> 

有一个尾随空格。摆脱它,它就会如你所愿。

我想原因如下。第一部分 :call TestFunc(input("input:"))<CR> 告诉 Vim 执行 <CR> 之前的代码。 Vim 按照要求完成工作;它显示输入提示,并记得在给出输入后调用 TestFunc()。但是随后,您(即 vnoremap)又敲了一个键: 。这就像您在输入提示处于活动状态时敲击空格键。您可以通过将尾随空格替换为其他内容来对此进行测试。