>> 古い記事: 雑メモ: オレオレフィードリーダ(書きかけ)
<< 新しい記事: hi-list.el: カーソルを含んでいるリストを常時ハイライトするマイナーモード

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Emacs Lisp: マイナーモード終了時に指定した処理を行う

マイナーモード終了(or 解除・無効化)時にフックして 任意の処理を実行させる方法についてのメモとサンプル。

メジャーモードについては after-change-major-mode-hook というフックがあるが (参考: Elisp メモ: メジャーモードを切り替えるタイミングで処理を実行させる)、 マイナーモードにはそのようなフックは用意されていないらしい。

では、たとえばマイナーモード開始時にある処理のインターバル処理を開始し、 終了時にその処理を停止させたいといった場合は どうすればいいのか。


というわけで調べてみたところ、次の記事が見つかった(英語)。
An Emacs Minor Mode | Time Poor Blogger

マイナーモードを作成する方法はいくつかあるが、 ここでは define-minor-mode を使う。

コマンド foo-mode を実行すると、マイナーモード変数 foo-mode の値に応じて 開始・終了処理を定義した関数を呼び出し、 foo-mode の有効/無効をトグルする。

そこで、モード終了時に実行したい処理を終了処理用の関数に書いておく。

サンプル


(defvar foo-mode nil)
(defvar foo-mode-timer nil)

;; F12 でモードをトグル
(global-set-key (kbd "<f12>") 'foo-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; モード開始時に呼ばれる
(defun foo-mode-start ()
  ;; カーソルを動かすなどの操作をした 0.1秒後に
  ;; 現在時刻を挿入
  ;; Javascript の setInterval みたいなもの
  (setq foo-mode-timer
        (run-with-idle-timer
         0.1
         t
         (lambda ()
           (insert
            (format-time-string "<%T>" (current-time)))))))

;; モード終了時に呼ばれる
(defun foo-mode-stop ()
  (cancel-timer foo-mode-timer))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define-minor-mode foo-mode
  "foo mode"
  :lighter " foo" ; for mode line
  (if foo-mode
      (foo-mode-start)
    (foo-mode-stop)))

emacs-version ;=> "23.0.91.1"

>> 古い記事: 雑メモ: オレオレフィードリーダ(書きかけ)
<< 新しい記事: hi-list.el: カーソルを含んでいるリストを常時ハイライトするマイナーモード
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。