我想检查函数是否存在默认\现有别名(在这种情况下: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对defaliasing 时的定义的快照.
但如果代码执行此操作:
(defalias 'foo 'bar)
Run Code Online (Sandbox Code Playgroud)
然后foo别名到符号bar.foo函数定义是符号bar:(symbol-function 'foo)= bar.因此,如果bar函数定义发生了变化,那么定义就会如此foo.
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |