如何解决从 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
作为输入,TestFunc
将 hello
添加到文档中,如果我从插入模式开始,但是 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)又敲了一个键:
。这就像您在输入提示处于活动状态时敲击空格键一样。您可以通过用其他内容替换尾随空格来测试这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。