我使用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(通过查看buffer-file-name是什么来生成)。但我还没有成功!
(global-set-key [f9] (lambda () (interactive) (cscope-set-initial-directory "blah") 'cscope-find-this-text-string))
不起作用。我也尝试在两个cscope-hooks中添加钩子,但是在我的正常使用模式中似乎都没有调用过这些钩子。我甚至不介意每次切换缓冲区时都运行一次,但我没有看到任何地方的钩子:/。
有人可以帮忙吗? :)
答案 0 :(得分: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
),你会得到一个有意义的命令名,其次,如果/当你修改了这个函数,你就可以这样做而不必破坏绑定。