作为一个vim的转换者,我已经相当习惯了viper模式。然而,我发现的一个问题是,viper-auto-indent会破坏所有的低级模式。当我进入任何一种下级模式(sql-mode、ess-mode等)时会发生什么。然后按Enter,Enter键实际上并没有将命令发送到下级进程,而是给出了进程挂起的外观。
在没有设置viper-auto-indent的情况下,我遇到了在编写代码时Enter键不能自动缩进的问题,这意味着我需要在输入新行后总是按tab键,这很烦人。我一直使用的变通方法是在默认情况下启用viper-auto-indent (因为我花了大部分时间进行编程),然后在进入次模式缓冲区时禁用它。
有人知道如何解决这个问题吗?或者,有没有人可以帮我提供elisp,在切换到内部模式缓冲区时禁用viper-auto-indent,并在非低级模式缓冲区中启用它?谢谢。
发布于 2009-09-29 09:05:45
我认为Emacs的目的是让您使用"C-j“进行换行和缩进,让Enter保持原样。
如果您还不能接受,那么这个未经测试的代码可能会起作用:
(add-hook 'inferior-ess-mode-hook
'(lambda () (set (make-local-variable 'viper-auto-indent) nil))
发布于 2009-10-01 15:50:40
我无法重现你的问题。我尝试了所有级别的毒蛇模式(1-5),以及一些较低级别的进程。也就是说,从您的实际问题来看,此代码看起来应该符合要求。如果/当调用'viper-autoindent
时,如果当前缓冲区有一个进程,它将调用刚刚按下的键的原始绑定。如果没有进程,则调用原始的viper-autoindent。
(defadvice viper-autoindent (around viper-autoindent-but-not-when-buffer-has-process activate)
"work around reported user problem"
(if (and (this-command-keys)
(get-buffer-process (current-buffer)))
(let* ((viper-mode nil)
(thiskey (key-binding (this-command-keys))))
(when thiskey
(call-interactively thiskey)))
ad-do-it))
https://stackoverflow.com/questions/1487971
复制相似问题