作为vim转换器,我已经习惯了viper模式。然而,我发现的一个问题是viper-auto-indent打破了所有劣质模式。当我进入任何类型的低级模式(sql-mode,ess-mode等)并按Enter键时,Enter键实际上不会将命令发送到下级进程并且只给出进程的外观挂。
没有设置viper-auto-indent我遇到的问题是在编写代码时Enter键不会自动缩进,这意味着我需要在输入新行后始终按Tab键,这很烦人。我一直在使用的解决方法是默认启用viper-auto-indent(因为我花了大部分时间编程),然后在进入低级模式缓冲区时禁用它。
有谁知道如何解决这个问题?或者,任何人都可以帮助我使用elisp来切换到内部模式缓冲区时禁用viper-auto-indent,并在非劣质模式缓冲区中启用它?感谢。
答案 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))