Python 在进入正常模式或ESC地图时触发光标定位和选择
有人知道,在正常工作时,如何从python触发光标定位和选择 这是一个问题,我不得不注释掉ESC映射 相关插件源代码如下:Python 在进入正常模式或ESC地图时触发光标定位和选择,python,vim,vim-plugin,Python,Vim,Vim Plugin,有人知道,在正常工作时,如何从python触发光标定位和选择 这是一个问题,我不得不注释掉ESC映射 相关插件源代码如下: # -*- coding: utf-8 -*- import re import vim #How can we fetch the first param on going to normal Mode without problems?! vim.command( "inoremap <silent> <buffer> <esc>
# -*- coding: utf-8 -*-
import re
import vim
#How can we fetch the first param on going to normal Mode without problems?!
vim.command( "inoremap <silent> <buffer> <esc> <c-\><c-n>:py clang_complete.firstParam()<cr>" )
r = re.compile( "@[^@]+\$" )
def firstParam():
line = vim.current.line
row, col = vim.current.window.cursor
result = r.search(line)
if result is None:
vim.command('call feedkeys("\<esc>", "n")')
return
selectParams( *result.span() )
def selectParams( start, end ):
row, _ = vim.current.window.cursor
vim.current.window.cursor = row, start
isInclusive = vim.options["selection"] == "inclusive"
vim.command( 'call feedkeys("\<c-\>\<c-n>v%dl\<c-g>", "n")' %
( end - start - isInclusive ) )
#-*-编码:utf-8-*-
进口稀土
进口维姆
#我们如何在进入正常模式时毫无问题地获取第一个参数?!
命令(“inoremap:py clang_complete.firstParam()”)
r=重新编译(“@[^@]+\$”)
def firstParam():
线路=vim.current.line
行,列=vim.current.window.cursor
结果=r.search(行)
如果结果为无:
命令('调用feedkeys(“\”,“n”))
返回
选择参数(*result.span())
def selectParams(开始、结束):
行,\=vim.current.window.cursor
vim.current.window.cursor=行,开始
isInclusive=vim.options[“selection”]=“inclusive”
vim.命令('call feedkeys(\\v%dl\,'n')'%
(结束-开始-包括在内)
ESC映射在终端插入模式下会出现箭头键问题,提供自动命令效果不佳,操作速度比映射慢得多,并且没有正确设置光标定位以进行选择,因此选择位于错误的位置
我也考虑了另一种方法来做同样的事情。
TL;DR、
set ttimeout=100(或更少)和InsertLeave auto命令将更快地被处理(具体地说,是在这么多毫秒内)
:imap
ing
将导致光标键和功能键在插入模式下停止工作,因此不要这样做。有了改进的超时,使用InsertLeave自动命令应该是一种方法。我会尽力帮你解决你提到的光标定位问题,但是没有足够的解释来解决这个问题
vim中有许多与按下Esc响应相关的设置。Vim可能会因为两个主要原因而退出:
用户自己按了escape,或
用户按下箭头键或功能键,产生转义序列
当vim在插入模式下看到一个转义时,它不能立即离开插入模式,但必须等待确定它是否是
由功能键生成的转义序列的一部分,或
多键映射的一部分
为了实现快速转义处理的终极效果,您可以设置选项noesckeys,该选项在插入模式下关闭对特殊钥匙
、
、
等的识别。当vim处于兼容模式(没有vimrc时得到的)时,这是默认行为,并解释了为什么会立即处理InsertLeave自动命令。文档注意到,esckeys设置不会影响映射的处理,从而导致第二个主题
Vim允许您为键序列创建映射,即使该序列的某个前缀已映射到某个其他操作(由另一个用户映射或默认操作)。当vim看到一个键时,它将查看是否有以该键开始的映射。如果只有一个,并且它本身就是密钥,则可以立即处理映射。如果有多个以键开头的映射,那么vim必须等待,看看您是否完成了其中一个映射
除了上面讨论的esckeys之外,Vim还有几个选项来控制它是否等待以及等待多长时间。这些是
超时,它控制vim是否使用超时来决定映射是否完成李>
ttimeout,控制vim是否使用超时来决定转义序列是否完成李>
timeoutlen,它控制vim等待查看映射是否完成的时间;及
ttimeoutlen,它控制vim等待多长时间以查看转义序列是否完成
当超时关闭(notimeout)时,vim将无限期地等待映射完成。例如,如果设置了notimeout,并且您有一个映射:inoremap-teh\the \
来修复此常见类型(您实际上会在现实生活中为此使用iabbrev
),并且您键入了该映射,则在按下空格键之前,不会向缓冲区添加任何内容,在这种情况下,会发生映射,将
添加到缓冲区;或者按其他键,添加原始的teh
,然后处理下一个键
只有在设置了notimeout时,才会参考ttimeout选项(每当设置超时时,vim都会对这两个选项使用超时)。设置了nottimeout后,vim将在获得转义后无限期等待,以查看它是否是转义序列的一部分。如果您设置了notimeout、nottimeout和showmode,您可以看到,当您在插入模式下按Esc键时,vim将保持在插入模式,直到按下某个不属于转义序列的其他键。一个愚蠢的技巧是用这些设置键入EscO*D(确保您在xterm中),然后看着光标向左移动
最后,当使用超时时,vim使用timeoutlen和ttimeoutlen来决定等待多长时间。默认设置为timeoutlen=1000
,表示一秒钟的超时;以及ttimeoutlen=-1
,表示使用timeout的值。现在,一秒钟对于映射来说是可以的,但是比识别转义序列所需的时间要长得多。Vim在看到退出和相关超时过期之前不会真正离开插入模式。奇怪的是,vim会在看到逃生后立即移除showmodeinsert mode指示灯,而不是fire InsertLeave指示灯,直到超时时间过去(如果有地图显示,则会将指示灯添加回去)