首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否在Emacs viper模式下将ESC作为元禁用?

是否在Emacs viper模式下将ESC作为元禁用?
EN

Stack Overflow用户
提问于 2010-07-13 01:49:09
回答 4查看 1.5K关注 0票数 5

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

我在emacs中使用viper-mode,并且一直在键入ESC (以退出插入模式),然后键入一个键(比如j)。我打字很快,经常同时打字。然后Emacs认为我正在访问META-j,并运行了一个我不想要的函数。

我喜欢使用选项作为元,并不关心当我在毒蛇中的时候ESC是元。

有谁有建议在毒蛇模式下完全禁用ESC的meta吗?

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

代码语言:javascript
复制
(setq viper-no-multiple-ESC t)                                                                                   
(setq viper-translate-all-ESC-keysequences t)                                                                        
(setq viper-fast-keyseq-timeout 0)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-30 12:08:57

我也处于同样的境地,这个问题已经阻碍我尝试emacs很长一段时间了。但我终于有了一些时间来研究,并认为我已经有了一个解决方案/变通方法。

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

因此,现在我在.emacs文件中的(require 'vimpulse)行后面有了(defun viper-translate-all-ESC-keysequences () nil)。似乎我现在可以随心所欲地发送我的ESC密钥了。我不知道为什么文档如此具有误导性,但至少现在我可以尝试使用emacs来解决这个问题。希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2011-08-29 00:13:34

上面的答案对我不起作用。我查阅了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 Esc键序列被如此多的延迟(以毫秒为单位)分隔,被解释为命令,忽略了VI中ESC的特殊含义。默认值适用于大多数终端。但是,如果您的终端非常慢,您可能希望略微增加这个值。如果箭头键发出的ESC键序列被解释为单独键入的字符,您就会知道终端是否很慢(因此箭头键将不起作用)。让这个值太大会减慢你的速度,所以要保持克制。

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-11-20 01:19:16

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

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

代码语言:javascript
复制
(set 'viper-fast-keyseq-timeout 0)
(set 'viper-no-multiple-ESC t)
(defun viper-translate-all-ESC-keysequences () t)

我还需要添加:

代码语言:javascript
复制
maptimeout 0

添加到我的.screenrc文件中,以便在GNU Screen会话中运行emacs,否则问题将再次出现。

另外:

代码语言:javascript
复制
(defun viper-translate-all-ESC-keysequences () nil)

看起来很“有效”,但却意外地禁用了M-样式的命令,因此(例如)我在插入模式下不能使用M-/来运行dabbrev-expand

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3230804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档