我想检查一个函数是否存在默认\现有别名(在这种情况下:x-clipboard-yank
,但问题是一般的。)
是否有一个emacs函数显示我可以用来计算它的活动别名?
预期的行为类似于shell alias
命令。
答案 0 :(得分:5)
您可以查看(symbol-function 'THE-FUNCTION)
的值。如果该值是符号,则THE-FUNCTION
是别名。
但是,如果值不是符号THE-FUNCTION
,则可能使用defalias
(或fset
)定义。在这种情况下,THE-FUNCTION
别名不是另一个函数的符号,而是函数定义(例如某个符号的当前函数定义,而不是符号本身)或变量定义(例如keymap变量的值) )。
你可能不关心这个案例 - 你甚至可能不认为它是别名。因此,测试symbol-function
值是否为非nil
符号可能就足够了。 (值nil
表示既没有函数别名也没有给定符号的任何其他函数定义。)
例如:
(defun aliased-p (fn)
"Return non-nil if function FN is aliased to a function symbol."
(let ((val (symbol-function fn)))
(and val ; `nil' means not aliased
(symbolp val))))
回答评论中的问题:这是函数的命令版本:
(defun aliased-p (fn &optional msgp)
"Prompt for a function name and say whether it is an alias.
Return non-nil if the function is aliased."
(interactive "aFunction: \np")
(let* ((val (symbol-function fn))
(ret (and val (symbolp val))))
(when msgp (message "`%s' %s an alias" fn (if ret "IS" "is NOT")))
ret))
要清楚非符号情况 - 如果代码执行此操作:
(defalias 'foo (symbol-function 'bar))
然后foo
别名为bar
的当前函数定义。如果随后更改bar
的定义,则不会影响foo
的定义。 foo
的定义是bar
时defalias
定义的快照。
但如果代码执行此操作:
(defalias 'foo 'bar)
然后foo
别名为符号bar
。 foo
的函数定义是符号bar
:(symbol-function 'foo)
= bar
。因此,如果bar
的函数定义发生变化,那么foo
的定义就会相应。