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

标签 vim

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

  • 普通模式映射
  • 命令行模式

对于精确的功能,幸运的是它在普通/命令模式或可视模式下都具有相同的行为,并选择了一条线。显然有不止一行 - 来自 a:firSTLine/laSTLine - 该函数不是从正常模式调用的。

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

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

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

我需要各种“无法完成”或“逐步完成”的答案。没有含糊的做这个然后做那个然后完成这个......我厌倦了跳过晦涩的 VIM Goldberg-esque 漏洞只是为了完成任何内置功能不提供的简单任务,老实说我的 vim -fu 还年轻。

最佳答案

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

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

如果参数为空,则该函数是从正常模式调用的。否则,传递的字符表示视觉模式(即 vV^V)。

关于VIM:确定函数是否从可视 block 模式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091614/

相关文章:

linux - `sudoedit` 和 `sudo vim` 有什么区别?

regex - 从行尾到下一行搜索

vim - 通过 Lua 启动 Vim

vim - 在 Vim 中用空行分隔行?

windows - 你如何让一个文件在 Windows 中从 vim 可写?

vim - 在 VIM 中将代码块包装在代码周围

vim - 如何让 Vim 继续要点?

c++ - 我可以让 vim 对没有扩展名的 C++ 头文件进行语法突出显示吗?

vim - 我的 mvim 中的 git diff

macos - git:EOF 处的新空行