viper-auto-indent ломает низшие режимы

Как vim convert, я довольно привык к режиму viper. Однако одна проблема, которую я обнаружил, заключается в том, что авто-отступ viper нарушает все низшие режимы. Что происходит, когда я вхожу в какой-либо низший режим (sql-mode, ess-mode и т. Д.) И нажимаю Enter, клавиша Enter на самом деле не отправляет команду низшему процессу, а просто создает видимость процесса повешение.

Без установки viper-auto-indent у меня возникает проблема, заключающаяся в том, что клавиша Enter не выполняет автоматический отступ при написании кода, а это означает, что мне нужно всегда нажимать клавишу Tab после ввода новой строки, что раздражает. Обходное решение, которое я использовал, - включить авто-отступ в viper по умолчанию (поскольку я провожу большую часть своего времени в программировании), а затем отключить его, когда я вхожу в буфер нижнего режима.

Кто-нибудь знает, как решить эту проблему? В качестве альтернативы, может ли кто-нибудь помочь мне предоставить elisp для отключения viper-auto-indent при переключении в буфер внутреннего режима и включения его в буфере не нижнего режима? Благодарю.

2 ответа

Я не могу воспроизвести вашу проблему. Я пробовал каждый уровень гадюки (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))

Я думаю, что намерение Emacs состоит в том, чтобы вы использовали "Cj" для новой строки и отступа, и позволили Enter оставить в покое.

Если это еще не приемлемо для вас, этот непроверенный код может работать:

(add-hook 'inferior-ess-mode-hook
               '(lambda () (set (make-local-variable 'viper-auto-indent) nil))
Другие вопросы по тегам