Як ви перераховуєте активні другорядні режими в 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

4
@jrockway Не найголовніший моїй миті.
Трей Джексон,

Використовуючи boundpзамість symbolpвас, ви можете позбутися від condition-case.
Лассі

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 або включити їх пам'яттю.


3

Якщо ви хочете програмно зробити щось із усіма буферами, у яких активний певний режим, то найкращим, найменмалістичнішим, найчистішим, вбудованим рішенням є таке:

(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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.