0

作为一个 vim 转换者,我已经习惯了 viper 模式。然而,我发现的一个问题是 viper-auto-indent 会破坏所有劣质模式。发生的情况是,当我进入任何一种低级模式(sql-mode、ess-mode 等)并按 Enter 键时,Enter 键实际上并没有将命令发送到低级进程,而只是给出了进程的外观绞刑。

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

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

4

2 回答 2

1

我无法重现您的问题。我尝试了每个级别的 viper-mode (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))
于 2009-10-01T15:50:40.213 回答
1

我认为 Emacs 的意图是让您使用“Cj”进行换行和缩进,并让 Enter 不理会。

如果您还不能接受,那么这个未经测试的代码可能会起作用:

(add-hook 'inferior-ess-mode-hook
               '(lambda () (set (make-local-variable 'viper-auto-indent) nil))
于 2009-09-29T09:05:44.830 回答