繁体   English   中英

在Emacs毒蛇模式下将ESC禁用为meta吗?

[英]Disable ESC as meta in Emacs viper mode?

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

我在emacs中使用viper-mode ,并且继续输入ESC(退出插入模式),然后输入一个键(例如j )。 我打得很快,经常同时打他们。 然后,Emacs认为我遇到了META-j并运行了我不想要的功能。

我喜欢将option用作meta,并且在我处于毒蛇状态时,不必在意将ESC变成meta。

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

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

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

我当时在同一条船上,这个问题一直使我无法尝试emacs。 但是我终于有一些时间进行调查,并认为我有解决方案/解决方法。

看了viper的源代码之后,我意识到,在我发现的所有文档中, viper-translate-all-ESC-keysequences都是一个功能。 因此,设置具有相同名称的变量将无济于事。

所以现在我的.emacs文件中的(require 'vimpulse)行之后有(defun viper-translate-all-ESC-keysequences () nil) 看来我现在可以随意发送我的ESC密钥了。 为什么我不知道文档为什么如此令人误解,但是到目前为止,我至少可以尝试使用此替代方法来尝试emacs。 希望这可以帮助!

以上答案对我不起作用。 我查阅了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风格的键盘宏。 如果键序列定义为这样的宏,它将被执行。 否则,将其作为普通的键入键序列处理。 将此变量设置得太高可能会减慢您的键入速度。 设置得太低可能会导致很难足够快地键入宏。

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

这个问题发生在控制台模式下(即,在运行emacs -nw )。

在我的init.el添加以下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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM