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>
这些功能究竟是如何使用的?
答案 0 :(得分:3)
此功能的简化版本(请使用可测试示例):
function! Delete() range
python << EOF
import vim
print vim.eval('visualmode()')
EOF
endfunction
正是它应该做的事情:
v
,V
,^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