web-dev-qa-db-ja.com

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

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

102
Readonly

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

117
Phil

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

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

20
Trey Jackson

describe-modeは何らかの方法で有効なマイナーモードのリストを思い付くことができますが、なぜできなかったのですか?そのため、ソースコードを読んだ後、minor-mode-listminor-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を再起動するか、メモリで有効にする必要があります。

3

以下は、他の回答ですでに取り上げられているいくつかのメソッドに似た簡単な代替スニペットです。

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
2
lawlist

特定のモードがアクティブになっているすべてのバッファーでプログラム的にを実行する場合、最適で最も最小限の、最もクリーンな組み込みソリューションは次のとおりです。

(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コードへ!

1
gw0