在Emacs viper模式下禁用ESC作为元键?

5

我是一个长期使用vim的用户,现在尝试转向emacs。

我在emacs中使用viper模式,并且经常会先按ESC(退出插入模式),然后再按一个键(比如j)。由于我打字很快,经常同时按下这两个键。然后Emacs就认为我按下了META-j,运行了一个我不想要的函数。

我喜欢将Option键作为Meta键,在viper模式下不希望将ESC作为Meta键。

有没有人有关于如何完全禁用viper模式下ESC作为Meta键的建议?

这里有一些相关的选项,但都不能解决这个问题。

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

你从vim转向emacs,但你还打上了vim的标签?这就像邀请一群vim高手来一次“愉快”的交谈。 - Jeffrey Jose
4个回答

3

我曾经遇到同样的问题,这个问题一直阻止我尝试使用emacs。但是最近我有些时间去调查,认为我已经找到了一个解决方案/变通方法。

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

所以现在,在我的.emacs文件中,在(require 'vimpulse)行之后加入(defun viper-translate-all-ESC-keysequences () nil)。现在似乎我可以随意按ESC键了。我不知道为什么文档如此误导人,但现在至少我可以用这种变通方法尝试emacs。希望这能帮到你!


1
我不知道你们两个在使用哪个版本的emacs,但是你们的解决方案对我没有用。 - huyz

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


1
以上的答案对我没有用。我查阅了Viper文档,找到了两个命令(viper-fast-keyseq-timeout)和(viper-ESC-keyseq-timeout)。前者是让Vi模式解释由定义时间分隔的任何键组合为Vi宏。后者似乎是我们想要的,即忽略vi模式中ESC的特殊含义。将后者设置为0可以解决我的问题。(iterm2,mac os X lion)
[参考]
viper-ESC-keyseq-timeout在tty上为200,在窗口显示上为0 由此间隔(以毫秒为单位)分隔的转义键序列被解释为命令,忽略VI中ESC的特殊含义。默认值适用于大多数终端。但是,如果您的终端非常慢,您可能需要稍微增加这个值。如果箭头键发出的ESC键序列被解释为单独键入的字符(因此箭头键无法工作),则您将知道您的终端速度很慢。将此值设置得太大会减慢您的速度,因此请谨慎行事。

viper-fast-keyseq-timeout 200 键序列之间的时间间隔被视为 Vi 风格的键盘宏。如果将键序列定义为这样的宏,则将执行它。否则,它将被处理为一系列普通的键入键。 将此变量设置得太高可能会减慢您的打字速度。将其设置得太低可能会使您难以快速输入宏。

viper-translate-all-ESC-keysequences 在 tty 上为 t,在窗口显示上为 nil 通常情况下,Viper 只允许 Emacs 翻译那些在低级别 key-translation-map 或 function-key-map 中定义的 ESC 键序列,例如箭头和功能键发出的那些。其他序列,例如 \e/,则被视为 ESC 命令后跟一个 /。这对于那些打字速度快且倾向于在按下 ESC 后立即击中其他字符的人来说是很好的。其他人喜欢 Emacs 总是翻译 ESC 序列。默认情况下,仅在使用愚蠢终端时才翻译所有序列。这允许您在插入模式下使用 ESC 作为元键。例如,快速按下 ESC x 将具有键入 M-x 的效果。如果您的愚蠢终端不那么愚蠢并且理解元键,则最好将此变量设置为 nil。尝试并查看哪种方式最适合您。


0

(defun viper-translate-all-ESC-keysequences () nil) 这个解决方案在我使用 iTerm2 终端运行的 Emacs 中无法正常工作,通过 ssh 到 Slackware 11 -> screen -> 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)                                                    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接