1;; missing functions in Emacs 24.
2
3(eval-after-load "\\(\\`\\|/\\)ruby-mode\\.elc?\\(\\.gz\\)?\\'"
4  (progn
5    (define-key ruby-mode-map "\C-c\C-e" 'ruby-insert-end)
6    (define-key ruby-mode-map "\C-c{" 'ruby-toggle-block)
7
8    (defun ruby-insert-end ()
9      (interactive)
10      (if (eq (char-syntax (char-before)) ?w)
11	  (insert " "))
12      (insert "end")
13      (save-excursion
14	(if (eq (char-syntax (char-after)) ?w)
15	    (insert " "))
16	(ruby-indent-line t)
17	(end-of-line)))
18
19    (defun ruby-brace-to-do-end ()
20      (when (looking-at "{")
21	(let ((orig (point)) (end (progn (ruby-forward-sexp) (point))))
22	  (when (eq (char-before) ?\})
23	    (delete-char -1)
24	    (if (eq (char-syntax (char-before)) ?w)
25		(insert " "))
26	    (insert "end")
27	    (if (eq (char-syntax (char-after)) ?w)
28		(insert " "))
29	    (goto-char orig)
30	    (delete-char 1)
31	    (if (eq (char-syntax (char-before)) ?w)
32		(insert " "))
33	    (insert "do")
34	    (when (looking-at "\\sw\\||")
35	      (insert " ")
36	      (backward-char))
37	    t))))
38
39    (defun ruby-do-end-to-brace ()
40      (when (and (or (bolp)
41		     (not (memq (char-syntax (char-before)) '(?w ?_))))
42		 (looking-at "\\<do\\(\\s \\|$\\)"))
43	(let ((orig (point)) (end (progn (ruby-forward-sexp) (point))))
44	  (backward-char 3)
45	  (when (looking-at ruby-block-end-re)
46	    (delete-char 3)
47	    (insert "}")
48	    (goto-char orig)
49	    (delete-char 2)
50	    (insert "{")
51	    (if (looking-at "\\s +|")
52		(delete-char (- (match-end 0) (match-beginning 0) 1)))
53	    t))))
54
55    (defun ruby-toggle-block ()
56      (interactive)
57      (or (ruby-brace-to-do-end)
58	  (ruby-do-end-to-brace)))
59
60    (defun ruby-mode-set-encoding ()
61      "Insert a magic comment header with the proper encoding always.
62Now encoding needs to be set always explicitly actually."
63      (save-excursion
64	(let ((coding-system))
65	  (widen)
66	  (goto-char (point-min))
67	  (if (re-search-forward "[^\0-\177]" nil t)
68	      (progn
69		(goto-char (point-min))
70		(setq coding-system
71                      (or coding-system-for-write
72                          buffer-file-coding-system))
73		(if coding-system
74		    (setq coding-system
75			  (or (coding-system-get coding-system 'mime-charset)
76			      (coding-system-change-eol-conversion coding-system nil))))
77		(setq coding-system
78		      (if coding-system
79			  (symbol-name
80			   (or (and ruby-use-encoding-map
81				    (cdr (assq coding-system ruby-encoding-map)))
82			       coding-system))
83			"ascii-8bit")))
84	    (setq coding-system "us-ascii"))
85	  (if (looking-at "^#!") (beginning-of-line 2))
86	  (cond ((looking-at "\\s *#.*-\*-\\s *\\(en\\)?coding\\s *:\\s *\\([-a-z0-9_]*\\)\\s *\\(;\\|-\*-\\)")
87		 (unless (string= (match-string 2) coding-system)
88		   (goto-char (match-beginning 2))
89		   (delete-region (point) (match-end 2))
90		   (and (looking-at "-\*-")
91			(let ((n (skip-chars-backward " ")))
92			  (cond ((= n 0) (insert "  ") (backward-char))
93				((= n -1) (insert " "))
94				((forward-char)))))
95		   (insert coding-system)))
96		((looking-at "\\s *#.*coding\\s *[:=]"))
97		(t (when ruby-insert-encoding-magic-comment
98		     (insert "# -*- coding: " coding-system " -*-\n")))))))
99
100    ))
101