0

vim の変換者として、viper モードにはかなり慣れてきました。ただし、私が発見した 1 つの問題は、viper-auto-indent がすべての下位モードを壊すことです。何が起こるかというと、何らかの下位モード (sql-mode、ess-mode など) に入って Enter キーを押すと、Enter キーを押しても実際には下位プロセスにコマンドが送信されず、プロセスの外観だけが表示されます。ぶら下がっています。

viper-auto-indent を設定しないと、コードを書くときに Enter キーが自動的にインデントされないという問題があります。つまり、新しい行を入力した後は常にタブを押す必要があり、面倒です。私が使用している回避策は、viper-auto-indent をデフォルトで有効にし (ほとんどの時間をプログラミングに費やしているため)、inferior-mode バッファーに入ったときに無効にすることです。

この問題を解決する方法を知っている人はいますか?あるいは、内部モード バッファに切り替えるときに viper-auto-indent を無効にし、非劣位モード バッファでは有効にする elisp を提供してくれる人はいますか? ありがとう。

4

2 に答える 2

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 に答える
1

問題を再現できません。viper-mode のすべてのレベル (1 ~ 5) と、多くの劣ったプロセスを試しました。とはいえ、実際の質問から、このコードは法案に適合するように見えます。If/when'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 に答える