Vim,如何让vmap快捷方式运行一次?

时间:2013-11-24 13:41:29

标签: vim

您好我有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运行几次。我想为视觉模式制作快捷方式,按键时只能运行一次。但是如何?

2 个答案:

答案 0 :(得分:2)

根据您的需要,您有两种选择:

  1. 使用function Hello() range声明(注意最后一个字)。这样你告诉vim你的函数是自己处理范围(否则假设它在一行上运行,有效地使vim重复它对一个范围内每一行的调用)。这种方式范围可通过a:firstlinea:lastline获得,但如果您想获取列,则仍必须使用'<'>标记col()
  2. <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