Bagaimana Anda mendaftar mode minor aktif di emacs?

105

Bagaimana Anda mendaftar mode minor aktif di emacs?

Hanya baca
sumber

Jawaban:

125

C-h matau M-x describe-modemenampilkan semua mode minor aktif (dan mode mayor) dan penjelasan singkat masing-masing.

Phil
sumber
21

Daftar semua perintah mode minor disimpan dalam variabel minor-mode-list. Mencari tahu apakah mereka aktif atau tidak biasanya dilakukan dengan memeriksa variabel dengan nama yang sama. Jadi Anda bisa melakukan sesuatu seperti ini:

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

Catatan: ini hanya berfungsi untuk buffer saat ini (karena mode minor mungkin hanya diaktifkan di buffer tertentu).

Trey Jackson
sumber
add-to-list inside map? membelit.
jrockway
4
@jrockway Bukan momen cadel yang paling saya banggakan.
Trey Jackson
Menggunakan boundpalih-alih symbolpAnda dapat menyingkirkan condition-case.
Lassi
4

describe-modeentah bagaimana dapat menampilkan daftar mode minor yang diaktifkan, mengapa saya tidak bisa? Jadi setelah membaca kode sumbernya, saya menyadari bahwa ia mendapat daftar mode minor aktif dari keduanya minor-mode-listdan minor-mode-alist. Menggunakan dash.elpustaka manipulasi daftar pihak ketiga, saya datang dengan kode ini:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)

Jadi, misalnya, untuk menonaktifkan semua mode minor, gunakan -each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
        (funcall it -1))

Jangan lupa untuk menyimpan daftar mode minor dalam variabel, jika tidak, Anda harus memulai ulang Emacs atau mengaktifkannya dengan memori.

Mirzhan Irkegulov
sumber
3

Jika Anda ingin melakukan sesuatu secara terprogram dengan semua buffer yang memiliki mode tertentu aktif, maka solusi bawaan terbaik, paling minimalis, terbersih, adalah sebagai berikut:

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

Itu melakukan hal berikut:

  1. Ambil daftar semua buffer melalui buffer-list, dengan buffer yang saat ini aktif di bagian atas daftar (jadi ini diperlakukan terlebih dahulu, biasanya sesuai keinginan Anda, tetapi biarkancurrent-buffer parameter jika Anda tidak peduli).
  2. Ulangi daftar buffer dan tetapkan setiap nama buffer ke variabel $buf .
  3. Gunakan with-current-buffer $bufuntuk memberi tahu Emacs bahwa semua kode di dalam body harus berjalan seperti jika dijalankan di dalam buffer$buf bukan buffer apa pun yang sebenarnya Anda tampilkan di layar.
  4. when <some mode variable>adalah cara yang benar untuk memeriksa apakah suatu mode diaktifkan; Anda juga dapat menggunakan ifdan metode serupa lainnya. Apa pun itu, tujuannya adalah untuk memeriksa apakah variabel mode utama minor atau mode utama disetel dalam buffer. Hampir semua mode mendefinisikan variabel melalui "mendefinisikan" mode, yang secara otomatis menyebabkan mereka membuat variabel buffer-lokal dinamai mode, yang merupakan cara kerjanya. Dan jika mereka tidak memiliki variabel standar, lihat kode sumber mereka sendiri untuk melihat bagaimana kode "toggle" mereka menentukan cara mengaktifkan dan menonaktifkannya. 99% dari mereka menggunakan keberadaan variabel modename mereka (dan jika tidak, saya sarankan untuk melaporkannya sebagai bug ke pembuat mode). Misalnya, untuk memeriksa apakah buffer memiliki whitespace-mode aktif, Anda akan berkata when whitespace-mode.
  5. Setelah itu, ia hanya mengeluarkan pesan ke buffer Pesan, dengan "x" dan nama buffer yang memiliki mode aktif. Di situlah Anda akan meletakkan kode Anda sendiri, untuk melakukan apa pun yang ingin Anda lakukan dengan buffer yang ditemukan.

Nikmati! Maju ke kode cadel yang lebih besar dan lebih bersih!

gw0
sumber
2

Berikut ini cuplikan alternatif sederhana yang mirip dengan beberapa metode yang telah dibahas di jawaban lain:

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
daftar hukum
sumber