Emacs factor mode: Fail gracefully when the listener is not running.

db4
Jose A. Ortega Ruiz 2008-11-28 02:37:49 +01:00
parent d7587282fd
commit 95bf38f5ee
1 changed files with 28 additions and 22 deletions

View File

@ -476,7 +476,7 @@ buffer."
(setq factor-indent-width (factor--guess-indent-width)) (setq factor-indent-width (factor--guess-indent-width))
(setq indent-tabs-mode nil) (setq indent-tabs-mode nil)
;; ElDoc ;; ElDoc
(set (make-local-variable 'eldoc-documentation-function) 'factor--see-current-word) (set (make-local-variable 'eldoc-documentation-function) 'factor--eldoc)
(run-hooks 'factor-mode-hook)) (run-hooks 'factor-mode-hook))
@ -503,11 +503,12 @@ buffer."
(with-current-buffer factor--listener-buffer (with-current-buffer factor--listener-buffer
(factor-listener-mode))) (factor-listener-mode)))
(defun factor--listener-process () (defun factor--listener-process (&optional start)
(or (and (buffer-live-p factor--listener-buffer) (or (and (buffer-live-p factor--listener-buffer)
(get-buffer-process factor--listener-buffer)) (get-buffer-process factor--listener-buffer))
(progn (factor--listener-start-process) (when start
(factor--listener-process)))) (factor--listener-start-process)
(factor--listener-process t))))
;;;###autoload ;;;###autoload
(defalias 'switch-to-factor 'run-factor) (defalias 'switch-to-factor 'run-factor)
@ -515,7 +516,7 @@ buffer."
(defun run-factor (&optional arg) (defun run-factor (&optional arg)
"Show the factor-listener buffer, starting the process if needed." "Show the factor-listener buffer, starting the process if needed."
(interactive) (interactive)
(let ((buf (process-buffer (factor--listener-process))) (let ((buf (process-buffer (factor--listener-process t)))
(pop-up-windows factor-listener-window-allow-split)) (pop-up-windows factor-listener-window-allow-split))
(if factor-listener-use-other-window (if factor-listener-use-other-window
(pop-to-buffer buf) (pop-to-buffer buf)
@ -538,15 +539,16 @@ buffer."
;;; Factor listener interaction: ;;; Factor listener interaction:
(defun factor--listener-send-cmd (cmd) (defun factor--listener-send-cmd (cmd)
(let* ((out (get-buffer-create "*factor messages*")) (let ((proc (factor--listener-process)))
(beg (with-current-buffer out (goto-char (point-max)))) (when proc
(proc (factor--listener-process))) (let* ((out (get-buffer-create "*factor messages*"))
(comint-redirect-send-command-to-process cmd out proc nil t) (beg (with-current-buffer out (goto-char (point-max)))))
(with-current-buffer factor--listener-buffer (comint-redirect-send-command-to-process cmd out proc nil t)
(while (not comint-redirect-completed) (sleep-for 0 1))) (with-current-buffer factor--listener-buffer
(with-current-buffer out (while (not comint-redirect-completed) (sleep-for 0 1)))
(split-string (buffer-substring-no-properties beg (point-max)) (with-current-buffer out
"[\"\f\n\r\v]+" t)))) (split-string (buffer-substring-no-properties beg (point-max))
"[\"\f\n\r\v]+" t))))))
;;;;; Current vocabulary: ;;;;; Current vocabulary:
(make-variable-buffer-local (make-variable-buffer-local
@ -581,15 +583,13 @@ buffer."
;;;;; Synchronous interaction: ;;;;; Synchronous interaction:
(defun factor--listener-sync-cmds (cmds &optional vocab) (defsubst factor--listener-vocab-cmds (cmds &optional vocab)
(factor--with-vocab vocab (factor--with-vocab vocab
(mapcar #'(lambda (c) (mapcar #'factor--listener-send-cmd cmds)))
(comint-redirect-results-list-from-process
(factor--listener-process) c ".+" 0))
cmds)))
(defsubst factor--listener-sync-cmd (cmd &optional vocab) (defsubst factor--listener-vocab-cmd (cmd &optional vocab)
(car (factor--listener-sync-cmds (list cmd) vocab))) (factor--with-vocab vocab
(factor--listener-send-cmd cmd)))
;;;;; Interface: see ;;;;; Interface: see
@ -618,11 +618,15 @@ buffer."
(let ((word (or word (factor--symbol-at-point)))) (let ((word (or word (factor--symbol-at-point))))
(when word (when word
(let ((answer (factor--listener-send-cmd (format "\\ %s see" word)))) (let ((answer (factor--listener-send-cmd (format "\\ %s see" word))))
(factor--see-ans-to-string answer))))) (and answer (factor--see-ans-to-string answer))))))
(defalias 'factor--eldoc 'factor--see-current-word)
(defun factor-see-current-word (&optional word) (defun factor-see-current-word (&optional word)
"Echo in the minibuffer information about word at point." "Echo in the minibuffer information about word at point."
(interactive) (interactive)
(unless (factor--listener-process)
(error "No factor listener running. Try M-x run-factor"))
(let ((word (or word (factor--symbol-at-point))) (let ((word (or word (factor--symbol-at-point)))
(msg (factor--see-current-word word))) (msg (factor--see-current-word word)))
(if msg (message "%s" msg) (if msg (message "%s" msg)
@ -742,6 +746,8 @@ buffer."
(defvar factor--help-history nil) (defvar factor--help-history nil)
(defun factor--listener-show-help (&optional see) (defun factor--listener-show-help (&optional see)
(unless (factor--listener-process)
(error "No running factor listener. Try M-x run-factor"))
(let* ((def (factor--symbol-at-point)) (let* ((def (factor--symbol-at-point))
(prompt (format "See%s help on%s: " (if see " short" "") (prompt (format "See%s help on%s: " (if see " short" "")
(if def (format " (%s)" def) ""))) (if def (format " (%s)" def) "")))