Bagaimana Anda mendaftar mode minor aktif di emacs?
Bagaimana Anda mendaftar mode minor aktif di emacs?
Jawaban:
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).
boundp
alih-alih symbolp
Anda dapat menyingkirkan condition-case
.
describe-mode
entah 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-list
dan minor-mode-alist
. Menggunakan dash.el
pustaka 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.
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:
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).$buf
.with-current-buffer $buf
untuk 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.when <some mode variable>
adalah cara yang benar untuk memeriksa apakah suatu mode diaktifkan; Anda juga dapat menggunakan if
dan 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
.Nikmati! Maju ke kode cadel yang lebih besar dan lebih bersih!
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))