Как вы перечисляете активные второстепенные режимы в 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 коду!