【问题标题】:Wrapping a quoted function in emacs-lisp在 emacs-lisp 中包装带引号的函数
【发布时间】:2009-06-17 14:55:25
【问题描述】:

我使用 cscope emacs 扩展(并发现它非常有用)。不幸的是,仅搜索当前目录及以下目录的默认行为对我来说是不够的,因此我将 cscope-set-initial-directory 用于我选择的目录。不幸的是,这对我来说也不够用,因为我有多个不同的项目,每个项目都有自己的“初始”目录。

我已经为我在emacs中使用最多的三个cscope方法设置了热键

(global-set-key [f9] 'cscope-find-this-text-string)
(global-set-key [f8] 'cscope-find-global-definition)
(global-set-key [f7] 'cscope-find-this-symbol)

我认为以某种方式用函数包装这些调用以在给定路径上运行 cscope-set-initial-directory (通过查看缓冲区文件名是什么而生成)会很容易。但是我一直没有成功!

(global-set-key [f9] (lambda () (interactive) (cscope-set-initial-directory "blah") 'cscope-find-this-text-string))

不起作用。我还尝试向两个 cscope-hooks 添加钩子,但在我的正常使用模式中,它们似乎都没有被调用。我什至不介意每次切换缓冲区时运行一次它,但我也没有在任何地方看到它的钩子:/。

有人可以帮忙吗? :)

【问题讨论】:

    标签: elisp cscope


    【解决方案1】:

    免责声明:我尚未安装 cscope,因此无法对此进行测试。

    (global-set-key (kbd "<f9>") 'my-cscope-find-this-text-string)
    (defun my-cscope-find-this-text-string (dir)
      (interactive "DRoot area to start search:")
      (let ((default-directory dir))
        (call-interactively 'cscope-find-this-text-string)))
    

    基本的想法是你想提示一个目录从哪里开始:这就是对交互式的调用。然后你设置目录: let 语句为你做这件事。然后你调用你想要的原始例程,并使用'call-interactively 调用它,你会得到提示。

    您可以类似地包装其他两个例程。

    一旦这对您有用,您可以通过自定义提示让根区域拥有自己的在三个例程之间共享的历史变量来获得更好的体验。

    关于您最初的解决方案,这是一个很好的尝试。大多数人没有意识到需要'interactive 将函数转换为命令。引用名称对您不起作用的原因是引用只是告诉解释器将符号视为符号,而不是对它做任何事情。要调用例程,您通常会这样做:

    (lambda ()
        (c-scope-find-this-text-string "some-string"))
    

    不幸的是,对于像上面这样的直接调用,您必须提供一个参数(要搜索的字符串)。因此,您可以添加一些代码来提示输入字符串,或者使用命令的内置代码来进行提示。这就是 'call-interactively 的用途,它调用命令并调用它的 'interactive 表单来执行提示。

    此外,将击键绑定到命令名称通常是一个好主意,而不是裸 lambda,原因有两个:首先,如果您曾经使用 C-h k (M-x describe-key),您会得到一个有意义的命令名称,其次,如果/当你修改函数时,你可以这样做,而不必再搞砸绑定。

    【讨论】:

    • 甜心,你的建议完全帮助了我。我最后只是在我最初的尝试中添加了 (call-interactively 'blah) 并且它起作用了。我真正想做的是一些非常奇特的事情,比如有一个包装函数,它返回一个设置目录的 lambda 语句,然后调用给定的函数。但我想这是不可能的,因为 emacs-lisp 进行范围界定的方式(给包装器的参数超出了返回的 lambda 语句的范围)。也许在 emacs-lisp 领域有不同的方式来思考这个问题?
    • 我不太明白你的描述,返回一个 lambda 语句(函数)似乎没有必要,因为在这种情况下实际上不需要更高阶的编程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多