В emacs можно получить список родительских режимов для производного режима?Список родительских режимов Emacs
Я нашел производный-режим-p, но это только позволяет проверить, является ли режим производным от другого.
В emacs можно получить список родительских режимов для производного режима?Список родительских режимов Emacs
Я нашел производный-режим-p, но это только позволяет проверить, является ли режим производным от другого.
Каждый symbol has a property list и для производных режимов этот список включает в себя компонент derived-mode-parent
, который указывает, из какого режима он был получен. Кажется, это всего лишь один символ.
(define-derived-mode nst-mode text-mode "Testing")
=> nst-mode
(get 'nst-mode 'derived-mode-parent)
=> text-mode
Я не вижу, как может быть более одного родителя, когда-либо.
Описание: Демонстрация переходной цепи родителей.
(define-derived-mode rope nil "Victim of mouse")
(define-derived-mode mouse rope "Victim of cat")
(define-derived-mode cat mouse "Victim of dog")
(define-derived-mode dog cat "Enough already")
(let ((mode 'dog) parents)
(while mode
(setq parents (cons mode parents)
mode (get mode 'derived-mode-parent)))
(reverse parents))
=> (dog cat mouse rope)
... или просто для удовольствия, рекурсивная версия:
(defun derived-mode-parents (mode)
(and mode
(cons mode (derived-mode-parents
(get mode 'derived-mode-parent)))))
(derived-mode-parents 'dog)
=> (dog cat mouse rope)
Даже если только режим может иметь один прямой родитель, что родитель может иметь родителя свой собственный, который, в свою очередь, может иметь родителя и т. д. – Lindydancer
О да, конечно; просто транзитивно следуйте цепочке, пока не получите один с пустым 'parent-mode-parent' или не получите этого свойства. Обновленный ответ - спасибо за комментарий! – tripleee
У вас есть дополнительная цитата в предложениях 'define-output-mode'. Он должен быть '(текстовый режим n-mode-mode-mode-mode-mode" Testing ")'. Затем 'get' возвращает просто текстовый режим. Это, по очереди, означает, что 'eval' в примере кода не должно быть. – Lindydancer