X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Friece-ruby.el;h=0b7ae64914373ea267dbcf1120a430538862d306;hb=c5b3e5f95254ee082408ed6c4a1b340b50300371;hp=e11ec90f31deae595d337a4192db31eef5180a6c;hpb=7cb6a3ea729d579d80da818d3090757c59501e9b;p=riece diff --git a/lisp/riece-ruby.el b/lisp/riece-ruby.el index e11ec90..0b7ae64 100644 --- a/lisp/riece-ruby.el +++ b/lisp/riece-ruby.el @@ -19,8 +19,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -52,6 +52,7 @@ (defgroup riece-ruby nil "Interact with Ruby interpreter." + :prefix "riece-" :group 'riece) (defcustom riece-ruby-command "ruby" @@ -141,8 +142,7 @@ Use `riece-ruby-set-property' to set this variable.") data)) (defun riece-ruby-reset-process-buffer () - (save-excursion - (set-buffer (process-buffer riece-ruby-process)) + (with-current-buffer (process-buffer riece-ruby-process) (buffer-disable-undo) (make-local-variable 'riece-ruby-response) (setq riece-ruby-response nil) @@ -179,8 +179,7 @@ Use `riece-ruby-set-property' to set this variable.") (concat "EXIT " name "\r\n"))) (defun riece-ruby-filter (process input) - (save-excursion - (set-buffer (process-buffer process)) + (with-current-buffer (process-buffer process) (goto-char (point-max)) (insert input) (goto-char (point-min)) @@ -215,7 +214,8 @@ Use `riece-ruby-set-property' to set this variable.") (cdr (car riece-ruby-status-alist))))) (if (looking-at "# output \\([^ ]*\\) \\(.*\\)\r") (riece-ruby-run-output-handler (match-string 1) - (match-string 2)) + (match-string 2) + (current-time)) (if (looking-at "# exit \\(.*\\)\r") (riece-ruby-run-exit-handler (match-string 1)))))))) (forward-line)) @@ -226,18 +226,24 @@ Use `riece-ruby-set-property' to set this variable.") (when entry (setq riece-ruby-exit-handler-alist (delq entry riece-ruby-exit-handler-alist)) - (riece-funcall-ignore-errors name (cdr entry) (car entry)) + (riece-funcall-ignore-errors (if (symbolp (cdr entry)) + (symbol-name (cdr entry)) + (format "%s-exit-handler" name)) + (cdr entry) (car entry)) (riece-ruby-clear name)))) -(defun riece-ruby-run-output-handler (name output) +(defun riece-ruby-run-output-handler (name output time) (let ((handler-entry (assoc name riece-ruby-output-handler-alist)) (entry (assoc name riece-ruby-output-queue-alist))) (if handler-entry - (riece-funcall-ignore-errors name (cdr handler-entry) name output) + (riece-funcall-ignore-errors (if (symbolp (cdr handler-entry)) + (symbol-name (cdr handler-entry)) + (format "%s-output-handler" name)) + (cdr handler-entry) name output time) (if entry - (setcdr entry (cons output (cdr entry))) + (setcdr entry (cons (cons output time) (cdr entry))) (setq riece-ruby-output-queue-alist - (cons (list name output) + (cons (list name (cons output time)) riece-ruby-output-queue-alist)))))) (defun riece-ruby-sentinel (process status) @@ -254,19 +260,13 @@ Return a string name assigned by the server." (setq riece-ruby-process (apply #'start-process "riece-ruby" (generate-new-buffer " *Ruby*") riece-ruby-command - (if (file-name-absolute-p riece-ruby-server-program) - riece-ruby-server-program - (expand-file-name - riece-ruby-server-program - (file-name-directory - (locate-library - (symbol-file 'riece-ruby-execute))))) + (expand-file-name riece-ruby-server-program + riece-data-directory) riece-ruby-server-program-arguments)) - (process-kill-without-query riece-ruby-process) + (riece-set-process-query-on-exit-flag riece-ruby-process nil) (set-process-filter riece-ruby-process #'riece-ruby-filter) (set-process-sentinel riece-ruby-process #'riece-ruby-sentinel))) - (save-excursion - (set-buffer (process-buffer riece-ruby-process)) + (with-current-buffer (process-buffer riece-ruby-process) (riece-ruby-reset-process-buffer) (make-local-variable 'riece-ruby-lock) (setq riece-ruby-lock t) @@ -284,8 +284,7 @@ The car is protocol response line which looks like: \(ERR 103 \"Not implemented\"). The cadr is data from the server, that is, the result of the program. The caddr is status from the server." - (save-excursion - (set-buffer (process-buffer riece-ruby-process)) + (with-current-buffer (process-buffer riece-ruby-process) (riece-ruby-reset-process-buffer) (make-local-variable 'riece-ruby-lock) (setq riece-ruby-lock t) @@ -300,8 +299,7 @@ The caddr is status from the server." "Clear a result of program execution distinguished by NAME. Note that riece-ruby-clear is automatically called iff an exit-handler is specified. Otherwise, it should be called explicitly." - (save-excursion - (set-buffer (process-buffer riece-ruby-process)) + (with-current-buffer (process-buffer riece-ruby-process) (riece-ruby-reset-process-buffer) (make-local-variable 'riece-ruby-lock) (setq riece-ruby-lock t) @@ -336,8 +334,9 @@ is specified. Otherwise, it should be called explicitly." "Set an output-handler HANDLER for the program distinguished by NAME. An output-handler is called when the program sends any output by using `output' method in the Ruby program. -An output-handler is called with two argument. The first argument is -the same as NAME. The second argument is output string." +An output-handler is called with three argument. The first argument +is the same as NAME. The second argument is the output string. The +third argument is the timestamp of the output event." (let ((entry (assoc name riece-ruby-output-handler-alist)) queue-entry pointer) (if handler @@ -347,7 +346,11 @@ the same as NAME. The second argument is output string." riece-ruby-output-queue-alist (delq queue-entry riece-ruby-output-queue-alist)) (while pointer - (riece-funcall-ignore-errors name handler name (car pointer)) + (riece-funcall-ignore-errors (if (symbolp handler) + (symbol-name handler) + (format "%s-output-handler" name)) + handler name (car (car pointer)) + (cdr (car pointer))) (setq pointer (cdr pointer)))) (if entry (setcdr entry handler)