annotate lisp/progmodes/ruby-mode.el @ 100334:2f23225ada6b

(Program Modes): Mention Ruby mode.
author Chong Yidong <cyd@stupidchicken.com>
date Wed, 10 Dec 2008 19:01:51 +0000
parents 267bf24aac5e
children d49ec2cd5727
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1 ;;; ruby-mode.el --- Major mode for editing Ruby files
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3 ;; Copyright (C) 1994, 1995, 1996 1997, 1998, 1999, 2000, 2001,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
4 ;; 2002,2003, 2004, 2005, 2006, 2007, 2008
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
5 ;; Free Software Foundation, Inc.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
6
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
7 ;; Authors: Yukihiro Matsumoto, Nobuyoshi Nakada
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
8 ;; URL: http://www.emacswiki.org/cgi-bin/wiki/RubyMode
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
9 ;; Created: Fri Feb 4 14:49:13 JST 1994
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
10 ;; Keywords: languages ruby
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
11 ;; Version: 1.0
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
12
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
13 ;; This file is part of GNU Emacs.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
14
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
15 ;; GNU Emacs is free software: you can redistribute it and/or modify
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
16 ;; it under the terms of the GNU General Public License as published by
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
17 ;; the Free Software Foundation, either version 3 of the License, or
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
18 ;; (at your option) any later version.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
19
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
20 ;; GNU Emacs is distributed in the hope that it will be useful,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
23 ;; GNU General Public License for more details.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
24
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
25 ;; You should have received a copy of the GNU General Public License
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
26 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
27
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
28 ;;; Commentary:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
29
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
30 ;; Provides font-locking, indentation support, and navigation for Ruby code.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
31 ;;
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
32 ;; If you're installing manually, you should add this to your .emacs
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
33 ;; file after putting it on your load path:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
34 ;;
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
35 ;; (autoload 'ruby-mode "ruby-mode" "Major mode for ruby files" t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
36 ;; (add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
37 ;; (add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
38 ;;
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
39 ;; Still needs more docstrings; search below for TODO.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
40
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
41 ;;; Code:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
42
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
43 (eval-when-compile (require 'cl))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
44
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
45 (defconst ruby-keyword-end-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
46 (if (string-match "\\_>" "ruby")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
47 "\\_>"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
48 "\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
49
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
50 (defconst ruby-block-beg-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
51 '("class" "module" "def" "if" "unless" "case" "while" "until" "for" "begin" "do")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
52 "Keywords at the beginning of blocks.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
53
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
54 (defconst ruby-block-beg-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
55 (regexp-opt ruby-block-beg-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
56 "Regexp to match the beginning of blocks.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
57
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
58 (defconst ruby-non-block-do-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
59 (concat (regexp-opt '("while" "until" "for" "rescue") t) ruby-keyword-end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
60 "Regexp to match keywords that nest without blocks.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
61
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
62 (defconst ruby-indent-beg-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
63 (concat "\\(\\s *" (regexp-opt '("class" "module" "def") t) "\\)\\|"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
64 (regexp-opt '("if" "unless" "case" "while" "until" "for" "begin")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
65 "Regexp to match where the indentation gets deeper.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
66
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
67 (defconst ruby-modifier-beg-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
68 '("if" "unless" "while" "until")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
69 "Modifiers that are the same as the beginning of blocks.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
70
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
71 (defconst ruby-modifier-beg-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
72 (regexp-opt ruby-modifier-beg-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
73 "Regexp to match modifiers same as the beginning of blocks.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
74
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
75 (defconst ruby-modifier-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
76 (regexp-opt (cons "rescue" ruby-modifier-beg-keywords))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
77 "Regexp to match modifiers.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
78
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
79 (defconst ruby-block-mid-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
80 '("then" "else" "elsif" "when" "rescue" "ensure")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
81 "Keywords where the indentation gets shallower in middle of block statements.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
82
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
83 (defconst ruby-block-mid-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
84 (regexp-opt ruby-block-mid-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
85 "Regexp to match where the indentation gets shallower in middle of block statements.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
86
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
87 (defconst ruby-block-op-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
88 '("and" "or" "not")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
89 "Regexp to match boolean keywords.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
90
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
91 (defconst ruby-block-hanging-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
92 (regexp-opt (append ruby-modifier-beg-keywords ruby-block-op-keywords))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
93 "Regexp to match hanging block modifiers.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
94
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
95 (defconst ruby-block-end-re "\\<end\\>")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
96
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
97 (defconst ruby-here-doc-beg-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
98 "\\(<\\)<\\(-\\)?\\(\\([a-zA-Z0-9_]+\\)\\|[\"]\\([^\"]+\\)[\"]\\|[']\\([^']+\\)[']\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
99 "Regexp to match the beginning of a heredoc.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
100
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
101 (defconst ruby-here-doc-end-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
102 "^\\([ \t]+\\)?\\(.*\\)\\(.\\)$"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
103 "Regexp to match the end of heredocs.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
104
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
105 This will actually match any line with one or more characters.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
106 It's useful in that it divides up the match string so that
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
107 `ruby-here-doc-beg-match' can search for the beginning of the heredoc.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
108
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
109 (defun ruby-here-doc-end-match ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
110 "Return a regexp to find the end of a heredoc.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
111
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
112 This should only be called after matching against `ruby-here-doc-beg-re'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
113 (concat "^"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
114 (if (match-string 2) "[ \t]*" nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
115 (regexp-quote
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
116 (or (match-string 4)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
117 (match-string 5)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
118 (match-string 6)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
119
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
120 (defun ruby-here-doc-beg-match ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
121 "Return a regexp to find the beginning of a heredoc.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
122
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
123 This should only be called after matching against `ruby-here-doc-end-re'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
124 (let ((contents (regexp-quote (concat (match-string 2) (match-string 3)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
125 (concat "<<"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
126 (let ((match (match-string 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
127 (if (and match (> (length match) 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
128 (concat "\\(?:-\\([\"']?\\)\\|\\([\"']\\)" (match-string 1) "\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
129 contents "\\b\\(\\1\\|\\2\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
130 (concat "-?\\([\"']\\|\\)" contents "\\b\\1"))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
131
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
132 (defconst ruby-delimiter
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
133 (concat "[?$/%(){}#\"'`.:]\\|<<\\|\\[\\|\\]\\|\\<\\("
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
134 ruby-block-beg-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
135 "\\)\\>\\|" ruby-block-end-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
136 "\\|^=begin\\|" ruby-here-doc-beg-re))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
137
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
138 (defconst ruby-negative
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
139 (concat "^[ \t]*\\(\\(" ruby-block-mid-re "\\)\\>\\|"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
140 ruby-block-end-re "\\|}\\|\\]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
141 "Regexp to match where the indentation gets shallower.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
142
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
143 (defconst ruby-operator-re "[-,.+*/%&|^~=<>:]"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
144 "Regexp to match operators.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
145
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
146 (defconst ruby-symbol-chars "a-zA-Z0-9_"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
147 "List of characters that symbol names may contain.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
148 (defconst ruby-symbol-re (concat "[" ruby-symbol-chars "]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
149 "Regexp to match symbols.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
150
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
151 (defvar ruby-mode-abbrev-table nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
152 "Abbrev table in use in ruby-mode buffers.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
153
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
154 (define-abbrev-table 'ruby-mode-abbrev-table ())
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
155
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
156 (defvar ruby-mode-map
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
157 (let ((map (make-sparse-keymap)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
158 (define-key map "{" 'ruby-electric-brace)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
159 (define-key map "}" 'ruby-electric-brace)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
160 (define-key map (kbd "M-C-a") 'ruby-beginning-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
161 (define-key map (kbd "M-C-e") 'ruby-end-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
162 (define-key map (kbd "M-C-b") 'ruby-backward-sexp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
163 (define-key map (kbd "M-C-f") 'ruby-forward-sexp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
164 (define-key map (kbd "M-C-p") 'ruby-beginning-of-block)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
165 (define-key map (kbd "M-C-n") 'ruby-end-of-block)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
166 (define-key map (kbd "M-C-h") 'ruby-mark-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
167 (define-key map (kbd "M-C-q") 'ruby-indent-exp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
168 (define-key map (kbd "TAB") 'ruby-indent-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
169 (define-key map (kbd "C-M-h") 'backward-kill-word)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
170 (define-key map (kbd "C-j") 'reindent-then-newline-and-indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
171 (define-key map (kbd "C-m") 'newline)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
172 map)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
173 "Keymap used in ruby-mode.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
174
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
175 (defvar ruby-mode-syntax-table
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
176 (let ((table (make-syntax-table)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
177 (modify-syntax-entry ?\' "\"" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
178 (modify-syntax-entry ?\" "\"" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
179 (modify-syntax-entry ?\` "\"" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
180 (modify-syntax-entry ?# "<" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
181 (modify-syntax-entry ?\n ">" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
182 (modify-syntax-entry ?\\ "\\" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
183 (modify-syntax-entry ?$ "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
184 (modify-syntax-entry ?? "_" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
185 (modify-syntax-entry ?_ "_" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
186 (modify-syntax-entry ?< "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
187 (modify-syntax-entry ?> "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
188 (modify-syntax-entry ?& "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
189 (modify-syntax-entry ?| "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
190 (modify-syntax-entry ?% "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
191 (modify-syntax-entry ?= "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
192 (modify-syntax-entry ?/ "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
193 (modify-syntax-entry ?+ "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
194 (modify-syntax-entry ?* "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
195 (modify-syntax-entry ?- "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
196 (modify-syntax-entry ?\; "." table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
197 (modify-syntax-entry ?\( "()" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
198 (modify-syntax-entry ?\) ")(" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
199 (modify-syntax-entry ?\{ "(}" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
200 (modify-syntax-entry ?\} "){" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
201 (modify-syntax-entry ?\[ "(]" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
202 (modify-syntax-entry ?\] ")[" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
203 table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
204 "Syntax table to use in ruby-mode.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
205
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
206 (defcustom ruby-indent-tabs-mode nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
207 "Indentation can insert tabs in ruby mode if this is non-nil."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
208 :type 'boolean :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
209
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
210 (defcustom ruby-indent-level 2
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
211 "Indentation of ruby statements."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
212 :type 'integer :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
213
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
214 (defcustom ruby-comment-column 32
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
215 "Indentation column of comments."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
216 :type 'integer :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
217
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
218 (defcustom ruby-deep-arglist t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
219 "Deep indent lists in parenthesis when non-nil.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
220 Also ignores spaces after parenthesis when 'space."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
221 :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
222
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
223 (defcustom ruby-deep-indent-paren '(?\( ?\[ ?\] t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
224 "Deep indent lists in parenthesis when non-nil. t means continuous line.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
225 Also ignores spaces after parenthesis when 'space."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
226 :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
227
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
228 (defcustom ruby-deep-indent-paren-style 'space
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
229 "Default deep indent style."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
230 :options '(t nil space) :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
231
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
232 (defcustom ruby-encoding-map '((shift_jis . cp932) (shift-jis . cp932))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
233 "Alist to map encoding name from Emacs to Ruby."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
234 :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
235
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
236 (defcustom ruby-insert-encoding-magic-comment t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
237 "*Insert a magic emacs 'coding' comment upon save if this is non-nil."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
238 :type 'boolean :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
239
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
240 (defcustom ruby-use-encoding-map t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
241 "Use `ruby-encoding-map' to set encoding magic comment if this is non-nil."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
242 :type 'boolean :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
243
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
244 ;; Safe file variables
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
245 (put 'ruby-indent-tabs-mode 'safe-local-variable 'booleanp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
246 (put 'ruby-indent-level 'safe-local-variable 'integerp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
247 (put 'ruby-comment-column 'safe-local-variable 'integerp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
248 (put 'ruby-deep-arglist 'safe-local-variable 'booleanp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
249
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
250 (defun ruby-imenu-create-index-in-block (prefix beg end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
251 "Create an imenu index of methods inside a block."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
252 (let ((index-alist '()) (case-fold-search nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
253 name next pos decl sing)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
254 (goto-char beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
255 (while (re-search-forward "^\\s *\\(\\(class\\s +\\|\\(class\\s *<<\\s *\\)\\|module\\s +\\)\\([^\(<\n ]+\\)\\|\\(def\\|alias\\)\\s +\\([^\(\n ]+\\)\\)" end t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
256 (setq sing (match-beginning 3))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
257 (setq decl (match-string 5))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
258 (setq next (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
259 (setq name (or (match-string 4) (match-string 6)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
260 (setq pos (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
261 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
262 ((string= "alias" decl)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
263 (if prefix (setq name (concat prefix name)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
264 (push (cons name pos) index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
265 ((string= "def" decl)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
266 (if prefix
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
267 (setq name
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
268 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
269 ((string-match "^self\." name)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
270 (concat (substring prefix 0 -1) (substring name 4)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
271 (t (concat prefix name)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
272 (push (cons name pos) index-alist)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
273 (ruby-accurate-end-of-block end))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
274 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
275 (if (string= "self" name)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
276 (if prefix (setq name (substring prefix 0 -1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
277 (if prefix (setq name (concat (substring prefix 0 -1) "::" name)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
278 (push (cons name pos) index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
279 (ruby-accurate-end-of-block end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
280 (setq beg (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
281 (setq index-alist
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
282 (nconc (ruby-imenu-create-index-in-block
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
283 (concat name (if sing "." "#"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
284 next beg) index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
285 (goto-char beg))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
286 index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
287
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
288 (defun ruby-imenu-create-index ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
289 "Create an imenu index of all methods in the buffer."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
290 (nreverse (ruby-imenu-create-index-in-block nil (point-min) nil)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
291
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
292 (defun ruby-accurate-end-of-block (&optional end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
293 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
294 (let (state
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
295 (end (or end (point-max))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
296 (while (and (setq state (apply 'ruby-parse-partial end state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
297 (>= (nth 2 state) 0) (< (point) end)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
298
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
299 (defun ruby-mode-variables ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
300 "Set up initial buffer-local variables for ruby-mode."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
301 (set-syntax-table ruby-mode-syntax-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
302 (setq local-abbrev-table ruby-mode-abbrev-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
303 (setq indent-tabs-mode ruby-indent-tabs-mode)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
304 (set (make-local-variable 'indent-line-function) 'ruby-indent-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
305 (set (make-local-variable 'require-final-newline) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
306 (set (make-local-variable 'comment-start) "# ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
307 (set (make-local-variable 'comment-end) "")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
308 (set (make-local-variable 'comment-column) ruby-comment-column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
309 (set (make-local-variable 'comment-start-skip) "#+ *")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
310 (set (make-local-variable 'parse-sexp-ignore-comments) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
311 (set (make-local-variable 'parse-sexp-lookup-properties) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
312 (set (make-local-variable 'paragraph-start) (concat "$\\|" page-delimiter))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
313 (set (make-local-variable 'paragraph-separate) paragraph-start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
314 (set (make-local-variable 'paragraph-ignore-fill-prefix) t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
315
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
316 (defun ruby-mode-set-encoding ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
317 "Insert a magic comment header with the proper encoding if necessary."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
318 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
319 (widen)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
320 (goto-char (point-min))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
321 (when (re-search-forward "[^\0-\177]" nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
322 (goto-char (point-min))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
323 (let ((coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
324 (or coding-system-for-write
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
325 buffer-file-coding-system)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
326 (if coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
327 (setq coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
328 (or (coding-system-get coding-system 'mime-charset)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
329 (coding-system-change-eol-conversion coding-system nil))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
330 (setq coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
331 (if coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
332 (symbol-name
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
333 (or (and ruby-use-encoding-map
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
334 (cdr (assq coding-system ruby-encoding-map)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
335 coding-system))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
336 "ascii-8bit"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
337 (if (looking-at "^#![^\n]*ruby") (beginning-of-line 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
338 (cond ((looking-at "\\s *#.*-\*-\\s *\\(en\\)?coding\\s *:\\s *\\([-a-z0-9_]*\\)\\s *\\(;\\|-\*-\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
339 (unless (string= (match-string 2) coding-system)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
340 (goto-char (match-beginning 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
341 (delete-region (point) (match-end 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
342 (and (looking-at "-\*-")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
343 (let ((n (skip-chars-backward " ")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
344 (cond ((= n 0) (insert " ") (backward-char))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
345 ((= n -1) (insert " "))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
346 ((forward-char)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
347 (insert coding-system)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
348 ((looking-at "\\s *#.*coding\\s *[:=]"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
349 (t (when ruby-insert-encoding-magic-comment
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
350 (insert "# -*- coding: " coding-system " -*-\n"))))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
351
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
352 (defun ruby-current-indentation ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
353 "Return the indentation level of current line."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
354 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
355 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
356 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
357 (current-column)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
358
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
359 (defun ruby-indent-line (&optional flag)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
360 "Correct the indentation of the current ruby line."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
361 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
362 (ruby-indent-to (ruby-calculate-indent)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
363
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
364 (defun ruby-indent-to (column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
365 "Indent the current line to COLUMN."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
366 (when column
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
367 (let (shift top beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
368 (and (< column 0) (error "invalid nest"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
369 (setq shift (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
370 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
371 (setq beg (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
372 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
373 (setq top (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
374 (skip-chars-backward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
375 (if (>= shift top) (setq shift (- shift top))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
376 (setq shift 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
377 (if (and (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
378 (= column top))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
379 (move-to-column (+ column shift))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
380 (move-to-column top)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
381 (delete-region beg (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
382 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
383 (indent-to column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
384 (move-to-column (+ column shift))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
385
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
386 (defun ruby-special-char-p (&optional pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
387 "Return t if the character before POS is a special character.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
388 If omitted, POS defaults to the current point.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
389 Special characters are `?', `$', `:' when preceded by whitespace,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
390 and `\\' when preceded by `?'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
391 (setq pos (or pos (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
392 (let ((c (char-before pos)) (b (and (< (point-min) pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
393 (char-before (1- pos)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
394 (cond ((or (eq c ??) (eq c ?$)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
395 ((and (eq c ?:) (or (not b) (eq (char-syntax b) ? ))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
396 ((eq c ?\\) (eq b ??)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
397
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
398 (defun ruby-expr-beg (&optional option)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
399 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
400 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
401 (store-match-data nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
402 (let ((space (skip-chars-backward " \t"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
403 (start (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
404 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
405 ((bolp) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
406 ((progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
407 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
408 (and (looking-at "\\?")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
409 (or (eq (char-syntax (char-before (point))) ?w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
410 (ruby-special-char-p))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
411 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
412 ((and (eq option 'heredoc) (< space 0)) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
413 ((or (looking-at ruby-operator-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
414 (looking-at "[\\[({,;]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
415 (and (looking-at "[!?]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
416 (or (not (eq option 'modifier))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
417 (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
418 (save-excursion (forward-char -1) (looking-at "\\Sw$"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
419 (and (looking-at ruby-symbol-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
420 (skip-chars-backward ruby-symbol-chars)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
421 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
422 ((looking-at (regexp-opt
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
423 (append ruby-block-beg-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
424 ruby-block-op-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
425 ruby-block-mid-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
426 'words))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
427 (goto-char (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
428 (not (looking-at "\\s_")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
429 ((eq option 'expr-qstr)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
430 (looking-at "[a-zA-Z][a-zA-z0-9_]* +%[^ \t]"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
431 ((eq option 'expr-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
432 (looking-at "[a-zA-Z][a-zA-z0-9_]* +/[^ \t]"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
433 (t nil)))))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
434
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
435 (defun ruby-forward-string (term &optional end no-error expand)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
436 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
437 (let ((n 1) (c (string-to-char term))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
438 (re (if expand
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
439 (concat "[^\\]\\(\\\\\\\\\\)*\\([" term "]\\|\\(#{\\)\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
440 (concat "[^\\]\\(\\\\\\\\\\)*[" term "]"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
441 (while (and (re-search-forward re end no-error)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
442 (if (match-beginning 3)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
443 (ruby-forward-string "}{" end no-error nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
444 (> (setq n (if (eq (char-before (point)) c)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
445 (1- n) (1+ n))) 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
446 (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
447 (cond ((zerop n))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
448 (no-error nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
449 ((error "unterminated string")))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
450
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
451 (defun ruby-deep-indent-paren-p (c)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
452 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
453 (cond ((listp ruby-deep-indent-paren)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
454 (let ((deep (assoc c ruby-deep-indent-paren)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
455 (cond (deep
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
456 (or (cdr deep) ruby-deep-indent-paren-style))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
457 ((memq c ruby-deep-indent-paren)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
458 ruby-deep-indent-paren-style))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
459 ((eq c ruby-deep-indent-paren) ruby-deep-indent-paren-style)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
460 ((eq c ?\( ) ruby-deep-arglist)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
461
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
462 (defun ruby-parse-partial (&optional end in-string nest depth pcol indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
463 "TODO: document throughout function body."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
464 (or depth (setq depth 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
465 (or indent (setq indent 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
466 (when (re-search-forward ruby-delimiter end 'move)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
467 (let ((pnt (point)) w re expand)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
468 (goto-char (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
469 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
470 ((and (memq (char-before) '(?@ ?$)) (looking-at "\\sw"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
471 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
472 ((looking-at "[\"`]") ;skip string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
473 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
474 ((and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
475 (ruby-forward-string (buffer-substring (point) (1+ (point))) end t t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
476 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
477 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
478 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
479 (goto-char end))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
480 ((looking-at "'")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
481 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
482 ((and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
483 (re-search-forward "[^\\]\\(\\\\\\\\\\)*'" end t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
484 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
485 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
486 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
487 (goto-char end))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
488 ((looking-at "/=")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
489 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
490 ((looking-at "/")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
491 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
492 ((and (not (eobp)) (ruby-expr-beg 'expr-re))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
493 (if (ruby-forward-string "/" end t t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
494 nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
495 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
496 (goto-char end)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
497 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
498 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
499 ((looking-at "%")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
500 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
501 ((and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
502 (ruby-expr-beg 'expr-qstr)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
503 (not (looking-at "%="))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
504 (looking-at "%[QqrxWw]?\\([^a-zA-Z0-9 \t\n]\\)"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
505 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
506 (setq expand (not (memq (char-before) '(?q ?w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
507 (setq w (match-string 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
508 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
509 ((string= w "[") (setq re "]["))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
510 ((string= w "{") (setq re "}{"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
511 ((string= w "(") (setq re ")("))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
512 ((string= w "<") (setq re "><"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
513 ((and expand (string= w "\\"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
514 (setq w (concat "\\" w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
515 (unless (cond (re (ruby-forward-string re end t expand))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
516 (expand (ruby-forward-string w end t t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
517 (t (re-search-forward
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
518 (if (string= w "\\")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
519 "\\\\[^\\]*\\\\"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
520 (concat "[^\\]\\(\\\\\\\\\\)*" w))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
521 end t)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
522 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
523 (goto-char end)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
524 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
525 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
526 ((looking-at "\\?") ;skip ?char
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
527 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
528 ((and (ruby-expr-beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
529 (looking-at "?\\(\\\\C-\\|\\\\M-\\)*\\\\?."))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
530 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
531 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
532 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
533 ((looking-at "\\$") ;skip $char
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
534 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
535 (forward-char 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
536 ((looking-at "#") ;skip comment
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
537 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
538 (goto-char (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
539 )
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
540 ((looking-at "[\\[{(]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
541 (let ((deep (ruby-deep-indent-paren-p (char-after))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
542 (if (and deep (or (not (eq (char-after) ?\{)) (ruby-expr-beg)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
543 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
544 (and (eq deep 'space) (looking-at ".\\s +[^# \t\n]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
545 (setq pnt (1- (match-end 0))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
546 (setq nest (cons (cons (char-after (point)) pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
547 (setq pcol (cons (cons pnt depth) pcol))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
548 (setq depth 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
549 (setq nest (cons (cons (char-after (point)) pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
550 (setq depth (1+ depth))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
551 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
552 )
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
553 ((looking-at "[])}]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
554 (if (ruby-deep-indent-paren-p (matching-paren (char-after)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
555 (setq depth (cdr (car pcol)) pcol (cdr pcol))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
556 (setq depth (1- depth)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
557 (setq nest (cdr nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
558 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
559 ((looking-at ruby-block-end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
560 (if (or (and (not (bolp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
561 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
562 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
563 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
564 (or (eq ?_ w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
565 (eq ?. w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
566 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
567 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
568 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
569 (or (eq ?_ w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
570 (eq ?! w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
571 (eq ?? w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
572 nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
573 (setq nest (cdr nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
574 (setq depth (1- depth)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
575 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
576 ((looking-at "def\\s +[^(\n;]*")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
577 (if (or (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
578 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
579 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
580 (not (eq ?_ (char-after (point))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
581 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
582 (setq nest (cons (cons nil pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
583 (setq depth (1+ depth))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
584 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
585 ((looking-at (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
586 (and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
587 (save-match-data
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
588 (or (not (looking-at (concat "do" ruby-keyword-end-re)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
589 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
590 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
591 (not (looking-at ruby-non-block-do-re)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
592 (or (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
593 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
594 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
595 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
596 (not (or (eq ?_ w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
597 (eq ?. w)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
598 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
599 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
600 (not (eq ?_ w))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
601 (not (eq ?! w))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
602 (not (eq ?? w))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
603 (skip-chars-forward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
604 (goto-char (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
605 (or (not (looking-at ruby-modifier-re))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
606 (ruby-expr-beg 'modifier))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
607 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
608 (setq nest (cons (cons nil pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
609 (setq depth (1+ depth)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
610 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
611 ((looking-at ":\\(['\"]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
612 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
613 (ruby-forward-string (buffer-substring (match-beginning 1) (match-end 1)) end))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
614 ((looking-at ":\\([-,.+*/%&|^~<>]=?\\|===?\\|<=>\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
615 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
616 ((looking-at ":\\([a-zA-Z_][a-zA-Z_0-9]*[!?=]?\\)?")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
617 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
618 ((or (looking-at "\\.\\.\\.?")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
619 (looking-at "\\.[0-9]+")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
620 (looking-at "\\.[a-zA-Z_0-9]+")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
621 (looking-at "\\."))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
622 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
623 ((looking-at "^=begin")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
624 (if (re-search-forward "^=end" end t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
625 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
626 (setq in-string (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
627 (goto-char end)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
628 ((looking-at "<<")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
629 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
630 ((and (ruby-expr-beg 'heredoc)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
631 (looking-at "<<\\(-\\)?\\(\\([\"'`]\\)\\([^\n]+?\\)\\3\\|\\(?:\\sw\\|\\s_\\)+\\)"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
632 (setq re (regexp-quote (or (match-string 4) (match-string 2))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
633 (if (match-beginning 1) (setq re (concat "\\s *" re)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
634 (let* ((id-end (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
635 (line-end-position (save-excursion (end-of-line) (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
636 (state (list in-string nest depth pcol indent)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
637 ;; parse the rest of the line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
638 (while (and (> line-end-position (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
639 (setq state (apply 'ruby-parse-partial
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
640 line-end-position state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
641 (setq in-string (car state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
642 nest (nth 1 state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
643 depth (nth 2 state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
644 pcol (nth 3 state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
645 indent (nth 4 state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
646 ;; skip heredoc section
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
647 (if (re-search-forward (concat "^" re "$") end 'move)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
648 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
649 (setq in-string id-end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
650 (goto-char end))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
651 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
652 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
653 ((looking-at "^__END__$")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
654 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
655 ((and (looking-at ruby-here-doc-beg-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
656 (boundp 'ruby-indent-point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
657 (if (re-search-forward (ruby-here-doc-end-match)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
658 ruby-indent-point t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
659 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
660 (setq in-string (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
661 (goto-char ruby-indent-point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
662 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
663 (error (format "bad string %s"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
664 (buffer-substring (point) pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
665 ))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
666 (list in-string nest depth pcol))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
667
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
668 (defun ruby-parse-region (start end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
669 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
670 (let (state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
671 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
672 (if start
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
673 (goto-char start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
674 (ruby-beginning-of-indent))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
675 (save-restriction
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
676 (narrow-to-region (point) end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
677 (while (and (> end (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
678 (setq state (apply 'ruby-parse-partial end state))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
679 (list (nth 0 state) ; in-string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
680 (car (nth 1 state)) ; nest
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
681 (nth 2 state) ; depth
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
682 (car (car (nth 3 state))) ; pcol
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
683 ;(car (nth 5 state)) ; indent
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
684 )))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
685
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
686 (defun ruby-indent-size (pos nest)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
687 "Returns the indentation level in spaces NEST levels deeper than POS."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
688 (+ pos (* (or nest 1) ruby-indent-level)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
689
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
690 (defun ruby-calculate-indent (&optional parse-start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
691 "Returns the proper indentation level of the current line."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
692 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
693 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
694 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
695 (let ((ruby-indent-point (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
696 (case-fold-search nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
697 state bol eol begin op-end
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
698 (paren (progn (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
699 (and (char-after) (matching-paren (char-after)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
700 (indent 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
701 (if parse-start
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
702 (goto-char parse-start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
703 (ruby-beginning-of-indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
704 (setq parse-start (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
705 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
706 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
707 (setq state (ruby-parse-region parse-start ruby-indent-point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
708 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
709 ((nth 0 state) ; within string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
710 (setq indent nil)) ; do nothing
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
711 ((car (nth 1 state)) ; in paren
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
712 (goto-char (setq begin (cdr (nth 1 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
713 (let ((deep (ruby-deep-indent-paren-p (car (nth 1 state)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
714 (if deep
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
715 (cond ((and (eq deep t) (eq (car (nth 1 state)) paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
716 (skip-syntax-backward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
717 (setq indent (1- (current-column))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
718 ((let ((s (ruby-parse-region (point) ruby-indent-point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
719 (and (nth 2 s) (> (nth 2 s) 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
720 (or (goto-char (cdr (nth 1 s))) t)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
721 (forward-word -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
722 (setq indent (ruby-indent-size (current-column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
723 (nth 2 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
724 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
725 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
726 (cond ((eq deep 'space))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
727 (paren (setq indent (1- indent)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
728 (t (setq indent (ruby-indent-size (1- indent) 1))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
729 (if (nth 3 state) (goto-char (nth 3 state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
730 (goto-char parse-start) (back-to-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
731 (setq indent (ruby-indent-size (current-column) (nth 2 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
732 (and (eq (car (nth 1 state)) paren)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
733 (ruby-deep-indent-paren-p (matching-paren paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
734 (search-backward (char-to-string paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
735 (setq indent (current-column)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
736 ((and (nth 2 state) (> (nth 2 state) 0)) ; in nest
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
737 (if (null (cdr (nth 1 state)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
738 (error "invalid nest"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
739 (goto-char (cdr (nth 1 state)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
740 (forward-word -1) ; skip back a keyword
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
741 (setq begin (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
742 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
743 ((looking-at "do\\>[^_]") ; iter block is a special case
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
744 (if (nth 3 state) (goto-char (nth 3 state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
745 (goto-char parse-start) (back-to-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
746 (setq indent (ruby-indent-size (current-column) (nth 2 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
747 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
748 (setq indent (+ (current-column) ruby-indent-level)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
749
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
750 ((and (nth 2 state) (< (nth 2 state) 0)) ; in negative nest
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
751 (setq indent (ruby-indent-size (current-column) (nth 2 state)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
752 (when indent
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
753 (goto-char ruby-indent-point)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
754 (end-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
755 (setq eol (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
756 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
757 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
758 ((and (not (ruby-deep-indent-paren-p paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
759 (re-search-forward ruby-negative eol t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
760 (and (not (eq ?_ (char-after (match-end 0))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
761 (setq indent (- indent ruby-indent-level))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
762 ((and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
763 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
764 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
765 (not (bobp)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
766 (or (ruby-deep-indent-paren-p t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
767 (null (car (nth 1 state)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
768 ;; goto beginning of non-empty no-comment line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
769 (let (end done)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
770 (while (not done)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
771 (skip-chars-backward " \t\n")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
772 (setq end (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
773 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
774 (if (re-search-forward "^\\s *#" end t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
775 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
776 (setq done t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
777 (setq bol (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
778 (end-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
779 ;; skip the comment at the end
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
780 (skip-chars-backward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
781 (let (end (pos (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
782 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
783 (while (and (re-search-forward "#" pos t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
784 (setq end (1- (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
785 (or (ruby-special-char-p end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
786 (and (setq state (ruby-parse-region parse-start end))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
787 (nth 0 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
788 (setq end nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
789 (goto-char (or end pos))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
790 (skip-chars-backward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
791 (setq begin (if (and end (nth 0 state)) pos (cdr (nth 1 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
792 (setq state (ruby-parse-region parse-start (point))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
793 (or (bobp) (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
794 (and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
795 (or (and (looking-at ruby-symbol-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
796 (skip-chars-backward ruby-symbol-chars)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
797 (looking-at (concat "\\<\\(" ruby-block-hanging-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
798 (not (eq (point) (nth 3 state)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
799 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
800 (goto-char (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
801 (not (looking-at "[a-z_]"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
802 (and (looking-at ruby-operator-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
803 (not (ruby-special-char-p))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
804 ;; operator at the end of line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
805 (let ((c (char-after (point))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
806 (and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
807 ;; (or (null begin)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
808 ;; (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
809 ;; (goto-char begin)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
810 ;; (skip-chars-forward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
811 ;; (not (or (eolp) (looking-at "#")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
812 ;; (and (eq (car (nth 1 state)) ?{)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
813 ;; (looking-at "|"))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
814 (or (not (eq ?/ c))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
815 (null (nth 0 (ruby-parse-region (or begin parse-start) (point)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
816 (or (not (eq ?| (char-after (point))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
817 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
818 (or (eolp) (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
819 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
820 ((search-backward "|" nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
821 (skip-chars-backward " \t\n")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
822 (and (not (eolp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
823 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
824 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
825 (not (looking-at "{")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
826 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
827 (forward-word -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
828 (not (looking-at "do\\>[^_]")))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
829 (t t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
830 (not (eq ?, c))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
831 (setq op-end t)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
832 (setq indent
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
833 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
834 ((and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
835 (null op-end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
836 (not (looking-at (concat "\\<\\(" ruby-block-hanging-re "\\)\\>")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
837 (eq (ruby-deep-indent-paren-p t) 'space)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
838 (not (bobp)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
839 (widen)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
840 (goto-char (or begin parse-start))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
841 (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
842 (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
843 ((car (nth 1 state)) indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
844 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
845 (+ indent ruby-indent-level))))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
846 (goto-char ruby-indent-point)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
847 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
848 (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
849 (if (looking-at "\\.[^.]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
850 (+ indent ruby-indent-level)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
851 indent))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
852
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
853 (defun ruby-electric-brace (arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
854 "Inserts a brace and re-indents the current line."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
855 (interactive "P")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
856 (self-insert-command (prefix-numeric-value arg))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
857 (ruby-indent-line t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
858
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
859 ;; TODO: Why isn't one ruby-*-of-defun written in terms of the other?
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
860 (defun ruby-beginning-of-defun (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
861 "Move backward to the beginning of the current top-level defun.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
862 With ARG, move backward multiple defuns. Negative ARG means
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
863 move forward."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
864 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
865 (and (re-search-backward (concat "^\\(" ruby-block-beg-re "\\)\\b")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
866 nil 'move (or arg 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
867 (beginning-of-line)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
868
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
869 (defun ruby-end-of-defun (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
870 "Move forward to the end of the current top-level defun.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
871 With ARG, move forward multiple defuns. Negative ARG means
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
872 move backward."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
873 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
874 (and (re-search-forward (concat "^\\(" ruby-block-end-re "\\)\\($\\|\\b[^_]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
875 nil 'move (or arg 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
876 (beginning-of-line))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
877 (forward-line 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
878
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
879 (defun ruby-beginning-of-indent ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
880 "TODO: document"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
881 ;; I don't understand this function.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
882 ;; It seems like it should move to the line where indentation should deepen,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
883 ;; but ruby-indent-beg-re only accounts for whitespace before class, module and def,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
884 ;; so this will only match other block beginners at the beginning of the line.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
885 (and (re-search-backward (concat "^\\(" ruby-indent-beg-re "\\)\\b") nil 'move)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
886 (beginning-of-line)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
887
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
888 (defun ruby-move-to-block (n)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
889 "Moves to the beginning (N < 0) or the end (N > 0) of the current block
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
890 or blocks containing the current block."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
891 ;; TODO: Make this work for n > 1,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
892 ;; make it not loop for n = 0,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
893 ;; document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
894 (let (start pos done down)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
895 (setq start (ruby-calculate-indent))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
896 (setq down (looking-at (if (< n 0) ruby-block-end-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
897 (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
898 (while (and (not done) (not (if (< n 0) (bobp) (eobp))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
899 (forward-line n)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
900 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
901 ((looking-at "^\\s *$"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
902 ((looking-at "^\\s *#"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
903 ((and (> n 0) (looking-at "^=begin\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
904 (re-search-forward "^=end\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
905 ((and (< n 0) (looking-at "^=end\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
906 (re-search-backward "^=begin\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
907 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
908 (setq pos (current-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
909 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
910 ((< start pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
911 (setq down t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
912 ((and down (= pos start))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
913 (setq done t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
914 ((> start pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
915 (setq done t)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
916 (if done
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
917 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
918 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
919 (if (looking-at (concat "\\<\\(" ruby-block-mid-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
920 (setq done nil))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
921 (back-to-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
922
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
923 (defun ruby-beginning-of-block (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
924 "Move backward to the beginning of the current block.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
925 With ARG, move up multiple blocks."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
926 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
927 (ruby-move-to-block (- (or arg 1))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
928
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
929 (defun ruby-end-of-block (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
930 "Move forward to the end of the current block.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
931 With ARG, move out of multiple blocks."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
932 ;; Passing a value > 1 to ruby-move-to-block currently doesn't work.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
933 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
934 (ruby-move-to-block (or arg 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
935
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
936 (defun ruby-forward-sexp (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
937 "Move forward across one balanced expression (sexp).
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
938 With ARG, do it many times. Negative ARG means move backward."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
939 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
940 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
941 (if (and (numberp arg) (< arg 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
942 (ruby-backward-sexp (- arg))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
943 (let ((i (or arg 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
944 (condition-case nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
945 (while (> i 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
946 (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
947 (cond ((looking-at "\\?\\(\\\\[CM]-\\)*\\\\?\\S ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
948 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
949 ((progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
950 (skip-chars-forward ",.:;|&^~=!?\\+\\-\\*")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
951 (looking-at "\\s("))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
952 (goto-char (scan-sexps (point) 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
953 ((and (looking-at (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
954 (not (eq (char-before (point)) ?.))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
955 (not (eq (char-before (point)) ?:)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
956 (ruby-end-of-block)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
957 (forward-word 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
958 ((looking-at "\\(\\$\\|@@?\\)?\\sw")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
959 (while (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
960 (while (progn (forward-word 1) (looking-at "_")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
961 (cond ((looking-at "::") (forward-char 2) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
962 ((> (skip-chars-forward ".") 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
963 ((looking-at "\\?\\|!\\(=[~=>]\\|[^~=]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
964 (forward-char 1) nil)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
965 ((let (state expr)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
966 (while
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
967 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
968 (setq expr (or expr (ruby-expr-beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
969 (looking-at "%\\sw?\\Sw\\|[\"'`/]")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
970 (nth 1 (setq state (apply 'ruby-parse-partial nil state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
971 (setq expr t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
972 (skip-chars-forward "<"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
973 (not expr))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
974 (setq i (1- i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
975 ((error) (forward-word 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
976 i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
977
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
978 (defun ruby-backward-sexp (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
979 "Move backward across one balanced expression (sexp).
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
980 With ARG, do it many times. Negative ARG means move forward."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
981 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
982 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
983 (if (and (numberp arg) (< arg 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
984 (ruby-forward-sexp (- arg))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
985 (let ((i (or arg 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
986 (condition-case nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
987 (while (> i 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
988 (skip-chars-backward " \t\n,.:;|&^~=!?\\+\\-\\*")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
989 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
990 (cond ((looking-at "\\s)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
991 (goto-char (scan-sexps (1+ (point)) -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
992 (case (char-before)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
993 (?% (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
994 ('(?q ?Q ?w ?W ?r ?x)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
995 (if (eq (char-before (1- (point))) ?%) (forward-char -2))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
996 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
997 ((looking-at "\\s\"\\|\\\\\\S_")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
998 (let ((c (char-to-string (char-before (match-end 0)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
999 (while (and (search-backward c)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1000 (eq (logand (skip-chars-backward "\\") 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1001 1))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1002 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1003 ((looking-at "\\s.\\|\\s\\")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1004 (if (ruby-special-char-p) (forward-char -1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1005 ((looking-at "\\s(") nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1006 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1007 (forward-char 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1008 (while (progn (forward-word -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1009 (case (char-before)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1010 (?_ t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1011 (?. (forward-char -1) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1012 ((?$ ?@)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1013 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1014 (and (eq (char-before) (char-after)) (forward-char -1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1015 (?:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1016 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1017 (eq (char-before) :)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1018 (if (looking-at ruby-block-end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1019 (ruby-beginning-of-block))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1020 nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1021 (setq i (1- i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1022 ((error)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1023 i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1024
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1025 (defun ruby-mark-defun ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1026 "Put mark at end of this Ruby function, point at beginning."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1027 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1028 (push-mark (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1029 (ruby-end-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1030 (push-mark (point) nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1031 (ruby-beginning-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1032 (re-search-backward "^\n" (- (point) 1) t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1033
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1034 (defun ruby-indent-exp (&optional shutup-p)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1035 "Indent each line in the balanced expression following the point.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1036 If a prefix arg is given or SHUTUP-P is non-nil, no errors
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1037 are signalled if a balanced expression isn't found."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1038 (interactive "*P")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1039 (let ((here (point-marker)) start top column (nest t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1040 (set-marker-insertion-type here t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1041 (unwind-protect
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1042 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1043 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1044 (setq start (point) top (current-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1045 (while (and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1046 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1047 (setq column (ruby-calculate-indent start))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1048 (cond ((> column top)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1049 (setq nest t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1050 ((and (= column top) nest)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1051 (setq nest nil) t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1052 (ruby-indent-to column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1053 (beginning-of-line 2)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1054 (goto-char here)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1055 (set-marker here nil))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1056
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1057 (defun ruby-add-log-current-method ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1058 "Returns the current method name as a string.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1059 This string includes all namespaces.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1060
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1061 For example:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1062
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1063 #exit
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1064 String#gsub
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1065 Net::HTTP#active?
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1066 File::open.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1067
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1068 See `add-log-current-defun-function'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1069 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1070 ;; Why does this append a period to class methods?
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1071 (condition-case nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1072 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1073 (let (mname mlist (indent 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1074 ;; get current method (or class/module)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1075 (if (re-search-backward
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1076 (concat "^[ \t]*\\(def\\|class\\|module\\)[ \t]+"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1077 "\\("
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1078 ;; \\. and :: for class method
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1079 "\\([A-Za-z_]" ruby-symbol-re "*\\|\\.\\|::" "\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1080 "+\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1081 nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1082 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1083 (setq mname (match-string 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1084 (unless (string-equal "def" (match-string 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1085 (setq mlist (list mname) mname nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1086 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1087 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1088 (beginning-of-line)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1089 ;; nest class/module
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1090 (while (and (> indent 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1091 (re-search-backward
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1092 (concat
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1093 "^[ \t]*\\(class\\|module\\)[ \t]+"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1094 "\\([A-Z]" ruby-symbol-re "*\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1095 nil t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1096 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1097 (if (< (current-column) indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1098 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1099 (setq mlist (cons (match-string 2) mlist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1100 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1101 (beginning-of-line))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1102 (when mname
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1103 (let ((mn (split-string mname "\\.\\|::")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1104 (if (cdr mn)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1105 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1106 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1107 ((string-equal "" (car mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1108 (setq mn (cdr mn) mlist nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1109 ((string-equal "self" (car mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1110 (setq mn (cdr mn)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1111 ((let ((ml (nreverse mlist)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1112 (while ml
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1113 (if (string-equal (car ml) (car mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1114 (setq mlist (nreverse (cdr ml)) ml nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1115 (or (setq ml (cdr ml)) (nreverse mlist))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1116 (if mlist
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1117 (setcdr (last mlist) mn)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1118 (setq mlist mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1119 (setq mn (last mn 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1120 (setq mname (concat "." (cadr mn)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1121 (setcdr mn nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1122 (setq mname (concat "#" mname)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1123 ;; generate string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1124 (if (consp mlist)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1125 (setq mlist (mapconcat (function identity) mlist "::")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1126 (if mname
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1127 (if mlist (concat mlist mname) mname)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1128 mlist)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1129
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1130 (defconst ruby-font-lock-syntactic-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1131 `(;; #{ }, #$hoge, #@foo are not comments
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1132 ("\\(#\\)[{$@]" 1 (1 . nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1133 ;; the last $', $", $` in the respective string is not variable
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1134 ;; the last ?', ?", ?` in the respective string is not ascii code
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1135 ("\\(^\\|[\[ \t\n<+\(,=]\\)\\(['\"`]\\)\\(\\\\.\\|\\2\\|[^'\"`\n\\\\]\\)*?\\\\?[?$]\\(\\2\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1136 (2 (7 . nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1137 (4 (7 . nil)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1138 ;; $' $" $` .... are variables
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1139 ;; ?' ?" ?` are ascii codes
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1140 ("\\(^\\|[^\\\\]\\)\\(\\\\\\\\\\)*[?$]\\([#\"'`]\\)" 3 (1 . nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1141 ;; regexps
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1142 ("\\(^\\|[=(,~?:;<>]\\|\\(^\\|\\s \\)\\(if\\|elsif\\|unless\\|while\\|until\\|when\\|and\\|or\\|&&\\|||\\)\\|g?sub!?\\|scan\\|split!?\\)\\s *\\(/\\)[^/\n\\\\]*\\(\\\\.[^/\n\\\\]*\\)*\\(/\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1143 (4 (7 . ?/))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1144 (6 (7 . ?/)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1145 ("^=en\\(d\\)\\_>" 1 "!")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1146 ("^\\(=\\)begin\\_>" 1 (ruby-comment-beg-syntax))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1147 ;; Currently, the following case is highlighted incorrectly:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1148 ;;
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1149 ;; <<FOO
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1150 ;; FOO
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1151 ;; <<BAR
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1152 ;; <<BAZ
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1153 ;; BAZ
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1154 ;; BAR
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1155 ;;
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1156 ;; This is because all here-doc beginnings are highlighted before any endings,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1157 ;; so although <<BAR is properly marked as a beginning, when we get to <<BAZ
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1158 ;; it thinks <<BAR is part of a string so it's marked as well.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1159 ;;
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1160 ;; This may be fixable by modifying ruby-in-here-doc-p to use
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1161 ;; ruby-in-non-here-doc-string-p rather than syntax-ppss-context,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1162 ;; but I don't want to try that until we've got unit tests set up
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1163 ;; to make sure I don't break anything else.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1164 (,(concat ruby-here-doc-beg-re ".*\\(\n\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1165 ,(+ 1 (regexp-opt-depth ruby-here-doc-beg-re))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1166 (ruby-here-doc-beg-syntax))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1167 (,ruby-here-doc-end-re 3 (ruby-here-doc-end-syntax)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1168 "Syntactic keywords for ruby-mode. See `font-lock-syntactic-keywords'.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1169
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1170 (defun ruby-comment-beg-syntax ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1171 "Returns the syntax cell for a the first character of a =begin.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1172 See the definition of `ruby-font-lock-syntactic-keywords'.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1173
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1174 This returns a comment-delimiter cell as long as the =begin
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1175 isn't in a string or another comment."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1176 (when (not (nth 3 (syntax-ppss)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1177 (string-to-syntax "!")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1178
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1179 (unless (functionp 'syntax-ppss)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1180 (defun syntax-ppss (&optional pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1181 (parse-partial-sexp (point-min) (or pos (point)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1182
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1183 (defun ruby-in-ppss-context-p (context &optional ppss)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1184 (let ((ppss (or ppss (syntax-ppss (point)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1185 (if (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1186 ((eq context 'anything)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1187 (or (nth 3 ppss)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1188 (nth 4 ppss)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1189 ((eq context 'string)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1190 (nth 3 ppss))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1191 ((eq context 'heredoc)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1192 (and (nth 3 ppss)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1193 ;; If it's generic string, it's a heredoc and we don't care
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1194 ;; See `parse-partial-sexp'
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1195 (not (numberp (nth 3 ppss)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1196 ((eq context 'non-heredoc)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1197 (and (ruby-in-ppss-context-p 'anything)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1198 (not (ruby-in-ppss-context-p 'heredoc))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1199 ((eq context 'comment)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1200 (nth 4 ppss))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1201 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1202 (error (concat
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1203 "Internal error on `ruby-in-ppss-context-p': "
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1204 "context name `" (symbol-name context) "' is unknown"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1205 t)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1206
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1207 (defun ruby-in-here-doc-p ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1208 "Returns whether or not the point is in a heredoc."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1209 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1210 (let ((old-point (point)) (case-fold-search nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1211 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1212 (catch 'found-beg
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1213 (while (re-search-backward ruby-here-doc-beg-re nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1214 (if (not (or (ruby-in-ppss-context-p 'anything)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1215 (ruby-here-doc-find-end old-point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1216 (throw 'found-beg t)))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1217
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1218 (defun ruby-here-doc-find-end (&optional limit)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1219 "Expects the point to be on a line with one or more heredoc
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1220 openers. Returns the buffer position at which all heredocs on the
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1221 line are terminated, or nil if they aren't terminated before the
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1222 buffer position `limit' or the end of the buffer."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1223 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1224 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1225 (catch 'done
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1226 (let ((eol (save-excursion (end-of-line) (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1227 (case-fold-search nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1228 ;; Fake match data such that (match-end 0) is at eol
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1229 (end-match-data (progn (looking-at ".*$") (match-data)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1230 beg-match-data end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1231 (while (re-search-forward ruby-here-doc-beg-re eol t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1232 (setq beg-match-data (match-data))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1233 (setq end-re (ruby-here-doc-end-match))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1234
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1235 (set-match-data end-match-data)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1236 (goto-char (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1237 (unless (re-search-forward end-re limit t) (throw 'done nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1238 (setq end-match-data (match-data))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1239
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1240 (set-match-data beg-match-data)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1241 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1242 (set-match-data end-match-data)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1243 (goto-char (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1244 (point)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1245
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1246 (defun ruby-here-doc-beg-syntax ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1247 "Returns the syntax cell for a line that may begin a heredoc.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1248 See the definition of `ruby-font-lock-syntactic-keywords'.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1249
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1250 This sets the syntax cell for the newline ending the line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1251 containing the heredoc beginning so that cases where multiple
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1252 heredocs are started on one line are handled correctly."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1253 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1254 (goto-char (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1255 (unless (or (ruby-in-ppss-context-p 'non-heredoc)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1256 (ruby-in-here-doc-p))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1257 (string-to-syntax "|"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1258
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1259 (defun ruby-here-doc-end-syntax ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1260 "Returns the syntax cell for a line that may end a heredoc.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1261 See the definition of `ruby-font-lock-syntactic-keywords'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1262 (let ((pss (syntax-ppss)) (case-fold-search nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1263 ;; If we aren't in a string, we definitely aren't ending a heredoc,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1264 ;; so we can just give up.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1265 ;; This means we aren't doing a full-document search
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1266 ;; every time we enter a character.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1267 (when (ruby-in-ppss-context-p 'heredoc pss)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1268 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1269 (goto-char (nth 8 pss)) ; Go to the beginning of heredoc.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1270 (let ((eol (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1271 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1272 (if (and (re-search-forward (ruby-here-doc-beg-match) eol t) ; If there is a heredoc that matches this line...
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1273 (not (ruby-in-ppss-context-p 'anything)) ; And that's not inside a heredoc/string/comment...
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1274 (progn (goto-char (match-end 0)) ; And it's the last heredoc on its line...
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1275 (not (re-search-forward ruby-here-doc-beg-re eol t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1276 (string-to-syntax "|")))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1277
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1278 (if (featurep 'xemacs)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1279 (put 'ruby-mode 'font-lock-defaults
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1280 '((ruby-font-lock-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1281 nil nil nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1282 beginning-of-line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1283 (font-lock-syntactic-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1284 . ruby-font-lock-syntactic-keywords))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1285
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1286 (defvar ruby-font-lock-syntax-table
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1287 (let ((tbl (copy-syntax-table ruby-mode-syntax-table)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1288 (modify-syntax-entry ?_ "w" tbl)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1289 tbl)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1290 "The syntax table to use for fontifying ruby-mode buffers.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1291 See `font-lock-syntax-table'.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1292
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1293 (defconst ruby-font-lock-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1294 (list
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1295 ;; functions
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1296 '("^\\s *def\\s +\\([^( \t\n]+\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1297 1 font-lock-function-name-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1298 ;; keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1299 (cons (concat
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1300 "\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(defined\\?\\|"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1301 (regexp-opt
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1302 '("alias_method"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1303 "alias"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1304 "and"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1305 "begin"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1306 "break"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1307 "case"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1308 "catch"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1309 "class"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1310 "def"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1311 "do"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1312 "elsif"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1313 "else"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1314 "fail"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1315 "ensure"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1316 "for"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1317 "end"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1318 "if"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1319 "in"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1320 "module_function"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1321 "module"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1322 "next"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1323 "not"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1324 "or"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1325 "public"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1326 "private"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1327 "protected"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1328 "raise"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1329 "redo"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1330 "rescue"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1331 "retry"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1332 "return"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1333 "then"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1334 "throw"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1335 "super"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1336 "unless"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1337 "undef"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1338 "until"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1339 "when"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1340 "while"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1341 "yield")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1342 t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1343 "\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1344 ruby-keyword-end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1345 2)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1346 ;; here-doc beginnings
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1347 (list ruby-here-doc-beg-re 0 'font-lock-string-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1348 ;; variables
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1349 '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\>"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1350 2 font-lock-variable-name-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1351 ;; variables
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1352 '("\\(\\$\\([^a-zA-Z0-9 \n]\\|[0-9]\\)\\)\\W"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1353 1 font-lock-variable-name-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1354 '("\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1355 0 font-lock-variable-name-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1356 ;; general delimited string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1357 '("\\(^\\|[[ \t\n<+(,=]\\)\\(%[xrqQwW]?\\([^<[{(a-zA-Z0-9 \n]\\)[^\n\\\\]*\\(\\\\.[^\n\\\\]*\\)*\\(\\3\\)\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1358 (2 font-lock-string-face))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1359 ;; constants
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1360 '("\\(^\\|[^_]\\)\\b\\([A-Z]+\\(\\w\\|_\\)*\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1361 2 font-lock-type-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1362 ;; symbols
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1363 '("\\(^\\|[^:]\\)\\(:\\([-+~]@?\\|[/%&|^`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|\\[\\]=?\\|\\(\\w\\|_\\)+\\([!?=]\\|\\b_*\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1364 2 font-lock-reference-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1365 ;; expression expansion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1366 '("#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1367 0 font-lock-variable-name-face t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1368 ;; warn lower camel case
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1369 ;'("\\<[a-z]+[a-z0-9]*[A-Z][A-Za-z0-9]*\\([!?]?\\|\\>\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1370 ; 0 font-lock-warning-face)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1371 )
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1372 "Additional expressions to highlight in ruby mode.")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1373
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1374 ;;;###autoload
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1375 (defun ruby-mode ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1376 "Major mode for editing Ruby scripts.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1377 \\[ruby-indent-line] properly indents subexpressions of multi-line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1378 class, module, def, if, while, for, do, and case statements, taking
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1379 nesting into account.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1380
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1381 The variable ruby-indent-level controls the amount of indentation.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1382 \\{ruby-mode-map}"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1383 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1384 (kill-all-local-variables)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1385 (use-local-map ruby-mode-map)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1386 (setq mode-name "Ruby")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1387 (setq major-mode 'ruby-mode)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1388 (ruby-mode-variables)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1389
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1390 (set (make-local-variable 'imenu-create-index-function)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1391 'ruby-imenu-create-index)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1392 (set (make-local-variable 'add-log-current-defun-function)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1393 'ruby-add-log-current-method)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1394
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1395 (add-hook
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1396 (cond ((boundp 'before-save-hook)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1397 (make-local-variable 'before-save-hook)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1398 'before-save-hook)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1399 ((boundp 'write-contents-functions) 'write-contents-functions)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1400 ((boundp 'write-contents-hooks) 'write-contents-hooks))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1401 'ruby-mode-set-encoding)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1402
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1403 (set (make-local-variable 'font-lock-defaults)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1404 '((ruby-font-lock-keywords) nil nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1405 (set (make-local-variable 'font-lock-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1406 ruby-font-lock-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1407 (set (make-local-variable 'font-lock-syntax-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1408 ruby-font-lock-syntax-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1409 (set (make-local-variable 'font-lock-syntactic-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1410 ruby-font-lock-syntactic-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1411
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1412 (if (fboundp 'run-mode-hooks)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1413 (run-mode-hooks 'ruby-mode-hook)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1414 (run-hooks 'ruby-mode-hook)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1415
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1416 ;;; Invoke ruby-mode when appropriate
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1417
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1418 ;;;###autoload
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1419 (add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1420
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1421 ;;;###autoload
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1422 (add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1423 (add-to-list 'interpreter-mode-alist '("rbx" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1424 (add-to-list 'interpreter-mode-alist '("jruby" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1425 (add-to-list 'interpreter-mode-alist '("ruby1.9" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1426 (add-to-list 'interpreter-mode-alist '("ruby1.8" . ruby-mode))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1427
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1428 (provide 'ruby-mode)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1429
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1430 ;;; ruby-mode.el ends here