如何在emacs中查找别名

use*_*046 5 emacs alias

我想检查函数是否存在默认\现有别名(在这种情况下:x-clipboard-yank,但问题是一般的).
是否有一个emacs函数显示我可以用它来计算的活动别名?
预期的行为类似于shell alias命令.

Dre*_*rew 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))))
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的定义是bardefaliasing 时的定义的快照.

但如果代码执行此操作:

(defalias 'foo 'bar)
Run Code Online (Sandbox Code Playgroud)

然后foo别名到符号bar.foo函数定义是符号bar:(symbol-function 'foo)= bar.因此,如果bar函数定义发生了变化,那么定义就会如此foo.