Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
emacs中的Lisp定位_Emacs_Elisp - Fatal编程技术网

emacs中的Lisp定位

emacs中的Lisp定位,emacs,elisp,Emacs,Elisp,在哪里可以找到所有Emacs的elisp脚本?我指的不是用户自己开发或安装的脚本,而是已经存在的通用elisp脚本 比如说, 如果我有一个类似于descripe char或insert file的函数,我如何找到包含这些函数的文件 Ctrl-hf将告诉您函数的解释及其包含位置 如果你想让一个函数自动完成,这里有一个草稿: (defun my-find-lisp-object-file-name (function) "Display the lisp file name of FUNCTIO

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

比如说,


如果我有一个类似于
descripe char
insert file
的函数,我如何找到包含这些函数的文件

Ctrl-hf
将告诉您函数的解释及其包含位置

如果你想让一个函数自动完成,这里有一个草稿:

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

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


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

初稿(2014年3月25日):初稿

编辑(2014年3月26日):添加了一个
全局设置键
。在最后一条消息中添加了一个
car
,以便从按钮文本属性列表中完全提取文件名的路径。在最初和最后的消息中添加了一些颜色。在函数末尾的缓冲区开始处添加了返回光标。添加了
查找变量其他窗口
查找函数其他窗口
的选项。添加了一些条件,以便在没有文件名时不会生成任何消息


这里有一个有趣的小函数,是我突然想到的——如果
*.el
文件显示在
*帮助*
缓冲区中,它会显示一条带有文件路径的消息


(全局设置键(kbd“C-h z”)'法律列表描述查找函数变量)

(defun lawlist描述find函数变量()
“描述或查找函数/变量。显示文件名的路径。”
(互动)
(电文)(concat)
(属性“描述”'face'字体锁定关键字face)
" ["
(属性“f”‘face’字体锁定警告面)
“]unction/[”
(属性化“v”‘face’字体锁定警告面)
“]可变|”
(属性化“查找”'face'字体锁定关键字face)
" ["
(属性“F”‘face’字体锁定警告面)
“]unction/[”
(属性化“V”‘face’字体锁定警告面)
“]可变“))
(让我们*(
(选择-f-或-v(读取字符专用))
功能
变量)
(续)
((eq选择-f-或-v?f)
(setq函数(读取(读取字符串“请输入函数名:”))
(描述功能)
(选择窗口(获取缓冲区窗口“*帮助*”))
((eq选择-f-或-v?v)
(setq变量(读取(读取字符串“请输入变量名:”))
(描述变量)
(选择窗口(获取缓冲区窗口“*帮助*”))
((eq选择-f-或-v?f)
(setq函数(读取(读取字符串“请输入函数名:”))
(查找功能其他窗口功能)
(当缓冲区文件名
(消息(属性缓冲区文件名'face'字体锁定警告面)))
((eq选择-f-或-v?v)
(setq变量(读取(读取字符串“请输入变量名:”))
(查找其他窗口变量)
(当缓冲区文件名
(消息(属性缓冲区文件名'face'字体锁定警告面)))
(t
(信息“谢谢,再来!”)
(何时)(及
(相等(缓冲区名称)“*帮助*”)
(省去远足
(转到字符(最大点))
(向后搜索“\\(`*[.]el'\\)“nil t)))
(转到字符(最大点))
(向后搜索“\\(`*[.]el'\\)”零t)
(信息
(财产化
(car(cdr(car(nthcdr 1)(点‘‘‘‘‘‘‘‘‘‘)处的文本属性)
“面”字体锁定(警告面)
(转到字符(最小点)))
如果使用次要模式:

  • 通过定位点,可以打开当前函数的定义 在该函数的打开部分,按F
  • 您可以通过标记和打开当前变量的定义 按F
  • 您可以使用g查找当前目录中的所有定义。 对于所有Elisp文件中的所有标记,您将获得一个
    helm
    完成界面。 每行的第一列将包含标记,第二列将包含文件。 我的安装的基本Elisp目录有19838个标记,完成的速度足够快

  • 您可以在当前目录及其子目录中找到所有定义 使用
    lispy转到递归
    。解析需要几分钟的时间,导入需要几秒钟的时间 打开完成界面。但它允许交互搜索 Emacs源代码中的所有文件-即89675个标记。 示例搜索:有55个顶级标记包含
    insert file
    spread 大约20个文件。 大多数都是函数,但顶级标记
    (定义键ctl-x-map“i”'插入文件)
    也匹配,无需打开文件即可查看

  • 您可以抓取(如果您安装了Emacs,您可能有.elc文件-这些文件是编译的elisp文件),并搜索该函数,如果您使用的是类Unix系统,则可以使用
    ack
    find/grep
    所有lisp文件都位于
    lisp
    目录中

    cd-Emacs-24.4/lisp
    确认“取消某些功能”
    找到-名称“*.el”| xargs grep“defun some function”
    
    是的,它描述函数的功能,但不描述函数的位置。我想知道包含*.el的文件在哪里。@PierreB我不确定你想知道什么,但是当你得到一个函数的文档,比如
    描述字符
    ,你可以在
    *帮助*
    缓冲区中得到
    .el
    文件的链接,并得到
    .el
    文件的位置。例如
    /usr/local/s中的
    descr text.el