【问题标题】:Lisp location in emacsEmacs 中的 Lisp 位置
【发布时间】:2014-03-26 02:09:11
【问题描述】:

在哪里可以找到所有 Emacs 的 elisp 脚本?我不是指用户自己开发或安装的脚本,而是已经存在的通用 elisp 脚本。

例如,

如果我有像describe-charinsert-file 这样的函数,我如何找到包含这些函数的文件?

【问题讨论】:

  • M-x find-function-other-windowM-x find-variable-other-window。我用(global-set-key (kbd "C-h F") 'find-function-other-window)(global-set-key (kbd "C-h V") 'find-variable-other-window) 设置了它我的模式行设置为显示打开缓冲区中显示的文件的路径。打开文件后,您还可以使用M-x describe-variable RET buffer-file-name,这将为您提供完整路径。
  • 当然C-h F 有一个相当有用的默认绑定,所以我建议选择一个未使用的绑定。 C-h C-f 是我的选择;仍然不是保留绑定,但默认情况下当前未使用。
  • 请注意,.el 可以卸载。例如在 debian 中,您将需要安装 emacs23-el 或 emacs24-el 软件包。如果你不这样做,那么只有 elc(编译的 lisp 文件)可用。

标签: emacs elisp


【解决方案1】:

Ctrl-h f 将告诉一个函数的解释以及它包含在哪里。

如果你想要一个函数自动执行此操作,这里有一个草稿:

(defun my-find-lisp-object-file-name (function)
  "Display the lisp file name of FUNCTION (a symbol)."
  (interactive
   (let ((fn (function-called-at-point))
     (enable-recursive-minibuffers t)
     val)
     (setq val (completing-read (if fn
                    (format "Describe function (default %s): " fn)
                  "Describe function: ")
                obarray 'fboundp t nil nil
                (and fn (symbol-name fn))))
     (list (if (equal val "")
           fn (intern val)))))
  (if (null function)
      (message "You didn't specify a function")
    (setq object-file-name (find-lisp-object-file-name function (symbol-function function)))
    (if (eq object-file-name 'C-source)
        (message "%s is in %s" function "C source code")
      (setq buff (find-function-search-for-symbol function nil object-file-name))
      (setq buf-name (buffer-name(car buff)))
      (setq buf-pos (cdr buff))
      (switch-to-buffer (car buff))
      (message "%s is in %s(%s, %d)" function object-file-name buf-name buf-pos))))

【讨论】:

  • 是的,它描述了函数的作用,但没有描述它在哪里。我想知道包含的 *.el 文件在哪里。
  • @PierreB 我不确定你想知道什么,但是当你得到一个函数的文档时,例如describe-char,你可以在@987654325 中得到.el 文件的链接@buffer,获取.el文件的位置。比如descr-text.el中的/usr/local/share/emacs/24.3/lisp/descr-text.el.gz。不是吗?
  • 也就是说*Help*缓冲区中显示的库名链接到定义所描述函数的源文件;所以你可以点击链接(作为调用find-function的替代方法)。
  • 好的,这行得通,但只有在安装 emacs23-el 包之后,正如 Remi 上面指出的那样。
【解决方案2】:

我猜M-x locate-library RET <libname> RET 可能是一个答案,它需要库名称而不是函数名称。否则,M-x find-function-other-window 不仅会告诉你文件在哪里,还会打开文件,之后你可以使用M-x pwd 知道你在哪里。

还有一件事:您可以通过C-h v load-path RET 来查看 Emacs 用来查找其库的目录,这样您就可以很好地了解所有捆绑的 Elisp 文件所在的位置。

【讨论】:

    【解决方案3】:

    INITIAL DRAFT(2014 年 3 月 25 日):初稿。

    编辑(2014 年 3 月 26 日):添加了 global-set-key。在最后一条消息中添加了一个car,以便从按钮文本属性列表中完全提取文件名的路径。为初始和最终消息添加了一些颜色。在函数末尾添加了返回光标到缓冲区的开头。为find-variable-other-windowfind-function-other-window 添加了选项。添加了条件,如果没有文件名则不生成消息。


    这是我创建的一个有趣的小功能——如果*.el 文件显示在*Help* 缓冲区中,它会显示一条带有文件路径的消息。


    (global-set-key (kbd "C-h z") 'lawlist-describe-find-function-variable)
    

    (defun lawlist-describe-find-function-variable ()
    "Describe or find a function / variable.  Displays the path of filename."
    (interactive)
      (message (concat
        (propertize "Describe" 'face 'font-lock-keyword-face)
        " ["
        (propertize "f" 'face 'font-lock-warning-face)
        "]unction / ["
        (propertize "v" 'face 'font-lock-warning-face)
        "]ariable | "
        (propertize "Find" 'face 'font-lock-keyword-face)
        " ["
        (propertize "F" 'face 'font-lock-warning-face)
        "]unction / ["
        (propertize "V" 'face 'font-lock-warning-face)
        "]ariable"))
      (let* (
          (select-f-or-v (read-char-exclusive))
          function
          variable)
        (cond
          ((eq select-f-or-v ?f)
            (setq function (read (read-string "Please enter a function name:  ")))
            (describe-function function)
            (select-window (get-buffer-window "*Help*")))
          ((eq select-f-or-v ?v)
            (setq variable (read (read-string "Please enter a variable name:  ")))
            (describe-variable variable)
            (select-window (get-buffer-window "*Help*")))
          ((eq select-f-or-v ?F)
            (setq function (read (read-string "Please enter a function name:  ")))
            (find-function-other-window function)
            (when buffer-file-name
              (message (propertize buffer-file-name 'face 'font-lock-warning-face))))
          ((eq select-f-or-v ?V)
            (setq variable (read (read-string "Please enter a variable name:  ")))
            (find-variable-other-window variable)
            (when buffer-file-name
              (message (propertize buffer-file-name 'face 'font-lock-warning-face))))
          (t
            (message "Thanks and come again!")))
        (when (and
            (equal (buffer-name) "*Help*")
            (save-excursion
              (goto-char (point-max))
              (re-search-backward "\\(`*[.]el'\\)" nil t)))
          (goto-char (point-max))
          (re-search-backward "\\(`*[.]el'\\)" nil t)
          (message 
            (propertize
              (car (cdr (car (nthcdr 1 (text-properties-at (point))))))
                'face 'font-lock-warning-face) )
          (goto-char (point-min))) ))
    

    【讨论】:

      【解决方案4】:

      如果您使用lispy 次要模式:

      1. 可以通过定位点打开当前函数的定义 在该函数的开放括号上并按 F
      2. 您可以通过标记打开当前变量的定义,然后 按 F
      3. 您可以使用 g 找到当前目录中的所有定义。 对于所有 Elisp 文件中的所有标签,您将获得一个 helm 完成接口。 每行将在第一列中包含标签,在第二列中包含文件。 我安装的基础 Elisp 目录有 19838 个标签,完成速度够快。

      4. 您可以在当前目录及其子目录中找到所有定义 与lispy-goto-recursive。解析需要几分钟,带来几秒钟 up完成界面。但它允许交互式搜索 所有 Emacs 源中的文件 - 即 89675 个标签。 示例搜索:有 55 个顶级标签包含 insert-file spread 大约20个文件。 大部分都是函数,但是顶层标签(define-key ctl-x-map "i" 'insert-file) 也是匹配的,不用打开文件就可以查看。

      【讨论】:

        【解决方案5】:

        你可以获取the source of Emacs(如果你安装了 Emacs,你可能有 .elc 文件 - 这是编译后的 elisp 文件),然后搜索函数,如果你在类 Unix 系统上,你可以使用 ack 或 @ 987654323@所有lisp文件都在lisp目录下

        cd Emacs-24.4/lisp
        ack 'defun some-function'
        find . -name '*.el' | xargs grep 'defun some-function'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-27
          • 1970-01-01
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          • 2022-12-05
          相关资源
          最近更新 更多