emacsでアクティブなマイナーモードをどのようにリストしますか?
6 に答える
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を再起動するか、メモリで有効にする必要があります。
特定のモードがアクティブになっているすべてのバッファーを使用してプログラムで何かを実行する場合、最良の、最もミニマルで、最もクリーンな、組み込みのソリューションは次のとおりです。
(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
ます。- その後、「x」とモードがアクティブになっていたバッファの名前を含むメッセージをメッセージバッファに出力するだけです。ここに独自のコードを配置して、検出されたバッファーでやりたいことを何でも実行します。
楽しみ!より大きく、よりクリーンなlispコードへ!
これは、他の回答ですでに対処されているいくつかのメソッドに似た単純な代替スニペットです。
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))
evil-mode
特定のマイナーモード(たとえば)がバッファでアクティブであるかどうかを知りたいだけの場合は、次のことを評価できます。
(when (member 'evil-mode minor-mode-list)
(message "`evil-mode' is active!"))