config/emacs.d/rails/rails-ruby.el
2009-11-10 22:26:19 -08:00

163 lines
No EOL
6.2 KiB
EmacsLisp

;;; rails-ruby.el --- provide features for ruby-mode
;; Copyright (C) 2006 Dmitry Galinsky <dima dot exe at gmail dot com>
;; Authors: Dmitry Galinsky <dima dot exe at gmail dot com>
;; Keywords: ruby rails languages oop
;; $URL: svn://rubyforge.org/var/svn/emacs-rails/trunk/rails-ruby.el $
;; $Id: rails-ruby.el 190 2007-04-27 19:04:46Z dimaexe $
;;; License
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License
;; as published by the Free Software Foundation; either version 2
;; of the License, or (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;;; Code:
(require 'inf-ruby)
;; setup align for ruby-mode
(require 'align)
(defconst align-ruby-modes '(ruby-mode)
"align-perl-modes is a variable defined in `align.el'.")
(defconst ruby-align-rules-list
'((ruby-comma-delimiter
(regexp . ",\\(\\s-*\\)[^/ \t\n]")
(modes . align-ruby-modes)
(repeat . t))
(ruby-symbol-after-func
(regexp . "^\\s-*\\w+\\(\\s-+\\):\\w+")
(modes . align-ruby-modes)))
"Alignment rules specific to the ruby mode.
See the variable `align-rules-list' for more details.")
(add-to-list 'align-perl-modes 'ruby-mode)
(add-to-list 'align-dq-string-modes 'ruby-mode)
(add-to-list 'align-sq-string-modes 'ruby-mode)
(add-to-list 'align-open-comment-modes 'ruby-mode)
(dolist (it ruby-align-rules-list)
(add-to-list 'align-rules-list it))
;; other stuff
(defun ruby-newline-and-indent ()
(interactive)
(newline)
(ruby-indent-command))
(defun ruby-toggle-string<>simbol ()
"Easy to switch between strings and symbols."
(interactive)
(let ((initial-pos (point)))
(save-excursion
(when (looking-at "[\"']") ;; skip beggining quote
(goto-char (+ (point) 1))
(unless (looking-at "\\w")
(goto-char (- (point) 1))))
(let* ((point (point))
(start (skip-syntax-backward "w"))
(end (skip-syntax-forward "w"))
(end (+ point start end))
(start (+ point start))
(start-quote (- start 1))
(end-quote (+ end 1))
(quoted-str (buffer-substring-no-properties start-quote end-quote))
(symbol-str (buffer-substring-no-properties start end)))
(cond
((or (string-match "^\"\\w+\"$" quoted-str)
(string-match "^\'\\w+\'$" quoted-str))
(setq quoted-str (substring quoted-str 1 (- (length quoted-str) 1)))
(kill-region start-quote end-quote)
(goto-char start-quote)
(insert (concat ":" quoted-str)))
((string-match "^\:\\w+$" symbol-str)
(setq symbol-str (substring symbol-str 1))
(kill-region start end)
(goto-char start)
(insert (format "'%s'" symbol-str))))))
(goto-char initial-pos)))
(defun run-ruby-in-buffer (cmd buf)
"Run CMD as a ruby process in BUF if BUF does not exist."
(let ((abuf (concat "*" buf "*")))
(when (not (comint-check-proc abuf))
(set-buffer (make-comint buf rails-ruby-command nil cmd)))
(inferior-ruby-mode)
(make-local-variable 'inferior-ruby-first-prompt-pattern)
(make-local-variable 'inferior-ruby-prompt-pattern)
(setq inferior-ruby-first-prompt-pattern "^>> "
inferior-ruby-prompt-pattern "^>> ")
(pop-to-buffer abuf)))
(defun complete-ruby-method (prefix &optional maxnum)
(if (capital-word-p prefix)
(let* ((cmd "x = []; ObjectSpace.each_object(Class){|i| x << i.to_s}; x.map{|i| i.match(/^%s/) ? i.gsub(/^%s/, '') : nil }.compact.sort{|x,y| x.size <=> y.size}")
(cmd (if maxnum (concat cmd (format "[0...%s]" maxnum)) cmd)))
(el4r-ruby-eval (format cmd prefix prefix)))
(save-excursion
(goto-char (- (point) (+ 1 (length prefix))))
(when (and (looking-at "\\.")
(capital-word-p (word-at-point))
(el4r-ruby-eval (format "::%s rescue nil" (word-at-point))))
(let* ((cmd "%s.public_methods.map{|i| i.match(/^%s/) ? i.gsub(/^%s/, '') : nil }.compact.sort{|x,y| x.size <=> y.size}")
(cmd (if maxnum (concat cmd (format "[0...%s]" maxnum)) cmd)))
(el4r-ruby-eval (format cmd (word-at-point) prefix prefix)))))))
;; flymake ruby support
(require 'flymake nil t)
(defconst flymake-allowed-ruby-file-name-masks
'(("\\.rb\\'" flymake-ruby-init)
("\\.rxml\\'" flymake-ruby-init)
("\\.builder\\'" flymake-ruby-init)
("\\.rjs\\'" flymake-ruby-init))
"Filename extensions that switch on flymake-ruby mode syntax checks.")
(defconst flymake-ruby-error-line-pattern-regexp
'("^\\([^:]+\\):\\([0-9]+\\): *\\([\n]+\\)" 1 2 nil 3)
"Regexp matching ruby error messages.")
(defun flymake-ruby-init ()
(condition-case er
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list rails-ruby-command (list "-c" local-file)))
('error ())))
(defun flymake-ruby-load ()
(when (and (buffer-file-name)
(string-match
(format "\\(%s\\)"
(string-join
"\\|"
(mapcar 'car flymake-allowed-ruby-file-name-masks)))
(buffer-file-name)))
(setq flymake-allowed-file-name-masks
(append flymake-allowed-file-name-masks flymake-allowed-ruby-file-name-masks))
(setq flymake-err-line-patterns
(cons flymake-ruby-error-line-pattern-regexp flymake-err-line-patterns))
(flymake-mode t)
(local-set-key (rails-key "d") 'flymake-display-err-menu-for-current-line)))
(when (featurep 'flymake)
(add-hook 'ruby-mode-hook 'flymake-ruby-load))
(provide 'rails-ruby)