5

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

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

我喜欢使用选项作为元,当我在毒蛇中时,我不在乎让 ESC 成为元。

有人对如何在毒蛇模式下完全禁用 ESC 作为元数据有任何建议吗?

这是我尝试过的一些相关选项。这些都不能解决问题。

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

4 回答 4

3

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

在查看了 viper 的源代码后,我意识到与我找到的所有文档相反的viper-translate-all-ESC-keysequences是一个函数。所以设置一个同名的变量不会做任何事情。

所以现在我的 .emacs 文件中有(defun viper-translate-all-ESC-keysequences () nil)我的(require 'vimpulse)行。看来我现在可以随心所欲地向我的 ESC 键发送垃圾邮件了。我不知道为什么文档如此具有误导性,但现在我至少可以尝试使用这种解决方法的 emacs。希望这可以帮助!

于 2010-10-30T04:08:57.050 回答
1

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

[参考]

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

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

viper 翻译所有 ESC 键序列t on tty, nil on windowing display 通常,Viper 让 Emacs 只翻译那些在低级 key-translation-map 或 function-key-map 中定义的 ESC 键序列,例如由箭头和功能键发出的那些。其他序列,例如 \e/,被视为 ESC 命令后跟 /。这对于打字速度快并且在敲击 ESC 后往往会立即敲击其他字符的人来说非常有用。其他人喜欢 Emacs 一直翻译 ESC 序列。默认设置是仅在使用哑终端时翻译所有序列。这允许您在插入模式下使用 ESC 作为元键。例如,快速按 ESC x 会产生输入 Mx 的效果。如果您的哑终端不是那么笨并且理解元键,那么您最好将此变量设置为 nil。尝试看看哪种方式最适合您。

于 2011-08-28T16:13:33.900 回答
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

于 2011-11-19T17:19:16.387 回答
0

(defun viper-translate-all-ESC-keysequences () nil)解决方案不适用于在 iTerm2 中运行的终端 emacs -> 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)                                                    
于 2011-04-25T02:40:05.197 回答