annotate lisp/progmodes/ruby-mode.el @ 110308:74362068fc07

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