2

この最小限の例に似たイディオムとマクロを使用して、独自の 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)または、モードの切り替えが行われないようにする代わりにエラーを通知するなど、キャンセルを実現するためのよりクリーンな方法はありますか?

4

3 に答える 3

0

ステファンの提案を次のように使用して、変数を使用して、無効化プロセスをキャンセルした結果としてモードが有効になったことをマイナーモード定義に通知しました(実際にはユーザークエリの結果として)。単純にモード変数を に設定するという考えはあえて使用しませんでしたtが、それに対して警告を発するドキュメントはもう見つかりません。(setq foo-mode t)実際に using で新しい variable を削除できるかどうかを確認することは価値があるかもしれませんcanceled-foo-off

(defvar canceled-foo-off nil "Set to `true' if user canceled toggling off foo.")
(make-variable-buffer-local 'canceled-foo-off)

(define-minor-mode foo-mode
  ...
  (if foo-mode
      (if canceled-foo-off
        (setq canceled-foo-off nil) ; Mode was turned back on from cancelling 
      (do-enable-foo)) ; Mode was turned on from scratch
    (do-disable-foo))
  )

(defun do-disable-foo ()
  "Disable foo minor mode"
  (if (not certain-situation)
      ...
    ;; else forms:
    (setq canceled-foo-off t) ; make sure mode starting procedure is not run!
    (foo-mode 1)) ; turning foo mode on again
  )
于 2015-09-28T14:12:35.533 に答える
0

ユーザーがマイナーモードをオフにできないようにするのはとても怖いです。つまり、マイナーモードが壊れているか、動作がおかしい場合は、殺されなければならない壊れた Emacs を残します。あなたが考えている条件は何ですか?

反対の状況 -- 特定の状況下でオンになることを拒否するモード -- はすでに発生しています -- paredit-mode は良い例です。define-minor-mode本体でエラーをスローするだけです。

于 2015-05-15T13:48:42.073 に答える