【问题标题】:Disable ESC as meta in Emacs viper mode?在 Emacs viper 模式下禁用 ESC 作为元?
【发布时间】:2010-07-12 17:49:09
【问题描述】:

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

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

我喜欢将选项用作元数据,并且当我在 viper 中时,我不在乎让 ESC 成为元数据。

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

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

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

【问题讨论】:

  • vim 切换到emacs 并且你用vim 标记了这个? - 就像邀请 vim 的名人来进行一次不错的对话。

标签: vim emacs escaping viper viper-mode


【解决方案1】:

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

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

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

【讨论】:

  • 我不知道你们两个使用的是哪个版本的 emacs,但你的解决方案对我不起作用。
【解决方案2】:

以上答案对我不起作用。我查阅了 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-translate-all-ESC-keysequences t 在 tty 上,在窗口显示上为零 通常,Viper 让 Emacs 只翻译那些在低级键翻译映射或功能键映射中定义的 ESC 键序列,例如由箭头和功能键发出的那些。其他序列,例如 \e/,被视为 ESC 命令后跟 /。这对于打字速度很快并且在敲击 ESC 后往往会立即敲击其他字符的人来说非常有用。其他人喜欢 Emacs 一直翻译 ESC 序列。默认设置是仅在使用哑终端时翻译所有序列。这允许您在插入模式下使用 ESC 作为元键。例如,快速按 ESC x 会产生键入 M-x 的效果。如果您的哑终端不是那么笨并且理解元键,那么您最好将此变量设置为 nil。试试看哪种方式最适合您。

【讨论】:

    【解决方案3】:

    这个问题在控制台模式下发生在我身上(即在运行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

    【讨论】:

      【解决方案4】:

      (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)                                                    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多