1 ;;; fuel-xref.el -- showing cross-reference info
3 ;; Copyright (C) 2008 Jose Antonio Ortega Ruiz
4 ;; See http://factorcode.org/license.txt for BSD license.
6 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
7 ;; Keywords: languages, fuel, factor
8 ;; Start date: Sat Dec 20, 2008 22:00
12 ;; A mode and utilities for showing cross-reference information.
23 (defgroup fuel-xref nil
24 "FUEL's cross-referencing engine."
30 (define-button-type 'fuel-xref--button-type
31 'action 'fuel-xref--follow-link
35 (defun fuel-xref--follow-link (button)
36 (let ((file (button-get button 'file))
37 (line (button-get button 'line)))
39 (error "No file for this ref"))
40 (when (not (file-readable-p file))
41 (error "File '%s' is not readable" file))
42 (find-file-other-window file)
43 (when (numberp line) (goto-line line))))
48 (defvar fuel-xref--buffer-name "*fuel xref*")
50 (defun fuel-xref--get-buffer ()
51 (let ((buffer (get-buffer fuel-xref--buffer-name)))
52 (or (and (buffer-live-p buffer) buffer)
54 (set-buffer (get-buffer-create fuel-xref--buffer-name))
57 (defvar fuel-xref--help-string "(Press RET or click to follow crossrefs)")
59 (defun fuel-xref--fill-buffer (title refs)
60 (let ((inhibit-read-only t))
61 (with-current-buffer (fuel-xref--get-buffer)
65 (when (and (first ref) (second ref) (numberp (third ref)))
67 (insert-text-button (first ref)
68 :type 'fuel-xref--button-type
69 'help-echo (format "File: %s (%s)"
76 (insert "\n\n" fuel-xref--help-string "\n"))
77 (goto-char (point-min)))))
79 (defun fuel-xref--show-callers (word)
80 (let* ((cmd `(:fuel* (((:quote ,word) fuel-callers-xref))))
81 (res (fuel-eval--retort-result (fuel-eval--send/wait cmd)))
82 (title (format (if res "Callers of '%s':"
83 "No callers found for '%s'")
85 (fuel-xref--fill-buffer title res)
86 (pop-to-buffer (fuel-xref--get-buffer))))
88 (defun fuel-xref--show-callees (word)
89 (let* ((cmd `(:fuel* (((:quote ,word) fuel-callees-xref))))
90 (res (fuel-eval--retort-result (fuel-eval--send/wait cmd)))
91 (title (format (if res "Words called by '%s':"
92 "No callees found for '%s'")
94 (fuel-xref--fill-buffer title res)
95 (pop-to-buffer (fuel-xref--get-buffer))))
100 (defvar fuel-xref-mode-map
101 (let ((map (make-sparse-keymap)))
102 (suppress-keymap map)
103 (set-keymap-parent map button-buffer-map)
104 (define-key map "q" 'bury-buffer)
107 (defun fuel-xref-mode ()
108 "Mode for displaying FUEL cross-reference information.
109 \\{fuel-xref-mode-map}"
111 (kill-all-local-variables)
112 (buffer-disable-undo)
113 (use-local-map fuel-xref-mode-map)
114 (setq mode-name "FUEL Xref")
115 (setq major-mode 'fuel-xref-mode)
116 (fuel-font-lock--font-lock-setup)
117 (setq buffer-read-only t))
121 ;;; fuel-xref.el ends here