Как вы указываете активные малые режимы в emacs?
Как вы перечисляете активные второстепенные режимы в emacs?
Ответ 1
C-h m
или M-x describe-mode
отображаются все активные малые режимы (и основной режим) и краткое описание каждого из них.
Ответ 2
Список всех команд второстепенного режима сохраняется в переменной 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
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 или включить их по памяти.
Ответ 4
Вот простой альтернативный фрагмент, похожий на некоторые из методов, которые уже были рассмотрены в других ответах:
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))
Ответ 5
Если вы хотите программно сделать что-то со всеми буферами, имеющими определенный режим, то лучшее, самое минималистичное, самое чистое, встроенное решение выглядит следующим образом:
(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))))
Он выполняет следующие действия:
- Получить список всех буферов через
buffer-list
, с текущим активным буфером в начале списка (поэтому он сначала обрабатывает, как правило, то, что вы хотите, но не учитывайте параметрcurrent-buffer
, если вам все равно). - Прокрутите список буфера и присвойте каждому имени буфера переменной
$buf
. - Используйте
with-current-buffer $buf
, чтобы сообщить Emacs, что весь код внутри тела должен работать так, как если бы он выполнялся внутри буфера$buf
вместо того, что вы действительно отображаете на экране. -
when <some mode variable>
- это правильный способ проверить, включен ли режим; вы также можете использоватьif
и другие подобные методы. В любом случае, цель состоит в том, чтобы проверить, установлена ли в буфере переменная основного режима основного или основного режима. Почти все режимы определяют переменную посредством "определения" режима, который автоматически заставляет их создавать локальную переменную буфера, названную в честь режима, как это работает. И если у них нет стандартной переменной, посмотрите на свой собственный исходный код, чтобы увидеть, как их "переключить" код определяет, как включать и выключать их. 99% из них используют существование своей переменной-имени (и если они этого не делают, я предлагаю сообщить об этом как об ошибке для автора режима). Например, чтобы проверить, имеет ли буфер активный режим в виде пробела, вы должны сказатьwhen whitespace-mode
. - После этого он просто выводит сообщение в буфер сообщений с "x" и именем буфера, в котором активен режим. То, где вы поместили свой собственный код, делать то, что вы хотели сделать с открытым буфером.
Наслаждайтесь! Перейти к большему и понятному lisp коду!