VIM: 确定函数是否从可视块模式调用

VIM: Determine if function called from visual-block mode

在一个函数中,如何确定该函数是否是从可视块模式调用的。这涉及从以下两个位置调用函数:

对于精确函数,幸运的是,它在 normal/command 模式或视觉模式下的行为都相同,并且选择了单行。显然不止一行 - 来自 a:firstline/lastline - 该函数不是从正常模式调用的。

现在的问题是我需要知道我是否处于视觉块模式,单行与否。

我尝试了以下所有方法均无济于事:

function! T() range
    echo [a:firstline, a:lastline]
    echo [getpos("'<")[1:2], getpos("'>")[1:2]]
    echo visualmode()
    echo mode()
endfun
vnoremap TT :call T()<CR>
nnoremap TT :call T()<CR>

视觉模式的输出(注意疯狂的 max-int 输出):

[3, 4]
[[3, 1], [4, 2147483647]]
V
n

我需要 "can't be done" 或 "step-by-step" 类型的答案。没有模糊的做这个然后做那个然后完成这个......我厌倦了跳过晦涩的 VIM Goldberg-esque 漏洞只是为了完成任何内置功能不提供的简单任务,老实说我的vim-fu还年轻

只需像这样调用您的函数:

vnoremap TT :call T(visualmode())<CR>
nnoremap TT :call T('')<CR>

参数为空时,函数是从正常模式调用的。否则,传递的字符表示视觉模式(即 v vs. V vs. ^V)。