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 | 1c9457aa15b00a9a9f058a5677370305aa68da79 (patch) | |
| tree | 8cdbd12b7915148c4eb7ef970c9a549f91455f7d /elisp | |
| parent | a9f26f1391aa6edaa728df5e05c6bcac8039289c (diff) | |
| download | geiser-guile-1c9457aa15b00a9a9f058a5677370305aa68da79.tar.gz geiser-guile-1c9457aa15b00a9a9f058a5677370305aa68da79.tar.bz2 | |
Guile: heuristically resolving relative paths in REPL errors.
Diffstat (limited to 'elisp')
| -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: | 
