Не позволяйте Emacs Evil переключаться в нормальный режим при выходе из минибуфера

Я злой пользователь Emacs. Однако на самом деле я использую нормальный режим только для причудливых правок в стиле Vim, когда считаю их более удобными, чем обычные команды Emacs. (В основном причудливое массовое редактирование/дергание/удаление). Тем не менее, я также большой пользователь минибуфера (я часто использую M-x с ido и flx, чтобы не запоминать более эзотерические команды). Когда я это делаю, зло автоматически переключается в нормальный режим после того, как я выхожу. Я нахожу это очень раздражающим/сбивающим с толку. Как я могу остановить его? (желательно элегантным, не хакерским способом).

Спасибо, PythonNut

РЕДАКТИРОВАТЬ:

Получается, что переход в нормальный режим происходит во всех окнах и во всех фреймах.


person PythonNut    schedule 29.07.2013    source источник
comment
Собственно, при осмотре. Похоже, что переход в обычный режим происходит при входе в минибуфер, а не при выходе из него. Интересно, что в содержимом minibuffer-setup-hook нет никаких вредоносных ловушек. его содержимое (minibuffer-depth-setup icicle-minibuffer-setup ido-minibuffer-setup auto-indent-minibuffer-hook rfn-eshadow-setup-minibuffer minibuffer-history-isearch-setup minibuffer-history-initialize)   -  person PythonNut    schedule 08.08.2013


Ответы (2)


Я не могу воспроизвести вашу проблему; возможно, знание ваших версий может помочь кому-нибудь определить вашу проблему. Можете ли вы воспроизвести свою проблему с помощью «emacs -q» (плюс добавление зла в путь загрузки)?

Вот подход к выявлению порочного (традиционное английское значение) фрагмента кода, если таковой имеется, который вызывает evil-normal-state:

(defadvice evil-normal-state (before debug-issue activate)
  (setq debug-on-error t)
  (inexisting-function-will-fail))

Оцените это сразу после установки буфера в состояние зла, которое вы хотите, а затем перейдите к минибуферу с помощью M-x. Есть ли трассировка стека?

person juanleon    schedule 23.10.2013
comment
В emacs -Q этого не происходит. Я получаю сообщение об ошибке: Error in post-command-hook (evil-mode-check-buffers): (void-function ...) - person PythonNut; 24.10.2013
comment
Хорошо, я нашел проблему с помощью бинарного поиска. Я завернул зло в свой собственный глобальный режим, чтобы зло было везде. Как я могу получить поведение глобального режима без него? - person PythonNut; 24.10.2013
comment
Исправил сам :). Вы выигрываете награду. - person PythonNut; 24.10.2013

Вы можете повторно активировать злой режим, добавив любую функцию, которую вы используете для его активации, в minibuffer-exit-hook.

person juanleon    schedule 29.07.2013
comment
Что бы ни происходило, это происходит после вызова minibuffer-exit-hook. (add-hook 'minibuffer-exit-hook 'evil-emacs-state) не останавливает переход в обычный режим. - person PythonNut; 07.08.2013
comment
Я не знаком со злом, поэтому не могу комментировать evil-emacs-state, но как насчет использования этого в хуке (run-with-timer 0.2 nil 'evil-emacs-state) (с лямбдой). Это своего рода хак: код будет выполняться через 0,2 секунды после выхода из минибуфера. - person juanleon; 07.08.2013
comment
Это работает, но зло по-прежнему не понимает состояния. Моя модель окрашена состоянием зла, и она все еще находится в нормальном режиме, хотя на самом деле зло находится в режиме вставки. - person PythonNut; 22.10.2013