在emacs中的Lisp位置

时间:2014-03-26 02:09:12

标签: emacs elisp

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

例如,

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

5 个答案:

答案 0 :(得分:3)

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))))

答案 1 :(得分: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文件所在的位置。

答案 2 :(得分:1)

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))) ))

答案 3 :(得分:0)

如果您使用lispy次要模式:

  1. 您可以通过定位点来打开当前功能的定义 在该功能的开放式上按 F
  2. 您可以通过标记它来打开当前变量的定义 按 F
  3. 您可以使用 g 找到当前目录中的所有定义。 您将获得所有Elisp文件中所有标记的helm完成界面。 每行将在第一列中包含标记,在第二列中包含文件。 我的安装基础Elisp目录有19838个标签,并且完成得足够快。

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

答案 4 :(得分:0)

你可以抓住the source of Emacs(如果你安装了Emacs,你可能有.elc文件 - 这是编译的elisp文件),并搜索该函数,如果你在Unix系统上,你可以使用{{1或ack所有lisp文件都在find/grep目录

lisp