从 vnoremap 调用 input() 添加一个空格

问题描述

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

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

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

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

然后将这个空格作为第一个字符添加到 TestFunc 的参数中,因此如果我输入 hello 作为输入,TestFunchello 添加到文档中,如果我从插入模式开始,但是 hello 如果我从可视模式开始。

为什么要添加空格,我该如何去掉它?

(我使用 MacVim 和 Vim 8.2。)

解决方法

:help input() 说:

注意:当从映射中调用 input() 时,它将消耗该映射中剩余的字符,因为映射的处理就像输入字符一样。

您的第一行有一个尾随空格,因此 input() “消耗”它,这使其成为输入文本的第一个字符。在这里,解决方案只是删除该尾随空格。

建议的带有 inputsave()inputrestore() 的示例在此特定情况下有点过分,但系统地使用该模式可能更安全。

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

,

你的第一行

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...