从 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)又敲了一个键:
。这就像您在输入提示处于活动状态时敲击空格键。您可以通过将尾随空格替换为其他内容来对此进行测试。
考虑以下 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)又敲了一个键:
。这就像您在输入提示处于活动状态时敲击空格键。您可以通过将尾随空格替换为其他内容来对此进行测试。