annotate lisp/progmodes/ruby-mode.el @ 112293:568ea4e08e90

* xterm.h (struct x_display_info): Remove stray semicolon. The extra semicolon didn't conform to the C standard. Problem reported by Sun cc.
author Paul Eggert <eggert@cs.ucla.edu>
date Sun, 16 Jan 2011 23:27:25 -0800
parents 61f7601898b1
children
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
112284
61f7601898b1 Refill some copyright headers.
Glenn Morris <rgm@gnu.org>
parents: 112228
diff changeset
3 ;; Copyright (C) 1994, 1995, 1996 1997, 1998, 1999, 2000, 2001, 2002,
61f7601898b1 Refill some copyright headers.
Glenn Morris <rgm@gnu.org>
parents: 112228
diff changeset
4 ;; 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
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
111205
e6399f46aefa * lisp/electric.el (electric-indent-chars): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 110305
diff changeset
138 (define-abbrev-table 'ruby-mode-abbrev-table ()
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 (defvar ruby-mode-map
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
142 (let ((map (make-sparse-keymap)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
143 (define-key map "{" 'ruby-electric-brace)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
144 (define-key map "}" 'ruby-electric-brace)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
145 (define-key map (kbd "M-C-a") 'ruby-beginning-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
146 (define-key map (kbd "M-C-e") 'ruby-end-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
147 (define-key map (kbd "M-C-b") 'ruby-backward-sexp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
148 (define-key map (kbd "M-C-f") 'ruby-forward-sexp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
149 (define-key map (kbd "M-C-p") 'ruby-beginning-of-block)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
150 (define-key map (kbd "M-C-n") 'ruby-end-of-block)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
151 (define-key map (kbd "M-C-h") 'ruby-mark-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
152 (define-key map (kbd "M-C-q") 'ruby-indent-exp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
153 (define-key map (kbd "C-M-h") 'backward-kill-word)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
154 (define-key map (kbd "C-j") 'reindent-then-newline-and-indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
155 (define-key map (kbd "C-m") 'newline)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
156 map)
100354
89bba37a3188 * progmodes/ruby-mode.el (ruby-mode-abbrev-table, ruby-mode-map)
Juanma Barranquero <lekktu@gmail.com>
parents: 100347
diff changeset
157 "Keymap used in Ruby mode.")
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
158
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
159 (defvar ruby-mode-syntax-table
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
160 (let ((table (make-syntax-table)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
161 (modify-syntax-entry ?\' "\"" table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
162 (modify-syntax-entry ?\" "\"" 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 ?\n ">" 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 ?$ "." 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 table)
100354
89bba37a3188 * progmodes/ruby-mode.el (ruby-mode-abbrev-table, ruby-mode-map)
Juanma Barranquero <lekktu@gmail.com>
parents: 100347
diff changeset
188 "Syntax table to use in Ruby mode.")
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
189
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
190 (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
191 "Indentation can insert tabs in Ruby mode if this is non-nil."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
192 :type 'boolean :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
193
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
194 (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
195 "Indentation of Ruby statements."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
196 :type 'integer :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
197
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
198 (defcustom ruby-comment-column 32
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
199 "Indentation column of comments."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
200 :type 'integer :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
201
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
202 (defcustom ruby-deep-arglist t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
203 "Deep indent lists in parenthesis when non-nil.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
204 Also ignores spaces after parenthesis when 'space."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
205 :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
206
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
207 (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
208 "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
209 The value t means continuous line.
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
210 Also ignores spaces after parenthesis when 'space."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
211 :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
212
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
213 (defcustom ruby-deep-indent-paren-style 'space
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
214 "Default deep indent style."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
215 :options '(t nil space) :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
216
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
217 (defcustom ruby-encoding-map '((shift_jis . cp932) (shift-jis . cp932))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
218 "Alist to map encoding name from Emacs to Ruby."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
219 :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
220
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
221 (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
222 "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
223 :type 'boolean :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
224
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
225 (defcustom ruby-use-encoding-map t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
226 "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
227 :type 'boolean :group 'ruby)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
228
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
229 ;; Safe file variables
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
230 (put 'ruby-indent-tabs-mode 'safe-local-variable 'booleanp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
231 (put 'ruby-indent-level 'safe-local-variable 'integerp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
232 (put 'ruby-comment-column 'safe-local-variable 'integerp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
233 (put 'ruby-deep-arglist 'safe-local-variable 'booleanp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
234
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
235 (defun ruby-imenu-create-index-in-block (prefix beg end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
236 "Create an imenu index of methods inside a block."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
237 (let ((index-alist '()) (case-fold-search nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
238 name next pos decl sing)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
239 (goto-char beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
240 (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
241 (setq sing (match-beginning 3))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
242 (setq decl (match-string 5))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
243 (setq next (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
244 (setq name (or (match-string 4) (match-string 6)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
245 (setq pos (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
246 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
247 ((string= "alias" decl)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
248 (if prefix (setq name (concat prefix name)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
249 (push (cons name pos) index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
250 ((string= "def" decl)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
251 (if prefix
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
252 (setq name
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
253 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
254 ((string-match "^self\." name)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
255 (concat (substring prefix 0 -1) (substring name 4)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
256 (t (concat prefix name)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
257 (push (cons name pos) index-alist)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
258 (ruby-accurate-end-of-block end))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
259 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
260 (if (string= "self" name)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
261 (if prefix (setq name (substring prefix 0 -1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
262 (if prefix (setq name (concat (substring prefix 0 -1) "::" name)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
263 (push (cons name pos) index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
264 (ruby-accurate-end-of-block end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
265 (setq beg (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
266 (setq index-alist
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
267 (nconc (ruby-imenu-create-index-in-block
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
268 (concat name (if sing "." "#"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
269 next beg) index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
270 (goto-char beg))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
271 index-alist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
272
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
273 (defun ruby-imenu-create-index ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
274 "Create an imenu index of all methods in the buffer."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
275 (nreverse (ruby-imenu-create-index-in-block nil (point-min) nil)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
276
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
277 (defun ruby-accurate-end-of-block (&optional end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
278 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
279 (let (state
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
280 (end (or end (point-max))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
281 (while (and (setq state (apply 'ruby-parse-partial end state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
282 (>= (nth 2 state) 0) (< (point) end)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
283
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
284 (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
285 "Set up initial buffer-local variables for Ruby mode."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
286 (set-syntax-table ruby-mode-syntax-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
287 (setq local-abbrev-table ruby-mode-abbrev-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
288 (setq indent-tabs-mode ruby-indent-tabs-mode)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
289 (set (make-local-variable 'indent-line-function) 'ruby-indent-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
290 (set (make-local-variable 'require-final-newline) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
291 (set (make-local-variable 'comment-start) "# ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
292 (set (make-local-variable 'comment-end) "")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
293 (set (make-local-variable 'comment-column) ruby-comment-column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
294 (set (make-local-variable 'comment-start-skip) "#+ *")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
295 (set (make-local-variable 'parse-sexp-ignore-comments) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
296 (set (make-local-variable 'parse-sexp-lookup-properties) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
297 (set (make-local-variable 'paragraph-start) (concat "$\\|" page-delimiter))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
298 (set (make-local-variable 'paragraph-separate) paragraph-start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
299 (set (make-local-variable 'paragraph-ignore-fill-prefix) t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
300
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
301 (defun ruby-mode-set-encoding ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
302 "Insert a magic comment header with the proper encoding if necessary."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
303 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
304 (widen)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
305 (goto-char (point-min))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
306 (when (re-search-forward "[^\0-\177]" nil t)
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 (let ((coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
309 (or coding-system-for-write
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
310 buffer-file-coding-system)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
311 (if coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
312 (setq coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
313 (or (coding-system-get coding-system 'mime-charset)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
314 (coding-system-change-eol-conversion coding-system nil))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
315 (setq coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
316 (if coding-system
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
317 (symbol-name
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
318 (or (and ruby-use-encoding-map
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
319 (cdr (assq coding-system ruby-encoding-map)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
320 coding-system))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
321 "ascii-8bit"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
322 (if (looking-at "^#![^\n]*ruby") (beginning-of-line 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
323 (cond ((looking-at "\\s *#.*-\*-\\s *\\(en\\)?coding\\s *:\\s *\\([-a-z0-9_]*\\)\\s *\\(;\\|-\*-\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
324 (unless (string= (match-string 2) coding-system)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
325 (goto-char (match-beginning 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
326 (delete-region (point) (match-end 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
327 (and (looking-at "-\*-")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
328 (let ((n (skip-chars-backward " ")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
329 (cond ((= n 0) (insert " ") (backward-char))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
330 ((= n -1) (insert " "))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
331 ((forward-char)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
332 (insert coding-system)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
333 ((looking-at "\\s *#.*coding\\s *[:=]"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
334 (t (when ruby-insert-encoding-magic-comment
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
335 (insert "# -*- coding: " coding-system " -*-\n"))))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
336
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
337 (defun ruby-current-indentation ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
338 "Return the indentation level of current line."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
339 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
340 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
341 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
342 (current-column)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
343
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
344 (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
345 "Correct the indentation of the current Ruby line."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
346 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
347 (ruby-indent-to (ruby-calculate-indent)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
348
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
349 (defun ruby-indent-to (column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
350 "Indent the current line to COLUMN."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
351 (when column
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
352 (let (shift top beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
353 (and (< column 0) (error "invalid nest"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
354 (setq shift (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
355 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
356 (setq beg (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
357 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
358 (setq top (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
359 (skip-chars-backward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
360 (if (>= shift top) (setq shift (- shift top))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
361 (setq shift 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
362 (if (and (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
363 (= column top))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
364 (move-to-column (+ column shift))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
365 (move-to-column top)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
366 (delete-region beg (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
367 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
368 (indent-to column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
369 (move-to-column (+ column shift))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
370
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
371 (defun ruby-special-char-p (&optional pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
372 "Return t if the character before POS is a special character.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
373 If omitted, POS defaults to the current point.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
374 Special characters are `?', `$', `:' when preceded by whitespace,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
375 and `\\' when preceded by `?'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
376 (setq pos (or pos (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
377 (let ((c (char-before pos)) (b (and (< (point-min) pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
378 (char-before (1- pos)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
379 (cond ((or (eq c ??) (eq c ?$)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
380 ((and (eq c ?:) (or (not b) (eq (char-syntax b) ? ))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
381 ((eq c ?\\) (eq b ??)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
382
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
383 (defun ruby-expr-beg (&optional option)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
384 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
385 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
386 (store-match-data nil)
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
387 (let ((space (skip-chars-backward " \t")))
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
388 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
389 ((bolp) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
390 ((progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
391 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
392 (and (looking-at "\\?")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
393 (or (eq (char-syntax (char-before (point))) ?w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
394 (ruby-special-char-p))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
395 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
396 ((and (eq option 'heredoc) (< space 0)) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
397 ((or (looking-at ruby-operator-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
398 (looking-at "[\\[({,;]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
399 (and (looking-at "[!?]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
400 (or (not (eq option 'modifier))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
401 (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
402 (save-excursion (forward-char -1) (looking-at "\\Sw$"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
403 (and (looking-at ruby-symbol-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
404 (skip-chars-backward ruby-symbol-chars)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
405 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
406 ((looking-at (regexp-opt
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
407 (append ruby-block-beg-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
408 ruby-block-op-keywords
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
409 ruby-block-mid-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
410 'words))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
411 (goto-char (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
412 (not (looking-at "\\s_")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
413 ((eq option 'expr-qstr)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
414 (looking-at "[a-zA-Z][a-zA-z0-9_]* +%[^ \t]"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
415 ((eq option 'expr-re)
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 (t nil)))))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
418
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
419 (defun ruby-forward-string (term &optional end no-error expand)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
420 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
421 (let ((n 1) (c (string-to-char term))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
422 (re (if expand
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
423 (concat "[^\\]\\(\\\\\\\\\\)*\\([" term "]\\|\\(#{\\)\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
424 (concat "[^\\]\\(\\\\\\\\\\)*[" term "]"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
425 (while (and (re-search-forward re end no-error)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
426 (if (match-beginning 3)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
427 (ruby-forward-string "}{" end no-error nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
428 (> (setq n (if (eq (char-before (point)) c)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
429 (1- n) (1+ n))) 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
430 (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
431 (cond ((zerop n))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
432 (no-error nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
433 ((error "unterminated string")))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
434
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
435 (defun ruby-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
436 "TODO: document."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
437 (cond ((listp ruby-deep-indent-paren)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
438 (let ((deep (assoc c ruby-deep-indent-paren)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
439 (cond (deep
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
440 (or (cdr deep) ruby-deep-indent-paren-style))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
441 ((memq c ruby-deep-indent-paren)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
442 ruby-deep-indent-paren-style))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
443 ((eq c ruby-deep-indent-paren) ruby-deep-indent-paren-style)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
444 ((eq c ?\( ) ruby-deep-arglist)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
445
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
446 (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
447 "TODO: document throughout function body."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
448 (or depth (setq depth 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
449 (or indent (setq indent 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
450 (when (re-search-forward ruby-delimiter end 'move)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
451 (let ((pnt (point)) w re expand)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
452 (goto-char (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
453 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
454 ((and (memq (char-before) '(?@ ?$)) (looking-at "\\sw"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
455 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
456 ((looking-at "[\"`]") ;skip string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
457 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
458 ((and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
459 (ruby-forward-string (buffer-substring (point) (1+ (point))) end t t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
460 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
461 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
462 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
463 (goto-char end))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
464 ((looking-at "'")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
465 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
466 ((and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
467 (re-search-forward "[^\\]\\(\\\\\\\\\\)*'" end t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
468 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
469 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
470 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
471 (goto-char end))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
472 ((looking-at "/=")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
473 (goto-char pnt))
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 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
476 ((and (not (eobp)) (ruby-expr-beg 'expr-re))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
477 (if (ruby-forward-string "/" end t t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
478 nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
479 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
480 (goto-char end)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
481 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
482 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
483 ((looking-at "%")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
484 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
485 ((and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
486 (ruby-expr-beg 'expr-qstr)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
487 (not (looking-at "%="))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
488 (looking-at "%[QqrxWw]?\\([^a-zA-Z0-9 \t\n]\\)"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
489 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
490 (setq expand (not (memq (char-before) '(?q ?w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
491 (setq w (match-string 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
492 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
493 ((string= w "[") (setq re "]["))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
494 ((string= w "{") (setq re "}{"))
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 ((and expand (string= w "\\"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
498 (setq w (concat "\\" w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
499 (unless (cond (re (ruby-forward-string re end t expand))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
500 (expand (ruby-forward-string w end t t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
501 (t (re-search-forward
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
502 (if (string= w "\\")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
503 "\\\\[^\\]*\\\\"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
504 (concat "[^\\]\\(\\\\\\\\\\)*" w))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
505 end t)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
506 (setq in-string (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
507 (goto-char end)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
508 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
509 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
510 ((looking-at "\\?") ;skip ?char
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
511 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
512 ((and (ruby-expr-beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
513 (looking-at "?\\(\\\\C-\\|\\\\M-\\)*\\\\?."))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
514 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
515 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
516 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
517 ((looking-at "\\$") ;skip $char
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 (forward-char 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
520 ((looking-at "#") ;skip comment
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
521 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
522 (goto-char (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
523 )
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
524 ((looking-at "[\\[{(]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
525 (let ((deep (ruby-deep-indent-paren-p (char-after))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
526 (if (and deep (or (not (eq (char-after) ?\{)) (ruby-expr-beg)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
527 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
528 (and (eq deep 'space) (looking-at ".\\s +[^# \t\n]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
529 (setq pnt (1- (match-end 0))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
530 (setq nest (cons (cons (char-after (point)) pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
531 (setq pcol (cons (cons pnt depth) pcol))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
532 (setq depth 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
533 (setq nest (cons (cons (char-after (point)) pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
534 (setq depth (1+ depth))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
535 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
536 )
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
537 ((looking-at "[])}]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
538 (if (ruby-deep-indent-paren-p (matching-paren (char-after)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
539 (setq depth (cdr (car pcol)) pcol (cdr pcol))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
540 (setq depth (1- depth)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
541 (setq nest (cdr nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
542 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
543 ((looking-at ruby-block-end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
544 (if (or (and (not (bolp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
545 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
546 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
547 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
548 (or (eq ?_ w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
549 (eq ?. w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
550 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
551 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
552 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
553 (or (eq ?_ w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
554 (eq ?! w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
555 (eq ?? w))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
556 nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
557 (setq nest (cdr nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
558 (setq depth (1- depth)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
559 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
560 ((looking-at "def\\s +[^(\n;]*")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
561 (if (or (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
562 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
563 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
564 (not (eq ?_ (char-after (point))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
565 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
566 (setq nest (cons (cons nil pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
567 (setq depth (1+ depth))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
568 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
569 ((looking-at (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
570 (and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
571 (save-match-data
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
572 (or (not (looking-at (concat "do" ruby-keyword-end-re)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
573 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
574 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
575 (not (looking-at ruby-non-block-do-re)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
576 (or (bolp)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
577 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
578 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
579 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
580 (not (or (eq ?_ w)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
581 (eq ?. w)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
582 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
583 (setq w (char-after (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
584 (not (eq ?_ w))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
585 (not (eq ?! w))
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 (skip-chars-forward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
588 (goto-char (match-beginning 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
589 (or (not (looking-at ruby-modifier-re))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
590 (ruby-expr-beg 'modifier))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
591 (goto-char pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
592 (setq nest (cons (cons nil pnt) nest))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
593 (setq depth (1+ depth)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
594 (goto-char pnt))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
595 ((looking-at ":\\(['\"]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
596 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
597 (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
598 ((looking-at ":\\([-,.+*/%&|^~<>]=?\\|===?\\|<=>\\|![~=]?\\)")
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
599 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
600 ((looking-at ":\\([a-zA-Z_][a-zA-Z_0-9]*[!?=]?\\)?")
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 ((or (looking-at "\\.\\.\\.?")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
603 (looking-at "\\.[0-9]+")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
604 (looking-at "\\.[a-zA-Z_0-9]+")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
605 (looking-at "\\."))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
606 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
607 ((looking-at "^=begin")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
608 (if (re-search-forward "^=end" end t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
609 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
610 (setq in-string (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
611 (goto-char end)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
612 ((looking-at "<<")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
613 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
614 ((and (ruby-expr-beg 'heredoc)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
615 (looking-at "<<\\(-\\)?\\(\\([\"'`]\\)\\([^\n]+?\\)\\3\\|\\(?:\\sw\\|\\s_\\)+\\)"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
616 (setq re (regexp-quote (or (match-string 4) (match-string 2))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
617 (if (match-beginning 1) (setq re (concat "\\s *" re)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
618 (let* ((id-end (goto-char (match-end 0)))
111433
05dc9dca8729 Replace end-of-line, save-excursion etc with point-at-eol, point-at-bol.
Glenn Morris <rgm@gnu.org>
parents: 111298
diff changeset
619 (line-end-position (point-at-eol))
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
620 (state (list in-string nest depth pcol indent)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
621 ;; parse the rest of the line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
622 (while (and (> line-end-position (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
623 (setq state (apply 'ruby-parse-partial
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
624 line-end-position state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
625 (setq in-string (car state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
626 nest (nth 1 state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
627 depth (nth 2 state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
628 pcol (nth 3 state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
629 indent (nth 4 state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
630 ;; skip heredoc section
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
631 (if (re-search-forward (concat "^" re "$") end 'move)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
632 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
633 (setq in-string id-end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
634 (goto-char end))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
635 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
636 (goto-char pnt))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
637 ((looking-at "^__END__$")
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 ((and (looking-at ruby-here-doc-beg-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
640 (boundp 'ruby-indent-point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
641 (if (re-search-forward (ruby-here-doc-end-match)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
642 ruby-indent-point t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
643 (forward-line 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
644 (setq in-string (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
645 (goto-char ruby-indent-point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
646 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
647 (error (format "bad string %s"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
648 (buffer-substring (point) pnt)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
649 ))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
650 (list in-string nest depth pcol))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
651
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
652 (defun ruby-parse-region (start end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
653 "TODO: document."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
654 (let (state)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
655 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
656 (if start
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
657 (goto-char start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
658 (ruby-beginning-of-indent))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
659 (save-restriction
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
660 (narrow-to-region (point) end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
661 (while (and (> end (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
662 (setq state (apply 'ruby-parse-partial end state))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
663 (list (nth 0 state) ; in-string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
664 (car (nth 1 state)) ; nest
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
665 (nth 2 state) ; depth
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
666 (car (car (nth 3 state))) ; pcol
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
667 ;(car (nth 5 state)) ; indent
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
668 )))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
669
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
670 (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
671 "Return the indentation level in spaces NEST levels deeper than POS."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
672 (+ pos (* (or nest 1) ruby-indent-level)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
673
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
674 (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
675 "Return the proper indentation level of the current line."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
676 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
677 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
678 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
679 (let ((ruby-indent-point (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
680 (case-fold-search nil)
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
681 state eol begin op-end
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
682 (paren (progn (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
683 (and (char-after) (matching-paren (char-after)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
684 (indent 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
685 (if parse-start
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
686 (goto-char parse-start)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
687 (ruby-beginning-of-indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
688 (setq parse-start (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
689 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
690 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
691 (setq state (ruby-parse-region parse-start ruby-indent-point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
692 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
693 ((nth 0 state) ; within string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
694 (setq indent nil)) ; do nothing
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
695 ((car (nth 1 state)) ; in paren
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
696 (goto-char (setq begin (cdr (nth 1 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
697 (let ((deep (ruby-deep-indent-paren-p (car (nth 1 state)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
698 (if deep
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
699 (cond ((and (eq deep t) (eq (car (nth 1 state)) paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
700 (skip-syntax-backward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
701 (setq indent (1- (current-column))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
702 ((let ((s (ruby-parse-region (point) ruby-indent-point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
703 (and (nth 2 s) (> (nth 2 s) 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
704 (or (goto-char (cdr (nth 1 s))) t)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
705 (forward-word -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
706 (setq indent (ruby-indent-size (current-column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
707 (nth 2 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
708 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
709 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
710 (cond ((eq deep 'space))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
711 (paren (setq indent (1- indent)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
712 (t (setq indent (ruby-indent-size (1- indent) 1))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
713 (if (nth 3 state) (goto-char (nth 3 state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
714 (goto-char parse-start) (back-to-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
715 (setq indent (ruby-indent-size (current-column) (nth 2 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
716 (and (eq (car (nth 1 state)) paren)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
717 (ruby-deep-indent-paren-p (matching-paren paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
718 (search-backward (char-to-string paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
719 (setq indent (current-column)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
720 ((and (nth 2 state) (> (nth 2 state) 0)) ; in nest
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
721 (if (null (cdr (nth 1 state)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
722 (error "invalid nest"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
723 (goto-char (cdr (nth 1 state)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
724 (forward-word -1) ; skip back a keyword
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
725 (setq begin (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
726 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
727 ((looking-at "do\\>[^_]") ; iter block is a special case
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
728 (if (nth 3 state) (goto-char (nth 3 state))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
729 (goto-char parse-start) (back-to-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
730 (setq indent (ruby-indent-size (current-column) (nth 2 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
731 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
732 (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
733
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
734 ((and (nth 2 state) (< (nth 2 state) 0)) ; in negative nest
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
735 (setq indent (ruby-indent-size (current-column) (nth 2 state)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
736 (when indent
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
737 (goto-char ruby-indent-point)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
738 (end-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
739 (setq eol (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
740 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
741 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
742 ((and (not (ruby-deep-indent-paren-p paren))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
743 (re-search-forward ruby-negative eol t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
744 (and (not (eq ?_ (char-after (match-end 0))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
745 (setq indent (- indent ruby-indent-level))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
746 ((and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
747 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
748 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
749 (not (bobp)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
750 (or (ruby-deep-indent-paren-p t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
751 (null (car (nth 1 state)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
752 ;; goto beginning of non-empty no-comment line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
753 (let (end done)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
754 (while (not done)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
755 (skip-chars-backward " \t\n")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
756 (setq end (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
757 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
758 (if (re-search-forward "^\\s *#" end t)
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 (setq done t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
761 (end-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
762 ;; skip the comment at the end
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
763 (skip-chars-backward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
764 (let (end (pos (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
765 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
766 (while (and (re-search-forward "#" pos t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
767 (setq end (1- (point)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
768 (or (ruby-special-char-p end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
769 (and (setq state (ruby-parse-region parse-start end))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
770 (nth 0 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
771 (setq end nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
772 (goto-char (or end pos))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
773 (skip-chars-backward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
774 (setq begin (if (and end (nth 0 state)) pos (cdr (nth 1 state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
775 (setq state (ruby-parse-region parse-start (point))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
776 (or (bobp) (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
777 (and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
778 (or (and (looking-at ruby-symbol-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
779 (skip-chars-backward ruby-symbol-chars)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
780 (looking-at (concat "\\<\\(" ruby-block-hanging-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
781 (not (eq (point) (nth 3 state)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
782 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
783 (goto-char (match-end 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
784 (not (looking-at "[a-z_]"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
785 (and (looking-at ruby-operator-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
786 (not (ruby-special-char-p))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
787 ;; operator at the end of line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
788 (let ((c (char-after (point))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
789 (and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
790 ;; (or (null begin)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
791 ;; (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
792 ;; (goto-char begin)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
793 ;; (skip-chars-forward " \t")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
794 ;; (not (or (eolp) (looking-at "#")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
795 ;; (and (eq (car (nth 1 state)) ?{)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
796 ;; (looking-at "|"))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
797 (or (not (eq ?/ c))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
798 (null (nth 0 (ruby-parse-region (or begin parse-start) (point)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
799 (or (not (eq ?| (char-after (point))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
800 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
801 (or (eolp) (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
802 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
803 ((search-backward "|" nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
804 (skip-chars-backward " \t\n")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
805 (and (not (eolp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
806 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
807 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
808 (not (looking-at "{")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
809 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
810 (forward-word -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
811 (not (looking-at "do\\>[^_]")))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
812 (t t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
813 (not (eq ?, c))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
814 (setq op-end t)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
815 (setq indent
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
816 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
817 ((and
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
818 (null op-end)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
819 (not (looking-at (concat "\\<\\(" ruby-block-hanging-re "\\)\\>")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
820 (eq (ruby-deep-indent-paren-p t) 'space)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
821 (not (bobp)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
822 (widen)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
823 (goto-char (or begin parse-start))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
824 (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
825 (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
826 ((car (nth 1 state)) indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
827 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
828 (+ indent ruby-indent-level))))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
829 (goto-char ruby-indent-point)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
830 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
831 (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
832 (if (looking-at "\\.[^.]")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
833 (+ indent ruby-indent-level)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
834 indent))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
835
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
836 (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
837 "Insert a brace and re-indent the current line."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
838 (interactive "P")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
839 (self-insert-command (prefix-numeric-value arg))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
840 (ruby-indent-line t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
841
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
842 ;; 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
843 (defun ruby-beginning-of-defun (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
844 "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
845 With ARG, move backward multiple defuns. Negative ARG means
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
846 move forward."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
847 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
848 (and (re-search-backward (concat "^\\(" ruby-block-beg-re "\\)\\b")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
849 nil 'move (or arg 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
850 (beginning-of-line)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
851
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
852 (defun ruby-end-of-defun (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
853 "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
854 With ARG, move forward multiple defuns. Negative ARG means
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
855 move backward."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
856 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
857 (and (re-search-forward (concat "^\\(" ruby-block-end-re "\\)\\($\\|\\b[^_]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
858 nil 'move (or arg 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
859 (beginning-of-line))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
860 (forward-line 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
861
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
862 (defun ruby-beginning-of-indent ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
863 "TODO: document"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
864 ;; I don't understand this function.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
865 ;; It seems like it should move to the line where indentation should deepen,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
866 ;; 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
867 ;; 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
868 (and (re-search-backward (concat "^\\(" ruby-indent-beg-re "\\)\\b") nil 'move)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
869 (beginning-of-line)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
870
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
871 (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
872 "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
873 or blocks containing the current block."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
874 ;; TODO: Make this work for n > 1,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
875 ;; make it not loop for n = 0,
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
876 ;; document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
877 (let (start pos done down)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
878 (setq start (ruby-calculate-indent))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
879 (setq down (looking-at (if (< n 0) ruby-block-end-re
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
880 (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
881 (while (and (not done) (not (if (< n 0) (bobp) (eobp))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
882 (forward-line n)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
883 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
884 ((looking-at "^\\s *$"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
885 ((looking-at "^\\s *#"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
886 ((and (> n 0) (looking-at "^=begin\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
887 (re-search-forward "^=end\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
888 ((and (< n 0) (looking-at "^=end\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
889 (re-search-backward "^=begin\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
890 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
891 (setq pos (current-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
892 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
893 ((< start pos)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
894 (setq down t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
895 ((and down (= pos start))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
896 (setq done t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
897 ((> start pos)
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 (if done
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
900 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
901 (back-to-indentation)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
902 (if (looking-at (concat "\\<\\(" ruby-block-mid-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
903 (setq done nil))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
904 (back-to-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
905
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
906 (defun ruby-beginning-of-block (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
907 "Move backward to the beginning of the current block.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
908 With ARG, move up multiple blocks."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
909 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
910 (ruby-move-to-block (- (or arg 1))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
911
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
912 (defun ruby-end-of-block (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
913 "Move forward to the end of the current block.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
914 With ARG, move out of multiple blocks."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
915 ;; Passing a value > 1 to ruby-move-to-block currently doesn't work.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
916 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
917 (ruby-move-to-block (or arg 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
918
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
919 (defun ruby-forward-sexp (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
920 "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
921 With ARG, do it many times. Negative ARG means move backward."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
922 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
923 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
924 (if (and (numberp arg) (< arg 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
925 (ruby-backward-sexp (- arg))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
926 (let ((i (or arg 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
927 (condition-case nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
928 (while (> i 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
929 (skip-syntax-forward " ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
930 (cond ((looking-at "\\?\\(\\\\[CM]-\\)*\\\\?\\S ")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
931 (goto-char (match-end 0)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
932 ((progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
933 (skip-chars-forward ",.:;|&^~=!?\\+\\-\\*")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
934 (looking-at "\\s("))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
935 (goto-char (scan-sexps (point) 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
936 ((and (looking-at (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
937 (not (eq (char-before (point)) ?.))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
938 (not (eq (char-before (point)) ?:)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
939 (ruby-end-of-block)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
940 (forward-word 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
941 ((looking-at "\\(\\$\\|@@?\\)?\\sw")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
942 (while (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
943 (while (progn (forward-word 1) (looking-at "_")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
944 (cond ((looking-at "::") (forward-char 2) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
945 ((> (skip-chars-forward ".") 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
946 ((looking-at "\\?\\|!\\(=[~=>]\\|[^~=]\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
947 (forward-char 1) nil)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
948 ((let (state expr)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
949 (while
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
950 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
951 (setq expr (or expr (ruby-expr-beg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
952 (looking-at "%\\sw?\\Sw\\|[\"'`/]")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
953 (nth 1 (setq state (apply 'ruby-parse-partial nil state))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
954 (setq expr t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
955 (skip-chars-forward "<"))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
956 (not expr))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
957 (setq i (1- i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
958 ((error) (forward-word 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
959 i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
960
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
961 (defun ruby-backward-sexp (&optional arg)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
962 "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
963 With ARG, do it many times. Negative ARG means move forward."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
964 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
965 (interactive "p")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
966 (if (and (numberp arg) (< arg 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
967 (ruby-forward-sexp (- arg))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
968 (let ((i (or arg 1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
969 (condition-case nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
970 (while (> i 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
971 (skip-chars-backward " \t\n,.:;|&^~=!?\\+\\-\\*")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
972 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
973 (cond ((looking-at "\\s)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
974 (goto-char (scan-sexps (1+ (point)) -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
975 (case (char-before)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
976 (?% (forward-char -1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
977 ('(?q ?Q ?w ?W ?r ?x)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
978 (if (eq (char-before (1- (point))) ?%) (forward-char -2))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
979 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
980 ((looking-at "\\s\"\\|\\\\\\S_")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
981 (let ((c (char-to-string (char-before (match-end 0)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
982 (while (and (search-backward c)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
983 (eq (logand (skip-chars-backward "\\") 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
984 1))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
985 nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
986 ((looking-at "\\s.\\|\\s\\")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
987 (if (ruby-special-char-p) (forward-char -1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
988 ((looking-at "\\s(") nil)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
989 (t
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
990 (forward-char 1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
991 (while (progn (forward-word -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
992 (case (char-before)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
993 (?_ t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
994 (?. (forward-char -1) t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
995 ((?$ ?@)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
996 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
997 (and (eq (char-before) (char-after)) (forward-char -1)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
998 (?:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
999 (forward-char -1)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1000 (eq (char-before) :)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1001 (if (looking-at ruby-block-end-re)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1002 (ruby-beginning-of-block))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1003 nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1004 (setq i (1- i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1005 ((error)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1006 i)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1007
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1008 (defun ruby-mark-defun ()
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1009 "Put mark at end of this Ruby function, point at beginning."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1010 (interactive)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1011 (push-mark (point))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1012 (ruby-end-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1013 (push-mark (point) nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1014 (ruby-beginning-of-defun)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1015 (re-search-backward "^\n" (- (point) 1) t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1016
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1017 (defun ruby-indent-exp (&optional ignored)
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1018 "Indent each line in the balanced expression following the point."
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1019 (interactive "*P")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1020 (let ((here (point-marker)) start top column (nest t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1021 (set-marker-insertion-type here t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1022 (unwind-protect
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1023 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1024 (beginning-of-line)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1025 (setq start (point) top (current-indentation))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1026 (while (and (not (eobp))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1027 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1028 (setq column (ruby-calculate-indent start))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1029 (cond ((> column top)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1030 (setq nest t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1031 ((and (= column top) nest)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1032 (setq nest nil) t))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1033 (ruby-indent-to column)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1034 (beginning-of-line 2)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1035 (goto-char here)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1036 (set-marker here nil))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1037
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1038 (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
1039 "Return the current method name as a string.
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1040 This string includes all namespaces.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1041
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1042 For example:
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1043
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1044 #exit
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1045 String#gsub
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1046 Net::HTTP#active?
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1047 File::open.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1048
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1049 See `add-log-current-defun-function'."
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1050 ;; TODO: Document body
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1051 ;; Why does this append a period to class methods?
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1052 (condition-case nil
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1053 (save-excursion
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1054 (let (mname mlist (indent 0))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1055 ;; get current method (or class/module)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1056 (if (re-search-backward
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1057 (concat "^[ \t]*\\(def\\|class\\|module\\)[ \t]+"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1058 "\\("
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1059 ;; \\. and :: for class method
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1060 "\\([A-Za-z_]" ruby-symbol-re "*\\|\\.\\|::" "\\)"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1061 "+\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1062 nil t)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1063 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1064 (setq mname (match-string 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1065 (unless (string-equal "def" (match-string 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1066 (setq mlist (list mname) mname nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1067 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1068 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1069 (beginning-of-line)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1070 ;; nest class/module
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1071 (while (and (> indent 0)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1072 (re-search-backward
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1073 (concat
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1074 "^[ \t]*\\(class\\|module\\)[ \t]+"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1075 "\\([A-Z]" ruby-symbol-re "*\\)")
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1076 nil t))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1077 (goto-char (match-beginning 1))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1078 (if (< (current-column) indent)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1079 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1080 (setq mlist (cons (match-string 2) mlist))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1081 (setq indent (current-column))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1082 (beginning-of-line))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1083 (when mname
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1084 (let ((mn (split-string mname "\\.\\|::")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1085 (if (cdr mn)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1086 (progn
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1087 (cond
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1088 ((string-equal "" (car mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1089 (setq mn (cdr mn) mlist nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1090 ((string-equal "self" (car mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1091 (setq mn (cdr mn)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1092 ((let ((ml (nreverse mlist)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1093 (while ml
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1094 (if (string-equal (car ml) (car mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1095 (setq mlist (nreverse (cdr ml)) ml nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1096 (or (setq ml (cdr ml)) (nreverse mlist))))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1097 (if mlist
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1098 (setcdr (last mlist) mn)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1099 (setq mlist mn))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1100 (setq mn (last mn 2))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1101 (setq mname (concat "." (cadr mn)))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1102 (setcdr mn nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1103 (setq mname (concat "#" mname)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1104 ;; generate string
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1105 (if (consp mlist)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1106 (setq mlist (mapconcat (function identity) mlist "::")))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1107 (if mname
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1108 (if mlist (concat mlist mname) mname)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1109 mlist)))))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1110
111298
cb908fcc9f00 * lisp/progmodes/ruby-mode.el (ruby-syntax-propertize-heredoc): Declare.
Glenn Morris <rgm@gnu.org>
parents: 111205
diff changeset
1111 (declare-function ruby-syntax-propertize-heredoc "ruby-mode" (limit))
cb908fcc9f00 * lisp/progmodes/ruby-mode.el (ruby-syntax-propertize-heredoc): Declare.
Glenn Morris <rgm@gnu.org>
parents: 111205
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 )
111298
cb908fcc9f00 * lisp/progmodes/ruby-mode.el (ruby-syntax-propertize-heredoc): Declare.
Glenn Morris <rgm@gnu.org>
parents: 111205
diff changeset
1167
110305
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
111433
05dc9dca8729 Replace end-of-line, save-excursion etc with point-at-eol, point-at-bol.
Glenn Morris <rgm@gnu.org>
parents: 111298
diff changeset
1259 (let ((eol (point-at-eol))
110305
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
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1433 ;;;###autoload
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1434 (define-derived-mode ruby-mode prog-mode "Ruby"
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1435 "Major mode for editing Ruby scripts.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1436 \\[ruby-indent-line] properly indents subexpressions of multi-line
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1437 class, module, def, if, while, for, do, and case statements, taking
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1438 nesting into account.
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1439
100354
89bba37a3188 * progmodes/ruby-mode.el (ruby-mode-abbrev-table, ruby-mode-map)
Juanma Barranquero <lekktu@gmail.com>
parents: 100347
diff changeset
1440 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
1441
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1442 \\{ruby-mode-map}"
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1443 (ruby-mode-variables)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1444
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1445 (set (make-local-variable 'imenu-create-index-function)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1446 'ruby-imenu-create-index)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1447 (set (make-local-variable 'add-log-current-defun-function)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1448 'ruby-add-log-current-method)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1449
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1450 (add-hook
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1451 (cond ((boundp 'before-save-hook) 'before-save-hook)
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1452 ((boundp 'write-contents-functions) 'write-contents-functions)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1453 ((boundp 'write-contents-hooks) 'write-contents-hooks))
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1454 'ruby-mode-set-encoding nil 'local)
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1455
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1456 (set (make-local-variable 'electric-indent-chars)
111205
e6399f46aefa * lisp/electric.el (electric-indent-chars): Autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 110305
diff changeset
1457 (append '(?\{ ?\}) electric-indent-chars))
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1458
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1459 (set (make-local-variable 'font-lock-defaults)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1460 '((ruby-font-lock-keywords) nil nil))
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1461 (set (make-local-variable 'font-lock-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1462 ruby-font-lock-keywords)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1463 (set (make-local-variable 'font-lock-syntax-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1464 ruby-font-lock-syntax-table)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1465
110305
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1466 (if (eval-when-compile (fboundp 'syntax-propertize-rules))
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1467 (set (make-local-variable 'syntax-propertize-function)
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1468 #'ruby-syntax-propertize-function)
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1469 (set (make-local-variable 'font-lock-syntactic-keywords)
b10051866f51 New syntax-propertize functionality.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 109967
diff changeset
1470 ruby-font-lock-syntactic-keywords)))
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1471
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1472 ;;; Invoke ruby-mode when appropriate
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1473
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1474 ;;;###autoload
105765
db5e4a5897ec * textmodes/tex-mode.el (tex-dvi-view-command)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 103462
diff changeset
1475 (add-to-list 'auto-mode-alist (cons (purecopy "\\.rb\\'") 'ruby-mode))
100329
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
101295
b7a4fb563960 Autoload other interpreter names.
Chong Yidong <cyd@stupidchicken.com>
parents: 101087
diff changeset
1478 (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
1479 (add-to-list 'interpreter-mode-alist (cons (purecopy name) 'ruby-mode)))
100329
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1480
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1481 (provide 'ruby-mode)
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1482
267bf24aac5e New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1483 ;;; ruby-mode.el ends here