【发布时间】:2015-06-12 11:49:12
【问题描述】:
使用 Emacs + Common Lisp (SBCL) + Slime,有没有一种快速的方法来跳转到函数的定义 (defun ...) 而无需输入 (find-function) 函数的名称? 我正在寻找 Eclipse 中经常提供的类似解决方案: Strg +(鼠标左键点击函数调用)。
【问题讨论】:
标签: emacs common-lisp slime
使用 Emacs + Common Lisp (SBCL) + Slime,有没有一种快速的方法来跳转到函数的定义 (defun ...) 而无需输入 (find-function) 函数的名称? 我正在寻找 Eclipse 中经常提供的类似解决方案: Strg +(鼠标左键点击函数调用)。
【问题讨论】:
标签: emacs common-lisp slime
在 Emacs 中:
点在要访问其定义的函数上,点击C-x 5 F (find-function-other-frame)。
您还可以将find-function、find-function-other-window 或find-function-other-frame 绑定到鼠标按钮操作。
例如,您提到了 Strg +(鼠标左键单击函数调用)。不知道Strg 在这里是什么,但您可以轻松地将[mouse-1] 或[down-mouse-1] 绑定到一个检查单击位置的符号的命令,如果它是一个已定义的函数,则调用find-function,如果它是没有通常的[mouse-1] 或[down-mouse-1] 行为。
就个人而言,我不希望这样的行为,但在 Emacs 中很容易实现。例如:
(defun my-find-func-mouse (event)
(interactive "e")
(let ((fn (save-excursion
(goto-char (posn-point (event-end event)))
(function-called-at-point))))
(unless (fboundp fn) (error "No function here"))
(find-function-do-it fn nil 'switch-to-buffer-other-window)))
(global-set-key [C-down-mouse-1] nil)
(global-set-key [C-mouse-1] #'my-find-func-mouse)
【讨论】:
[C-mouse-1] 或[C-down-mouse-1]。 (为什么不在这里使用 Emacs 约定 C- 而不是德语 Strg?)
find-function 不适合我?”)。单独摆姿势,提供分步配方,最好从emacs -Q(无初始化文件)开始,这样我们可以通过了解您的上下文和您在做什么来提供帮助。尝试从emacs -Q 开始,阅读C-h f find-function。这告诉您该函数必须位于 load-path 或 find-function-source-path 的 Lisp 文件中。另见函数symbol-file,它通常最终用于这样的情况:它检查load-history。一般情况下,函数需要自动加载或者已经加载完毕。
您可以使用键盘。在 Emacs 中通常是 m-. 或 esc-.。光标必须在符号上。
【讨论】:
通常的方式是使用etags创建一个TAGS文件:
$ find . -type f -iname "*.lisp*" | etags -
然后,执行 M-x visit-tags-table 并导航到 TAGS 文件。加载标签后,您可以简单地在功能上执行M-.,它将在当前缓冲区中打开。
另外,您可以使用M-* 回到您之前的位置。
如果您使用的是 projectile,您只需将 TAGS 文件保存在项目根目录中即可,无需运行 M-x visit-tags-table。当你第一次按下M-.时,Projectile 会自动加载标签表
【讨论】:
M-. (slime-edit-definition) 完全不需要使用标签。然后回到 Slime,它是 M-,(逗号)。