Emacsでアクティブなマイナーモードをどのようにリストしますか?
C-h m
またはM-x describe-mode
は、アクティブなすべてのマイナーモード(およびメジャーモード)とそれぞれの簡単な説明を示します。
すべてのマイナーモードコマンドのリストは、変数 minor-mode-list
。それらがアクティブかどうかを確認するには、通常、同じ名前の変数をチェックします。したがって、次のようなことができます。
(defun which-active-modes ()
"Give a message of which minor modes are enabled in the current buffer."
(interactive)
(let ((active-modes))
(mapc (lambda (mode) (condition-case nil
(if (and (symbolp mode) (symbol-value mode))
(add-to-list 'active-modes mode))
(error nil) ))
minor-mode-list)
(message "Active modes are %s" active-modes)))
注:これは、現在のバッファーでのみ機能します(マイナーモードは特定のバッファーでのみ有効になる場合があるため)。
describe-mode
は何らかの方法で有効なマイナーモードのリストを思い付くことができますが、なぜできなかったのですか?そのため、ソースコードを読んだ後、minor-mode-list
とminor-mode-alist
の両方からアクティブなマイナーモードのリストを取得することに気付きました。サードパーティの使用 dash.el
リスト操作ライブラリ
(--filter (and (boundp it) (symbol-value it)) minor-mode-list)
したがって、たとえば、すべてのマイナーモードを無効にするには、 -each
を使用します。
(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
(funcall it -1))
変数にマイナーモードのリストを保存することを忘れないでください。そうしないと、Emacsを再起動するか、メモリで有効にする必要があります。
以下は、他の回答ですでに取り上げられているいくつかのメソッドに似た簡単な代替スニペットです。
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))
特定のモードがアクティブになっているすべてのバッファーでプログラム的にを実行する場合、最適で最も最小限の、最もクリーンな組み込みソリューションは次のとおりです。
(dolist ($buf (buffer-list (current-buffer)))
(with-current-buffer $buf
(when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
(message "x %s" $buf))))
次のことを行います。
buffer-list
を介してすべてのバッファーのリストを取得します。リストの先頭に現在アクティブなバッファーがあります(したがって、通常は必要なものが最初に処理されますが、current-buffer
パラメーターは省略しますお手入れ)。$buf
に割り当てます。with-current-buffer $buf
を使用して、Emacsに、実際に画面に表示しているバッファーではなく、バッファー$buf
内で実行されているようにボディ内のすべてのコードを実行するように指示します。when <some mode variable>
は、モードが有効になっているかどうかを確認する正しい方法です。 if
などのメソッドを使用することもできます。どちらにしても、目標は、マイナーモードまたはメジャーモードのメインモード変数がバッファーに設定されているかどうかを確認することです。ほとんどすべてのモードは、モードを「定義」することで変数を定義します。これにより、自動的にになり、モードにちなんで名付けられたバッファローカル変数が作成されます。また、標準変数がない場合は、独自のソースコードを調べて、「トグル」コードがオンとオフを切り替える方法をどのように決定するかを確認してください。 99%がモード名の変数の存在を使用しています(そうでない場合は、モードの作成者にバグとして報告することをお勧めします)。たとえば、バッファのホワイトスペースモードがアクティブかどうかを確認するには、when whitespace-mode
と言います。楽しい!より大きくよりクリーンなLISPコードへ!