回答:
すべてのマイナーモードコマンドのリストは、変数に格納されます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)))
注:これは現在のバッファーでのみ機能します(マイナーモードは特定のバッファーでのみ有効になる場合があるため)。
boundp
代わりに使用すると、symbolp
を取り除くことができますcondition-case
。
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を再起動するか、メモリで有効にする必要があります。
特定のモードがアクティブになっているすべてのバッファを使用してプログラムで何かを実行したい場合は、次のように、最適で最もミニマルでクリーンな組み込みソリューションを使用します。
(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コードへ!