在Emacs viper模式下禁用ESC为meta?

时间:2010-07-12 17:49:09

标签: vim emacs escaping viper viper-mode

我是一个长期的vim用户,试图切换到emacs。

我在emacs中使用viper-mode,我一直在键入ESC(退出插入模式),然后键入一个键(比如j)。我打字很快,经常同时打它们。然后Emacs认为我正在点击META-j并运行一个我不打算的功能。

我喜欢使用选项作为meta,并且当我在v蛇中时,不关心ESC曾经是meta。

任何人都有关于如何在viper模式下完全禁用ESC作为meta的建议吗?

以下是我尝试过的一些相关选项。这些都没有解决问题。

(setq viper-no-multiple-ESC t)                                                                                   
(setq viper-translate-all-ESC-keysequences t)                                                                        
(setq viper-fast-keyseq-timeout 0)

4 个答案:

答案 0 :(得分:3)

我在同一条船上,这个问题一直阻止我尝试emacs很长一段时间。但我终于有时间去调查,并认为我有一个解决方案/解决方法。

在查看viper的源代码后,我意识到我发现的所有文档都是正确的,viper-translate-all-ESC-keysequences是一个函数。因此,设置具有相同名称的变量将不起作用。

现在,我的.emacs文件中的(defun viper-translate-all-ESC-keysequences () nil)行后面有(require 'vimpulse)。而且我似乎可以尽可能多地发送我的ESC密钥。为什么文档如此误导我不知道,但是现在我至少可以尝试使用此解决方法的emacs。希望这有帮助!

答案 1 :(得分:1)

以上答案对我不起作用。我查看了viper文档并找到了两个命令(viper-fast-keyseq-timeout)与(viper-ESC-keyseq-timeout)。前者是让Vi模式将由定义的时间分隔的任何键组合解释为Vi宏。后者似乎是我们想要的,这是在vi模式中忽略ESC的特殊含义。将后者设置为0可以解决我的问题。 (iterm2,mac os X lion)

[参考]

viper-ESC-keyseq-timeout 200 on tty,0 on windowing display 由这么多延迟(以毫秒为单位)分隔的转义键序列被解释为命令,忽略了VI中ESC的特殊含义。默认适用于大多数终端。但是,如果您的终端速度非常慢,您可能需要稍微增加它。如果箭头键发出的ESC键序列被解释为单独键入的字符(因此箭头键不起作用),您将知道您的终端是否很慢。使这个值太大会减慢你的速度,所以要克制。

viper-fast-keyseq-timeout 200 以这么多毫秒分隔的关键序列被视为Vi风格的键盘宏。如果将键序列定义为这样的宏,则将执行该键。否则,它将作为普通的键入键序列进行处理。 将此变量设置得太高可能会减慢您的输入速度。将其设置得太低可能会使得很难快速键入宏。

viper-translate-all-ESC-keysequences t on tty,nil on windowing display 通常,Viper允许Emacs仅转换在低级键转换映射或功能键映射中定义的ESC键序列,例如箭头和功能键发出的那些。其他序列,例如\ e /,被视为ESC命令,后跟一个/。这对于快速打字并且在击中ESC之后立即击中其他角色的人来说是有益的。像Emacs这样的其他人一直在翻译ESC序列。默认设置是仅在使用哑终端时转换所有序列。这允许您在插入模式下使用ESC作为元键。例如,快速按ESC x会产生键入M-x的效果。如果您的哑终端不那么愚蠢且理解元键,那么您可能最好将此变量设置为nil。试着看看哪种方式最适合你。

答案 2 :(得分:1)

在控制台模式下(即运行emacs -nw时),我遇到了这个问题。

将以下内容添加到我的init.el似乎是我的解决方案:

(set 'viper-fast-keyseq-timeout 0)
(set 'viper-no-multiple-ESC t)
(defun viper-translate-all-ESC-keysequences () t)

我还需要添加:

maptimeout 0

到我的.screenrc文件,用于在GNU Screen会话中运行emacs,否则问题会重新出现。


此外:

(defun viper-translate-all-ESC-keysequences () nil)

似乎“有效”,但有意外禁用M-样式命令的效果,所以(例如)我在插入模式下无法使用M-/来运行dabbrev-expand

答案 3 :(得分:0)

使用在iTerm2中运行的终端emacs,(defun viper-translate-all-ESC-keysequences () nil)解决方案对我无效 - > ssh到Slackware 11 - >屏幕 - > emacs 22.3.1

我所要做的就是:

(custom-set-variables
  '(viper-translate-all-ESC-keysequences t))

请注意,设置为“t”,而不是“nil”。

然而,我的OSX iTerm2的解决方案 - > emacs 23.2.1,这是修复:

(setq viper-fast-keyseq-timeout 0)