gpt4 book ai didi

vim - 检查 Vim 中当前是否有来自命令调用的函数的事件视觉选择

转载 作者:行者123 更新时间:2023-12-04 12:14:05 25 4
gpt4 key购买 nike

情况#1:我刚刚选择了一个文本块。然后我输入“:Command”,它会调用一些函数。

情况#2:当前没有视觉选择(尽管我之前可能在编辑 session 中进行了这样的选择)。我输入“:Command”,它调用(相同的)函数。

是否有(稳健的)方法可以从函数内部区分上述两种情况?我试过 mode() ,但问题是在这两种情况下我都处于命令模式,尽管在第一种情况下我从可视模式进入命令模式而在第二种情况下从正常模式进入。也许通过检查a:firstline/a:lastline/v:count ?

更新 -- 用例示例:“: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) 上遇到了问题。我使用“ <"/">”标记重新创建从视觉选择中收集数字。但我只想在当前突出显示/事件的视觉选择时执行此操作。

也许我的整个逻辑是错误的,有没有更好的方法来设计这个功能?

最佳答案

如果您需要使用命令,我看到的唯一方法是检查 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()

更新 : 可视模式在命令模式下永远不会激活。绝不。仅仅因为命令模式不是视觉模式。使用映射是实现您想要的唯一方法,这里有两种方法:您对所有模式使用完全相同的 expr 映射并检查 mode()在这个表达式的某个地方,或者你为不同的模式定义不同的映射,并使用这些差异来告诉函数从什么模式调用它。

关于vim - 检查 Vim 中当前是否有来自命令调用的函数的事件视觉选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4316193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com