]> gitweb.factorcode.org Git - factor.git/commitdiff
FUEL: Small improvements to xref mode.
authorJose A. Ortega Ruiz <jao@gnu.org>
Sun, 21 Dec 2008 17:39:59 +0000 (18:39 +0100)
committerJose A. Ortega Ruiz <jao@gnu.org>
Sun, 21 Dec 2008 17:39:59 +0000 (18:39 +0100)
extra/fuel/fuel.factor
misc/fuel/fuel-connection.el
misc/fuel/fuel-mode.el
misc/fuel/fuel-popup.el
misc/fuel/fuel-syntax.el
misc/fuel/fuel-xref.el

index 30a6962aafefe7a67fcf8915b0a049c9e01503d1..7ce7c2b779b71a09c532193a3f809dc39bfd8673 100644 (file)
@@ -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
index 162a1edd02d237b21942ac05667227c56c68c16d..d029f6a0565094085062e883cdd66cf35ae9664c 100644 (file)
 
 (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))
index b855cc340ae4139786d0eeae0cb4d8356c227269..812f1e5b2ba05dc5458149340be9ab7e3cd50f88 100644 (file)
@@ -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))))
 
 \f
 ;;; Minor mode definition:
index 8cccc44836a9a475d6ee802afed5cd786ddfff42..f18e77b321c67c012885365b387f3adfff0b091c 100644 (file)
@@ -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))
index 5f7ab4341cea0deb7c4eb1c93046702de2f9d639..e8508f88ccee1fb0f9d6291dc2088fd43546cd3a 100644 (file)
 (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)
index 4e276c1b224bdcf320c1c91518f7d34a8c8741f1..f7ff1dea66f4f63f7d6447b064630ada1907fc84 100644 (file)
@@ -14,6 +14,7 @@
 ;;; Code:
 
 (require 'fuel-eval)
+(require 'fuel-syntax)
 (require 'fuel-popup)
 (require 'fuel-font-lock)
 (require 'fuel-base)
   "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")
 
       (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)))))))
 
 \f
 ;;; The xref buffer:
 (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)
     (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)))
 
 \f
 ;;; Xref mode: