Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在进入正常模式或ESC地图时触发光标定位和选择_Python_Vim_Vim Plugin - Fatal编程技术网

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>

有人知道,在正常工作时,如何从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> <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将在获得转义后无限期等待,以查看它是否是转义序列的一部分。如果您设置了notimeoutnottimeoutshowmode,您可以看到,当您在插入模式下按Esc键时,vim将保持在插入模式,直到按下某个不属于转义序列的其他键。一个愚蠢的技巧是用这些设置键入EscO*D(确保您在xterm中),然后看着光标向左移动

    最后,当使用超时时,vim使用timeoutlenttimeoutlen来决定等待多长时间。默认设置为
    timeoutlen=1000
    ,表示一秒钟的超时;以及
    ttimeoutlen=-1
    ,表示使用timeout的值。现在,一秒钟对于映射来说是可以的,但是比识别转义序列所需的时间要长得多。Vim在看到退出和相关超时过期之前不会真正离开插入模式。奇怪的是,vim会在看到逃生后立即移除showmodeinsert mode指示灯,而不是fire InsertLeave指示灯,直到超时时间过去(如果有地图显示,则会将指示灯添加回去)