diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-03-13 03:49:22 +0100 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-03-13 03:49:22 +0100 |
commit | eb1f0a9362c8b6b19d3f4e41d32f89b94d17e873 (patch) | |
tree | f71d0b7fb69e268c9211d344985c0d27d98fc455 | |
parent | 495a4b9bb253cb4dc443ae45fbdc2e02b7e81e4f (diff) | |
download | geiser-guile-eb1f0a9362c8b6b19d3f4e41d32f89b94d17e873.tar.gz geiser-guile-eb1f0a9362c8b6b19d3f4e41d32f89b94d17e873.tar.bz2 |
Guile: heuristically resolving relative paths in REPL errors.
-rw-r--r-- | elisp/geiser-guile.el | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/elisp/geiser-guile.el b/elisp/geiser-guile.el index 0523dfe..db4b27d 100644 --- a/elisp/geiser-guile.el +++ b/elisp/geiser-guile.el @@ -150,11 +150,44 @@ This function uses `geiser-guile-init-file' if it exists." ;;; Compilation shell regexps + +(defconst geiser-guile--path-rx "^In \\([^:\n]+\\):\n") + +(defconst geiser-guile--rel-path-rx + "^In \\([^/\n]+.+?/module/\\([^:\n]+\\)\\):\n") + +(make-variable-buffer-local + (defvar geiser-guile--load-path nil)) + +(defun geiser-guile--load-path () + (geiser-eval--send/result `(:eval (:scm "%load-path")))) + +(defun geiser-guile--find-in-load-path (f ps) + (when ps + (let ((c (expand-file-name f (car ps)))) + (or (and (file-exists-p c) c) + (geiser-guile--find-in-load-path f (cdr ps)))))) + +(defun geiser-guile--resolve-file-x () + (let ((f (match-string-no-properties 1))) + (if (file-name-absolute-p f) + (list f) + (let ((p (match-string-no-properties 0))) + (when (string-match geiser-guile--rel-path-rx p) + (let ((f (geiser-guile--find-in-load-path + (match-string-no-properties 2 p) + geiser-guile--load-path))) + (and f (list f)))))))) + (defun geiser-guile--startup () (set (make-local-variable 'compilation-error-regexp-alist) - '(("^In \\(/[^:\n]+\\):\n +\\([0-9]+\\): +" 1 2) + `((,geiser-guile--path-rx geiser-guile--resolve-file-x) + ("^ +\\([0-9]+\\): +" nil 1) ("at \\(/[^:\n]+\\):\\([[:digit:]]+\\):\\([[:digit:]]+\\)" 1 2 3))) - (compilation-setup t)) + (setq geiser-guile--load-path (geiser-guile--load-path)) + (compilation-setup t) + (font-lock-add-keywords + nil `((,geiser-guile--path-rx 1 compilation-error-face)))) ;;; Implementation definition: |