From eb43cddb33d0eaaf279599b95cf66836a195dd5c Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Sat, 6 Dec 2008 07:01:12 +0100 Subject: [PATCH] FUEL: fuel-edit-word-at-point, fuel-eval-region, fuel-eval-extended-region. --- extra/fuel/fuel.factor | 2 ++ misc/fuel/README | 6 ++++- misc/fuel/fuel-eval.el | 2 +- misc/fuel/fuel-mode.el | 58 ++++++++++++++++++++++++++++++++++++------ 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/extra/fuel/fuel.factor b/extra/fuel/fuel.factor index 9203f0fcdd..357e7508f4 100644 --- a/extra/fuel/fuel.factor +++ b/extra/fuel/fuel.factor @@ -112,6 +112,8 @@ M: continuation fuel-pprint drop "~continuation~" write ; : fuel-end-eval ( -- ) [ ] (fuel-end-eval) ; +: fuel-get-edit-location ( defspec -- ) + where [ first2 [ (normalize-path) ] dip 2array fuel-eval-set-result ] when* ; : fuel-startup ( -- ) "listener" run ; diff --git a/misc/fuel/README b/misc/fuel/README index b98a23e92a..817695f626 100644 --- a/misc/fuel/README +++ b/misc/fuel/README @@ -50,7 +50,11 @@ Quick key reference - C-cz : switch to listener - C-co : cycle between code, tests and docs factor files - - C-M-x, C-cC-ed : eval definition around point + - M-. : edit word at point in Emacs + + - C-C-r, C-cC-er : eval region + - C-M-r, C-cC-ee : eval region, extending it to definition boundaries + - C-M-x, C-cC-ex : eval definition around point - C-cC-da : toggle autodoc mode - C-cC-dd : help for word at point diff --git a/misc/fuel/fuel-eval.el b/misc/fuel/fuel-eval.el index c92d8a8831..bef7171f6f 100644 --- a/misc/fuel/fuel-eval.el +++ b/misc/fuel/fuel-eval.el @@ -38,7 +38,7 @@ (when (and (> fuel-eval-log-max-length 0) (> (point) fuel-eval-log-max-length)) (erase-buffer)) - (when fuel-eval--log (insert "\n>> " (fuel--shorten-str str 75) "\n")) + (when fuel-eval--log (insert "\n>> " (fuel--shorten-str str 256) "\n")) (let ((beg (point))) (comint-redirect-send-command-to-process str (current-buffer) proc nil t) (with-current-buffer (process-buffer proc) diff --git a/misc/fuel/fuel-mode.el b/misc/fuel/fuel-mode.el index 5a3206698e..bd9b127c7d 100644 --- a/misc/fuel/fuel-mode.el +++ b/misc/fuel/fuel-mode.el @@ -37,21 +37,56 @@ ;;; User commands +(defun fuel-eval-region (begin end &optional arg) + "Sends region to Fuel's listener for evaluation. +With prefix, switchs to the listener's buffer afterwards." + (interactive "r\nP") + (let* ((ret (fuel-eval--eval-region/context begin end)) + (err (fuel-eval--retort-error ret))) + (message "%s" (or err (fuel--shorten-region begin end 70)))) + (when arg (pop-to-buffer fuel-listener-buffer))) + +(defun fuel-eval-extended-region (begin end &optional arg) + "Sends region extended outwards to nearest definitions, +to Fuel's listener for evaluation. With prefix, switchs to the +listener's buffer afterwards." + (interactive "r\nP") + (fuel-eval-region (save-excursion (goto-char begin) (mark-defun) (point)) + (save-excursion (goto-char end) (mark-defun) (mark)))) + (defun fuel-eval-definition (&optional arg) "Sends definition around point to Fuel's listener for evaluation. -With prefix, switchs the the listener's buffer." +With prefix, switchs to the listener's buffer afterwards." (interactive "P") (save-excursion (mark-defun) (let* ((begin (point)) (end (mark))) (unless (< begin end) (error "No evaluable definition around point")) - (let* ((msg (match-string 0)) - (ret (fuel-eval--eval-region/context begin end)) - (err (fuel-eval--retort-error ret))) - (when err (error "%s" err)) - (message "%s" (fuel--shorten-region begin end 70))))) - (when arg (pop-to-buffer fuel-listener-buffer))) + (fuel-eval-region begin end)))) + +(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") + (let* ((word (fuel-syntax-symbol-at-point)) + (ask (or arg (not word))) + (word (if ask + (read-string nil + (format "Edit word%s: " + (if word (format " (%s)" word) "")) + word) + word))) + (let* ((ret (fuel-eval--eval-string/context + (format "\\ %s fuel-get-edit-location" word))) + (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 for '%s'" word)) + (unless (file-readable-p (car loc)) + (error "Couldn't open '%s' for read" (car loc))) + (find-file-other-window (car loc)) + (goto-line (if (numberp (cadr loc)) (cadr loc) 1))))) ;;; Minor mode definition: @@ -94,8 +129,15 @@ interacting with a factor listener is at your disposal. (fuel-mode--key-1 ?z 'run-factor) (define-key fuel-mode-map "\C-\M-x" 'fuel-eval-definition) +(fuel-mode--key ?e ?x 'fuel-eval-definition) -(fuel-mode--key ?e ?d 'fuel-eval-definition) +(fuel-mode--key-1 ?r 'fuel-eval-region) +(fuel-mode--key ?e ?r 'fuel-eval-region) + +(define-key fuel-mode-map "\C-\M-r" 'fuel-eval-extended-region) +(fuel-mode--key ?e ?e 'fuel-eval-extended-region) + +(define-key fuel-mode-map "\M-." 'fuel-edit-word-at-point) (fuel-mode--key ?d ?a 'fuel-autodoc-mode) (fuel-mode--key ?d ?d 'fuel-help)