annotate lisp/progmodes/ruby-mode.el @ 100354:89bba37a3188

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