我想检查函数是否存在默认\现有别名(在这种情况下:x-clipboard-yank
,但问题是一般的).
是否有一个emacs函数显示我可以用它来计算的活动别名?
预期的行为类似于shell alias
命令.
你可以检查一下它的值(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))))
Run Code Online (Sandbox Code Playgroud)
回答您的评论中的问题:这是函数的命令版本:
(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))
Run Code Online (Sandbox Code Playgroud)
要清楚非符号情况 - 如果代码执行此操作:
(defalias 'foo (symbol-function 'bar))
Run Code Online (Sandbox Code Playgroud)
然后foo
别名为当前的函数定义bar
.如果bar
随后改变了定义,那将对定义没有影响foo
. foo
的定义是bar
对defalias
ing 时的定义的快照.
但如果代码执行此操作:
(defalias 'foo 'bar)
Run Code Online (Sandbox Code Playgroud)
然后foo
别名到符号bar
.foo
函数定义是符号bar
:(symbol-function 'foo)
= bar
.因此,如果bar
函数定义发生了变化,那么定义就会如此foo
.