version 1.3, 2013/09/19 19:57:32 |
version 1.13, 2013/11/27 17:18:07 |
|
|
;; |
;; |
;; asir-mode.el -- asir mode |
;; asir-mode.el -- asir mode |
;; |
;; |
;; $OpenXM: OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el,v 1.2 2013/08/29 17:39:29 ohara Exp $ |
;; $OpenXM: OpenXM_contrib2/windows/post-msg-asirgui/asir-mode.el,v 1.12 2013/11/27 13:39:08 ohara Exp $ |
|
|
;; This program is free software: you can redistribute it and/or modify |
;; 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 |
;; it under the terms of the GNU General Public License as published by |
;; the Free Software Foundation, either version 3 of the License, or |
;; the Free Software Foundation, either version 3 of the License, or |
;; (at your option) any later version. |
;; (at your option) any later version. |
|
|
|
;; 1. Install |
|
;; |
|
;; **(for Windows) Write the following configuration to your .emacs file. |
|
;; |
|
;; (setq load-path (append load-path '((concat (getenv "ASIR_ROOTDIR") "/share/editor")))) |
|
;; (setq auto-mode-alist (cons '("\\.rr$" . asir-mode) auto-mode-alist)) |
|
;; (autoload 'asir-mode "asir-mode" "Asir mode" t) |
|
;; |
|
;; **(for unix) Copy this file to your emacs site-lisp folder and |
|
;; write the following configuration to your .emacs file. |
|
;; |
|
;; (setq auto-mode-alist (cons '("\\.rr$" . asir-mode) auto-mode-alist)) |
|
;; (autoload 'asir-mode "asir-mode" "Asir mode" t) |
|
;; |
|
;; Please run byte-compile for speed up. |
|
;; |
|
;; 2. Use |
|
;; |
|
;; If you open Risa/Asir source file (*.rr) by emacs, then asir-mode starts up automatically. |
|
;; The following key binding can be used: |
|
;; C-c s Asir starts up in another window. |
|
;; C-c t Asir terminates. |
|
;; C-c a Abort current calculation. |
|
;; C-c l The current buffer is loaded to Asir as a file. |
|
;; C-c r Selected region is loaded to Asir as a file. |
|
;; C-c p Selected region is pasted to Asir. |
|
|
|
(require 'shell) |
|
|
;;;; AsirGUI for Windows |
;;;; AsirGUI for Windows |
(defvar asir-exec-path '("~/Desktop/asir/bin" "c:/Program Files/asir/bin" "c:/Program Files (x64)/asir/bin" "c:/asir/bin") |
(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") |
"Default search path for asir binary in Windows") |
|
|
(defun asir-effective-exec-path () |
(defun asir-effective-exec-path () |
"Search path for command" |
"Search path for command" |
(let* ((dir (getenv "ASIR_ROOTDIR")) |
(let* ((dir (getenv "ASIR_ROOTDIR")) |
(path (append asir-exec-path exec-path))) |
(path (append asir-exec-path exec-path))) |
(if dir (cons (concat dir "/bin") path) path))) |
(if dir (cons (concat dir "/bin") path) path))) |
|
|
(defun asir-executable-find (command) |
(defun asir-executable-find (command) |
"Search for command" |
"Search for command" |
(let* ((exec-path (asir-effective-exec-path))) |
(let* ((exec-path (asir-effective-exec-path))) |
(executable-find command))) |
(executable-find command))) |
|
|
;;;; Asir for UNIX |
;;;; Asir for UNIX |
(defvar asir-cmd-buffer-name "*asir-cmd*") |
(defvar asir-cmd-buffer-name "*asir-cmd*") |
|
|
(defun asir-cmd-load (filename) |
(defun asir-cmd-load (filename) |
"Send `load' command to running asir process" |
"Send `load' command to running asir process" |
(if (eq system-type 'windows-nt) |
(if (eq system-type 'windows-nt) |
(let ((exec-path (asir-effective-exec-path))) |
(let ((exec-path (asir-effective-exec-path))) |
(start-process "asir-proc-cmdasir" nil "cmdasir" filename)) |
(start-process "asir-proc-cmdasir" nil "cmdasir" filename)) |
(save-excursion |
(save-excursion |
(if (get-buffer asir-cmd-buffer-name) |
(if (get-buffer asir-cmd-buffer-name) |
(progn |
(progn |
(set-buffer asir-cmd-buffer-name) |
(set-buffer asir-cmd-buffer-name) |
(goto-char (point-max)) |
(goto-char (point-max)) |
(insert (format "load(\"%s\");" filename)) |
(insert (format "load(\"%s\");" filename)) |
(comint-send-input)))))) |
(comint-send-input)))))) |
|
|
(defun asir-start () |
(defun asir-start () |
"Start asir process" |
"Start asir process" |
(interactive) |
(interactive) |
(if (eq system-type 'windows-nt) |
(if (eq system-type 'windows-nt) |
;; for Windows |
;; for Windows |
(let ((exec-path (asir-effective-exec-path))) |
(let ((exec-path (asir-effective-exec-path))) |
(start-process "asir-proc-asirgui" nil "asirgui")) |
(start-process "asir-proc-asirgui" nil "asirgui")) |
;; for UNIX |
;; for UNIX |
(save-excursion |
(save-excursion |
(if (not (get-buffer asir-cmd-buffer-name)) |
(if (not (get-buffer asir-cmd-buffer-name)) |
(let ((current-frame (selected-frame))) |
(let ((current-frame (selected-frame))) |
(or (not window-system) |
(if window-system |
(select-frame (make-frame))) |
(progn |
(shell (get-buffer-create asir-cmd-buffer-name)) ;; Switch to new buffer automatically |
(select-frame (make-frame)) |
(sleep-for 1) |
(shell (get-buffer-create asir-cmd-buffer-name)) ;; Switch to new buffer automatically |
(goto-char (point-max)) |
(delete-other-windows)) |
(insert "asir") |
(if (>= emacs-major-version 24) |
(comint-send-input) |
(progn |
(select-frame current-frame)))))) |
(split-window) |
|
(other-window -1))) |
|
(shell (get-buffer-create asir-cmd-buffer-name))) |
|
(sleep-for 1) |
|
(goto-char (point-max)) |
|
(insert "asir") |
|
(comint-send-input) |
|
(select-frame current-frame)))))) |
|
|
(defun asir-terminate () |
(defun asir-terminate () |
"Terminate asir process" |
"Terminate asir process" |
(interactive) |
(interactive) |
(if (eq system-type 'windows-nt) |
(if (eq system-type 'windows-nt) |
;; for Windows |
;; for Windows |
(let ((exec-path (asir-effective-exec-path))) |
(let ((exec-path (asir-effective-exec-path))) |
(start-process "asir-proc-cmdasir" nil "cmdasir" "--quit")) |
(start-process "asir-proc-cmdasir" nil "cmdasir" "--quit")) |
;; for UNIX |
;; for UNIX |
(if (get-buffer asir-cmd-buffer-name) |
(if (get-buffer asir-cmd-buffer-name) |
(if (not window-system) |
(if (not window-system) |
(let ((asir-cmd-window (get-buffer-window asir-cmd-buffer-name))) |
(let ((asir-cmd-window (get-buffer-window asir-cmd-buffer-name))) |
(and (kill-buffer asir-cmd-buffer-name) |
(and (kill-buffer asir-cmd-buffer-name) |
(or (not asir-cmd-window) (delete-window asir-cmd-window)))) |
(or (not asir-cmd-window) (delete-window asir-cmd-window)))) |
(let ((asir-cmd-frame (window-frame (get-buffer-window asir-cmd-buffer-name 0)))) |
(let ((asir-cmd-frame (window-frame (get-buffer-window asir-cmd-buffer-name 0)))) |
(and (kill-buffer asir-cmd-buffer-name) |
(and (kill-buffer asir-cmd-buffer-name) |
(delete-frame asir-cmd-frame))))))) |
(delete-frame asir-cmd-frame))))))) |
|
|
(defun asir-execute-current-buffer () |
(defun asir-execute-current-buffer () |
"Execute the current buffer on asir" |
"Execute current buffer on asir" |
(interactive) |
(interactive) |
(let ((exec-path (asir-effective-exec-path))) |
(let ((exec-path (asir-effective-exec-path))) |
(asir-cmd-load (buffer-file-name)))) |
(asir-cmd-load (buffer-file-name)))) |
|
|
(defun asir-execute-region () |
(defun asir-execute-region () |
"Execute the region on asir" |
"Execute region on asir" |
(interactive) |
(interactive) |
(save-excursion |
(if mark-active |
(if mark-active |
(save-excursion |
(let ((temp-file (make-temp-file (format "%s/cmdasir-" (or (getenv "TEMP") "/var/tmp")))) |
(let ((temp-file (make-temp-file (format "%s/cmdasir-" (or (getenv "TEMP") "/var/tmp")))) |
(temp-buffer (generate-new-buffer " *asir-temp*"))) |
(temp-buffer (generate-new-buffer " *asir-temp*"))) |
(write-region (region-beginning) (region-end) temp-file) |
(write-region (region-beginning) (region-end) temp-file) |
(set-buffer temp-buffer) |
(set-buffer temp-buffer) |
(insert " end$") |
(insert " end$") |
(write-region (point-min) (point-max) temp-file t) ;; append |
(write-region (point-min) (point-max) temp-file t) ;; append |
(kill-buffer temp-buffer) |
(kill-buffer temp-buffer) |
(asir-cmd-load temp-file))))) |
(asir-cmd-load temp-file))))) |
|
|
|
(defun asir-paste-region () |
|
"Paste region to asir" |
|
(interactive) |
|
(if mark-active |
|
(if (eq system-type 'windows-nt) |
|
(let ((temp-file (make-temp-file (format "%s/cmdasir-" (getenv "TEMP")))) |
|
(exec-path (asir-effective-exec-path))) |
|
(write-region (region-beginning) (region-end) temp-file) |
|
(start-process "asir-proc-cmdasir" nil "cmdasir" "--paste-contents" temp-file)) |
|
(save-excursion |
|
(let ((buffer (current-buffer)) |
|
(start (region-beginning)) |
|
(end (region-end))) |
|
(set-buffer asir-cmd-buffer-name) |
|
(goto-char (point-max)) |
|
(insert-buffer-substring buffer start end) |
|
(comint-send-input)))))) |
|
|
|
(defun asir-abort () |
|
"Abort calculation on asir" |
|
(interactive) |
|
(if (eq system-type 'windows-nt) |
|
;; for Windows |
|
(let ((exec-path (asir-effective-exec-path))) |
|
(start-process "asir-proc-cmdasir" nil "cmdasir" "--abort")) |
|
;; for UNIX |
|
(save-excursion |
|
(if (get-buffer asir-cmd-buffer-name) |
|
(progn |
|
(set-buffer asir-cmd-buffer-name) |
|
(comint-kill-input) |
|
(comint-interrupt-subjob) |
|
(goto-char (point-max)) |
|
(insert "t\ny") |
|
(comint-send-input) |
|
))))) |
|
|
;;;; Extension for CC-mode. |
;;;; Extension for CC-mode. |
|
|
(require 'cc-mode) |
(require 'cc-mode) |
|
|
'("----" |
'("----" |
["Start Asir" asir-start t] |
["Start Asir" asir-start t] |
["Terminate Asir" asir-terminate t] |
["Terminate Asir" asir-terminate t] |
|
["Abort calcuration on Asir" asir-abort t] |
["Execute Current Buffer on Asir" asir-execute-current-buffer (buffer-file-name)] |
["Execute Current Buffer on Asir" asir-execute-current-buffer (buffer-file-name)] |
["Execute Region on Asir" asir-execute-region mark-active] |
["Execute Region on Asir" asir-execute-region mark-active] |
|
["Paste Region to Asir" asir-paste-region mark-active] |
))) |
))) |
|
|
(defvar asir-font-lock-extra-types nil |
(defvar asir-font-lock-extra-types nil |
Line 172 Each list item should be a regexp matching a single id |
|
Line 247 Each list item should be a regexp matching a single id |
|
;; Key binding for asir-mode |
;; Key binding for asir-mode |
(define-key asir-mode-map (kbd "C-c s") 'asir-start) |
(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 t") 'asir-terminate) |
|
(define-key asir-mode-map (kbd "C-c a") 'asir-abort) |
(define-key asir-mode-map (kbd "C-c l") 'asir-execute-current-buffer) |
(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) |
(define-key asir-mode-map (kbd "C-c r") 'asir-execute-region) |
|
(define-key asir-mode-map (kbd "C-c p") 'asir-paste-region) |
|
|
(easy-menu-define asir-menu asir-mode-map "asir Mode Commands" |
(easy-menu-define asir-menu asir-mode-map "asir Mode Commands" |
;; Can use `asir' as the language for `c-mode-menu' |
;; Can use `asir' as the language for `c-mode-menu' |