【问题标题】:VIM: Determine if function called from visual-block modeVIM:确定是否从可视块模式调用函数
【发布时间】:2015-05-19 10:33:59
【问题描述】:

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

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

对于精确的功能,幸运的是它在正常/命令模式或可视模式下的行为相同,并选择了一行。显然不止一行 - 来自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

我需要“无法完成”或“循序渐进”的各种答案。没有模糊的 do-this 然后 do-that 然后结束... -fu 还年轻。

【问题讨论】:

  • 你能在你的键映射中传递一个附加参数吗?例如vnoremap TT :call T(1)&lt;CR&gt;nnoremap TT :call T(0)&lt;CR&gt;.

标签: vim


【解决方案1】:

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

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

使用空参数,从正常模式调用函数。否则,传递的字符代表可视模式(即v vs. V vs. ^V)。

【讨论】:

  • 我对此没有任何问题,但是对于命令(从命令行模式调用)我该怎么办? command! ... T call T(...)
  • Ex 命令总是按行工作,就像正常模式一样。如果您像这样定义命令,则可以传入范围:command -range T &lt;line1&gt;,&lt;line2&gt;call T('')
  • 所以要确认一下,这属于“无法完成”类别吗?
  • 正如我所说,命令总是在整个选定的行上工作。您无法轻松确定提供给它的范围是否来自可视模式(即'&lt;,'&gt;)。但是你可以让用户传递一个参数来表明这一点。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2022-01-27
  • 2015-04-17
  • 1970-01-01
  • 2019-01-04
  • 2010-10-21
  • 2021-10-31
  • 2012-09-06
相关资源
最近更新 更多