如何将带有行号的文件名转换为超链接?

时间:2014-08-17 13:05:05

标签: emacs elisp

我是emacs的新手用户,目前我正在尝试为python设置工作环境。我正在使用绳索,但遇到了以下情况:虽然rope的“Find occurences”命令工作正常,但其结果放在一个无模式缓冲区中,要访问它们,我必须复制文件名。

缓冲区内容为here

据我所知,关闭功能到我想要的(即在点击它或按RET后在给定行上打开文件)由编译模式提供。但是,事实上,启用编译模式只会导致文件名突出显示。

如果我没有正确处理,要处理行我需要将项目提供给compilation-error-regexp-alist,就像在以下代码段中完成一样(来自emacs wiki

(require 'compile)

(let ((symbol  'compilation-ledger)
      (pattern '("^Error: \"\\([^\"\n]+?\\)\", line \\([0-9]+\\):" 1 2)))
  (cond ((eval-when-compile (boundp 'compilation-error-regexp-systems-list))
         ;; xemacs21
         (add-to-list 'compilation-error-regexp-alist-alist
                      (list symbol pattern))
         (compilation-build-compilation-error-regexp-alist))
        ((eval-when-compile (boundp 'compilation-error-regexp-alist-alist))
         ;; emacs22 up
         (add-to-list 'compilation-error-regexp-alist symbol)
         (add-to-list 'compilation-error-regexp-alist-alist
                      (cons symbol pattern)))
        (t
         ;; emacs21
         (add-to-list 'compilation-error-regexp-alist pattern))))

我应该如何修改它以使其与我的缓冲区一起使用?

是否有更好/更快的替代品?

1 个答案:

答案 0 :(得分:4)

通常,在缓冲区中显示文件名称时打开文件的最快方法是

M-x ffap

M-x find-file-at-point的缩写)

如果要自动打开文件,可以定义自己的功能:

(defun open-file-at-point ()
  (interactive)
  (let ((file (ffap-file-at-point)))
    (if file
        (find-file file)
      (error "No file at point"))))

并且可能将其绑定到带有

的键
(global-set-key (kbd "C-<return>") 'open-file-at-point)

如果您想使用compilation-mode,则必须向compilation-error-regexp-alist(-alist)添加匹配的正则表达式。对于您的示例,以下似乎有效:

(add-to-list
 'compilation-error-regexp-alist
 'python-file-name)

(add-to-list
 'compilation-error-regexp-alist-alist
 (list
  'python-file-name
  (concat "\\(?1:.*?\\)"              ;; file name
          " : "                       ;; seperator
          "\\(?2:[[:digit:]]+\\)")    ;; line number
   1 2)) ;; subexpr 1 is the file name, subexp 2 is the line number