viper-auto-indent打破了劣等模式

时间:2009-09-28 16:22:33

标签: emacs viper-mode

作为vim转换器,我已经习惯了viper模式。然而,我发现的一个问题是viper-auto-indent打破了所有劣质模式。当我进入任何类型的低级模式(sql-mode,ess-mode等)并按Enter键时,Enter键实际上不会将命令发送到下级进程并且只给出进程的外观挂。

没有设置viper-auto-indent我遇到的问题是在编写代码时Enter键不会自动缩进,这意味着我需要在输入新行后始终按Tab键,这很烦人。我一直在使用的解决方法是默认启用viper-auto-indent(因为我花了大部分时间编程),然后在进入低级模式缓冲区时禁用它。

有谁知道如何解决这个问题?或者,任何人都可以帮助我使用elisp来切换到内部模式缓冲区时禁用viper-auto-indent,并在非劣质模式缓冲区中启用它?感谢。

2 个答案:

答案 0 :(得分:1)

我认为Emacs的意图是让你使用“C-j”进行换行和缩进,并让Enter留空。

如果您尚未接受,则此未经测试的代码可能有效:

(add-hook 'inferior-ess-mode-hook
               '(lambda () (set (make-local-variable 'viper-auto-indent) nil))

答案 1 :(得分:1)

我无法重现您的问题。我尝试了每个级别的毒蛇模式(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))