VimL是否有轮询当前视觉选择的方法?
Trevor希望在VimL脚本中创建一个只执行一项操作的函数。
TRUE
。FALSE
。该函数将成为需要展示不同行为的其他函数的插件,具体取决于当前是否存在当前非空的Visual选择(按行或按字符划分) - 有效缓冲区。
答案 0 :(得分:3)
我相信mode()
功能正是您所寻找的。 (来自:h mode()
)
mode()
mode([expr]) Return a string that indicates the current mode.
If [expr] is supplied and it evaluates to a non-zero Number or
a non-empty String (non-zero-arg), then the full mode is
returned, otherwise only the first letter is returned. Note
that " " and "0" are also non-empty strings.
n Normal
no Operator-pending
v Visual by character
V Visual by line
CTRL-V Visual blockwise
s Select by character
S Select by line
CTRL-S Select blockwise
i Insert
R Replace R
Rv Virtual Replace gR
c Command-line
cv Vim Ex mode gQ
ce Normal Ex mode Q
r Hit-enter prompt
rm The -- more -- prompt
r? A :confirm query of some sort
! Shell or external command is executing
This is useful in the 'statusline' option or when used
with remote_expr() In most other places it always returns
"c" or "n".
Also see visualmode().
如果您处于可视模式,将返回v
,V
或CTRL-V
。
然而,此函数几乎总是返回c
或n
,因为当运行ex命令时,视觉选择会立即结束。您可以使用标记'<
和'>
来确定视觉选择的位置。您还可以使用xnoremap
命令确定您是否处于可视化功能中,该命令将标志传递给该函数以表明您处于可视模式。
如果您将函数放在映射中mode()
似乎正常工作。
答案 1 :(得分:2)
正如您的问题是关于民意调查,严格的答案是mode()
。 但轮询仅在状态行评估期间或触发的:autocmd
事件处理程序中发生。
如果您通过自定义映射或命令调用了您隐约引用的其他功能,mode()
对您没有帮助,因为视觉模式已经在调用函数时离开了。正确处理视觉选择的方法如下:
:'<,'>
范围。在极少数情况下,您可能需要创建一个特殊命令来处理视觉选择,例如: :Frobnize
与:FrobnizeVisual
的对比,然后只需使用:normal! gv
来进行选择。:nnoremap <Leader>x :<C-u>call Frobnize(0)<CR>
:xnoremap <Leader>x :<C-u>call Frobnize(1)<CR>
function! Frobnize( isVisualMode )
...
TL / DR:你没有找到这样方便的功能的原因;重新思考你的方法。