情况#1:我刚刚选择了一个文本块。然后我输入“:Command”,它会调用一些函数。
情况#2:当前没有视觉选择(尽管我之前可能在编辑会话中做出了这样的选择)。我输入“:Command”,它调用(相同的)函数。
是否有一种(稳健的)方法可以从函数内部区分上述两种情况?我试过mode()
,但问题是,在这两种情况下,我都处于命令模式,尽管在第一种情况下,我从视觉模式进入命令模式,而在第二种情况下,我是从正常模式进入命令模式。也许通过检查a:firstline
/a:lastline
/v:count
?
Update-- 用例示例:“:Sum
如果存在当前的视觉选择,例如一列数字(块选择)或一系列仅包含数字的行,则此命令将回显数字的总和。否则,它需要一个以空格分隔的数字列表作为参数,并将回显这些数字的总和。基本框架:
command! -nargs="*" -range Sum :call CalcSum(<f-args>)
function! CalcSum(...) range
" 1. collect numbers from visual selection if there is a current active selection
" 2. otherwise, if len(args) > 0, collect numbers from args
" 3. other cases (i.e., no selection and no args or both selection and args) handled reasonably
" 4. sum collection of numbers
" 5. return/echo result
endfunction
步骤 (2)-(5) 很简单。我在(1)方面遇到了麻烦。我用 ”<"/"
>”标记来重新创建从视觉选择中收集数字。但我只想这样做if有一个视觉选择现在突出显示/活动。
也许我的整个逻辑都是错误的,有更好的方法来设计这个功能吗?
如果您需要使用命令,我看到的唯一方法是检查a:firstline
/a:lastline
:
" Assuming that you have passed -range=% when defining command
if a:firstline==1 && a:lastline==line('$')
" Do something
endif
但当您选择整个缓冲区时,情况就不成立了。我建议您使用表达式映射:
function DoCommand()
if mode()!~#"^[vV\<C-v>]"
" Do something. For example, set global variable (and unset it in :Command)
endif
return ':Command'
endfunction
noremap <expr> {lhs} DoCommand()
Update: 视觉模式是never在命令模式下激活。绝不。只是因为命令模式不是视觉模式。使用映射是实现您想要的目标的唯一方法,这里有两种方法:您对所有模式使用完全相同的 expr 映射并检查mode()
在此表达式中的某个位置,或者您为不同模式定义不同的映射,并使用这些差异来告诉函数被调用的模式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)