Как вы перечислите активные второстепенные режимы в Emacs? - PullRequest
100 голосов
/ 03 октября 2009

Как вы перечисляете активные второстепенные режимы в emacs?

Ответы [ 5 ]

114 голосов
/ 03 октября 2009

C-h m или M-x describe-mode показывает все активные второстепенные режимы (и основной режим) и краткое описание каждого.

20 голосов
/ 03 октября 2009

Список всех вспомогательных команд режима хранится в переменной 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)))

Примечание: это работает только для текущего буфера (потому что второстепенные режимы могут быть включены только в определенных буферах).

3 голосов
/ 12 декабря 2014

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 голосов
/ 18 января 2017

Вот простой альтернативный фрагмент, похожий на некоторые из методов, которые уже были рассмотрены в других ответах:

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
1 голос
/ 12 декабря 2016

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

(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» и именем буфера, в котором был активен режим. Вот где вы бы поместили свой собственный код, чтобы делать то, что вы хотели сделать с обнаруженным буфером.

Наслаждайтесь! Вперед к большему и более чистому коду!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...