2015-05-15 3 views
2

Я программирования мой собственный Emacs второстепенный режим с помощью идиомы и макросы, подобные этим минимальным, например:Программирование второстепенного режима Emacs: отменить процедуру переключения?

(define-minor-mode foo-mode 
    "Toggle Foo mode." 
    :init-value nil 
    :lighter " Foo" 
    :group 'foo 
    (if foo-mode 
     (do-enable-foo) 
    (do-disable-foo)) 
) 

(defun do-enable-foo() 
    "Enable foo minor mode" 
    (message "Enabling foo...") 
    (if test-something 
     (message "Foo enabled after disabling was canceled!") 
    (message "Foo enabled from scratch")) 
) 

(defun do-disable-foo() 
    "Disable foo minor mode" 
    (message "Disabling foo...") 
    (if (not certain-situation) 
     (message "... done.") ; finish disabling foo 
    ;; else forms: 
    (message "Need to cancel disabling foo!") 
    (foo-mode 1)) ; turning foo mode on again 
) 

В переключени прочь второстепенный режим, может возникнуть 'certain-situation, когда я должен отменить переключая прочь. В настоящее время я думаю, так как я использую макрос define-minor-mode, который я не могу выручить, но просто нужно программно включить режим снова, используя (foo-mode 1), как видно из кода.

Если я иду по этому маршруту, мне придется обрабатывать это по-разному в функции включения do-enable-foo - так что мой первый вопрос заключается в том, как обнаружить этот случай с использованием заполнителя 'test-something в коде выше?

Или, есть ли более чистый способ добиться отмены, например, путем сообщения об ошибке вместо (foo-mode 1), чтобы предотвратить переход режима из режима?

ответ

0

Я закончил с использованием предложений Стефана следующим образом используя переменную, чтобы сигнализировать определению второстепенного режима, что режим был активирован в результате отмены процесса отключения (фактически в результате пользовательского запроса). Я не осмелился использовать идею просто установить переменную режима на t, но я больше не могу найти документацию, которая предостерегает ее. Возможно, стоит посмотреть, действительно ли использование (setq foo-mode t) позволяет мне исключить новую переменную canceled-foo-off.

+0

Почему вы хотите использовать 'setq' вместо' let'? – Stefan

0

Я был бы очень напуган о том, что пользователь не выключит второстепенный режим. Я имею в виду, что если второстепенный режим сломан или плохо работает, вы оставляете их со сломанным Emacs, который должен быть убит. Какое состояние вы думаете?

Противоположная ситуация - режим, который отказывается при включении при определенных обстоятельствах - уже происходит - режим paredit - хороший пример. Он просто выдает ошибку в корпусе define-minor-mode.

+0

Это хорошее предложение, но это не ответ на вопрос. Пожалуйста, переместите это в комментарий. – Chris

1

Если вы хотите отменить «выключить», а не позвонить (foo-mode 1), вы можете просто (setq foo-mode t).

Если по какой-то причине вы действительно хотите вызвать (foo-mode 1) рекурсивно (перо) включить режим, то вы можете сделать это следующим образом:

(defvar foo-mode--reenabling nil) 
.... 
(defun do-enable-foo() 
    (if foo-mode--reenabling 
     ... 
    ...)) 
... 
(defun do-disable-foo() 
    ... 
    (let ((foo-mode--reenabling t)) 
    (foo-mode 1))) 
+0

Я сделал вариацию идеи с переменной и разместил ее ниже. – Linda

Смежные вопросы