【问题标题】:Vim: Map Esc Without Affecting Terminal Control CharactersVim:在不影响终端控制字符的情况下映射 Esc
【发布时间】:2014-07-28 22:52:54
【问题描述】:

我正在尝试映射 <Esc> 以关闭 Vim 中的搜索突出显示。问题是终端模拟的带有+Esc的按键会受到影响。

终端发送字符的速度比我输入的快得多。有没有办法在vim中映射键+超时?

4 年前提出了同样的问题,答案是无法完成。这(仍然)是真的吗?

Mapping :nohlsearch to escape key

【问题讨论】:

  • 我确实设置了更快的超时时间,这样我按下的键就不会被解释为终端发送的东西。我不知道如何实现相反的效果。也就是说,要求一些按键后有延迟。
  • 我的 .vimrc 中与 的唯一映射是: nnoremap :noh 这会导致奇怪的行为。例如,在正常模式下按 Escape,等待几秒钟,然后按向上箭头在新行上插入一个 A。特别令人困惑的是,我还设置了 timeout timeoutlen=500 ttimeoutlen=50。
  • 我对帮助表的理解是,如果设置了超时,ttimeout 没有任何作用。我没有在 vimrc 中的任何地方设置 ttimeout,但是如果我检查 :set ttimeout?,它就会设置为 on。
  • 我做:set to? ttimeout? tm? ttm? 并得到timeout ttimeout timeoutlen=250 ttimeoutlen=20,我点击ESC 并且nohls 运行。 Vim 7.4
  • nohls 确实为我运行。问题只是 Esc 键现在获得了不需要的“附加功能”。

标签: vim control-characters


【解决方案1】:

您的麻烦是由某些插件或其他引起的,本机 vim 可以很好地处理这个问题。使用vim --noplugin 启动vim,或者如果这还不够,则使用vim -u NONE(或gvim -U NONE)和:source 绕过你的vimrc:

set nocp                     " life's too short for pure vi-compatibility mode
set timeout ttimeout         " enable separate mapping and keycode timeouts
set timeoutlen=250           " mapping timeout 250ms  (adjust for preference)
set ttimeoutlen=20           " keycode timeout 20ms
nno <ESC> :nohls<CR>

我从未见过也无法重现您所描述的干扰,所以我不知道是什么原因造成的,我只能建议使用您的插件集进行二进制搜索。

【讨论】:

  • 我相信你是对的,它是我的 vimrc 中的一个插件或其他东西导致了奇怪的东西。当我摆弄设置时,这些症状以某种方式“自行修复”......
  • 两个答案都很好,但是在完全复制超时设置之后,就像一个健全性检查一样,jk 在启动时删除东西之类的奇怪东西似乎停止了。
【解决方案2】:

是的,由于 ZyX 在他的回答中给出的原因,这仍然是不可能的。

&lt;Esc&gt; 是“特殊的”,因为它的行为位于像 a 这样的“普通”键(您可以将其映射到任何您想要的)和修饰键(终端使用它来表示许多特殊的&lt;Up&gt; 之类的键)。

安全地映射&lt;Esc&gt; 以执行任何其他/超过&lt;Esc&gt; 的操作可能的,但您必须noremap 所有受影响的键。这是我在vimrc 中为减轻这种副作用而提供的内容:

nnoremap <Esc>A <up>
nnoremap <Esc>B <down>
nnoremap <Esc>C <right>
nnoremap <Esc>D <left>
inoremap <Esc>A <up>
inoremap <Esc>B <down>
inoremap <Esc>C <right>
inoremap <Esc>D <left>

【讨论】:

  • 那么它对我有什么作用呢? these timeouts:nno &lt;ESC&gt; :nohls&lt;CR&gt;,我有一个不寻常键码的映射,当然还有正常的键码,一切正常。
  • @jthill,&lt;Esc&gt; 映射成功地为我、OP 和大概每个人禁用了搜索突出显示。这不是问题所在,这里。 OP的问题是映射有副作用(延迟和箭头被破坏)并且玩timeoutttimeouttimeoutlenttimeoutlen似乎没有解决任何问题。我也在 7.4,尝试你的价值观在这里不起作用。
  • 然后还有其他事情发生。试试vim -u NONE。 (:set nocp 很好,没有相关变化)。
  • @jthill,确实有些不对劲:您的 timeout/ttimeout 设置消除了 -u NONE 的副作用。我建议您将其发布为答案,并解释其工作原理。
猜你喜欢
  • 2010-10-20
  • 2016-03-02
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多