diff .emacs.d/inf-groovy.el @ 0:2764b4f45f9f

1st commit
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Mon, 21 Apr 2014 04:30:59 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.emacs.d/inf-groovy.el	Mon Apr 21 04:30:59 2014 +0900
@@ -0,0 +1,349 @@
+;;; -*-Emacs-Lisp-*-
+;;;
+;;; Stuart Clayman   sclayman@ee.ucl.ac.uk
+;;; 2006-08-01       v1
+;;; 2010-04-07       v2 fixes for new groovy-mode
+;;;
+;;; Inferior Groovy Mode - groovy process in a buffer.
+;;;                      adapted from cmuscheme.el and inf-haskell.el
+;;;
+;;; Usage:
+;;;
+;;; (1) modify .emacs to use groovy-mode 
+;;;     for example :
+;;;
+;;;    (autoload 'groovy-mode "groovy-mode"
+;;;      "Mode for editing groovy source files" t)
+;;;    (setq auto-mode-alist
+;;;          (append '(("\\.groovy$" . groovy-mode)) auto-mode-alist))
+;;;    (setq interpreter-mode-alist (append '(("groovy" . groovy-mode))
+;;;    				     interpreter-mode-alist))
+;;;    
+;;; (2) set to load inf-groovy and set inf-groovy key definition in groovy-mode.
+;;;
+;;;    (autoload 'groovy-mode "groovy-mode" "Groovy mode." t)
+;;;    (autoload 'run-groovy "inf-groovy" "Run an inferior Groovy process")
+;;;    (autoload 'inf-groovy-keys "inf-groovy" "Set local key defs for inf-groovy in groovy-mode")
+;;;
+;;;    (add-hook 'groovy-mode-hook
+;;;          '(lambda ()
+;;;             (inf-groovy-keys)
+;;;    ))
+;;;
+;;;    ;; can set groovy-home here, if not in environment
+;;;    (setq inferior-groovy-mode-hook
+;;;        '(lambda()
+;;;           (setq groovy-home "/Users/sclayman/Downloads/groovy-1.7.1/")
+;;;           ))
+;;;
+;;; (3) execute
+;;;      M-x run-groovy
+;;;
+
+(require 'comint)
+(require 'compile)
+(require 'groovy-mode)
+
+;;;; for groovy
+(defvar groovy-home (getenv "GROOVY_HOME"))
+
+(defvar groovy-program-name "groovysh --color=false"
+  "*Program invoked by the run-groovy command")
+
+(defvar inferior-groovy-first-prompt-pattern "^groovy:.*> *"
+  "first prompt regex pattern of groovy interpreter.")
+
+(defvar inferior-groovy-prompt-pattern "^groovy:.*> *"
+  "prompt regex pattern of groovy interpreter.")
+
+;;
+;; mode variables
+;;
+(defvar inferior-groovy-mode-hook nil
+  "*Hook for customising inferior-groovy mode.")
+
+(defvar inferior-groovy-mode-map nil
+  "*Mode map for inferior-groovy-mode")
+
+(defconst inferior-groovy-error-regexp-alist
+       '(("SyntaxError: compile error\n^\\([^\(].*\\):\\([1-9][0-9]*\\):" 1 2)
+	 ("^\tfrom \\([^\(].*\\):\\([1-9][0-9]*\\)\\(:in `.*'\\)?$" 1 2)))
+
+(cond ((not inferior-groovy-mode-map)
+       (setq inferior-groovy-mode-map
+	     (copy-keymap comint-mode-map))
+;       (define-key inferior-groovy-mode-map "\M-\C-x" ;gnu convention
+;	           'groovy-send-definition)
+;       (define-key inferior-groovy-mode-map "\C-x\C-e" 'groovy-send-last-sexp)
+       (define-key inferior-groovy-mode-map "\C-c\C-l" 'groovy-load-file)
+       (define-key inferior-groovy-mode-map "\C-c\C-m" 'inferior-groovy-newline-and-go)
+))
+
+(defun inf-groovy-keys ()
+  "Set local key defs for inf-groovy in groovy-mode"
+  (define-key groovy-mode-map "\M-\C-x" 'groovy-send-definition)
+  (define-key groovy-mode-map "\C-x\C-e" 'groovy-send-last-sexp)
+  ;;(define-key groovy-mode-map "\C-c\M-b" 'groovy-send-block)
+  ;;(define-key groovy-mode-map "\C-c\C-b" 'groovy-send-block-and-go)
+  (define-key groovy-mode-map "\C-c\M-d" 'groovy-send-definition)
+  (define-key groovy-mode-map "\C-c\C-x" 'groovy-send-definition-and-go)
+  (define-key groovy-mode-map "\C-c\C-x" 'groovy-send-definition-and-go)
+  (define-key groovy-mode-map "\C-c\M-r" 'groovy-send-region)
+  (define-key groovy-mode-map "\C-c\C-r" 'groovy-send-region-and-go)
+  (define-key groovy-mode-map "\C-c\C-z" 'switch-to-groovy)
+  (define-key groovy-mode-map "\C-c\C-l" 'groovy-load-file)
+  (define-key groovy-mode-map "\C-c\C-s" 'run-groovy)
+)
+
+(defvar groovy-buffer nil "current groovy (actually groovysh) process buffer.")
+
+(defun inferior-groovy-mode ()
+  "Major mode for interacting with an inferior groovy (groovysh) process.
+
+The following commands are available:
+\\{inferior-groovy-mode-map}
+
+A groovy process can be fired up with M-x run-groovy.
+
+Customisation: Entry to this mode runs the hooks on comint-mode-hook and
+inferior-groovy-mode-hook (in that order).
+
+You can send text to the inferior groovy process from other buffers containing
+Groovy source.
+    switch-to-groovy switches the current buffer to the groovy process buffer.
+    groovy-send-definition sends the current definition to the groovy process.
+    groovy-send-region sends the current region to the groovy process.
+
+    groovy-send-definition-and-go, groovy-send-region-and-go,
+        switch to the groovy process buffer after sending their text.
+For information on running multiple processes in multiple buffers, see
+documentation for variable groovy-buffer.
+
+Commands:
+Return after the end of the process' output sends the text from the 
+    end of process to point.
+Return before the end of the process' output copies the sexp ending at point
+    to the end of the process' output, and sends it.
+Delete converts tabs to spaces as it moves back.
+Tab indents for groovy; with argument, shifts rest
+    of expression rigidly with the current line.
+C-M-q does Tab on each line starting within following expression.
+Paragraphs are separated only by blank lines.  # start comments.
+If you accidentally suspend your process, use \\[comint-continue-subjob]
+to continue it."
+  (interactive)
+  (comint-mode)
+  ;; Customise in inferior-groovy-mode-hook
+  (setq comint-prompt-regexp inferior-groovy-prompt-pattern)
+  ;; (groovy-mode-variables)
+  (setq major-mode 'inferior-groovy-mode)
+  (setq mode-name "Inferior Groovy")
+  (setq mode-line-process '(":%s"))
+  (use-local-map inferior-groovy-mode-map)
+  (define-key inferior-groovy-mode-map "\C-c\C-m" 'inferior-groovy-newline-and-go)
+  (setq comint-input-filter (function groovy-input-filter))
+  (setq comint-get-old-input (function groovy-get-old-input))
+  (setq comint-use-prompt-regexp t)  ;; added v2
+  (setq comint-process-echoes t)  ;; added v2
+  (setq comint-eol-on-send t)  ;; added v2
+  (compilation-shell-minor-mode t)
+  (make-local-variable 'compilation-error-regexp-alist)
+  (setq compilation-error-regexp-alist inferior-groovy-error-regexp-alist)
+  (run-hooks 'inferior-groovy-mode-hook))
+
+(defvar inferior-groovy-filter-regexp "\\`\\s *\\S ?\\S ?\\s *\\'"
+  "*Input matching this regexp are not saved on the history list.
+Defaults to a regexp ignoring all inputs of 0, 1, or 2 letters.")
+
+(defun inferior-groovy-newline-and-go()
+  (interactive)
+  (comint-send-input)
+  (let ((proc (groovy-proc)))
+    (comint-send-string proc "go\n")))
+
+(defun groovy-input-filter (str)
+  "Don't save anything matching inferior-groovy-filter-regexp"
+  (not (string-match inferior-groovy-filter-regexp str)))
+
+;; adapted from replace-in-string in XEmacs (subr.el)
+(defun remove-in-string (str regexp)
+  "Remove all matches in STR for REGEXP and returns the new string."
+  (let ((rtn-str "") (start 0) match prev-start)
+    (while (setq match (string-match regexp str start))
+      (setq prev-start start
+	    start (match-end 0)
+	    rtn-str (concat rtn-str (substring str prev-start match))))
+    (concat rtn-str (substring str start))))
+
+(defun groovy-get-old-input ()
+  "Snarf the sexp ending at point"
+  (save-excursion
+    (let ((end (point)))
+      (re-search-backward inferior-groovy-first-prompt-pattern)
+      (remove-in-string (buffer-substring (point) end)
+			inferior-groovy-prompt-pattern)
+      )))
+
+(defun groovy-args-to-list (string)
+  (let ((where (string-match "[ \t]" string)))
+    (cond ((null where) (list string))
+	  ((not (= where 0))
+	   (cons (substring string 0 where)
+		 (groovy-args-to-list (substring string (+ 1 where)
+						 (length string)))))
+	  (t (let ((pos (string-match "[^ \t]" string)))
+	       (if (null pos)
+		   nil
+		 (groovy-args-to-list (substring string pos
+						 (length string)))))))))
+
+(defun run-groovy (cmd)
+  "Run an inferior Groovy process, input and output via buffer *groovy*.
+If there is a process already running in `*groovy*', switch to that buffer.
+With argument, allows you to edit the command line (default is value
+of `groovy-program-name').  Runs the hooks `inferior-groovy-mode-hook'
+\(after the `comint-mode-hook' is run).
+\(Type \\[describe-mode] in the process buffer for a list of commands.)"
+
+  (interactive (list (if current-prefix-arg
+			 (read-string "Run Groovy: " groovy-program-name)
+		       (concat groovy-home "/bin/" groovy-program-name))))
+  (if (not (comint-check-proc "*groovy*"))
+      (let ((cmdlist (groovy-args-to-list cmd)))
+	(set-buffer (apply 'make-comint "groovy" (car cmdlist)
+			   nil (cdr cmdlist)))
+	(inferior-groovy-mode)))
+  ;(setq groovy-program-name cmd)
+  (setq groovy-buffer "*groovy*")
+  (pop-to-buffer "*groovy*")
+  (get-buffer-process groovy-buffer)
+  )
+
+
+(defun groovy-proc ()
+  "Returns the current groovy process. See variable groovy-buffer."
+  (let ((proc (get-buffer-process (if (eq major-mode 'inferior-groovy-mode)
+				      (current-buffer)
+				    groovy-buffer))))
+    (or proc
+	(call-interactively 'run-groovy))))
+
+	;;; was (error "No current process. See variable groovy-buffer"))))
+
+(defun groovy-send-region (start end)
+  "Send the current region to the inferior Groovy process."
+  (interactive "r")
+
+  (save-excursion
+    (save-restriction
+      (let (( str (concat (buffer-substring start end) "\n"))
+	    (proc (groovy-proc)))
+	    
+      (with-current-buffer (process-buffer proc)
+	(while (and
+		(goto-char comint-last-input-end)
+		(not (re-search-forward comint-prompt-regexp nil t))
+		(accept-process-output proc)))
+	(goto-char (process-mark proc))
+	(insert-before-markers str)
+	(move-marker comint-last-input-end (point))
+	(comint-send-string proc str)
+	(comint-send-string proc "go\n")
+	)
+      )
+    )))
+
+      
+
+(defun groovy-send-definition ()
+  "Send the current definition to the inferior Groovy process."
+  (interactive)
+  (save-excursion
+    (c-end-of-defun)
+    (let ((end (point)))
+      (c-beginning-of-defun)
+      (groovy-send-region (point) end))))
+
+(defun groovy-send-last-sexp ()
+  "Send the previous sexp to the inferior Groovy process."
+  (interactive)
+  (groovy-send-region (save-excursion (backward-sexp) (point)) (point)))
+
+;; v2. current groovy-mode does not support beginning-of-block, end-of-block
+;; (defun groovy-send-block ()
+;;   "Send the current block to the inferior Groovy process."
+;;   (interactive)
+;;   (save-excursion
+;;     (groovy-end-of-block)
+;;     (end-of-line)
+;;     (let ((end (point)))
+;;       (groovy-beginning-of-block)
+;;       (groovy-send-region (point) end))))
+
+(defun switch-to-groovy (eob-p)
+  "Switch to the groovy process buffer.
+With argument, positions cursor at end of buffer."
+  (interactive "P")
+  (if (get-buffer groovy-buffer)
+      (pop-to-buffer groovy-buffer)
+      (error "No current process buffer. See variable groovy-buffer."))
+  (cond (eob-p
+	 (push-mark)
+	 (goto-char (point-max)))))
+
+(defun groovy-send-region-and-go (start end)
+  "Send the current region to the inferior Groovy process.
+Then switch to the process buffer."
+  (interactive "r")
+  (groovy-send-region start end)
+  
+  (switch-to-groovy t))
+
+(defun groovy-send-definition-and-go ()
+  "Send the current definition to the inferior Groovy. 
+Then switch to the process buffer."
+  (interactive)
+  (groovy-send-definition)
+  (switch-to-groovy t))
+
+;; (defun groovy-send-block-and-go ()
+;;   "Send the current block to the inferior Groovy. 
+;; Then switch to the process buffer."
+;;   (interactive)
+;;   (groovy-send-block)
+;;   (switch-to-groovy t))
+
+(defvar groovy-source-modes '(groovy-mode)
+  "*Used to determine if a buffer contains Groovy source code.
+If it's loaded into a buffer that is in one of these major modes, it's
+considered a groovy source file by groovy-load-file.
+Used by these commands to determine defaults.")
+
+(defvar groovy-prev-l/c-dir/file nil
+  "Caches the last (directory . file) pair.
+Caches the last pair used in the last groovy-load-file command.
+Used for determining the default in the 
+next one.")
+
+(defun groovy-load-file (file-name)
+  "Load a Groovy file into the inferior Groovy process."
+  (interactive (comint-get-source "Load Groovy file: " groovy-prev-l/c-dir/file
+				  groovy-source-modes t)) ; T because LOAD 
+                                                          ; needs an exact name
+  (comint-check-source file-name) ; Check to see if buffer needs saved.
+  (setq groovy-prev-l/c-dir/file (cons (file-name-directory    file-name)
+				       (file-name-nondirectory file-name)))
+  (comint-send-string (groovy-proc) (concat "\\i "
+					    file-name
+					    "\n")))
+;;; Do the user's customisation...
+
+(defvar inf-groovy-load-hook nil
+  "This hook is run when inf-groovy is loaded in.
+This is a good place to put keybindings.")
+	
+(run-hooks 'inf-groovy-load-hook)
+
+(provide 'inf-groovy)
+
+;;; inf-groovy.el ends here