mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Removed old elisp files. New upstream repository was moved https://github.com/ruby/elisp.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									5c16b21f44
								
							
						
					
					
						commit
						7eedd308b8
					
				
					 8 changed files with 0 additions and 1657 deletions
				
			
		| 
						 | 
				
			
			@ -1,12 +1,3 @@
 | 
			
		|||
README            this file
 | 
			
		||||
inf-ruby.el       program to run ruby under emacs
 | 
			
		||||
rb_optparse.bash  bash completion script
 | 
			
		||||
rb_optparse.zsh   zsh completion script
 | 
			
		||||
rdoc-mode.el      RDoc mode for emacs
 | 
			
		||||
ruby-mode.el      ruby mode for emacs
 | 
			
		||||
ruby-style.el     Ruby's C/C++ mode style for emacs
 | 
			
		||||
rubydb2x.el       ruby debugger support for emacs 19.2x or before
 | 
			
		||||
rubydb3x.el       ruby debugger support for emacs 19.3x or later
 | 
			
		||||
ruby-electric.el  emacs minor mode providing electric commands
 | 
			
		||||
 | 
			
		||||
Check out https://github.com/ruby-debug/ also.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										418
									
								
								misc/inf-ruby.el
									
										
									
									
									
								
							
							
						
						
									
										418
									
								
								misc/inf-ruby.el
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,418 +0,0 @@
 | 
			
		|||
;;; -*-Emacs-Lisp-*-
 | 
			
		||||
;;;
 | 
			
		||||
;;;  $Id$
 | 
			
		||||
;;;  $Author$
 | 
			
		||||
;;;
 | 
			
		||||
;;; Inferior Ruby Mode - ruby process in a buffer.
 | 
			
		||||
;;;                      adapted from cmuscheme.el
 | 
			
		||||
;;;
 | 
			
		||||
;;; Usage:
 | 
			
		||||
;;;
 | 
			
		||||
;;; (0) check ruby-program-name variable that can run your environment.
 | 
			
		||||
;;;
 | 
			
		||||
;;; (1) modify .emacs to use ruby-mode
 | 
			
		||||
;;;     for example :
 | 
			
		||||
;;;
 | 
			
		||||
;;;    (autoload 'ruby-mode "ruby-mode"
 | 
			
		||||
;;;      "Mode for editing ruby source files" t)
 | 
			
		||||
;;;    (setq auto-mode-alist
 | 
			
		||||
;;;          (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
 | 
			
		||||
;;;    (setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
 | 
			
		||||
;;;                                  interpreter-mode-alist))
 | 
			
		||||
;;;
 | 
			
		||||
;;; (2) set to load inf-ruby and set inf-ruby key definition in ruby-mode.
 | 
			
		||||
;;;
 | 
			
		||||
;;;    (autoload 'run-ruby "inf-ruby"
 | 
			
		||||
;;;      "Run an inferior Ruby process")
 | 
			
		||||
;;;    (autoload 'inf-ruby-keys "inf-ruby"
 | 
			
		||||
;;;      "Set local key defs for inf-ruby in ruby-mode")
 | 
			
		||||
;;;    (add-hook 'ruby-mode-hook
 | 
			
		||||
;;;          '(lambda ()
 | 
			
		||||
;;;             (inf-ruby-keys)
 | 
			
		||||
;;;    ))
 | 
			
		||||
;;;
 | 
			
		||||
;;; HISTORY
 | 
			
		||||
;;; senda -  8 Apr 1998: Created.
 | 
			
		||||
;;;      $Log$
 | 
			
		||||
;;;      Revision 1.7  2004/07/27 08:11:36  matz
 | 
			
		||||
;;;      * eval.c (rb_eval): copy on write for argument local variable
 | 
			
		||||
;;;        assignment.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * eval.c (assign): ditto.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * eval.c (rb_call0): update ruby_frame->argv with the default
 | 
			
		||||
;;;        value used for the optional arguments.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * object.c (Init_Object): "===" calls rb_obj_equal() directly.
 | 
			
		||||
;;;        [ruby-list:39937]
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.6  2002/09/07 14:35:46  nobu
 | 
			
		||||
;;;      * misc/inf-ruby.el (inferior-ruby-error-regexp-alist): regexp
 | 
			
		||||
;;;        alist for error message from ruby.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * misc/inf-ruby.el (inferior-ruby-mode): fixed for Emacs.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * misc/inf-ruby.el (ruby-send-region): compilation-parse-errors
 | 
			
		||||
;;;        doesn't parse first line, so insert separators before each
 | 
			
		||||
;;;        evaluations.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.5  2002/08/19 10:05:47  nobu
 | 
			
		||||
;;;      * misc/inf-ruby.el (inf-ruby-keys): ruby-send-definition
 | 
			
		||||
;;;        conflicted with ruby-insert-end.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * misc/inf-ruby.el (inferior-ruby-mode): compilation-minor-mode.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * misc/inf-ruby.el (ruby-send-region): send as here document to
 | 
			
		||||
;;;        adjust source file/line.  [ruby-talk:47113], [ruby-dev:17965]
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * misc/inf-ruby.el (ruby-send-terminator): added to make unique
 | 
			
		||||
;;;        terminator.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.4  2002/01/29 07:16:09  matz
 | 
			
		||||
;;;      * file.c (rb_stat_rdev_major): added. [new]
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * file.c (rb_stat_rdev_minor): added. [new]
 | 
			
		||||
;;;
 | 
			
		||||
;;;      * file.c (rb_stat_inspect): print mode in octal.
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.3  1999/12/01 09:24:18  matz
 | 
			
		||||
;;;      19991201
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.2  1999/08/13 05:45:18  matz
 | 
			
		||||
;;;      1.4.0
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.1.1.1.2.1  1999/07/15 07:59:59  matz
 | 
			
		||||
;;;      990715
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.1.1.1  1999/01/20 04:59:36  matz
 | 
			
		||||
;;;      ruby 1.3 cycle
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.1.2.1  1998/12/16 07:30:36  matz
 | 
			
		||||
;;;      first public release of 1.1d (pre1.2) series
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.4  1998/05/20 02:45:58  senda
 | 
			
		||||
;;;      default program to irb
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.3  1998/04/10 04:11:30  senda
 | 
			
		||||
;;;      modification by Matsumoto san (1.1b9_09)
 | 
			
		||||
;;;      remove-in-string defined
 | 
			
		||||
;;;      global variable :
 | 
			
		||||
;;;              inferior-ruby-first-prompt-pattern
 | 
			
		||||
;;;            inferior-ruby-prompt-pattern
 | 
			
		||||
;;;      defined
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.2  1998/04/09 07:53:42  senda
 | 
			
		||||
;;;      remove M-C-x in inferior-ruby-mode
 | 
			
		||||
;;;
 | 
			
		||||
;;;      Revision 1.1  1998/04/09 07:28:36  senda
 | 
			
		||||
;;;      Initial revision
 | 
			
		||||
;;;
 | 
			
		||||
;;;
 | 
			
		||||
 | 
			
		||||
(require 'comint)
 | 
			
		||||
(require 'compile)
 | 
			
		||||
(require 'ruby-mode)
 | 
			
		||||
 | 
			
		||||
;;
 | 
			
		||||
;; you may change these variables
 | 
			
		||||
;;
 | 
			
		||||
;(defvar ruby-program-name "rbc --noreadline"
 | 
			
		||||
;  "*Program invoked by the run-ruby command")
 | 
			
		||||
;
 | 
			
		||||
;(defvar inferior-ruby-first-prompt-pattern "^rbc0> *"
 | 
			
		||||
;  "first prompt regex pattern of ruby interpreter.")
 | 
			
		||||
;
 | 
			
		||||
;(defvar inferior-ruby-prompt-pattern "^\\(rbc.[>*\"'] *\\)+"
 | 
			
		||||
;  "prompt regex pattern of ruby interpreter.")
 | 
			
		||||
 | 
			
		||||
;;;; for irb
 | 
			
		||||
(defvar ruby-program-name "irb --inf-ruby-mode"
 | 
			
		||||
  "*Program invoked by the run-ruby command")
 | 
			
		||||
 | 
			
		||||
(defvar inferior-ruby-first-prompt-pattern "^irb(.*)[0-9:]+0> *"
 | 
			
		||||
  "first prompt regex pattern of ruby interpreter.")
 | 
			
		||||
 | 
			
		||||
(defvar inferior-ruby-prompt-pattern "^\\(irb(.*)[0-9:]+[>*\"'] *\\)+"
 | 
			
		||||
  "prompt regex pattern of ruby interpreter.")
 | 
			
		||||
 | 
			
		||||
;;
 | 
			
		||||
;; mode variables
 | 
			
		||||
;;
 | 
			
		||||
(defvar inferior-ruby-mode-hook nil
 | 
			
		||||
  "*Hook for customising inferior-ruby mode.")
 | 
			
		||||
(defvar inferior-ruby-mode-map nil
 | 
			
		||||
  "*Mode map for inferior-ruby-mode")
 | 
			
		||||
 | 
			
		||||
(defconst inferior-ruby-error-regexp-alist
 | 
			
		||||
       '(("SyntaxError: compile error\n^\\([^\(].*\\):\\([1-9][0-9]*\\):" 1 2)
 | 
			
		||||
         ("^\tfrom \\([^\(].*\\):\\([1-9][0-9]*\\)\\(:in `.*'\\)?$" 1 2)))
 | 
			
		||||
 | 
			
		||||
(cond ((not inferior-ruby-mode-map)
 | 
			
		||||
       (setq inferior-ruby-mode-map
 | 
			
		||||
             (copy-keymap comint-mode-map))
 | 
			
		||||
;       (define-key inferior-ruby-mode-map "\M-\C-x" ;gnu convention
 | 
			
		||||
;                  'ruby-send-definition)
 | 
			
		||||
;       (define-key inferior-ruby-mode-map "\C-x\C-e" 'ruby-send-last-sexp)
 | 
			
		||||
       (define-key inferior-ruby-mode-map "\C-c\C-l" 'ruby-load-file)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(defun inf-ruby-keys ()
 | 
			
		||||
  "Set local key defs for inf-ruby in ruby-mode"
 | 
			
		||||
  (define-key ruby-mode-map "\M-\C-x" 'ruby-send-definition)
 | 
			
		||||
;  (define-key ruby-mode-map "\C-x\C-e" 'ruby-send-last-sexp)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\C-b" 'ruby-send-block)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\M-b" 'ruby-send-block-and-go)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\C-x" 'ruby-send-definition)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\M-x" 'ruby-send-definition-and-go)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\C-r" 'ruby-send-region)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\M-r" 'ruby-send-region-and-go)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\C-z" 'switch-to-ruby)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\C-l" 'ruby-load-file)
 | 
			
		||||
  (define-key ruby-mode-map "\C-c\C-s" 'run-ruby)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
(defvar ruby-buffer nil "current ruby (actually irb) process buffer.")
 | 
			
		||||
 | 
			
		||||
(defun inferior-ruby-mode ()
 | 
			
		||||
  "Major mode for interacting with an inferior ruby (irb) process.
 | 
			
		||||
 | 
			
		||||
The following commands are available:
 | 
			
		||||
\\{inferior-ruby-mode-map}
 | 
			
		||||
 | 
			
		||||
A ruby process can be fired up with M-x run-ruby.
 | 
			
		||||
 | 
			
		||||
Customisation: Entry to this mode runs the hooks on comint-mode-hook and
 | 
			
		||||
inferior-ruby-mode-hook (in that order).
 | 
			
		||||
 | 
			
		||||
You can send text to the inferior ruby process from other buffers containing
 | 
			
		||||
Ruby source.
 | 
			
		||||
    switch-to-ruby switches the current buffer to the ruby process buffer.
 | 
			
		||||
    ruby-send-definition sends the current definition to the ruby process.
 | 
			
		||||
    ruby-send-region sends the current region to the ruby process.
 | 
			
		||||
 | 
			
		||||
    ruby-send-definition-and-go, ruby-send-region-and-go,
 | 
			
		||||
        switch to the ruby process buffer after sending their text.
 | 
			
		||||
For information on running multiple processes in multiple buffers, see
 | 
			
		||||
documentation for variable ruby-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 ruby; 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-ruby-mode-hook
 | 
			
		||||
  ;(setq comint-prompt-regexp "^[^>\n]*>+ *")
 | 
			
		||||
  (setq comint-prompt-regexp inferior-ruby-prompt-pattern)
 | 
			
		||||
  ;;(scheme-mode-variables)
 | 
			
		||||
  (ruby-mode-variables)
 | 
			
		||||
  (setq major-mode 'inferior-ruby-mode)
 | 
			
		||||
  (setq mode-name "Inferior Ruby")
 | 
			
		||||
  (setq mode-line-process '(":%s"))
 | 
			
		||||
  (use-local-map inferior-ruby-mode-map)
 | 
			
		||||
  (setq comint-input-filter (function ruby-input-filter))
 | 
			
		||||
  (setq comint-get-old-input (function ruby-get-old-input))
 | 
			
		||||
  (make-local-variable 'compilation-error-regexp-alist)
 | 
			
		||||
  (setq compilation-error-regexp-alist inferior-ruby-error-regexp-alist)
 | 
			
		||||
  (compilation-shell-minor-mode t)
 | 
			
		||||
  (run-hooks 'inferior-ruby-mode-hook))
 | 
			
		||||
 | 
			
		||||
(defvar inferior-ruby-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 ruby-input-filter (str)
 | 
			
		||||
  "Don't save anything matching inferior-ruby-filter-regexp"
 | 
			
		||||
  (not (string-match inferior-ruby-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 ruby-get-old-input ()
 | 
			
		||||
  "Snarf the sexp ending at point"
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (let ((end (point)))
 | 
			
		||||
      (re-search-backward inferior-ruby-first-prompt-pattern)
 | 
			
		||||
      (remove-in-string (buffer-substring (point) end)
 | 
			
		||||
                        inferior-ruby-prompt-pattern)
 | 
			
		||||
      )))
 | 
			
		||||
 | 
			
		||||
(defun ruby-args-to-list (string)
 | 
			
		||||
  (let ((where (string-match "[ \t]" string)))
 | 
			
		||||
    (cond ((null where) (list string))
 | 
			
		||||
          ((not (= where 0))
 | 
			
		||||
           (cons (substring string 0 where)
 | 
			
		||||
                 (ruby-args-to-list (substring string (+ 1 where)
 | 
			
		||||
                                                 (length string)))))
 | 
			
		||||
          (t (let ((pos (string-match "[^ \t]" string)))
 | 
			
		||||
               (if (null pos)
 | 
			
		||||
                   nil
 | 
			
		||||
                 (ruby-args-to-list (substring string pos
 | 
			
		||||
                                                 (length string)))))))))
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(defun run-ruby (cmd)
 | 
			
		||||
  "Run an inferior Ruby process, input and output via buffer *ruby*.
 | 
			
		||||
If there is a process already running in `*ruby*', switch to that buffer.
 | 
			
		||||
With argument, allows you to edit the command line (default is value
 | 
			
		||||
of `ruby-program-name').  Runs the hooks `inferior-ruby-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 Ruby: " ruby-program-name)
 | 
			
		||||
                         ruby-program-name)))
 | 
			
		||||
  (if (not (comint-check-proc "*ruby*"))
 | 
			
		||||
      (let ((cmdlist (ruby-args-to-list cmd)))
 | 
			
		||||
        (set-buffer (apply 'make-comint "ruby" (car cmdlist)
 | 
			
		||||
                           nil (cdr cmdlist)))
 | 
			
		||||
        (inferior-ruby-mode)))
 | 
			
		||||
  (setq ruby-program-name cmd)
 | 
			
		||||
  (setq ruby-buffer "*ruby*")
 | 
			
		||||
  (pop-to-buffer "*ruby*"))
 | 
			
		||||
 | 
			
		||||
(defconst ruby-send-terminator "--inf-ruby-%x-%d-%d-%d--"
 | 
			
		||||
  "Template for irb here document terminator.
 | 
			
		||||
Must not contain ruby meta characters.")
 | 
			
		||||
 | 
			
		||||
(defconst ruby-eval-separator "")
 | 
			
		||||
 | 
			
		||||
(defun ruby-send-region (start end)
 | 
			
		||||
  "Send the current region to the inferior Ruby process."
 | 
			
		||||
  (interactive "r")
 | 
			
		||||
  (let (term (file (buffer-file-name)) line)
 | 
			
		||||
    (save-excursion
 | 
			
		||||
      (save-restriction
 | 
			
		||||
        (widen)
 | 
			
		||||
        (goto-char start)
 | 
			
		||||
        (setq line (+ start (forward-line (- start)) 1))
 | 
			
		||||
        (goto-char start)
 | 
			
		||||
        (while (progn
 | 
			
		||||
                 (setq term (apply 'format ruby-send-terminator (random) (current-time)))
 | 
			
		||||
                 (re-search-forward (concat "^" (regexp-quote term) "$") end t)))))
 | 
			
		||||
    ;; compilation-parse-errors parses from second line.
 | 
			
		||||
    (save-excursion
 | 
			
		||||
      (let ((m (process-mark (ruby-proc))))
 | 
			
		||||
        (set-buffer (marker-buffer m))
 | 
			
		||||
        (goto-char m)
 | 
			
		||||
        (insert ruby-eval-separator "\n")
 | 
			
		||||
        (set-marker m (point))))
 | 
			
		||||
    (comint-send-string (ruby-proc) (format "eval <<'%s', nil, %S, %d\n" term file line))
 | 
			
		||||
    (comint-send-region (ruby-proc) start end)
 | 
			
		||||
    (comint-send-string (ruby-proc) (concat "\n" term "\n"))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-send-definition ()
 | 
			
		||||
  "Send the current definition to the inferior Ruby process."
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (ruby-end-of-defun)
 | 
			
		||||
    (let ((end (point)))
 | 
			
		||||
      (ruby-beginning-of-defun)
 | 
			
		||||
      (ruby-send-region (point) end))))
 | 
			
		||||
 | 
			
		||||
;(defun ruby-send-last-sexp ()
 | 
			
		||||
;  "Send the previous sexp to the inferior Ruby process."
 | 
			
		||||
;  (interactive)
 | 
			
		||||
;  (ruby-send-region (save-excursion (backward-sexp) (point)) (point)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-send-block ()
 | 
			
		||||
  "Send the current block to the inferior Ruby process."
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (ruby-end-of-block)
 | 
			
		||||
    (end-of-line)
 | 
			
		||||
    (let ((end (point)))
 | 
			
		||||
      (ruby-beginning-of-block)
 | 
			
		||||
      (ruby-send-region (point) end))))
 | 
			
		||||
 | 
			
		||||
(defun switch-to-ruby (eob-p)
 | 
			
		||||
  "Switch to the ruby process buffer.
 | 
			
		||||
With argument, positions cursor at end of buffer."
 | 
			
		||||
  (interactive "P")
 | 
			
		||||
  (if (get-buffer ruby-buffer)
 | 
			
		||||
      (pop-to-buffer ruby-buffer)
 | 
			
		||||
      (error "No current process buffer. See variable ruby-buffer."))
 | 
			
		||||
  (cond (eob-p
 | 
			
		||||
         (push-mark)
 | 
			
		||||
         (goto-char (point-max)))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-send-region-and-go (start end)
 | 
			
		||||
  "Send the current region to the inferior Ruby process.
 | 
			
		||||
Then switch to the process buffer."
 | 
			
		||||
  (interactive "r")
 | 
			
		||||
  (ruby-send-region start end)
 | 
			
		||||
  (switch-to-ruby t))
 | 
			
		||||
 | 
			
		||||
(defun ruby-send-definition-and-go ()
 | 
			
		||||
  "Send the current definition to the inferior Ruby.
 | 
			
		||||
Then switch to the process buffer."
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (ruby-send-definition)
 | 
			
		||||
  (switch-to-ruby t))
 | 
			
		||||
 | 
			
		||||
(defun ruby-send-block-and-go ()
 | 
			
		||||
  "Send the current block to the inferior Ruby.
 | 
			
		||||
Then switch to the process buffer."
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (ruby-send-block)
 | 
			
		||||
  (switch-to-ruby t))
 | 
			
		||||
 | 
			
		||||
(defvar ruby-source-modes '(ruby-mode)
 | 
			
		||||
  "*Used to determine if a buffer contains Ruby source code.
 | 
			
		||||
If it's loaded into a buffer that is in one of these major modes, it's
 | 
			
		||||
considered a ruby source file by ruby-load-file.
 | 
			
		||||
Used by these commands to determine defaults.")
 | 
			
		||||
 | 
			
		||||
(defvar ruby-prev-l/c-dir/file nil
 | 
			
		||||
  "Caches the last (directory . file) pair.
 | 
			
		||||
Caches the last pair used in the last ruby-load-file command.
 | 
			
		||||
Used for determining the default in the
 | 
			
		||||
next one.")
 | 
			
		||||
 | 
			
		||||
(defun ruby-load-file (file-name)
 | 
			
		||||
  "Load a Ruby file into the inferior Ruby process."
 | 
			
		||||
  (interactive (comint-get-source "Load Ruby file: " ruby-prev-l/c-dir/file
 | 
			
		||||
                                  ruby-source-modes t)) ; T because LOAD
 | 
			
		||||
                                                          ; needs an exact name
 | 
			
		||||
  (comint-check-source file-name) ; Check to see if buffer needs saved.
 | 
			
		||||
  (setq ruby-prev-l/c-dir/file (cons (file-name-directory    file-name)
 | 
			
		||||
                                       (file-name-nondirectory file-name)))
 | 
			
		||||
  (comint-send-string (ruby-proc) (concat "(load \""
 | 
			
		||||
                                            file-name
 | 
			
		||||
                                            "\"\)\n")))
 | 
			
		||||
 | 
			
		||||
(defun ruby-proc ()
 | 
			
		||||
  "Returns the current ruby process. See variable ruby-buffer."
 | 
			
		||||
  (let ((proc (get-buffer-process (if (eq major-mode 'inferior-ruby-mode)
 | 
			
		||||
                                      (current-buffer)
 | 
			
		||||
                                    ruby-buffer))))
 | 
			
		||||
    (or proc
 | 
			
		||||
        (error "No current process. See variable ruby-buffer"))))
 | 
			
		||||
 | 
			
		||||
;;; Do the user's customisation...
 | 
			
		||||
 | 
			
		||||
(defvar inf-ruby-load-hook nil
 | 
			
		||||
  "This hook is run when inf-ruby is loaded in.
 | 
			
		||||
This is a good place to put keybindings.")
 | 
			
		||||
 | 
			
		||||
(run-hooks 'inf-ruby-load-hook)
 | 
			
		||||
 | 
			
		||||
(provide 'inf-ruby)
 | 
			
		||||
 | 
			
		||||
;;; inf-ruby.el ends here
 | 
			
		||||
| 
						 | 
				
			
			@ -1,166 +0,0 @@
 | 
			
		|||
;;
 | 
			
		||||
;; rdoc-mode.el
 | 
			
		||||
;; Major mode for RDoc editing
 | 
			
		||||
;;
 | 
			
		||||
 | 
			
		||||
;; Created: Fri Sep 18 09:04:49 JST 2009
 | 
			
		||||
 | 
			
		||||
;; License: Ruby's
 | 
			
		||||
 | 
			
		||||
(require 'derived)
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(define-derived-mode rdoc-mode text-mode "RDoc"
 | 
			
		||||
  "Major mode for RD editing.
 | 
			
		||||
\\{rdoc-mode-map}"
 | 
			
		||||
  (make-local-variable 'paragraph-separate)
 | 
			
		||||
  (setq paragraph-separate "^\\(=+\\|\\*+\\)[ \t\v\f]*\\|^\\s *$")
 | 
			
		||||
  (make-local-variable 'paragraph-start)
 | 
			
		||||
  (setq paragraph-start paragraph-separate)
 | 
			
		||||
  (make-local-variable 'require-final-newline)
 | 
			
		||||
  (setq require-final-newline t)
 | 
			
		||||
  (make-local-variable 'font-lock-defaults)
 | 
			
		||||
  (setq font-lock-defaults '((rdoc-font-lock-keywords) t nil))
 | 
			
		||||
  (make-local-variable 'font-lock-keywords)
 | 
			
		||||
  (setq font-lock-keywords rdoc-font-lock-keywords)
 | 
			
		||||
  (make-local-variable 'outline-regexp)
 | 
			
		||||
  (setq outline-regexp "^\\(=+\\)[ \t\v\f]*")
 | 
			
		||||
  (outline-minor-mode t)
 | 
			
		||||
  (setq show-trailing-whitespace t)
 | 
			
		||||
  (rdoc-setup-keys)
 | 
			
		||||
  (setq indent-tabs-mode nil)
 | 
			
		||||
  (run-hooks 'rdoc-mode-hook)
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
(defun rdoc-fill-paragraph (&optional justify region)
 | 
			
		||||
  "Fills paragraph, except for cited region"
 | 
			
		||||
  (interactive (progn
 | 
			
		||||
		 (barf-if-buffer-read-only)
 | 
			
		||||
		 (list (if current-prefix-arg 'full))))
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (beginning-of-line)
 | 
			
		||||
    (save-restriction
 | 
			
		||||
      (let ((pos (point)) beg end indent hanging)
 | 
			
		||||
	(cond
 | 
			
		||||
	 ((looking-at "^ +\\(\\*\\s *\\)")
 | 
			
		||||
	  (setq indent (- (match-end 0) (match-beginning 0))
 | 
			
		||||
		hanging (- (match-end 1) (match-beginning 1))))
 | 
			
		||||
	 ((looking-at "^ +")
 | 
			
		||||
	  (setq indent (- (match-end 0) (match-beginning 0)))
 | 
			
		||||
	  (when (and (re-search-backward "^[^ ]\\|^\\( *\\(\\* *\\)\\)" nil t)
 | 
			
		||||
		     (match-beginning 1)
 | 
			
		||||
		     (= indent (- (match-end 1) (match-beginning 1))))
 | 
			
		||||
	    (setq hanging (- (match-end 2) (match-beginning 2)))
 | 
			
		||||
	    (setq beg (match-beginning 1))))
 | 
			
		||||
	 ((setq beg t)))
 | 
			
		||||
	(when beg
 | 
			
		||||
	  (when indent
 | 
			
		||||
	    (goto-char pos)
 | 
			
		||||
	    (while (progn (beginning-of-line 2)
 | 
			
		||||
			  (and (looking-at "^\\( +\\)\\S ")
 | 
			
		||||
			       (= indent (- (match-end 1) (match-beginning 1))))))
 | 
			
		||||
	    (setq end (point))
 | 
			
		||||
	    (when (and beg (not region))
 | 
			
		||||
	      (setq region (list beg end))
 | 
			
		||||
	      (narrow-to-region beg end)
 | 
			
		||||
	      ))
 | 
			
		||||
	  (goto-char pos)
 | 
			
		||||
	  (fill-paragraph justify region)
 | 
			
		||||
	  (when (and indent
 | 
			
		||||
		     (or (goto-char beg) t)
 | 
			
		||||
		     (or (beginning-of-line 2) t)
 | 
			
		||||
		     (looking-at "^\\( +\\)")
 | 
			
		||||
		     (= (- indent hanging) (- (match-end 0) (match-beginning 0))))
 | 
			
		||||
	    (insert-char ?\s hanging)
 | 
			
		||||
	    (beginning-of-line)
 | 
			
		||||
	    (narrow-to-region (point) end)
 | 
			
		||||
	    (fill-paragraph justify (list (point) end))))))))
 | 
			
		||||
 | 
			
		||||
(defun rdoc-setup-keys ()
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (define-key rdoc-mode-map "\M-q" 'rdoc-fill-paragraph)
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
(defvar rdoc-heading1-face 'font-lock-keywordoc-face)
 | 
			
		||||
(defvar rdoc-heading2-face 'font-lock-type-face)
 | 
			
		||||
(defvar rdoc-heading3-face 'font-lock-variable-name-face)
 | 
			
		||||
(defvar rdoc-heading4-face 'font-lock-comment-face)
 | 
			
		||||
(defvar rdoc-bold-face 'font-lock-function-name-face)
 | 
			
		||||
(defvar rdoc-emphasis-face 'font-lock-function-name-face)
 | 
			
		||||
(defvar rdoc-code-face 'font-lock-keyword-face)
 | 
			
		||||
(defvar rdoc-description-face 'font-lock-constant-face)
 | 
			
		||||
 | 
			
		||||
(defvar rdoc-font-lock-keywords
 | 
			
		||||
  (list
 | 
			
		||||
   (list "^=([^=\r\n].*)?$"
 | 
			
		||||
	 0 rdoc-heading1-face)
 | 
			
		||||
   (list "^==([^=\r\n].*)?$"
 | 
			
		||||
	 0 rdoc-heading2-face)
 | 
			
		||||
   (list "^===([^=\r\n].*)?$"
 | 
			
		||||
	 0 rdoc-heading3-face)
 | 
			
		||||
   (list "^====+.*$"
 | 
			
		||||
	 0 rdoc-heading4-face)
 | 
			
		||||
   (list "\\(^\\|[ \t\v\f]\\)\\(\\*\\(\\sw\\|[-_:]\\)+\\*\\)\\($\\|[ \t\v\f]\\)"
 | 
			
		||||
	 2 rdoc-bold-face)		; *bold*
 | 
			
		||||
   (list "\\(^\\|[ \t\v\f]\\)\\(_\\(\\sw\\|[-_:]\\)+_\\)\\($\\|[ \t\v\f]\\)"
 | 
			
		||||
	 2 rdoc-emphasis-face)		; _emphasis_
 | 
			
		||||
   (list "\\(^\\|[ \t\v\f]\\)\\(\\+\\(\\sw\\|[-_:]\\)+\\+\\)\\($\\|[ \t\v\f]\\)"
 | 
			
		||||
	 2 rdoc-code-face)		; +code+
 | 
			
		||||
   (list "<em>[^<>]*</em>" 0 rdoc-emphasis-face)
 | 
			
		||||
   (list "<i>[^<>]*</i>" 0 rdoc-emphasis-face)
 | 
			
		||||
   (list "<b>[^<>]*</b>" 0 rdoc-bold-face)
 | 
			
		||||
   (list "<tt>[^<>]*</tt>" 0 rdoc-code-face)
 | 
			
		||||
   (list "<code>[^<>]*</code>" 0 rdoc-code-face)
 | 
			
		||||
   (list "^\\([-*]\\|[0-9]+\\.\\|[A-Za-z]\\.\\)\\s "
 | 
			
		||||
	 1 rdoc-description-face) ; bullet | numbered | alphabetically numbered
 | 
			
		||||
   (list "^\\[[^\]]*\\]\\|\\S .*::\\)\\([ \t\v\f]\\|$\\)"
 | 
			
		||||
	 1 rdoc-description-face)	; labeled | node
 | 
			
		||||
   ;(list "^[ \t\v\f]+\\(.*\\)" 1 rdoc-verbatim-face)
 | 
			
		||||
   ))
 | 
			
		||||
 | 
			
		||||
(defun rdoc-imenu-create-index ()
 | 
			
		||||
  (let ((root '(nil . nil))
 | 
			
		||||
        cur-alist
 | 
			
		||||
        (cur-level 0)
 | 
			
		||||
        (pattern (concat outline-regexp "\\(.*?\\)[ \t\v\f]*$"))
 | 
			
		||||
        (empty-heading "-")
 | 
			
		||||
        (self-heading ".")
 | 
			
		||||
        pos level heading alist)
 | 
			
		||||
    (save-excursion
 | 
			
		||||
      (goto-char (point-min))
 | 
			
		||||
      (while (re-search-forward pattern (point-max) t)
 | 
			
		||||
        (setq heading (match-string-no-properties 2)
 | 
			
		||||
              level (min 6 (length (match-string-no-properties 1)))
 | 
			
		||||
              pos (match-beginning 1))
 | 
			
		||||
        (if (= (length heading) 0)
 | 
			
		||||
            (setq heading empty-heading))
 | 
			
		||||
        (setq alist (list (cons heading pos)))
 | 
			
		||||
        (cond
 | 
			
		||||
         ((= cur-level level)		; new sibling
 | 
			
		||||
          (setcdr cur-alist alist)
 | 
			
		||||
          (setq cur-alist alist))
 | 
			
		||||
         ((< cur-level level)		; first child
 | 
			
		||||
          (dotimes (i (- level cur-level 1))
 | 
			
		||||
            (setq alist (list (cons empty-heading alist))))
 | 
			
		||||
          (if cur-alist
 | 
			
		||||
              (let* ((parent (car cur-alist))
 | 
			
		||||
                     (self-pos (cdr parent)))
 | 
			
		||||
                (setcdr parent (cons (cons self-heading self-pos) alist)))
 | 
			
		||||
            (setcdr root alist))	; primogenitor
 | 
			
		||||
          (setq cur-alist alist
 | 
			
		||||
                cur-level level))
 | 
			
		||||
         (t				; new sibling of an ancestor
 | 
			
		||||
          (let ((sibling-alist (last (cdr root))))
 | 
			
		||||
            (dotimes (i (1- level))
 | 
			
		||||
              (setq sibling-alist (last (cdar sibling-alist))))
 | 
			
		||||
            (setcdr sibling-alist alist)
 | 
			
		||||
            (setq cur-alist alist
 | 
			
		||||
                  cur-level level))))))
 | 
			
		||||
    (cdr root)))
 | 
			
		||||
 | 
			
		||||
(defun rdoc-set-imenu-create-index-function ()
 | 
			
		||||
  (setq imenu-create-index-function 'rdoc-imenu-create-index))
 | 
			
		||||
 | 
			
		||||
(add-hook 'rdoc-mode-hook 'rdoc-set-imenu-create-index-function)
 | 
			
		||||
 | 
			
		||||
(provide 'rdoc-mode)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,181 +0,0 @@
 | 
			
		|||
;;; ruby-additional.el --- ruby-mode extensions yet to be merged into Emacs
 | 
			
		||||
 | 
			
		||||
;; Authors: Yukihiro Matsumoto, Nobuyoshi Nakada, Akinori MUSHA
 | 
			
		||||
;; URL: https://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/
 | 
			
		||||
;; Created: 3 Sep 2012
 | 
			
		||||
;; Package-Requires: ((emacs "24.3") (ruby-mode "1.2"))
 | 
			
		||||
;; Keywords: ruby, languages
 | 
			
		||||
 | 
			
		||||
;;; Commentary:
 | 
			
		||||
;;
 | 
			
		||||
;; This package contains ruby-mode extensions yet to be merged into
 | 
			
		||||
;; the latest released version of Emacs distribution.  For older
 | 
			
		||||
;; versions of Emacs, use ruby-mode.el bundled with CRuby.
 | 
			
		||||
 | 
			
		||||
;;; Code:
 | 
			
		||||
 | 
			
		||||
(eval-when-compile
 | 
			
		||||
  (require 'ruby-mode))
 | 
			
		||||
 | 
			
		||||
(eval-after-load 'ruby-mode
 | 
			
		||||
  '(progn
 | 
			
		||||
     (define-key ruby-mode-map "\C-c\C-e" 'ruby-insert-end)
 | 
			
		||||
 | 
			
		||||
     (defun ruby-insert-end ()
 | 
			
		||||
       (interactive)
 | 
			
		||||
       (if (eq (char-syntax (preceding-char)) ?w)
 | 
			
		||||
           (insert " "))
 | 
			
		||||
       (insert "end")
 | 
			
		||||
       (save-excursion
 | 
			
		||||
         (if (eq (char-syntax (following-char)) ?w)
 | 
			
		||||
             (insert " "))
 | 
			
		||||
         (ruby-indent-line t)
 | 
			
		||||
         (end-of-line)))
 | 
			
		||||
 | 
			
		||||
     (defconst ruby-default-encoding-map
 | 
			
		||||
       '((us-ascii       . nil)       ;; Do not put coding: us-ascii
 | 
			
		||||
         (utf-8          . nil)       ;; Do not put coding: utf-8
 | 
			
		||||
         (shift-jis      . cp932)     ;; Emacs charset name of Shift_JIS
 | 
			
		||||
         (shift_jis      . cp932)     ;; MIME charset name of Shift_JIS
 | 
			
		||||
         (japanese-cp932 . cp932))    ;; Emacs charset name of CP932
 | 
			
		||||
       )
 | 
			
		||||
 | 
			
		||||
     (custom-set-default 'ruby-encoding-map ruby-default-encoding-map)
 | 
			
		||||
 | 
			
		||||
     (defcustom ruby-encoding-map ruby-default-encoding-map
 | 
			
		||||
       "Alist to map encoding name from Emacs to Ruby.
 | 
			
		||||
Associating an encoding name with nil means it needs not be
 | 
			
		||||
explicitly declared in magic comment."
 | 
			
		||||
       :type '(repeat (cons (symbol :tag "From") (symbol :tag "To")))
 | 
			
		||||
       :group 'ruby)
 | 
			
		||||
 | 
			
		||||
     (defun ruby-mode-set-encoding ()
 | 
			
		||||
       "Insert or update a magic comment header with the proper encoding.
 | 
			
		||||
`ruby-encoding-map' is looked up to convert an encoding name from
 | 
			
		||||
Emacs to Ruby."
 | 
			
		||||
       (let* ((nonascii
 | 
			
		||||
               (save-excursion
 | 
			
		||||
                 (widen)
 | 
			
		||||
                 (goto-char (point-min))
 | 
			
		||||
                 (re-search-forward "[^\0-\177]" nil t)))
 | 
			
		||||
              (coding-system
 | 
			
		||||
               (or coding-system-for-write
 | 
			
		||||
                   buffer-file-coding-system))
 | 
			
		||||
              (coding-system
 | 
			
		||||
               (and coding-system
 | 
			
		||||
                    (coding-system-change-eol-conversion coding-system nil)))
 | 
			
		||||
              (coding-system
 | 
			
		||||
               (and coding-system
 | 
			
		||||
                    (or
 | 
			
		||||
                     (coding-system-get coding-system :mime-charset)
 | 
			
		||||
                     (let ((coding-type (coding-system-get coding-system :coding-type)))
 | 
			
		||||
                       (cond ((eq coding-type 'undecided)
 | 
			
		||||
                              (if nonascii
 | 
			
		||||
                                  (or (and (coding-system-get coding-system :prefer-utf-8)
 | 
			
		||||
                                           'utf-8)
 | 
			
		||||
                                      (coding-system-get default-buffer-file-coding-system :coding-type)
 | 
			
		||||
                                      'ascii-8bit)))
 | 
			
		||||
                             ((memq coding-type '(utf-8 shift-jis))
 | 
			
		||||
                              coding-type)
 | 
			
		||||
                             (t coding-system))))))
 | 
			
		||||
              (coding-system
 | 
			
		||||
               (or coding-system
 | 
			
		||||
                   'us-ascii))
 | 
			
		||||
              (coding-system
 | 
			
		||||
               (let ((cons (assq coding-system ruby-encoding-map)))
 | 
			
		||||
                 (if cons (cdr cons) coding-system)))
 | 
			
		||||
              (coding-system
 | 
			
		||||
               (and coding-system
 | 
			
		||||
                    (symbol-name coding-system))))
 | 
			
		||||
         (if coding-system
 | 
			
		||||
             (save-excursion
 | 
			
		||||
               (widen)
 | 
			
		||||
               (goto-char (point-min))
 | 
			
		||||
               (if (looking-at "^#!") (beginning-of-line 2))
 | 
			
		||||
               (cond ((looking-at "\\s *#.*-\*-\\s *\\(en\\)?coding\\s *:\\s *\\([-a-z0-9_]*\\)\\s *\\(;\\|-\*-\\)")
 | 
			
		||||
                      (unless (string= (match-string 2) coding-system)
 | 
			
		||||
                        (goto-char (match-beginning 2))
 | 
			
		||||
                        (delete-region (point) (match-end 2))
 | 
			
		||||
                        (and (looking-at "-\*-")
 | 
			
		||||
                             (let ((n (skip-chars-backward " ")))
 | 
			
		||||
                               (cond ((= n 0) (insert "  ") (backward-char))
 | 
			
		||||
                                     ((= n -1) (insert " "))
 | 
			
		||||
                                     ((forward-char)))))
 | 
			
		||||
                        (insert coding-system)))
 | 
			
		||||
                     ((looking-at "\\s *#.*coding\\s *[:=]"))
 | 
			
		||||
                     (t (when ruby-insert-encoding-magic-comment
 | 
			
		||||
                          (insert "# -*- coding: " coding-system " -*-\n"))))))))
 | 
			
		||||
 | 
			
		||||
     (define-key ruby-mode-map "\C-cU" 'ruby-encode-decode-unicode)
 | 
			
		||||
 | 
			
		||||
     (defun ruby-encode-unicode (beg end)
 | 
			
		||||
       "Convert non-ascii string in the given region to \\u{} form."
 | 
			
		||||
       (interactive "r")
 | 
			
		||||
       (setq end (set-marker (make-marker) end))
 | 
			
		||||
       (goto-char beg)
 | 
			
		||||
       (while (and (< (point) end)
 | 
			
		||||
		   (re-search-forward "\\([\C-@-\C-I\C-K\C-_\C-?]+\\)\\|[^\C-@-\C-?]+" end t))
 | 
			
		||||
	 (let ((str (match-string-no-properties 0)) sep b e f)
 | 
			
		||||
	   (if (match-beginning 1)
 | 
			
		||||
	       (setq b "" e "" sep ""
 | 
			
		||||
		     f (lambda (c)
 | 
			
		||||
			 (cond ((= c ?\t) "\\t")
 | 
			
		||||
			       ((= c ?\r) "\\r")
 | 
			
		||||
			       ((= c ?\e) "\\e")
 | 
			
		||||
			       ((= c ?\f) "\\f")
 | 
			
		||||
			       ((= c ?\b) "\\b")
 | 
			
		||||
			       ((= c ?\v) "\\v")
 | 
			
		||||
			       ((= c ?\C-?) "\\c?")
 | 
			
		||||
			       ((concat "\\c" (char-to-string (logior c #x40)))))))
 | 
			
		||||
	     (setq b "\\u{" e "}" sep " " f (lambda (c) (format "%x" c))))
 | 
			
		||||
	   (setq str (mapconcat f str sep))
 | 
			
		||||
	   (delete-region (match-beginning 0) (match-end 0))
 | 
			
		||||
	   (insert b str e))))
 | 
			
		||||
 | 
			
		||||
     (defun ruby-decode-unicode (beg end)
 | 
			
		||||
       "Convert escaped Unicode in the given region to raw string."
 | 
			
		||||
       (interactive "r")
 | 
			
		||||
       (setq end (set-marker (make-marker) end))
 | 
			
		||||
       (goto-char beg)
 | 
			
		||||
       (while (and (< (point) end)
 | 
			
		||||
		   (re-search-forward "\\\\u\\([0-9a-fA-F]\\{4\\}\\)\\|\\\\u{\\([0-9a-fA-F \t]+\\)}" end t))
 | 
			
		||||
	 (let ((b (match-beginning 0)) (e (match-end 0))
 | 
			
		||||
	       (s (match-string-no-properties 1)))
 | 
			
		||||
	   (if s
 | 
			
		||||
	       (setq s (cons s nil))
 | 
			
		||||
	     (goto-char (match-beginning 2))
 | 
			
		||||
	     (while (looking-at "[ \t]*\\([0-9a-fA-F]+\\)")
 | 
			
		||||
	       (setq s (cons (match-string-no-properties 1) s))
 | 
			
		||||
	       (goto-char (match-end 0))))
 | 
			
		||||
	   (setq s (mapconcat (lambda (c) (format "%c" (string-to-int c 16)))
 | 
			
		||||
			      (nreverse s) ""))
 | 
			
		||||
	   (delete-region b e)
 | 
			
		||||
	   (insert s))
 | 
			
		||||
	 ))
 | 
			
		||||
 | 
			
		||||
     (defun ruby-encode-decode-unicode (dec beg end)
 | 
			
		||||
       "Convert Unicode <-> \\u{} in the given region."
 | 
			
		||||
       (interactive "P\nr")
 | 
			
		||||
       (if dec (ruby-decode-unicode beg end) (ruby-encode-unicode beg end)))
 | 
			
		||||
 | 
			
		||||
     (defun ruby-insert-heredoc-code-block (arg)
 | 
			
		||||
       "Insert indented here document code block"
 | 
			
		||||
       (interactive "P")
 | 
			
		||||
       (let ((c (if arg "~" "-")))
 | 
			
		||||
	 (insert "\"#{<<" c "\"{#\"}\\n#{<<" c "'};'}\""))
 | 
			
		||||
       (end-of-line)
 | 
			
		||||
       (if (eobp) (insert "\n") (forward-char))
 | 
			
		||||
       (indent-region (point)
 | 
			
		||||
		      (progn (insert "{#\n" "};\n") (point)))
 | 
			
		||||
       (beginning-of-line 0))
 | 
			
		||||
     (define-key ruby-mode-map "\C-cH" 'ruby-insert-heredoc-code-block)
 | 
			
		||||
     ))
 | 
			
		||||
 | 
			
		||||
;; monkey-patching ruby-mode.el in Emacs 24, as r49872.
 | 
			
		||||
(when (and (boundp 'ruby-syntax-before-regexp-re)
 | 
			
		||||
	   (not (string-match ruby-syntax-before-regexp-re "foo {|" 1)))
 | 
			
		||||
  (replace-regexp-in-string "\\[\\[" "\\&{|" ruby-syntax-before-regexp-re))
 | 
			
		||||
 | 
			
		||||
(provide 'ruby-additional)
 | 
			
		||||
 | 
			
		||||
;;; ruby-additional.el ends here
 | 
			
		||||
| 
						 | 
				
			
			@ -1,583 +0,0 @@
 | 
			
		|||
;;; ruby-electric.el --- Minor mode for electrically editing ruby code
 | 
			
		||||
;;
 | 
			
		||||
;; Authors: Dee Zsombor <dee dot zsombor at gmail dot com>
 | 
			
		||||
;;          Yukihiro Matsumoto
 | 
			
		||||
;;          Nobuyoshi Nakada
 | 
			
		||||
;;          Akinori MUSHA <knu@iDaemons.org>
 | 
			
		||||
;;          Jakub Kuźma <qoobaa@gmail.com>
 | 
			
		||||
;; Maintainer: Akinori MUSHA <knu@iDaemons.org>
 | 
			
		||||
;; Created: 6 Mar 2005
 | 
			
		||||
;; URL: https://github.com/knu/ruby-electric.el
 | 
			
		||||
;; Keywords: languages ruby
 | 
			
		||||
;; License: The same license terms as Ruby
 | 
			
		||||
;; Version: 2.3.1
 | 
			
		||||
 | 
			
		||||
;;; Commentary:
 | 
			
		||||
;;
 | 
			
		||||
;; `ruby-electric-mode' accelerates code writing in ruby by making
 | 
			
		||||
;; some keys "electric" and automatically supplying with closing
 | 
			
		||||
;; parentheses and "end" as appropriate.
 | 
			
		||||
;;
 | 
			
		||||
;; This work was originally inspired by a code snippet posted by
 | 
			
		||||
;; [Frederick Ros](https://github.com/sleeper).
 | 
			
		||||
;;
 | 
			
		||||
;; Add the following line to enable ruby-electric-mode under
 | 
			
		||||
;; ruby-mode.
 | 
			
		||||
;;
 | 
			
		||||
;;     (eval-after-load "ruby-mode"
 | 
			
		||||
;;       '(add-hook 'ruby-mode-hook 'ruby-electric-mode))
 | 
			
		||||
;;
 | 
			
		||||
;; Type M-x customize-group ruby-electric for configuration.
 | 
			
		||||
 | 
			
		||||
;;; Code:
 | 
			
		||||
 | 
			
		||||
(require 'ruby-mode)
 | 
			
		||||
 | 
			
		||||
(eval-when-compile
 | 
			
		||||
  (require 'cl))
 | 
			
		||||
 | 
			
		||||
(defgroup ruby-electric nil
 | 
			
		||||
  "Minor mode providing electric editing commands for ruby files"
 | 
			
		||||
  :group 'ruby)
 | 
			
		||||
 | 
			
		||||
(defconst ruby-electric-expandable-bar-re
 | 
			
		||||
  "\\s-\\(do\\|{\\)\\s-*|")
 | 
			
		||||
 | 
			
		||||
(defconst ruby-electric-delimiters-alist
 | 
			
		||||
  '((?\{ :name "Curly brace"  :handler ruby-electric-curlies       :closing ?\})
 | 
			
		||||
    (?\[ :name "Square brace" :handler ruby-electric-matching-char :closing ?\])
 | 
			
		||||
    (?\( :name "Round brace"  :handler ruby-electric-matching-char :closing ?\))
 | 
			
		||||
    (?\' :name "Quote"        :handler ruby-electric-matching-char)
 | 
			
		||||
    (?\" :name "Double quote" :handler ruby-electric-matching-char)
 | 
			
		||||
    (?\` :name "Back quote"   :handler ruby-electric-matching-char)
 | 
			
		||||
    (?\| :name "Vertical bar" :handler ruby-electric-bar)
 | 
			
		||||
    (?\# :name "Hash"         :handler ruby-electric-hash)))
 | 
			
		||||
 | 
			
		||||
(defvar ruby-electric-matching-delimeter-alist
 | 
			
		||||
  (apply 'nconc
 | 
			
		||||
         (mapcar #'(lambda (x)
 | 
			
		||||
                     (let ((delim (car x))
 | 
			
		||||
                           (plist (cdr x)))
 | 
			
		||||
                       (if (eq (plist-get plist :handler) 'ruby-electric-matching-char)
 | 
			
		||||
                           (list (cons delim (or (plist-get plist :closing)
 | 
			
		||||
                                                 delim))))))
 | 
			
		||||
                 ruby-electric-delimiters-alist)))
 | 
			
		||||
 | 
			
		||||
(defvar ruby-electric-expandable-keyword-re)
 | 
			
		||||
 | 
			
		||||
(defmacro ruby-electric--try-insert-and-do (string &rest body)
 | 
			
		||||
  (declare (indent 1))
 | 
			
		||||
  `(let ((before (point))
 | 
			
		||||
         (after (progn
 | 
			
		||||
                  (insert ,string)
 | 
			
		||||
                  (point))))
 | 
			
		||||
     (unwind-protect
 | 
			
		||||
         (progn ,@body)
 | 
			
		||||
       (delete-region before after)
 | 
			
		||||
       (goto-char before))))
 | 
			
		||||
 | 
			
		||||
(defconst ruby-modifier-beg-symbol-re
 | 
			
		||||
  (regexp-opt ruby-modifier-beg-keywords 'symbols))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric--modifier-keyword-at-point-p ()
 | 
			
		||||
  "Test if there is a modifier keyword at point."
 | 
			
		||||
  (and (looking-at ruby-modifier-beg-symbol-re)
 | 
			
		||||
       (let ((end (match-end 1)))
 | 
			
		||||
         (not (looking-back "\\."))
 | 
			
		||||
         (save-excursion
 | 
			
		||||
           (let ((indent1 (ruby-electric--try-insert-and-do "\n"
 | 
			
		||||
                            (ruby-calculate-indent)))
 | 
			
		||||
                 (indent2 (save-excursion
 | 
			
		||||
                            (goto-char end)
 | 
			
		||||
                            (ruby-electric--try-insert-and-do " x\n"
 | 
			
		||||
                              (ruby-calculate-indent)))))
 | 
			
		||||
             (= indent1 indent2))))))
 | 
			
		||||
 | 
			
		||||
(defconst ruby-block-mid-symbol-re
 | 
			
		||||
  (regexp-opt ruby-block-mid-keywords 'symbols))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric--block-mid-keyword-at-point-p ()
 | 
			
		||||
  "Test if there is a block mid keyword at point."
 | 
			
		||||
  (and (looking-at ruby-block-mid-symbol-re)
 | 
			
		||||
       (looking-back "^\\s-*")))
 | 
			
		||||
 | 
			
		||||
(defconst ruby-block-beg-symbol-re
 | 
			
		||||
  (regexp-opt ruby-block-beg-keywords 'symbols))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric--block-beg-keyword-at-point-p ()
 | 
			
		||||
  "Test if there is a block beginning keyword at point."
 | 
			
		||||
  (and (looking-at ruby-block-beg-symbol-re)
 | 
			
		||||
       (if (string= (match-string 1) "do")
 | 
			
		||||
           (looking-back "\\s-")
 | 
			
		||||
         (not (looking-back "\\.")))
 | 
			
		||||
       ;; (not (ruby-electric--modifier-keyword-at-point-p)) ;; implicit assumption
 | 
			
		||||
       ))
 | 
			
		||||
 | 
			
		||||
(defcustom ruby-electric-keywords-alist
 | 
			
		||||
  '(("begin" . end)
 | 
			
		||||
    ("case" . end)
 | 
			
		||||
    ("class" . end)
 | 
			
		||||
    ("def" . end)
 | 
			
		||||
    ("do" . end)
 | 
			
		||||
    ("else" . reindent)
 | 
			
		||||
    ("elsif" . reindent)
 | 
			
		||||
    ("end" . reindent)
 | 
			
		||||
    ("ensure" . reindent)
 | 
			
		||||
    ("for" . end)
 | 
			
		||||
    ("if" . end)
 | 
			
		||||
    ("module" . end)
 | 
			
		||||
    ("rescue" . reindent)
 | 
			
		||||
    ("unless" . end)
 | 
			
		||||
    ("until" . end)
 | 
			
		||||
    ("when" . reindent)
 | 
			
		||||
    ("while" . end))
 | 
			
		||||
  "Alist of keywords and actions to define how to react to space
 | 
			
		||||
or return right after each keyword.  In each (KEYWORD . ACTION)
 | 
			
		||||
cons, ACTION can be set to one of the following values:
 | 
			
		||||
 | 
			
		||||
    `reindent'  Reindent the line.
 | 
			
		||||
 | 
			
		||||
    `end'       Reindent the line and auto-close the keyword with
 | 
			
		||||
                end if applicable.
 | 
			
		||||
 | 
			
		||||
    `nil'       Do nothing.
 | 
			
		||||
"
 | 
			
		||||
  :type '(repeat (cons (string :tag "Keyword")
 | 
			
		||||
                       (choice :tag "Action"
 | 
			
		||||
                               :menu-tag "Action"
 | 
			
		||||
                               (const :tag "Auto-close with end"
 | 
			
		||||
                                      :value end)
 | 
			
		||||
                               (const :tag "Auto-reindent"
 | 
			
		||||
                                      :value reindent)
 | 
			
		||||
                               (const :tag "None"
 | 
			
		||||
                                      :value nil))))
 | 
			
		||||
  :set (lambda (sym val)
 | 
			
		||||
         (set sym val)
 | 
			
		||||
         (let (keywords)
 | 
			
		||||
           (dolist (x val)
 | 
			
		||||
             (let ((keyword (car x))
 | 
			
		||||
                   (action (cdr x)))
 | 
			
		||||
               (if action
 | 
			
		||||
                   (setq keywords (cons keyword keywords)))))
 | 
			
		||||
           (setq ruby-electric-expandable-keyword-re
 | 
			
		||||
                 (concat (regexp-opt keywords 'symbols)
 | 
			
		||||
                         "$"))))
 | 
			
		||||
  :group 'ruby-electric)
 | 
			
		||||
 | 
			
		||||
(defvar ruby-electric-mode-map
 | 
			
		||||
  (let ((map (make-sparse-keymap)))
 | 
			
		||||
    (define-key map " " 'ruby-electric-space/return)
 | 
			
		||||
    (define-key map [remap delete-backward-char] 'ruby-electric-delete-backward-char)
 | 
			
		||||
    (define-key map [remap newline] 'ruby-electric-space/return)
 | 
			
		||||
    (define-key map [remap newline-and-indent] 'ruby-electric-space/return)
 | 
			
		||||
    (define-key map [remap electric-newline-and-maybe-indent] 'ruby-electric-space/return)
 | 
			
		||||
    (define-key map [remap reindent-then-newline-and-indent] 'ruby-electric-space/return)
 | 
			
		||||
    (dolist (x ruby-electric-delimiters-alist)
 | 
			
		||||
      (let* ((delim   (car x))
 | 
			
		||||
             (plist   (cdr x))
 | 
			
		||||
             (name    (plist-get plist :name))
 | 
			
		||||
             (func    (plist-get plist :handler))
 | 
			
		||||
             (closing (plist-get plist :closing)))
 | 
			
		||||
        (define-key map (char-to-string delim) func)
 | 
			
		||||
        (if closing
 | 
			
		||||
            (define-key map (char-to-string closing) 'ruby-electric-closing-char))))
 | 
			
		||||
    map)
 | 
			
		||||
  "Keymap used in ruby-electric-mode")
 | 
			
		||||
 | 
			
		||||
(defcustom ruby-electric-expand-delimiters-list '(all)
 | 
			
		||||
  "*List of contexts where matching delimiter should be inserted.
 | 
			
		||||
The word 'all' will do all insertions."
 | 
			
		||||
  :type `(set :extra-offset 8
 | 
			
		||||
              (const :tag "Everything" all)
 | 
			
		||||
              ,@(apply 'list
 | 
			
		||||
                       (mapcar #'(lambda (x)
 | 
			
		||||
                                   `(const :tag ,(plist-get (cdr x) :name)
 | 
			
		||||
                                           ,(car x)))
 | 
			
		||||
                               ruby-electric-delimiters-alist)))
 | 
			
		||||
  :group 'ruby-electric)
 | 
			
		||||
 | 
			
		||||
(defcustom ruby-electric-newline-before-closing-bracket nil
 | 
			
		||||
  "*Non-nil means a newline should be inserted before an
 | 
			
		||||
automatically inserted closing bracket."
 | 
			
		||||
  :type 'boolean :group 'ruby-electric)
 | 
			
		||||
 | 
			
		||||
(defcustom ruby-electric-autoindent-on-closing-char nil
 | 
			
		||||
  "*Non-nil means the current line should be automatically
 | 
			
		||||
indented when a closing character is manually typed in."
 | 
			
		||||
  :type 'boolean :group 'ruby-electric)
 | 
			
		||||
 | 
			
		||||
(defvar ruby-electric-mode-hook nil
 | 
			
		||||
  "Called after `ruby-electric-mode' is turned on.")
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(define-minor-mode ruby-electric-mode
 | 
			
		||||
  "Toggle Ruby Electric minor mode.
 | 
			
		||||
With no argument, this command toggles the mode.  Non-null prefix
 | 
			
		||||
argument turns on the mode.  Null prefix argument turns off the
 | 
			
		||||
mode.
 | 
			
		||||
 | 
			
		||||
When Ruby Electric mode is enabled, an indented 'end' is
 | 
			
		||||
heuristicaly inserted whenever typing a word like 'module',
 | 
			
		||||
'class', 'def', 'if', 'unless', 'case', 'until', 'for', 'begin',
 | 
			
		||||
'do' followed by a space.  Single, double and back quotes as well
 | 
			
		||||
as braces are paired auto-magically.  Expansion does not occur
 | 
			
		||||
inside comments and strings. Note that you must have Font Lock
 | 
			
		||||
enabled."
 | 
			
		||||
  ;; initial value.
 | 
			
		||||
  nil
 | 
			
		||||
  ;;indicator for the mode line.
 | 
			
		||||
  " REl"
 | 
			
		||||
  ;;keymap
 | 
			
		||||
  ruby-electric-mode-map
 | 
			
		||||
  (if ruby-electric-mode
 | 
			
		||||
      (run-hooks 'ruby-electric-mode-hook)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-space/return-fallback ()
 | 
			
		||||
  (if (or (eq this-original-command 'ruby-electric-space/return)
 | 
			
		||||
          (null (ignore-errors
 | 
			
		||||
                  ;; ac-complete may fail if there is nothing left to complete
 | 
			
		||||
                  (call-interactively this-original-command)
 | 
			
		||||
                  (setq this-command this-original-command))))
 | 
			
		||||
      ;; fall back to a globally bound command
 | 
			
		||||
      (let ((command (global-key-binding (char-to-string last-command-event) t)))
 | 
			
		||||
        (and command
 | 
			
		||||
             (call-interactively (setq this-command command))))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-space/return (arg)
 | 
			
		||||
  (interactive "*P")
 | 
			
		||||
  (and (boundp 'sp-last-operation)
 | 
			
		||||
       (setq sp-delayed-pair nil))
 | 
			
		||||
  (cond ((or arg
 | 
			
		||||
             (region-active-p))
 | 
			
		||||
         (or (= last-command-event ?\s)
 | 
			
		||||
             (setq last-command-event ?\n))
 | 
			
		||||
         (ruby-electric-replace-region-or-insert))
 | 
			
		||||
        ((ruby-electric-space/return-can-be-expanded-p)
 | 
			
		||||
         (let (action)
 | 
			
		||||
           (save-excursion
 | 
			
		||||
             (goto-char (match-beginning 0))
 | 
			
		||||
             (let* ((keyword (match-string 1))
 | 
			
		||||
                    (allowed-actions
 | 
			
		||||
                     (cond ((ruby-electric--modifier-keyword-at-point-p)
 | 
			
		||||
                            '(reindent)) ;; no end necessary
 | 
			
		||||
                           ((ruby-electric--block-mid-keyword-at-point-p)
 | 
			
		||||
                            '(reindent)) ;; ditto
 | 
			
		||||
                           ((ruby-electric--block-beg-keyword-at-point-p)
 | 
			
		||||
                            '(end reindent)))))
 | 
			
		||||
               (if allowed-actions
 | 
			
		||||
                   (setq action
 | 
			
		||||
                         (let ((action (cdr (assoc keyword ruby-electric-keywords-alist))))
 | 
			
		||||
                           (and (memq action allowed-actions)
 | 
			
		||||
                                action))))))
 | 
			
		||||
           (cond ((eq action 'end)
 | 
			
		||||
                  (ruby-indent-line)
 | 
			
		||||
                  (save-excursion
 | 
			
		||||
                    (newline)
 | 
			
		||||
                    (ruby-electric-end)))
 | 
			
		||||
                 ((eq action 'reindent)
 | 
			
		||||
                  (ruby-indent-line)))
 | 
			
		||||
           (ruby-electric-space/return-fallback)))
 | 
			
		||||
        ((and (eq this-original-command 'newline-and-indent)
 | 
			
		||||
              (ruby-electric-comment-at-point-p))
 | 
			
		||||
         (call-interactively (setq this-command 'comment-indent-new-line)))
 | 
			
		||||
        (t
 | 
			
		||||
         (ruby-electric-space/return-fallback))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric--get-faces-at-point ()
 | 
			
		||||
  (let* ((point (point))
 | 
			
		||||
         (value (or
 | 
			
		||||
                 (get-text-property point 'read-face-name)
 | 
			
		||||
                 (get-text-property point 'face))))
 | 
			
		||||
    (if (listp value) value (list value))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric--faces-include-p (pfaces &rest faces)
 | 
			
		||||
  (and ruby-electric-mode
 | 
			
		||||
       (loop for face in faces
 | 
			
		||||
             thereis (memq face pfaces))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric--faces-at-point-include-p (&rest faces)
 | 
			
		||||
  (apply 'ruby-electric--faces-include-p
 | 
			
		||||
         (ruby-electric--get-faces-at-point)
 | 
			
		||||
         faces))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-code-face-p (faces)
 | 
			
		||||
  (not (ruby-electric--faces-include-p
 | 
			
		||||
        faces
 | 
			
		||||
        'font-lock-string-face
 | 
			
		||||
        'font-lock-comment-face
 | 
			
		||||
        'enh-ruby-string-delimiter-face
 | 
			
		||||
        'enh-ruby-heredoc-delimiter-face
 | 
			
		||||
        'enh-ruby-regexp-delimiter-face
 | 
			
		||||
        'enh-ruby-regexp-face)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-code-at-point-p ()
 | 
			
		||||
  (ruby-electric-code-face-p
 | 
			
		||||
   (ruby-electric--get-faces-at-point)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-string-face-p (faces)
 | 
			
		||||
  (ruby-electric--faces-include-p
 | 
			
		||||
   faces
 | 
			
		||||
   'font-lock-string-face
 | 
			
		||||
   'enh-ruby-string-delimiter-face
 | 
			
		||||
   'enh-ruby-heredoc-delimiter-face
 | 
			
		||||
   'enh-ruby-regexp-delimiter-face
 | 
			
		||||
   'enh-ruby-regexp-face))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-string-at-point-p ()
 | 
			
		||||
  (ruby-electric-string-face-p
 | 
			
		||||
   (ruby-electric--get-faces-at-point)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-comment-at-point-p ()
 | 
			
		||||
  (ruby-electric--faces-at-point-include-p
 | 
			
		||||
   'font-lock-comment-face))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-escaped-p()
 | 
			
		||||
  (let ((f nil))
 | 
			
		||||
    (save-excursion
 | 
			
		||||
      (while (char-equal ?\\ (preceding-char))
 | 
			
		||||
        (backward-char 1)
 | 
			
		||||
        (setq f (not f))))
 | 
			
		||||
    f))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-command-char-expandable-punct-p(char)
 | 
			
		||||
  (or (memq 'all ruby-electric-expand-delimiters-list)
 | 
			
		||||
      (memq char ruby-electric-expand-delimiters-list)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-space/return-can-be-expanded-p()
 | 
			
		||||
  (and (ruby-electric-code-at-point-p)
 | 
			
		||||
       (looking-back ruby-electric-expandable-keyword-re)))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-replace-region-or-insert ()
 | 
			
		||||
  (and (region-active-p)
 | 
			
		||||
       (bound-and-true-p delete-selection-mode)
 | 
			
		||||
       (fboundp 'delete-selection-helper)
 | 
			
		||||
       (delete-selection-helper (get 'self-insert-command 'delete-selection)))
 | 
			
		||||
  (insert (make-string (prefix-numeric-value current-prefix-arg)
 | 
			
		||||
                       last-command-event))
 | 
			
		||||
  (setq this-command 'self-insert-command))
 | 
			
		||||
 | 
			
		||||
(defmacro ruby-electric-insert (arg &rest body)
 | 
			
		||||
  `(cond ((and
 | 
			
		||||
           (null ,arg)
 | 
			
		||||
           (ruby-electric-command-char-expandable-punct-p last-command-event))
 | 
			
		||||
          (let ((region-beginning
 | 
			
		||||
                 (cond ((region-active-p)
 | 
			
		||||
                        (prog1
 | 
			
		||||
                            (save-excursion
 | 
			
		||||
                              (goto-char (region-beginning))
 | 
			
		||||
                              (insert last-command-event)
 | 
			
		||||
                              (point))
 | 
			
		||||
                          (goto-char (region-end))))
 | 
			
		||||
                       (t
 | 
			
		||||
                        (insert last-command-event)
 | 
			
		||||
                        nil)))
 | 
			
		||||
                (faces-at-point
 | 
			
		||||
                 (ruby-electric--get-faces-at-point)))
 | 
			
		||||
            ,@body
 | 
			
		||||
            (and region-beginning
 | 
			
		||||
                 ;; If no extra character is inserted, go back to the
 | 
			
		||||
                 ;; region beginning.
 | 
			
		||||
                 (eq this-command 'self-insert-command)
 | 
			
		||||
                 (goto-char region-beginning))))
 | 
			
		||||
         ((ruby-electric-replace-region-or-insert))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-curlies (arg)
 | 
			
		||||
  (interactive "*P")
 | 
			
		||||
  (ruby-electric-insert
 | 
			
		||||
   arg
 | 
			
		||||
   (cond
 | 
			
		||||
    ((or (ruby-electric-code-at-point-p)
 | 
			
		||||
         (ruby-electric--faces-include-p
 | 
			
		||||
          faces-at-point
 | 
			
		||||
          'enh-ruby-string-delimiter-face
 | 
			
		||||
          'enh-ruby-regexp-delimiter-face))
 | 
			
		||||
     (save-excursion
 | 
			
		||||
       (insert "}")
 | 
			
		||||
       (font-lock-fontify-region (line-beginning-position) (point)))
 | 
			
		||||
     (cond
 | 
			
		||||
      ((or (ruby-electric-string-at-point-p)  ;; %w{}, %r{}, etc.
 | 
			
		||||
           (looking-back "%[QqWwRrxIis]{"))
 | 
			
		||||
       (if region-beginning
 | 
			
		||||
           (forward-char 1)))
 | 
			
		||||
      (ruby-electric-newline-before-closing-bracket
 | 
			
		||||
       (cond (region-beginning
 | 
			
		||||
              (save-excursion
 | 
			
		||||
                (goto-char region-beginning)
 | 
			
		||||
                (newline))
 | 
			
		||||
              (newline)
 | 
			
		||||
              (forward-char 1)
 | 
			
		||||
              (indent-region region-beginning (line-end-position)))
 | 
			
		||||
             (t
 | 
			
		||||
              (insert " ")
 | 
			
		||||
              (save-excursion
 | 
			
		||||
                (newline)
 | 
			
		||||
                (ruby-indent-line t)))))
 | 
			
		||||
      (t
 | 
			
		||||
       (if region-beginning
 | 
			
		||||
           (save-excursion
 | 
			
		||||
             (goto-char region-beginning)
 | 
			
		||||
             (insert " "))
 | 
			
		||||
         (insert " "))
 | 
			
		||||
       (insert " ")
 | 
			
		||||
       (backward-char 1)
 | 
			
		||||
       (and region-beginning
 | 
			
		||||
            (forward-char 1)))))
 | 
			
		||||
    ((ruby-electric-string-at-point-p)
 | 
			
		||||
     (let ((start-position (1- (or region-beginning (point)))))
 | 
			
		||||
       (cond
 | 
			
		||||
        ((char-equal ?\# (char-before start-position))
 | 
			
		||||
         (unless (save-excursion
 | 
			
		||||
                   (goto-char (1- start-position))
 | 
			
		||||
                   (ruby-electric-escaped-p))
 | 
			
		||||
           (insert "}")
 | 
			
		||||
           (or region-beginning
 | 
			
		||||
               (backward-char 1))))
 | 
			
		||||
        ((or
 | 
			
		||||
          (ruby-electric-command-char-expandable-punct-p ?\#)
 | 
			
		||||
          (save-excursion
 | 
			
		||||
            (goto-char start-position)
 | 
			
		||||
            (ruby-electric-escaped-p)))
 | 
			
		||||
         (if region-beginning
 | 
			
		||||
             (goto-char region-beginning))
 | 
			
		||||
         (setq this-command 'self-insert-command))
 | 
			
		||||
        (t
 | 
			
		||||
         (save-excursion
 | 
			
		||||
           (goto-char start-position)
 | 
			
		||||
           (insert "#"))
 | 
			
		||||
         (insert "}")
 | 
			
		||||
         (or region-beginning
 | 
			
		||||
             (backward-char 1))))))
 | 
			
		||||
    (t
 | 
			
		||||
     (delete-char -1)
 | 
			
		||||
     (ruby-electric-replace-region-or-insert)))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-hash (arg)
 | 
			
		||||
  (interactive "*P")
 | 
			
		||||
  (ruby-electric-insert
 | 
			
		||||
   arg
 | 
			
		||||
   (if (ruby-electric-string-at-point-p)
 | 
			
		||||
       (let ((start-position (1- (or region-beginning (point)))))
 | 
			
		||||
         (cond
 | 
			
		||||
          ((char-equal (following-char) ?')) ;; likely to be in ''
 | 
			
		||||
          ((save-excursion
 | 
			
		||||
             (goto-char start-position)
 | 
			
		||||
             (ruby-electric-escaped-p)))
 | 
			
		||||
          (region-beginning
 | 
			
		||||
           (save-excursion
 | 
			
		||||
             (goto-char (1+ start-position))
 | 
			
		||||
             (insert "{"))
 | 
			
		||||
           (insert "}"))
 | 
			
		||||
          (t
 | 
			
		||||
           (insert "{")
 | 
			
		||||
           (save-excursion
 | 
			
		||||
             (insert "}")))))
 | 
			
		||||
     (delete-char -1)
 | 
			
		||||
     (ruby-electric-replace-region-or-insert))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-matching-char (arg)
 | 
			
		||||
  (interactive "*P")
 | 
			
		||||
  (ruby-electric-insert
 | 
			
		||||
   arg
 | 
			
		||||
   (let ((closing (cdr (assoc last-command-event
 | 
			
		||||
                              ruby-electric-matching-delimeter-alist))))
 | 
			
		||||
     (cond
 | 
			
		||||
      ;; quotes
 | 
			
		||||
      ((char-equal closing last-command-event)
 | 
			
		||||
       (cond ((not (ruby-electric-string-face-p faces-at-point))
 | 
			
		||||
              (if region-beginning
 | 
			
		||||
                  ;; escape quotes of the same kind, backslash and hash
 | 
			
		||||
                  (let ((re (format "[%c\\%s]"
 | 
			
		||||
                                    last-command-event
 | 
			
		||||
                                    (if (char-equal last-command-event ?\")
 | 
			
		||||
                                        "#" "")))
 | 
			
		||||
                        (bound (point)))
 | 
			
		||||
                    (save-excursion
 | 
			
		||||
                      (goto-char region-beginning)
 | 
			
		||||
                      (while (re-search-forward re bound t)
 | 
			
		||||
                        (let ((end (point)))
 | 
			
		||||
                          (replace-match "\\\\\\&")
 | 
			
		||||
                          (setq bound (+ bound (- (point) end))))))))
 | 
			
		||||
              (insert closing)
 | 
			
		||||
              (or region-beginning
 | 
			
		||||
                  (backward-char 1)))
 | 
			
		||||
             (t
 | 
			
		||||
              (and (eq last-command 'ruby-electric-matching-char)
 | 
			
		||||
                   (char-equal (following-char) closing) ;; repeated quotes
 | 
			
		||||
                   (delete-char 1))
 | 
			
		||||
              (setq this-command 'self-insert-command))))
 | 
			
		||||
      ((ruby-electric-code-at-point-p)
 | 
			
		||||
       (insert closing)
 | 
			
		||||
       (or region-beginning
 | 
			
		||||
           (backward-char 1)))))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-closing-char(arg)
 | 
			
		||||
  (interactive "*P")
 | 
			
		||||
  (cond
 | 
			
		||||
   (arg
 | 
			
		||||
    (ruby-electric-replace-region-or-insert))
 | 
			
		||||
   ((and
 | 
			
		||||
     (eq last-command 'ruby-electric-curlies)
 | 
			
		||||
     (= last-command-event ?})
 | 
			
		||||
     (not (char-equal (preceding-char) last-command-event))) ;; {}
 | 
			
		||||
    (if (char-equal (following-char) ?\n) (delete-char 1))
 | 
			
		||||
    (delete-horizontal-space)
 | 
			
		||||
    (forward-char))
 | 
			
		||||
   ((and
 | 
			
		||||
     (= last-command-event (following-char))
 | 
			
		||||
     (not (char-equal (preceding-char) last-command-event))
 | 
			
		||||
     (memq last-command '(ruby-electric-matching-char
 | 
			
		||||
                          ruby-electric-closing-char))) ;; ()/[] and (())/[[]]
 | 
			
		||||
    (forward-char))
 | 
			
		||||
   (t
 | 
			
		||||
    (ruby-electric-replace-region-or-insert)
 | 
			
		||||
    (if ruby-electric-autoindent-on-closing-char
 | 
			
		||||
        (ruby-indent-line)))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-bar(arg)
 | 
			
		||||
  (interactive "*P")
 | 
			
		||||
  (ruby-electric-insert
 | 
			
		||||
   arg
 | 
			
		||||
   (cond ((and (ruby-electric-code-at-point-p)
 | 
			
		||||
               (looking-back ruby-electric-expandable-bar-re))
 | 
			
		||||
          (save-excursion (insert "|")))
 | 
			
		||||
         (t
 | 
			
		||||
          (delete-char -1)
 | 
			
		||||
          (ruby-electric-replace-region-or-insert)))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-delete-backward-char(arg)
 | 
			
		||||
  (interactive "*p")
 | 
			
		||||
  (cond ((memq last-command '(ruby-electric-matching-char
 | 
			
		||||
                              ruby-electric-bar))
 | 
			
		||||
         (delete-char 1))
 | 
			
		||||
        ((eq last-command 'ruby-electric-curlies)
 | 
			
		||||
         (cond ((eolp)
 | 
			
		||||
                (cond ((char-equal (preceding-char) ?\s)
 | 
			
		||||
                       (setq this-command last-command))
 | 
			
		||||
                      ((char-equal (preceding-char) ?{)
 | 
			
		||||
                       (and (looking-at "[ \t\n]*}")
 | 
			
		||||
                            (delete-char (- (match-end 0) (match-beginning 0)))))))
 | 
			
		||||
               ((char-equal (following-char) ?\s)
 | 
			
		||||
                (setq this-command last-command)
 | 
			
		||||
                (delete-char 1))
 | 
			
		||||
               ((char-equal (following-char) ?})
 | 
			
		||||
                (delete-char 1))))
 | 
			
		||||
        ((eq last-command 'ruby-electric-hash)
 | 
			
		||||
         (and (char-equal (preceding-char) ?{)
 | 
			
		||||
              (delete-char 1))))
 | 
			
		||||
  (delete-char (- arg)))
 | 
			
		||||
 | 
			
		||||
(put 'ruby-electric-delete-backward-char 'delete-selection 'supersede)
 | 
			
		||||
 | 
			
		||||
(defun ruby-electric-end ()
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (if (eq (char-syntax (preceding-char)) ?w)
 | 
			
		||||
      (insert " "))
 | 
			
		||||
  (insert "end")
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (if (eq (char-syntax (following-char)) ?w)
 | 
			
		||||
        (insert " "))
 | 
			
		||||
    (ruby-indent-line t)))
 | 
			
		||||
 | 
			
		||||
(provide 'ruby-electric)
 | 
			
		||||
 | 
			
		||||
;;; ruby-electric.el ends here
 | 
			
		||||
| 
						 | 
				
			
			@ -1,81 +0,0 @@
 | 
			
		|||
;;; -*- emacs-lisp -*-
 | 
			
		||||
;;;
 | 
			
		||||
;;; ruby-style.el -
 | 
			
		||||
;;;
 | 
			
		||||
;;; C/C++ mode style for Ruby.
 | 
			
		||||
;;;
 | 
			
		||||
;;;  $Author$
 | 
			
		||||
;;;  created at: Thu Apr 26 13:54:01 JST 2007
 | 
			
		||||
;;;
 | 
			
		||||
;;; Put this file under a directory contained in ``load-path'', and
 | 
			
		||||
;;; then load it.
 | 
			
		||||
;;; To switch to the "ruby" style automatically if it looks like a
 | 
			
		||||
;;; source file of ruby, add ruby-style-c-mode to c-mode-hook:
 | 
			
		||||
;;;
 | 
			
		||||
;;;   (require 'ruby-style)
 | 
			
		||||
;;;   (add-hook 'c-mode-hook 'ruby-style-c-mode)
 | 
			
		||||
;;;   (add-hook 'c++-mode-hook 'ruby-style-c-mode)
 | 
			
		||||
;;;
 | 
			
		||||
;;; Customize the c-default-style variable to set the default style
 | 
			
		||||
;;; for each CC major mode.
 | 
			
		||||
 | 
			
		||||
(defconst ruby-style-revision "$Revision$"
 | 
			
		||||
  "Ruby style revision string.")
 | 
			
		||||
 | 
			
		||||
(defconst ruby-style-version
 | 
			
		||||
  (and
 | 
			
		||||
   (string-match "[0-9.]+" ruby-style-revision)
 | 
			
		||||
   (substring ruby-style-revision (match-beginning 0) (match-end 0)))
 | 
			
		||||
  "Ruby style version number.")
 | 
			
		||||
 | 
			
		||||
(defun ruby-style-case-indent (x)
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (back-to-indentation)
 | 
			
		||||
    (unless (progn (backward-up-list) (back-to-indentation)
 | 
			
		||||
                   (> (point) (cdr x)))
 | 
			
		||||
      (goto-char (cdr x))
 | 
			
		||||
      (if (looking-at "\\<case\\|default\\>") '*))))
 | 
			
		||||
 | 
			
		||||
(defun ruby-style-label-indent (x)
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (back-to-indentation)
 | 
			
		||||
    (unless (progn (backward-up-list) (back-to-indentation)
 | 
			
		||||
                   (>= (point) (cdr x)))
 | 
			
		||||
      (goto-char (cdr x))
 | 
			
		||||
      (condition-case ()
 | 
			
		||||
          (progn
 | 
			
		||||
            (backward-up-list)
 | 
			
		||||
            (backward-sexp 2)
 | 
			
		||||
            (if (looking-at "\\<switch\\>") '/))
 | 
			
		||||
        (error)))))
 | 
			
		||||
 | 
			
		||||
(require 'cc-styles)
 | 
			
		||||
(c-add-style
 | 
			
		||||
 "ruby"
 | 
			
		||||
 '("bsd"
 | 
			
		||||
   (c-basic-offset . 4)
 | 
			
		||||
   (tab-width . 8)
 | 
			
		||||
   (indent-tabs-mode . nil)
 | 
			
		||||
   (setq show-trailing-whitespace t)
 | 
			
		||||
   (c-offsets-alist
 | 
			
		||||
    (case-label . *)
 | 
			
		||||
    (label . (ruby-style-label-indent *))
 | 
			
		||||
    (statement-case-intro . *)
 | 
			
		||||
    (statement-case-open . *)
 | 
			
		||||
    (statement-block-intro . (ruby-style-case-indent +))
 | 
			
		||||
    (access-label /)
 | 
			
		||||
    )))
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(defun ruby-style-c-mode ()
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (if (or (let ((name (buffer-file-name))) (and name (string-match "/ruby\\>" name)))
 | 
			
		||||
          (save-excursion
 | 
			
		||||
            (goto-char (point-min))
 | 
			
		||||
            (let ((head (progn (forward-line 100) (point)))
 | 
			
		||||
                  (case-fold-search nil))
 | 
			
		||||
              (goto-char (point-min))
 | 
			
		||||
              (re-search-forward "Copyright (C) .* Yukihiro Matsumoto" head t))))
 | 
			
		||||
      (c-set-style "ruby")))
 | 
			
		||||
 | 
			
		||||
(provide 'ruby-style)
 | 
			
		||||
							
								
								
									
										104
									
								
								misc/rubydb2x.el
									
										
									
									
									
								
							
							
						
						
									
										104
									
								
								misc/rubydb2x.el
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,104 +0,0 @@
 | 
			
		|||
(require 'gud)
 | 
			
		||||
(provide 'rubydb)
 | 
			
		||||
 | 
			
		||||
;; ======================================================================
 | 
			
		||||
;; rubydb functions
 | 
			
		||||
 | 
			
		||||
;;; History of argument lists passed to rubydb.
 | 
			
		||||
(defvar gud-rubydb-history nil)
 | 
			
		||||
 | 
			
		||||
(defun gud-rubydb-massage-args (file args)
 | 
			
		||||
  (cons "-I" (cons "." (cons "-r" (cons "debug" (cons file args))))))
 | 
			
		||||
 | 
			
		||||
;; There's no guarantee that Emacs will hand the filter the entire
 | 
			
		||||
;; marker at once; it could be broken up across several strings.  We
 | 
			
		||||
;; might even receive a big chunk with several markers in it.  If we
 | 
			
		||||
;; receive a chunk of text which looks like it might contain the
 | 
			
		||||
;; beginning of a marker, we save it here between calls to the
 | 
			
		||||
;; filter.
 | 
			
		||||
(defvar gud-rubydb-marker-acc "")
 | 
			
		||||
 | 
			
		||||
(defun gud-rubydb-marker-filter (string)
 | 
			
		||||
  (save-match-data
 | 
			
		||||
    (setq gud-marker-acc (concat gud-marker-acc string))
 | 
			
		||||
    (let ((output ""))
 | 
			
		||||
      
 | 
			
		||||
      ;; Process all the complete markers in this chunk.
 | 
			
		||||
      (while (string-match "\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n"
 | 
			
		||||
                           gud-marker-acc)
 | 
			
		||||
        (setq
 | 
			
		||||
         
 | 
			
		||||
         ;; Extract the frame position from the marker.
 | 
			
		||||
         gud-last-frame
 | 
			
		||||
         (cons (substring gud-marker-acc (match-beginning 1) (match-end 1))
 | 
			
		||||
               (string-to-int (substring gud-marker-acc
 | 
			
		||||
                                         (match-beginning 2)
 | 
			
		||||
                                         (match-end 2))))
 | 
			
		||||
         
 | 
			
		||||
         ;; Append any text before the marker to the output we're going
 | 
			
		||||
         ;; to return - we don't include the marker in this text.
 | 
			
		||||
         output (concat output
 | 
			
		||||
                        (substring gud-marker-acc 0 (match-beginning 0)))
 | 
			
		||||
         
 | 
			
		||||
         ;; Set the accumulator to the remaining text.
 | 
			
		||||
         gud-marker-acc (substring gud-marker-acc (match-end 0))))
 | 
			
		||||
      
 | 
			
		||||
      ;; Does the remaining text look like it might end with the
 | 
			
		||||
      ;; beginning of another marker?  If it does, then keep it in
 | 
			
		||||
      ;; gud-marker-acc until we receive the rest of it.  Since we
 | 
			
		||||
      ;; know the full marker regexp above failed, it's pretty simple to
 | 
			
		||||
      ;; test for marker starts.
 | 
			
		||||
      (if (string-match "\032.*\\'" gud-marker-acc)
 | 
			
		||||
          (progn
 | 
			
		||||
            ;; Everything before the potential marker start can be output.
 | 
			
		||||
            (setq output (concat output (substring gud-marker-acc
 | 
			
		||||
                                                   0 (match-beginning 0))))
 | 
			
		||||
            
 | 
			
		||||
            ;; Everything after, we save, to combine with later input.
 | 
			
		||||
            (setq gud-marker-acc
 | 
			
		||||
                  (substring gud-marker-acc (match-beginning 0))))
 | 
			
		||||
        
 | 
			
		||||
        (setq output (concat output gud-marker-acc)
 | 
			
		||||
              gud-marker-acc ""))
 | 
			
		||||
      
 | 
			
		||||
      output)))
 | 
			
		||||
  
 | 
			
		||||
(defun gud-rubydb-find-file (f)
 | 
			
		||||
  (find-file-noselect f))
 | 
			
		||||
 | 
			
		||||
(defvar rubydb-command-name "ruby"
 | 
			
		||||
  "File name for executing ruby.")
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(defun rubydb (command-line)
 | 
			
		||||
  "Run rubydb on program FILE in buffer *gud-FILE*.
 | 
			
		||||
The directory containing FILE becomes the initial working directory
 | 
			
		||||
and source-file directory for your debugger."
 | 
			
		||||
  (interactive
 | 
			
		||||
   (list (read-from-minibuffer "Run rubydb (like this): "
 | 
			
		||||
                               (if (consp gud-rubydb-history)
 | 
			
		||||
                                   (car gud-rubydb-history)
 | 
			
		||||
                                 (concat rubydb-command-name " "))
 | 
			
		||||
                               nil nil
 | 
			
		||||
                               '(gud-rubydb-history . 1))))
 | 
			
		||||
 | 
			
		||||
  (gud-overload-functions '((gud-massage-args . gud-rubydb-massage-args)
 | 
			
		||||
                            (gud-marker-filter . gud-rubydb-marker-filter)
 | 
			
		||||
                            (gud-find-file . gud-rubydb-find-file)
 | 
			
		||||
                            ))
 | 
			
		||||
  (gud-common-init command-line)
 | 
			
		||||
 | 
			
		||||
  (gud-def gud-break  "b %l"         "\C-b" "Set breakpoint at current line.")
 | 
			
		||||
;  (gud-def gud-remove "clear %l"     "\C-d" "Remove breakpoint at current line")
 | 
			
		||||
  (gud-def gud-step   "s"            "\C-s" "Step one source line with display.")
 | 
			
		||||
  (gud-def gud-next   "n"            "\C-n" "Step one line (skip functions).")
 | 
			
		||||
  (gud-def gud-cont   "c"            "\C-r" "Continue with display.")
 | 
			
		||||
  (gud-def gud-finish "finish"       "\C-f" "Finish executing current function.")
 | 
			
		||||
  (gud-def gud-up     "up %p"        "<" "Up N stack frames (numeric arg).")
 | 
			
		||||
  (gud-def gud-down   "down %p"      ">" "Down N stack frames (numeric arg).")
 | 
			
		||||
  (gud-def gud-print  "p %e"         "\C-p" "Evaluate ruby expression at point.")
 | 
			
		||||
 | 
			
		||||
  (setq comint-prompt-regexp "^(rdb:-) ")
 | 
			
		||||
  (setq paragraph-start comint-prompt-regexp)
 | 
			
		||||
  (run-hooks 'rubydb-mode-hook)
 | 
			
		||||
  )
 | 
			
		||||
							
								
								
									
										115
									
								
								misc/rubydb3x.el
									
										
									
									
									
								
							
							
						
						
									
										115
									
								
								misc/rubydb3x.el
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,115 +0,0 @@
 | 
			
		|||
(require 'gud)
 | 
			
		||||
(provide 'rubydb)
 | 
			
		||||
 | 
			
		||||
;; ======================================================================
 | 
			
		||||
;; rubydb functions
 | 
			
		||||
 | 
			
		||||
;;; History of argument lists passed to rubydb.
 | 
			
		||||
(defvar gud-rubydb-history nil)
 | 
			
		||||
 | 
			
		||||
(if (fboundp 'gud-overload-functions)
 | 
			
		||||
    (defun gud-rubydb-massage-args (file args)
 | 
			
		||||
      (cons "-r" (cons "debug" (cons file args))))
 | 
			
		||||
  (defun gud-rubydb-massage-args (file args)
 | 
			
		||||
      (cons "-r" (cons "debug" args))))
 | 
			
		||||
 | 
			
		||||
;; There's no guarantee that Emacs will hand the filter the entire
 | 
			
		||||
;; marker at once; it could be broken up across several strings.  We
 | 
			
		||||
;; might even receive a big chunk with several markers in it.  If we
 | 
			
		||||
;; receive a chunk of text which looks like it might contain the
 | 
			
		||||
;; beginning of a marker, we save it here between calls to the
 | 
			
		||||
;; filter.
 | 
			
		||||
(defvar gud-rubydb-marker-acc "")
 | 
			
		||||
(make-variable-buffer-local 'gud-rubydb-marker-acc)
 | 
			
		||||
 | 
			
		||||
(defun gud-rubydb-marker-filter (string)
 | 
			
		||||
  (setq gud-rubydb-marker-acc (concat gud-rubydb-marker-acc string))
 | 
			
		||||
  (let ((output ""))
 | 
			
		||||
 | 
			
		||||
    ;; Process all the complete markers in this chunk.
 | 
			
		||||
    (while (string-match "\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n"
 | 
			
		||||
                         gud-rubydb-marker-acc)
 | 
			
		||||
      (setq
 | 
			
		||||
 | 
			
		||||
       ;; Extract the frame position from the marker.
 | 
			
		||||
       gud-last-frame
 | 
			
		||||
       (cons (substring gud-rubydb-marker-acc (match-beginning 1) (match-end 1))
 | 
			
		||||
             (string-to-int (substring gud-rubydb-marker-acc
 | 
			
		||||
                                       (match-beginning 2)
 | 
			
		||||
                                       (match-end 2))))
 | 
			
		||||
 | 
			
		||||
       ;; Append any text before the marker to the output we're going
 | 
			
		||||
       ;; to return - we don't include the marker in this text.
 | 
			
		||||
       output (concat output
 | 
			
		||||
                      (substring gud-rubydb-marker-acc 0 (match-beginning 0)))
 | 
			
		||||
 | 
			
		||||
       ;; Set the accumulator to the remaining text.
 | 
			
		||||
       gud-rubydb-marker-acc (substring gud-rubydb-marker-acc (match-end 0))))
 | 
			
		||||
 | 
			
		||||
    ;; Does the remaining text look like it might end with the
 | 
			
		||||
    ;; beginning of another marker?  If it does, then keep it in
 | 
			
		||||
    ;; gud-rubydb-marker-acc until we receive the rest of it.  Since we
 | 
			
		||||
    ;; know the full marker regexp above failed, it's pretty simple to
 | 
			
		||||
    ;; test for marker starts.
 | 
			
		||||
    (if (string-match "\032.*\\'" gud-rubydb-marker-acc)
 | 
			
		||||
        (progn
 | 
			
		||||
          ;; Everything before the potential marker start can be output.
 | 
			
		||||
          (setq output (concat output (substring gud-rubydb-marker-acc
 | 
			
		||||
                                                 0 (match-beginning 0))))
 | 
			
		||||
 | 
			
		||||
          ;; Everything after, we save, to combine with later input.
 | 
			
		||||
          (setq gud-rubydb-marker-acc
 | 
			
		||||
                (substring gud-rubydb-marker-acc (match-beginning 0))))
 | 
			
		||||
 | 
			
		||||
      (setq output (concat output gud-rubydb-marker-acc)
 | 
			
		||||
            gud-rubydb-marker-acc ""))
 | 
			
		||||
 | 
			
		||||
    output))
 | 
			
		||||
 | 
			
		||||
(defun gud-rubydb-find-file (f)
 | 
			
		||||
  (save-excursion
 | 
			
		||||
    (let ((buf (find-file-noselect f)))
 | 
			
		||||
      (set-buffer buf)
 | 
			
		||||
;;      (gud-make-debug-menu)
 | 
			
		||||
      buf)))
 | 
			
		||||
 | 
			
		||||
(defvar rubydb-command-name "ruby"
 | 
			
		||||
  "File name for executing ruby.")
 | 
			
		||||
 | 
			
		||||
;;;###autoload
 | 
			
		||||
(defun rubydb (command-line)
 | 
			
		||||
  "Run rubydb on program FILE in buffer *gud-FILE*.
 | 
			
		||||
The directory containing FILE becomes the initial working directory
 | 
			
		||||
and source-file directory for your debugger."
 | 
			
		||||
  (interactive
 | 
			
		||||
   (list (read-from-minibuffer "Run rubydb (like this): "
 | 
			
		||||
                               (if (consp gud-rubydb-history)
 | 
			
		||||
                                   (car gud-rubydb-history)
 | 
			
		||||
                                 (concat rubydb-command-name " "))
 | 
			
		||||
                               nil nil
 | 
			
		||||
                               '(gud-rubydb-history . 1))))
 | 
			
		||||
 | 
			
		||||
  (if (not (fboundp 'gud-overload-functions))
 | 
			
		||||
      (gud-common-init command-line 'gud-rubydb-massage-args
 | 
			
		||||
                       'gud-rubydb-marker-filter 'gud-rubydb-find-file)
 | 
			
		||||
    (gud-overload-functions '((gud-massage-args . gud-rubydb-massage-args)
 | 
			
		||||
                              (gud-marker-filter . gud-rubydb-marker-filter)
 | 
			
		||||
                              (gud-find-file . gud-rubydb-find-file)))
 | 
			
		||||
    (gud-common-init command-line rubydb-command-name))
 | 
			
		||||
 | 
			
		||||
  (gud-def gud-break  "b %l"         "\C-b" "Set breakpoint at current line.")
 | 
			
		||||
;  (gud-def gud-remove "clear %l"     "\C-d" "Remove breakpoint at current line")
 | 
			
		||||
  (gud-def gud-step   "s"            "\C-s" "Step one source line with display.")
 | 
			
		||||
  (gud-def gud-next   "n"            "\C-n" "Step one line (skip functions).")
 | 
			
		||||
  (gud-def gud-cont   "c"            "\C-r" "Continue with display.")
 | 
			
		||||
  (gud-def gud-finish "finish"       "\C-f" "Finish executing current function.")
 | 
			
		||||
  (gud-def gud-up     "up %p"        "<" "Up N stack frames (numeric arg).")
 | 
			
		||||
  (gud-def gud-down   "down %p"      ">" "Down N stack frames (numeric arg).")
 | 
			
		||||
  (gud-def gud-print  "p %e"         "\C-p" "Evaluate ruby expression at point.")
 | 
			
		||||
 | 
			
		||||
  (setq comint-prompt-regexp "^(rdb:-) ")
 | 
			
		||||
  (if (boundp 'comint-last-output-start)
 | 
			
		||||
      (set-marker comint-last-output-start (point)))
 | 
			
		||||
  (set (make-local-variable 'paragraph-start) comint-prompt-regexp)
 | 
			
		||||
  (run-hooks 'rubydb-mode-hook)
 | 
			
		||||
  )
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue