From 3721086424288fb5c707e45fbfb401b6f4facd93 Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Sun, 21 Dec 2008 18:39:59 +0100 Subject: [PATCH] FUEL: Small improvements to xref mode. --- extra/fuel/fuel.factor | 10 ----- misc/fuel/fuel-connection.el | 2 +- misc/fuel/fuel-mode.el | 6 +-- misc/fuel/fuel-popup.el | 3 +- misc/fuel/fuel-syntax.el | 5 +++ misc/fuel/fuel-xref.el | 77 ++++++++++++++++++++++++------------ 6 files changed, 61 insertions(+), 42 deletions(-) diff --git a/extra/fuel/fuel.factor b/extra/fuel/fuel.factor index 30a6962aaf..7ce7c2b779 100644 --- a/extra/fuel/fuel.factor +++ b/extra/fuel/fuel.factor @@ -147,16 +147,6 @@ M: source-file fuel-pprint path>> fuel-pprint ; (fuel-eval) ] (fuel-end-eval) ; -: fuel-begin-eval ( in -- ) - (fuel-begin-eval) - (fuel-eval-in) - fuel-retort ; - -: fuel-eval ( lines -- ) - (fuel-begin-eval) [ (fuel-eval) ] (fuel-end-eval) ; inline - -: fuel-end-eval ( -- ) [ ] (fuel-end-eval) ; inline - : fuel-run-file ( path -- ) run-file ; inline ! Edit locations diff --git a/misc/fuel/fuel-connection.el b/misc/fuel/fuel-connection.el index 162a1edd02..d029f6a056 100644 --- a/misc/fuel/fuel-connection.el +++ b/misc/fuel/fuel-connection.el @@ -134,7 +134,7 @@ (defconst fuel-con--prompt-regex "( .+ ) ") (defconst fuel-con--eot-marker "<~FUEL~>") -(defconst fuel-con--init-stanza "USE: fuel f fuel-eval") +(defconst fuel-con--init-stanza "USE: fuel fuel-retort") (defconst fuel-con--comint-finished-regex (format "^%s$" fuel-con--eot-marker)) diff --git a/misc/fuel/fuel-mode.el b/misc/fuel/fuel-mode.el index b855cc340a..812f1e5b2b 100644 --- a/misc/fuel/fuel-mode.el +++ b/misc/fuel/fuel-mode.el @@ -183,8 +183,7 @@ With prefix argument, ask for word." (fuel-syntax-symbol-at-point)))) (when word (message "Looking up %s's callers ..." word) - (fuel-xref--show-callers word) - (message "")))) + (fuel-xref--show-callers word)))) (defun fuel-show-callees (&optional arg) "Show a list of callers of word at point. @@ -196,8 +195,7 @@ With prefix argument, ask for word." (fuel-syntax-symbol-at-point)))) (when word (message "Looking up %s's callees ..." word) - (fuel-xref--show-callees word) - (message "")))) + (fuel-xref--show-callees word)))) ;;; Minor mode definition: diff --git a/misc/fuel/fuel-popup.el b/misc/fuel/fuel-popup.el index 8cccc44836..f18e77b321 100644 --- a/misc/fuel/fuel-popup.el +++ b/misc/fuel/fuel-popup.el @@ -20,7 +20,8 @@ (make-variable-buffer-local (defvar fuel-popup--selected-window nil)) -(defun fuel-popup--display () +(defun fuel-popup--display (&optional buffer) + (when buffer (set-buffer buffer)) (let ((selected-window (selected-window)) (buffer (current-buffer))) (unless (eq selected-window (get-buffer-window buffer)) diff --git a/misc/fuel/fuel-syntax.el b/misc/fuel/fuel-syntax.el index 5f7ab4341c..e8508f88cc 100644 --- a/misc/fuel/fuel-syntax.el +++ b/misc/fuel/fuel-syntax.el @@ -277,6 +277,11 @@ (defsubst fuel-syntax--end-of-defun () (re-search-forward fuel-syntax--end-of-def-regex nil t)) +(defsubst fuel-syntax--end-of-defun-pos () + (save-excursion + (re-search-forward fuel-syntax--end-of-def-regex nil t) + (point))) + (defconst fuel-syntax--defun-signature-regex (format "\\(%s\\|%s\\)" (format ":[^ ]* [^ ]+\\(%s\\)*" fuel-syntax--stack-effect-regex) diff --git a/misc/fuel/fuel-xref.el b/misc/fuel/fuel-xref.el index 4e276c1b22..f7ff1dea66 100644 --- a/misc/fuel/fuel-xref.el +++ b/misc/fuel/fuel-xref.el @@ -14,6 +14,7 @@ ;;; Code: (require 'fuel-eval) +(require 'fuel-syntax) (require 'fuel-popup) (require 'fuel-font-lock) (require 'fuel-base) @@ -27,6 +28,12 @@ "FUEL's cross-referencing engine." :group 'fuel) +(defcustom fuel-xref-follow-link-to-word-p t + "Whether, when following a link to a caller, we position the +cursor at the first ocurrence of the used word." + :group 'fuel-xref + :type 'boolean) + (fuel-font-lock--defface fuel-font-lock-xref-link 'link fuel-xref "highlighting links in cross-reference buffers") @@ -48,8 +55,14 @@ (error "No file for this ref")) (when (not (file-readable-p file)) (error "File '%s' is not readable" file)) - (find-file-other-window file) - (when (numberp line) (goto-line line)))) + (let ((word fuel-xref--word)) + (find-file-other-window file) + (when (numberp line) (goto-line line)) + (when (and word fuel-xref-follow-link-to-word-p) + (and (search-forward word + (fuel-syntax--end-of-defun-pos) + t) + (goto-char (match-beginning 0))))))) ;;; The xref buffer: @@ -57,12 +70,32 @@ (fuel-popup--define fuel-xref--buffer "*fuel xref*" 'fuel-xref-mode) +(make-local-variable (defvar fuel-xref--word nil)) + (defvar fuel-xref--help-string "(Press RET or click to follow crossrefs)") (defun fuel-xref--title (word cc count) - (cond ((zerop count) (format "No known words %s '%s'." cc word)) - ((= 1 count) (format "1 word %s '%s':" cc word)) - (t (format "%s words %s '%s':" count cc word)))) + (let ((cc (if cc "using" "used by"))) + (cond ((zerop count) (format "No known words %s '%s'" cc word)) + ((= 1 count) (format "1 word %s '%s':" cc word)) + (t (format "%s words %s '%s':" count cc word))))) + +(defun fuel-xref--insert-ref (ref) + (when (and (stringp (first ref)) + (stringp (third ref)) + (numberp (fourth ref))) + (insert " ") + (insert-text-button (first ref) + :type 'fuel-xref--button-type + 'help-echo (format "File: %s (%s)" + (third ref) + (fourth ref)) + 'file (third ref) + 'line (fourth ref)) + (when (stringp (second ref)) + (insert (format " (in %s)" (second ref)))) + (newline) + t)) (defun fuel-xref--fill-buffer (word cc refs) (let ((inhibit-read-only t) @@ -70,40 +103,32 @@ (with-current-buffer (fuel-xref--buffer) (erase-buffer) (dolist (ref refs) - (when (and (stringp (first ref)) - (stringp (third ref)) - (numberp (fourth ref))) - (insert " ") - (insert-text-button (first ref) - :type 'fuel-xref--button-type - 'help-echo (format "File: %s (%s)" - (second ref) - (third ref)) - 'file (third ref) - 'line (fourth ref)) - (when (stringp (second ref)) - (insert (format " (in %s)" (second ref)))) - (setq count (1+ count)) - (newline))) + (when (fuel-xref--insert-ref ref) (setq count (1+ count)))) (goto-char (point-min)) - (insert (fuel-xref--title word (if cc "using" "used by") count) "\n\n") + (insert (fuel-xref--title word cc count) "\n\n") (when (> count 0) + (setq fuel-xref--word (and cc word)) (goto-char (point-max)) (insert "\n" fuel-xref--help-string "\n")) (goto-char (point-min)) - (current-buffer)))) + count))) + +(defun fuel-xref--fill-and-display (word cc refs) + (let ((count (fuel-xref--fill-buffer word cc refs))) + (if (zerop count) + (error (fuel-xref--title word cc 0)) + (message "") + (fuel-popup--display (fuel-xref--buffer))))) (defun fuel-xref--show-callers (word) (let* ((cmd `(:fuel* (((:quote ,word) fuel-callers-xref)))) (res (fuel-eval--retort-result (fuel-eval--send/wait cmd)))) - (set-buffer (fuel-xref--fill-buffer word t res)) - (fuel-popup--display))) + (fuel-xref--fill-and-display word t res))) (defun fuel-xref--show-callees (word) (let* ((cmd `(:fuel* (((:quote ,word) fuel-callees-xref)))) (res (fuel-eval--retort-result (fuel-eval--send/wait cmd)))) - (set-buffer (fuel-xref--fill-buffer word nil res)) - (fuel-popup--display))) + (fuel-xref--fill-and-display word nil res))) ;;; Xref mode: