Emacs 父模式列表
Emacs list of parent modes
在 emacs 中是否可以获得派生模式的父模式列表?
我找到了 derived-mode-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
我不明白怎么会有超过一个 parent,永远。
这是一个 parents 传递链的演示。
(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)
在 emacs 中是否可以获得派生模式的父模式列表?
我找到了 derived-mode-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
我不明白怎么会有超过一个 parent,永远。
这是一个 parents 传递链的演示。
(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)