如何在emacs

时间:2015-04-30 14:19:30

标签: emacs alias

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

1 个答案:

答案 0 :(得分: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))))

回答评论中的问题:这是函数的命令版本:

(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))

然后foo别名为bar的当前函数定义。如果随后更改bar的定义,则不会影响foo的定义。 foo的定义是bardefalias定义的快照。

但如果代码执行此操作:

(defalias 'foo 'bar)

然后foo别名为符号barfoo的函数定义是符号bar(symbol-function 'foo) = bar。因此,如果bar的函数定义发生变化,那么foo的定义就会相应。