-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmy-ruby.el
127 lines (106 loc) · 4.54 KB
/
my-ruby.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
(setq rinari-tags-file-name "TAGS"
ruby-program-name "irb -f --inf-ruby-mode -rubygems")
(add-hook 'ruby-mode-hook
'(lambda ()
(require 'ruby-electric)
(require 'ruby-style)
(require 'rcodetools)
(ruby-electric-mode t)
(require 'ruby-compilation)
(coding-hook)
(set-pairs '("(" "{" "[" "\"" "\'" "|"))
(inf-ruby-keys)
(local-set-key [return] 'ruby-reindent-then-newline-and-indent)
(local-set-key (kbd "C-h r") 'ri)
(local-set-key (kbd "C-c C-c") 'ruby-compilation-this-buffer)
(define-key ruby-mode-map (kbd "C-c M-t") 'ruby-test-file)
(define-key ruby-mode-map (kbd "C-c C-M-t") 'ruby-test-one)
;;(local-set-key [tab] 'ri-ruby-complete-symbol)
;;(local-set-key "\C-c\C-a" 'ri-ruby-show-args)
))
;; Code borrowed from Emacs starter kit
(defun rr (&optional arg)
"Run a Ruby interactive shell session in a buffer."
(interactive "P")
(let ((impl (if (not arg)
"mri"
(completing-read "Ruby Implementation: "
'("ruby" "jruby" "rubinius" "yarv")))))
(run-ruby (cdr (assoc impl '(("mri" . "irb")
("jruby" . "jruby -S irb")
("rubinius" . "rbx")
("yarv" . "irb1.9")))))
(with-current-buffer "*ruby*"
(rename-buffer (format "*%s*" impl) t))))
(add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
(add-to-list 'interpreter-mode-alist '("jruby" . ruby-mode))
(add-to-list 'interpreter-mode-alist '("ruby1.9" . ruby-mode))
;;; rhtml mode
(add-to-list 'load-path "~/.emacs.d/vendor/rhtml")
(require 'rhtml-mode)
;; ruby-test
(require 'ruby-test)
;; (add-hook 'rhtml-mode-hook
;; (lambda () (rinari-launch)))
;; find-file-at-point help
(defun ruby-module-path (module)
(shell-command-to-string
(concat
"ruby -e "
"\"ret='()';$LOAD_PATH.each{|p| "
"x=p+'/'+ARGV[0].gsub('.rb', '')+'.rb';"
"ret=File.expand_path(x)"
"if(File.exist?(x))};printf ret\" "
module)))
(eval-after-load "ffap"
'(push '(ruby-mode . ruby-module-path) ffap-alist))
;;; Rake
(defun pcomplete/rake ()
(pcomplete-here (pcmpl-rake-tasks)))
(defun pcmpl-rake-tasks ()
"Return a list of all the rake tasks defined in the current
projects. I know this is a hack to put all the logic in the
exec-to-string command, but it works and seems fast"
(delq nil (mapcar '(lambda(line)
(if (string-match "rake \\([^ ]+\\)" line) (match-string 1 line)))
(split-string (shell-command-to-string "rake -T") "[\n]"))))
(defun rake (task)
(interactive (list (completing-read "Rake (default: default): "
(pcmpl-rake-tasks))))
(shell-command-to-string (concat "rake " (if (= 0 (length task)) "default" task))))
;; Clear the compilation buffer between test runs.
(eval-after-load 'ruby-compilation
'(progn
(defadvice ruby-do-run-w/compilation (before kill-buffer (name cmdlist))
(let ((comp-buffer-name (format "*%s*" name)))
(when (get-buffer comp-buffer-name)
(with-current-buffer comp-buffer-name
(delete-region (point-min) (point-max))))))
(ad-activate 'ruby-do-run-w/compilation)))
;;; Flymake
(eval-after-load 'ruby-mode
'(progn
(require 'flymake)
(require 'rinari)
;; Invoke ruby with '-c' to get syntax checking
(defun flymake-ruby-init ()
(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 "ruby" (list "-c" local-file))))
(push '(".+\\.rb$" flymake-ruby-init) flymake-allowed-file-name-masks)
(push '("Rakefile$" flymake-ruby-init) flymake-allowed-file-name-masks)
(push '("^\\(.*\\):\\([0-9]+\\): \\(.*\\)$" 1 2 nil 3)
flymake-err-line-patterns)
(add-hook 'ruby-mode-hook
(lambda ()
(c-subword-mode t)
(when (and buffer-file-name
(file-writable-p
(file-name-directory buffer-file-name))
(file-writable-p buffer-file-name))
(local-set-key (kbd "C-c d") 'flymake-display-err-menu-for-current-line)
(flymake-mode t))))))
(provide 'my-ruby)