我在哪里可以找到所有Emacs的elisp脚本?我并不是说脚本用户自己开发或安装,而是已经存在常见的elisp脚本。
例如,
如果我有describe-char
或insert-file
这样的函数,我怎样才能找到包含这些函数的文件?
答案 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-window
和find-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次要模式:
您可以使用 g 找到当前目录中的所有定义。
您将获得所有Elisp文件中所有标记的helm
完成界面。
每行将在第一列中包含标记,在第二列中包含文件。
我的安装基础Elisp目录有19838个标签,并且完成得足够快。
您可以在当前目录及其子目录中找到所有定义
与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