VIM:判断函数是否从可视块模式调用

3

如何在函数内部确定该函数是从可视块模式调用的?这涉及到从以下两个方面调用函数:

  • 正常模式映射
  • 命令行模式

对于精确的函数,幸运的是它在普通/命令模式或选择单行的可视模式下表现相同。显然,如果有多行 - 来自 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>

使用visual-line模式的输出(注意疯狂的max-int输出):

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

我需要的答案要么是“无法完成”,要么是“逐步操作”。不要给我含糊不清的这样做,然后那样做,最后用这个完成...我已经厌倦了为了完成任何内置功能都必须跳过晦涩难懂的VIM Goldberg式漏洞,而且说实话,我的vim技能还很菜。


你可以在键映射中传递一个附加参数吗?例如:vnoremap TT :call T(1)<CR>nnoremap TT :call T(0)<CR> - Michael Anderson
1个回答

7
只需像这样调用您的函数:
vnoremap TT :call T(visualmode())<CR>
nnoremap TT :call T('')<CR>

如果没有传入参数,该函数将从正常模式下调用。否则,传递的字符表示可视化模式(即vV^V的区别)。


我对此没有问题,但是对于命令(从命令行模式调用)该怎么办?command! ... T call T(...) - user19087
Ex 命令始终按行处理,就像正常模式一样。如果您像这样定义命令,则可以传递范围:command -range T <line1>,<line2>call T('') - Ingo Karkat
所以确认一下,这属于“无法完成”的类别? - user19087
正如我所说,命令总是在整个选定行上工作。你不能轻易确定它所提供的范围是否来自可视模式(即'<,'>)。但你可以让用户传递一个参数来指示。 - Ingo Karkat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接