【问题标题】:passing functions as arguments in emacs lisp在 emacs lisp 中将函数作为参数传递
【发布时间】:2012-03-07 11:20:48
【问题描述】:

我不确定 emacs lisp 是如何处理函数对象的,是否有一个我没有看到的隐藏参数,当我有这个时,当我点击 C-c p 时,它给出了错误 Wrong type argument: commandp, load-cenet-files

我根本不懂 lisp。

(defun load-cenet-files ()
  (load-file "~/.emacs.d/cedet/common/cedet.elc")
  (require 'semantic-gcc)
)

(global-set-key (kbd "C-c p") '(load-cenet-files)) 

【问题讨论】:

    标签: elisp


    【解决方案1】:

    Emacs 区分 functionscommands - 后者是一种特殊类型的函数,即可以由用户交互调用的函数。错误消息Wrong type argument: commandp, load-cenet-files 告诉您代码中的某个点需要一个命令,但得到了其他内容。 commandp 是一个谓词函数,用于检查其参数是否为命令;在这里,它测试了load-cenet-files,发现它不是命令,因此被拒绝。

    您可以通过将函数声明为交互式来将其转换为命令。为此,您可以在(defun function-name (args) 之后的第一行添加(interactive) 声明。注意(interactive)是一个特殊的构造,它并不是真正的函数调用,而是一个声明。

    (defun load-cenet-files ()
      (interactive)
      (load-file "~/.emacs.d/cedet/common/cedet.elc")
      (require 'semantic-gcc)
    )
    

    将函数转换为命令后,您可以通过M-x function-name 调用它。此外,如果要将函数绑定到键盘快捷键,则它必须是命令。后者正是您看到该错误消息的原因:您已将 load-cenet-files 函数绑定到 C-c p 但它是一个函数,而不是命令。插入 (interactive) 后应该没问题。

    最后,您尝试将此功能绑定到键盘快捷键似乎有些不寻常。你不能把load-filerequire 放到你的“.emacs”文件中吗?或者,如果您不希望全局加载文件,请将其附加到 mode-specific hook

    【讨论】:

    • 非常感谢,如果我有代表,我肯定会为这个深思熟虑和信息丰富的答案投票给你。我想将它绑定到键盘快捷键的原因是 cedet 需要很长时间才能加载,而我喜欢 emacs 的一件事是能够立即打开它来查看和编辑文件,这与大图形不同艾德的我可以添加一个钩子,我正在使用它,但是当我只想查看文件时我不想加载它。我想保留它,以备我要进行认真的编码时使用。
    【解决方案2】:

    它需要一个交互式函数http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Interactive.html#Interactive,它可能允许用户向您的函数输入参数。如果你不想要任何东西,这样的事情可能会起作用:

    (defun load-cenet-files ()
      (interactive)
      (load-file "~/.emacs.d/cedet/common/cedet.elc")
      (require 'semantic-gcc)
    )
    
    (global-set-key (kbd "C-c p") 'load-cenet-files) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2023-04-02
      相关资源
      最近更新 更多