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
)。
在一个函数中,如何确定该函数是否是从可视块模式调用的。这涉及从以下两个位置调用函数:
- 普通模式映射
- 命令行模式
对于精确函数,幸运的是,它在 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
)。