emacsでアクティブなマイナーモードをどのようにリストしますか?


回答:


125

C-h mまたはM-x describe-mode、アクティブなすべてのマイナーモード(およびメジャーモード)とそれぞれの簡単な説明を表示します。


21

すべてのマイナーモードコマンドのリストは、変数に格納されます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)))

注:これは現在のバッファーでのみ機能します(マイナーモードは特定のバッファーでのみ有効になる場合があるため)。


マップ内にリストに追加しますか?入り組んだ。
jrockway 2009年

4
@jrockway私の誇り高き瞬間ではありません。
トレイジャクソン

boundp代わりに使用すると、symbolpを取り除くことができますcondition-case
ラッシー2018年

4

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を再起動するか、メモリで有効にする必要があります。


2

特定のモードがアクティブになっているすべてのバッファを使用してプログラムで何かを実行したい場合は、次のように、最適で最もミニマルでクリーンな組み込みソリューションを使用します。

(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))))

次のことを行います。

  1. buffer-list現在アクティブなバッファをリストの先頭にして、を介してすべてのバッファのリストを取得します(最初に処理されるため、通常は必要な処理が行われcurrent-bufferますが、必要がない場合はパラメータを省略してください)。
  2. バッファリストをループして、各バッファ名を変数に割り当てます$buf
  3. with-current-buffer $bufボディ内のすべてのコードは、バッファ内で実行されているかのように実行する必要があることをEmacsに伝えるために使用します$buf実際に画面に表示しなく、します。
  4. when <some mode variable>モードが有効かどうかを確認する正しい方法です。ifと他のそのような方法を使用することもできます。どちらの方法でも、マイナーモードまたはメジャーモードのメインモード変数がバッファに設定されているかどうかを確認することが目的です。ほとんどすべてのモードは、モードを「定義」して変数を定義します。これにより、モードに基づいて名前が付けられたバッファーローカル変数が自動的に作成されます。また、標準変数がない場合は、独自のソースコードを調べて、「トグル」コードがオンとオフを切り替える方法を決定する方法を確認します。それらの99%はモード名の変数の存在を使用しています(使用しない場合は、モードの作者にバグとして報告することをお勧めします)。たとえば、バッファで空白モードがアクティブになっているかどうかを確認するには、と言いwhen whitespace-modeます。
  5. その後、「x」とモードがアクティブであったバッファの名前を付けて、メッセージバッファにメッセージを出力します。発見されたバッファでやりたいことを何でもするために、そこに独自のコードを配置します。

楽しい!より大きく、よりクリーンなlispコードへ!


2

以下は、他の回答ですでに対処されているいくつかのメソッドに似た単純な代替スニペットです。

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.