如何在emacs中查找别名
我想检查函数是否存在默认\现有别名(在本例中:如何在emacs中查找别名,emacs,alias,Emacs,Alias,我想检查函数是否存在默认\现有别名(在本例中:x-clipboard-yank,但问题是一般性的)。 是否有一个显示活动别名的emacs函数,我可以用来计算它? 预期的行为类似于shellalias命令。您可以检查(symbol function'The-function)的值。如果该值是一个符号,则-FUNCTION是一个别名 但是,如果该值不是符号,则可能使用defalias(或fset)定义了-FUNCTION。在这种情况下,函数的别名不是另一个函数的符号,而是函数定义(例如某些符号的当前
x-clipboard-yank
,但问题是一般性的)。是否有一个显示活动别名的emacs函数,我可以用来计算它?
预期的行为类似于shell
alias
命令。您可以检查(symbol function'The-function)
的值。如果该值是一个符号,则-FUNCTION是一个别名
但是,如果该值不是符号,则可能使用defalias
(或fset
)定义了-FUNCTION
。在这种情况下,函数
的别名不是另一个函数的符号,而是函数定义(例如某些符号的当前函数定义,而不是符号本身)或变量定义(例如keymap变量的值)
无论如何,您可能并不关心这个案例——您甚至可能不认为它是一个别名。因此,测试symbol函数
值是否为非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))
(defalias 'foo 'bar)
然后,foo
被别名为bar
的当前函数定义。如果随后更改了bar
的定义,则不会影响foo
的定义foo
的定义是bar
在删除时定义的快照
但如果代码执行此操作:
(defalias 'foo (symbol-function 'bar))
(defalias 'foo 'bar)
然后foo
被别名为符号bar
foo
的函数定义是符号bar
:(符号函数'foo)
=bar
。因此,如果bar
的函数定义发生了变化,那么foo
的定义也会随之改变。要从Drew提到的相反方向出发,您需要扫描整个符号列表,看看是否有“指向”给定函数符号,因为别名是单向关系
因此,此函数将为您提供引用给定函数的别名列表,使用mapatoms
迭代所有符号:
(defun get-aliases (fn-symbol)
"Return a list of aliases for the given function."
(let ((aliases nil))
(mapatoms (lambda (sym)
(if (eq fn-symbol (symbol-function sym))
(setq aliases (cons sym aliases)))))
(nreverse aliases)))
e、 g
由于caddr
和cl-third
“指向”cl-caddr 如何检查函数symbol函数的值?我明天才能检查你的答案,抱歉耽搁了。你没有检查函数symbol function
的值。您可以使用symbol function
检查您想了解的某个函数的函数值。如果(符号函数'toto)
返回符号titi
,则函数toto
是函数titi
的别名。如果它返回的不是(non-nil
)符号,那么它可能不是您关心的别名。请参阅我的更新答案,以获取示例别名-p
谓词。@Drew:您关于如何使用defalias
设置别名以外的内容的讨论令人困惑/误导:现在所有函数都是用defalias
定义的(例如(defun…
宏扩展为(defalias…
)@Stefan:你的回答(对我来说)令人困惑你不会说什么让你困惑。我没有说过“使用defalias
设置别名以外的东西”。(?)我只是指出OP可能(可能?)只对符号的别名感兴趣,而不是对函数感兴趣。也许你的观点只是,这种区别在“现在”是没有用的,因为所有函数都是用defalias
定义的?请考虑把你的观点/澄清作为答案。(SE不利于讨论。)“函数别名”只是一个普通函数(带有名称)。虽然从技术上讲这是正确的,但是说car
是#
原语的别名并没有多大用处。当人们在Elisp中说出别名时,他们总是引用一个函数,该函数的定义引用了另一个名称。对不起,Drew在你之前给出了一个解决方案,所以我没有机会检查你的解决方案。