【问题标题】:Jump to function definition in Emacs by mouse-click通过鼠标单击跳转到 Emacs 中的函数定义
【发布时间】:2015-06-12 11:49:12
【问题描述】:

使用 Emacs + Common Lisp (SBCL) + Slime,有没有一种快速的方法来跳转到函数的定义 (defun ...) 而无需输入 (find-function) 函数的名称? 我正在寻找 Eclipse 中经常提供的类似解决方案: Strg +(鼠标左键点击函数调用)。

【问题讨论】:

    标签: emacs common-lisp slime


    【解决方案1】:

    在 Emacs 中:

    点在要访问其定义的函数上,点击C-x 5 F (find-function-other-frame)。

    您还可以将find-functionfind-function-other-windowfind-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)
    

    【讨论】:

    • @BRPocock:我明白了。 OP:在这种情况下,只需绑定[C-mouse-1][C-down-mouse-1]。 (为什么不在这里使用 Emacs 约定 C- 而不是德语 Strg?)
    • 是的,抱歉,Strg 应该是 Ctrl。奇怪的是,(查找函数)在我的源文件中找不到任何函数(我将源文件夹添加到“加载路径”变量中)。 lisp 文件是否必须具有 .el / .elc 文件结尾才能使用 find-function?我所有的源代码都位于 .lisp 文件中。
    • 这是一个不同的问题(“为什么find-function 不适合我?”)。单独摆姿势,提供分步配方,最好从emacs -Q(无初始化文件)开始,这样我们可以通过了解您的上下文和您在做什么来提供帮助。尝试从emacs -Q 开始,阅读C-h f find-function。这告诉您该函数必须位于 load-pathfind-function-source-path 的 Lisp 文件中。另见函数symbol-file,它通常最终用于这样的情况:它检查load-history。一般情况下,函数需要自动加载或者已经加载完毕。
    • 谢谢!我提出了一个新的question
    • 我为鼠标单击命令添加了代码,我认为它可以回答 this 问题。
    【解决方案2】:

    您可以使用键盘。在 Emacs 中通常是 m-.esc-.。光标必须在符号上。

    【讨论】:

      【解决方案3】:

      通常的方式是使用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 会自动加载标签表

      【讨论】:

      • 根据我的经验,在 Common Lisp & Slime 中使用 M-. (slime-edit-definition) 完全不需要使用标签。然后回到 Slime,它是 M-,(逗号)。
      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多