VIM / Python:可视模式/模式检测

时间:2014-11-06 03:55:34

标签: vim

function! Delete() range
python3 << EOF
import vim

vim.command('let x = visualmode()')
mode = vim.eval('x')

EOF
endfunction

我无法在vim(xterm)中正确检测到'mode'。它无法在'视觉''正常'之间切换 - 我总是得到'n'或'^ V',无论我实际处于什么模式。我调用这样的函数:

 :map <kDel> :call Delete()<CR>
:imap <kDel> <Esc>l:call Delete()<CR>
:vmap <kDel> <Esc>:call Delete()<CR>

这些功能究竟是如何使用的?

1 个答案:

答案 0 :(得分:3)

此功能的简化版本(请使用可测试示例):

function! Delete() range
    python << EOF
    import vim

    print vim.eval('visualmode()')

    EOF
endfunction

正是它应该做的事情:

  • 如果最后一个视觉模式是普通的视觉模式,它会回显v
  • 如果最后一个视觉模式是 visual-line 模式,它会回显V
  • 如果最后一个视觉模式是普通的 visual-block 模式,它会回显^V

当然,您可以在实际功能中执行以下操作:

mode = vim.eval('visualmode()')

什么,完全,你期望和完全,你想要实现什么?

---编辑---

来自:help visualmode(),强调我的:

  

结果是一个String,它描述当前缓冲区中使用的 最后 可视模式。

因此很明显visualmode()无法用于了解当前模式。正确的功能是mode()

来自:help mode(),强调我的:

  

这在状态线&#39;中非常有用。选项或使用时   with remote_expr() 在大多数其他地方,它总是返回   &#34; C&#34;或&#34; n&#34;。

因此,在大多数情况下使用直接mode()将毫无用处,正如下面的映射所示,所有这些都会让您在调用mode()之前进入正常模式,因此您总是得到n

function! Delete() range
    python << EOF
    import vim

    print vim.eval('mode()')

    EOF
endfunction

nmap <key> :call Delete()<CR>         --> n
imap <key> <Esc>:call Delete()<CR>    --> n
xmap <key> <Esc>:call Delete()<CR>    --> n

要让mode()返回您想要的值,您需要位于表达式上下文中,这样您无需离开当前模式即可评估内容:

nmap <expr> <key> Delete()            --> n
imap <expr> <key> Delete()            --> i
xmap <expr> <key> Delete()            --> v, V or ^V