您好我有vimconfig(test.vim):
set nocompatible
vmap t :call Hello()<cr>
fun! Hello() "{{{
echom "I work with selection"
endfunction "}}}
我使用配置运行vim,禁用任何其他设置和插件:
vim -u test.vim test.vim
好的,当我选择多行并按“t”时,函数Hello运行几次。我想为视觉模式制作快捷方式,按键时只能运行一次。但是如何?
答案 0 :(得分:2)
根据您的需要,您有两种选择:
function Hello() range
声明(注意最后一个字)。这样你告诉vim你的函数是自己处理范围(否则假设它在一行上运行,有效地使vim重复它对一个范围内每一行的调用)。这种方式范围可通过a:firstline
和a:lastline
获得,但如果您想获取列,则仍必须使用'<
和'>
标记col()
。 <C-u>
之后立即使用:
清除范围。在可视模式下按:
时,它会启动已插入范围('<,'>
)的命令模式。此范围代表选择中的第一行和最后一行。这种方式仍然可以通过'<
和'>
标记(使用col()
,line()
或getpos()
来获取实际数字)。答案 1 :(得分:1)
在Vim帮助中找到答案:
:help a:firstline
当添加[range]参数时,该函数应该自己处理一个范围。 范围以“a:firstline”和“a:lastline”传递。如果[范围] 排除,“:{range} call”将调用每一行的函数 在范围内,光标位于每行的开头。看到 |功能范围-示例|。光标仍然移动到第一个 范围的行,与所有Ex命令的情况一样。
因此,函数Hello应定义为:
fun Hello() range
echom "I work with selection"
end