=================================================================== RCS file: /home/cvs/OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el 2013/08/29 17:39:29 1.2 +++ OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el 2013/09/19 19:57:32 1.3 @@ -2,7 +2,7 @@ ;; ;; asir-mode.el -- asir mode ;; -;; $OpenXM: OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el,v 1.1 2013/08/27 05:51:50 takayama Exp $ +;; $OpenXM: OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el,v 1.2 2013/08/29 17:39:29 ohara Exp $ ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -10,50 +10,92 @@ ;; (at your option) any later version. ;;;; AsirGUI for Windows -(defconst asir-exec-path-default '("~/Desktop/asir/bin" "c:/Program Files/asir/bin" "c:/Program Files (x64)/asir/bin" "c:/asir/bin") - "Default Search path for asir binary in Windows") +(defvar asir-exec-path '("~/Desktop/asir/bin" "c:/Program Files/asir/bin" "c:/Program Files (x64)/asir/bin" "c:/asir/bin") + "Default search path for asir binary in Windows") -(defvar asir-exec-path asir-exec-path-default - "Search path for asir binary") - -(defun asir-effective-exec-path () +(defun asir-effective-exec-path () "Search path for command" (let* ((dir (getenv "ASIR_ROOTDIR")) (path (append asir-exec-path exec-path))) (if dir (cons (concat dir "/bin") path) path))) -(defun asir-executable-find (command) +(defun asir-executable-find (command) "Search for command" (let* ((exec-path (asir-effective-exec-path))) (executable-find command))) -(defun asir-start-asirgui () - "Run asirgui" +;;;; Asir for UNIX +(defvar asir-cmd-buffer-name "*asir-cmd*") + +(defun asir-cmd-load (filename) + "Send `load' command to running asir process" + (if (eq system-type 'windows-nt) + (let ((exec-path (asir-effective-exec-path))) + (start-process "asir-proc-cmdasir" nil "cmdasir" filename)) + (save-excursion + (if (get-buffer asir-cmd-buffer-name) + (progn + (set-buffer asir-cmd-buffer-name) + (goto-char (point-max)) + (insert (format "load(\"%s\");" filename)) + (comint-send-input)))))) + +(defun asir-start () + "Start asir process" (interactive) - (let ((exec-path (asir-effective-exec-path))) - (start-process "asir-proc-asirgui" nil "asirgui"))) + (if (eq system-type 'windows-nt) + ;; for Windows + (let ((exec-path (asir-effective-exec-path))) + (start-process "asir-proc-asirgui" nil "asirgui")) + ;; for UNIX + (save-excursion + (if (not (get-buffer asir-cmd-buffer-name)) + (let ((current-frame (selected-frame))) + (or (not window-system) + (select-frame (make-frame))) + (shell (get-buffer-create asir-cmd-buffer-name)) ;; Switch to new buffer automatically + (sleep-for 1) + (goto-char (point-max)) + (insert "asir") + (comint-send-input) + (select-frame current-frame)))))) -(defun asir-terminate-asirgui () - "Execute the current buffer on asir" +(defun asir-terminate () + "Terminate asir process" (interactive) - (let ((exec-path (asir-effective-exec-path))) - (start-process "asir-proc-cmdasir" nil "cmdasir" "--quit"))) + (if (eq system-type 'windows-nt) + ;; for Windows + (let ((exec-path (asir-effective-exec-path))) + (start-process "asir-proc-cmdasir" nil "cmdasir" "--quit")) + ;; for UNIX + (if (get-buffer asir-cmd-buffer-name) + (if (not window-system) + (let ((asir-cmd-window (get-buffer-window asir-cmd-buffer-name))) + (and (kill-buffer asir-cmd-buffer-name) + (or (not asir-cmd-window) (delete-window asir-cmd-window)))) + (let ((asir-cmd-frame (window-frame (get-buffer-window asir-cmd-buffer-name 0)))) + (and (kill-buffer asir-cmd-buffer-name) + (delete-frame asir-cmd-frame))))))) -(defun asir-execute-current-buffer-on-asir () +(defun asir-execute-current-buffer () "Execute the current buffer on asir" (interactive) (let ((exec-path (asir-effective-exec-path))) - (start-process "asir-proc-cmdasir" nil "cmdasir" (buffer-file-name)))) + (asir-cmd-load (buffer-file-name)))) -(defun asir-execute-region-on-asir () +(defun asir-execute-region () "Execute the region on asir" (interactive) (save-excursion (if mark-active - (let ((exec-path (asir-effective-exec-path)) - (temp-file (make-temp-file (format "%s/cmdasir-" (getenv "TEMP"))))) + (let ((temp-file (make-temp-file (format "%s/cmdasir-" (or (getenv "TEMP") "/var/tmp")))) + (temp-buffer (generate-new-buffer " *asir-temp*"))) (write-region (region-beginning) (region-end) temp-file) - (start-process "asir-proc-cmdasir" nil "cmdasir" temp-file))))) + (set-buffer temp-buffer) + (insert " end$") + (write-region (point-min) (point-max) temp-file t) ;; append + (kill-buffer temp-buffer) + (asir-cmd-load temp-file))))) ;;;; Extension for CC-mode. @@ -91,12 +133,10 @@ asir (append (c-lang-const c-mode-menu c) '("----" - ["Start asirgui" asir-start-asirgui (eq system-type 'windows-nt)] - ["Terminate asirgui" asir-terminate-asirgui (eq system-type 'windows-nt)] - ["Execute the current buffer on asir" asir-execute-current-buffer-on-asir - (and (eq system-type 'windows-nt) (buffer-file-name))] - ["Execute the region on asir" asir-execute-region-on-asir - (and (eq system-type 'windows-nt) mark-active)] + ["Start Asir" asir-start t] + ["Terminate Asir" asir-terminate t] + ["Execute Current Buffer on Asir" asir-execute-current-buffer (buffer-file-name)] + ["Execute Region on Asir" asir-execute-region mark-active] ))) (defvar asir-font-lock-extra-types nil @@ -130,10 +170,10 @@ Each list item should be a regexp matching a single id "Keymap used in asir-mode buffers.") ;; Key binding for asir-mode -(define-key asir-mode-map (kbd "C-c s") 'asir-start-asirgui) -(define-key asir-mode-map (kbd "C-c t") 'asir-terminate-asirgui) -(define-key asir-mode-map (kbd "C-c l") 'asir-execute-current-buffer-on-asir) -(define-key asir-mode-map (kbd "C-c r") 'asir-execute-region-on-asir) +(define-key asir-mode-map (kbd "C-c s") 'asir-start) +(define-key asir-mode-map (kbd "C-c t") 'asir-terminate) +(define-key asir-mode-map (kbd "C-c l") 'asir-execute-current-buffer) +(define-key asir-mode-map (kbd "C-c r") 'asir-execute-region) (easy-menu-define asir-menu asir-mode-map "asir Mode Commands" ;; Can use `asir' as the language for `c-mode-menu'