2009-01-05 16:06:43 -05:00
|
|
|
|
;;; fuel-edit.el -- utilities for file editing
|
|
|
|
|
|
|
|
|
|
;; Copyright (C) 2009 Jose Antonio Ortega Ruiz
|
|
|
|
|
;; See http://factorcode.org/license.txt for BSD license.
|
|
|
|
|
|
|
|
|
|
;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
|
|
|
|
|
;; Keywords: languages, fuel, factor
|
|
|
|
|
;; Start date: Mon Jan 05, 2009 21:16
|
|
|
|
|
|
|
|
|
|
;;; Comentary:
|
|
|
|
|
|
|
|
|
|
;; Locating and opening factor source and documentation files.
|
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(require 'fuel-completion)
|
|
|
|
|
(require 'fuel-eval)
|
|
|
|
|
(require 'fuel-base)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(require 'factor-mode)
|
2009-01-05 16:06:43 -05:00
|
|
|
|
|
2009-01-12 20:58:33 -05:00
|
|
|
|
(require 'etags)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Customization
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(defcustom fuel-edit-word-method nil
|
|
|
|
|
"How the new buffer is opened when invoking `fuel-edit-word-at-point'."
|
|
|
|
|
:group 'fuel
|
|
|
|
|
:type '(choice (const :tag "Other window" window)
|
|
|
|
|
(const :tag "Other frame" frame)
|
|
|
|
|
(const :tag "Current window" nil)))
|
2009-01-12 20:58:33 -05:00
|
|
|
|
|
2009-01-05 16:06:43 -05:00
|
|
|
|
|
|
|
|
|
;;; Auxiliar functions:
|
|
|
|
|
|
2009-01-22 03:55:39 -05:00
|
|
|
|
(defun fuel-edit--visit-file (file method)
|
|
|
|
|
(cond ((eq method 'window) (find-file-other-window file))
|
|
|
|
|
((eq method 'frame) (find-file-other-frame file))
|
|
|
|
|
(t (find-file file))))
|
|
|
|
|
|
2009-01-16 16:07:14 -05:00
|
|
|
|
(defun fuel-edit--looking-at-vocab ()
|
|
|
|
|
(save-excursion
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(factor-beginning-of-defun)
|
2009-01-22 15:13:38 -05:00
|
|
|
|
(looking-at "USING:\\|USE:\\|IN:")))
|
2009-01-16 16:07:14 -05:00
|
|
|
|
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(defun fuel-edit--try-edit (ret)
|
|
|
|
|
(let* ((err (fuel-eval--retort-error ret))
|
|
|
|
|
(loc (fuel-eval--retort-result ret)))
|
|
|
|
|
(when (or err (not loc) (not (listp loc)) (not (stringp (car loc))))
|
|
|
|
|
(error "Couldn't find edit location"))
|
|
|
|
|
(unless (file-readable-p (car loc))
|
|
|
|
|
(error "Couldn't open '%s' for read" (car loc)))
|
2009-01-22 03:55:39 -05:00
|
|
|
|
(fuel-edit--visit-file (car loc) fuel-edit-word-method)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line (1- (if (numberp (cadr loc)) (cadr loc) 1)))))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
|
|
|
|
|
(defun fuel-edit--edit-article (name)
|
|
|
|
|
(let ((cmd `(:fuel* (,name fuel-get-article-location) "fuel" t)))
|
|
|
|
|
(fuel-edit--try-edit (fuel-eval--send/wait cmd))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Editing commands:
|
|
|
|
|
|
|
|
|
|
(defvar fuel-edit--word-history nil)
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
;;;###autoload
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(defun fuel-edit-vocabulary (&optional refresh vocab)
|
|
|
|
|
"Visits vocabulary file in Emacs.
|
|
|
|
|
When called interactively, asks for vocabulary with completion.
|
|
|
|
|
With prefix argument, refreshes cached vocabulary list."
|
|
|
|
|
(interactive "P")
|
2009-02-05 04:28:57 -05:00
|
|
|
|
(let* ((vocab (or vocab (fuel-completion--read-vocab refresh)))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(cmd `(:fuel* (,vocab fuel-get-vocab-location) "fuel" t)))
|
|
|
|
|
(fuel-edit--try-edit (fuel-eval--send/wait cmd))))
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
;;;###autoload
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(defun fuel-edit-word (&optional arg)
|
|
|
|
|
"Asks for a word to edit, with completion.
|
|
|
|
|
With prefix, only words visible in the current vocabulary are
|
|
|
|
|
offered."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(let* ((word (fuel-completion--read-word "Edit word: "
|
|
|
|
|
nil
|
|
|
|
|
fuel-edit--word-history
|
|
|
|
|
arg))
|
2009-01-22 10:11:44 -05:00
|
|
|
|
(cmd `(:fuel* ((:quote ,word) fuel-get-word-location))))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(fuel-edit--try-edit (fuel-eval--send/wait cmd))))
|
|
|
|
|
|
|
|
|
|
(defun fuel-edit-word-at-point (&optional arg)
|
|
|
|
|
"Opens a new window visiting the definition of the word at point.
|
|
|
|
|
With prefix, asks for the word to edit."
|
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((word (or (and (not arg) (factor-symbol-at-point))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(fuel-completion--read-word "Edit word: ")))
|
2009-01-22 10:11:44 -05:00
|
|
|
|
(cmd `(:fuel* ((:quote ,word) fuel-get-word-location)))
|
2009-01-12 20:58:33 -05:00
|
|
|
|
(marker (and (not arg) (point-marker))))
|
2009-01-16 16:07:14 -05:00
|
|
|
|
(if (and (not arg) (fuel-edit--looking-at-vocab))
|
|
|
|
|
(fuel-edit-vocabulary nil word)
|
|
|
|
|
(fuel-edit--try-edit (fuel-eval--send/wait cmd)))
|
2009-01-12 20:58:33 -05:00
|
|
|
|
(when marker (ring-insert find-tag-marker-ring marker))))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
|
|
|
|
|
(defun fuel-edit-word-doc-at-point (&optional arg word)
|
|
|
|
|
"Opens a new window visiting the documentation file for the word at point.
|
|
|
|
|
With prefix, asks for the word to edit."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(let* ((word (or word
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(and (not arg) (factor-symbol-at-point))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(fuel-completion--read-word "Edit word: ")))
|
2009-01-12 20:58:33 -05:00
|
|
|
|
(cmd `(:fuel* ((:quote ,word) fuel-get-doc-location)))
|
|
|
|
|
(marker (and (not arg) (point-marker))))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(condition-case nil
|
|
|
|
|
(fuel-edit--try-edit (fuel-eval--send/wait cmd))
|
|
|
|
|
(error
|
|
|
|
|
(message "Documentation for '%s' not found" word)
|
|
|
|
|
(when (and (eq major-mode 'factor-mode)
|
|
|
|
|
(y-or-n-p (concat "No documentation found. "
|
|
|
|
|
"Do you want to open the vocab's "
|
|
|
|
|
"doc file? ")))
|
2009-01-12 20:58:33 -05:00
|
|
|
|
(when marker (ring-insert find-tag-marker-ring marker))
|
2009-01-05 16:06:43 -05:00
|
|
|
|
(find-file-other-window
|
|
|
|
|
(format "%s-docs.factor"
|
|
|
|
|
(file-name-sans-extension (buffer-file-name)))))))))
|
|
|
|
|
|
2009-01-12 20:58:33 -05:00
|
|
|
|
(defun fuel-edit-pop-edit-word-stack ()
|
|
|
|
|
"Pop back to where \\[fuel-edit-word-at-point] or \\[fuel-edit-word-doc-at-point]
|
|
|
|
|
was last invoked."
|
|
|
|
|
(interactive)
|
|
|
|
|
(condition-case nil
|
|
|
|
|
(pop-tag-mark)
|
2009-02-14 07:44:12 -05:00
|
|
|
|
(error "No previous location for find word or vocab invocation")))
|
2009-01-12 20:58:33 -05:00
|
|
|
|
|
2009-01-18 23:10:47 -05:00
|
|
|
|
(defvar fuel-edit--buffer-history nil)
|
|
|
|
|
|
|
|
|
|
(defun fuel-switch-to-buffer (&optional method)
|
|
|
|
|
"Switch to any of the existing Factor buffers, with completion."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let ((buffer (completing-read "Factor buffer: "
|
|
|
|
|
(remove (buffer-name)
|
|
|
|
|
(mapcar 'buffer-name (buffer-list)))
|
2013-05-05 00:48:12 -04:00
|
|
|
|
#'(lambda (s) (string-match "\\.factor$" s))
|
2009-01-18 23:10:47 -05:00
|
|
|
|
t
|
|
|
|
|
nil
|
|
|
|
|
fuel-edit--buffer-history)))
|
|
|
|
|
(cond ((eq method 'window) (switch-to-buffer-other-window buffer))
|
|
|
|
|
((eq method 'frame) (switch-to-buffer-other-frame buffer))
|
|
|
|
|
(t (switch-to-buffer buffer)))))
|
|
|
|
|
|
|
|
|
|
(defun fuel-switch-to-buffer-other-window ()
|
|
|
|
|
"Switch to any of the existing Factor buffers, in other window."
|
|
|
|
|
(interactive)
|
|
|
|
|
(fuel-switch-to-buffer 'window))
|
|
|
|
|
|
|
|
|
|
(defun fuel-switch-to-buffer-other-frame ()
|
|
|
|
|
"Switch to any of the existing Factor buffers, in other frame."
|
|
|
|
|
(interactive)
|
|
|
|
|
(fuel-switch-to-buffer 'frame))
|
|
|
|
|
|
2009-01-05 16:06:43 -05:00
|
|
|
|
|
|
|
|
|
(provide 'fuel-edit)
|
|
|
|
|
;;; fuel-edit.el ends here
|