Emacs evil-mode, как автоматически изменить состояние insert-state в emacs-state

Мне не нравится состояние insert, поэтому я хочу заменить его emacs-state. Но этот параметр не работает:

(add-hook 'evil-insert-state-entry-hook 'evil-emacs-state)

После нажатия o или cw, я все еще в состоянии insert.

Ответ 1

Расскажи мне, как это работает. Это взлом, который в основном заменяет функцию evil-insert-state на evil-emacs-state. Проблема заключается в том, как выйти из состояния emacs с помощью клавиши escape. Например, эта версия отлично работает, когда я выхожу из состояния emacs с помощью клавиши ESC, но не тогда, когда я пытаюсь сделать то же самое с C-[:

; redefine emacs state to intercept the escape key like insert-state does:
(evil-define-state emacs
  "Emacs state that can be exited with the escape key."
  :tag " <EE> "
  :message "-- EMACS WITH ESCAPE --"
  :input-method t
  ;; :intercept-esc nil)
  )

(defadvice evil-insert-state (around emacs-state-instead-of-insert-state activate)
  (evil-emacs-state))

Ответ 2

Как насчет этого подхода:

(setq evil-insert-state-map (make-sparse-keymap))
(define-key evil-insert-state-map (kbd "<escape>") 'evil-normal-state)

Я использую его, и, похоже, это трюк. И поскольку вы не меняете состояние, вы сохраняете связанные с состоянием конфигурации, такие как цвет курсора и т.д.

Ответ 3

Удивленный никто не опубликовал это еще...

(defalias 'evil-insert-state 'evil-emacs-state)

Все, что пытается вызвать evil-insert-state, просто вызовет evil-emacs-state. Работает для i, a, o, O и т.д.

Ответ 4

Если точка заключается в том, что вы хотите использовать нормальное редактирование Emacs при выполнении задач vi, в которых используется режим вставки, то это позволяет выполнить очистку словаря в режиме вставки. Вероятно, желательно, чтобы клавиша ESC вернула вас в нормальный режим и C-z попала в состояние Emacs; Лев Алексеев опубликовал небольшой бит кода, который делает это:

(setcdr evil-insert-state-map nil)
(define-key evil-insert-state-map
    (read-kbd-macro evil-toggle-key) 'evil-emacs-state)

который я использую и как. Существует два потенциальных недостатка в режиме вставки, а не в режиме emacs:

  • Вы не можете использовать клавишу ESC как другой, префиксный способ ALT-keymapping; и
  • Существует риск (поэтому мне говорят, хотя я этого не встречал), если вы получаете доступ к Emacs через tty, Emacs будет интерпретировать ALT-модифицированные ключи как ESC, за которым следует символ, что дает разницу в в режиме вставки, чем в режиме emacs.

Я не думаю, что проблема серьезная.

Ответ 5

Из документации о evil-emacs-state-entry-hook:

Крючки для запуска при входе в состояние Emacs.

Таким образом, функция evil-emacs-state запускается при вводе emacs-state (с помощью C-z).

Вы можете, однако, сделать это:

(define-key evil-normal-state-map (kbd "i") 'evil-emacs-state)

Теперь проблема заключается в выходе из состояния emacs. Я помню, что в emacs были проблемы с привязкой ESC, поскольку ESC используется как META, а (IIRC) Evil использует некоторый "специальный" код для перехвата ключа ESC.

EDIT: после вашего комментария: этот должен работать:

(fset 'evil-insert-state 'evil-emacs-state)