如何在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在你之前给出了一个解决方案,所以我没有机会检查你的解决方案。