ruby_learner 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/docs/thesis/competing_services.org +21 -0
  4. data/docs/thesis/manual.org +55 -0
  5. data/docs/thesis/mid_term.pptx +0 -0
  6. data/lib/ruby_learner/common.rb +45 -0
  7. data/lib/ruby_learner/ruby_learner.rb +9 -17
  8. data/lib/ruby_learner/sequential_main.rb +146 -0
  9. data/lib/ruby_learner/typing_practice.rb +82 -10
  10. data/lib/ruby_learner/version.rb +1 -1
  11. data/workshop/emacs.d/init.el +1 -76
  12. data/workshop/emacs.d/ruby_learner_init.el +0 -76
  13. metadata +7 -83
  14. data/lib/ruby_learner/methods.rb +0 -290
  15. data/workshop/emacs.d/#init# +0 -1
  16. data/workshop/emacs.d/ac-comphist.dat +0 -50
  17. data/workshop/emacs.d/cp5022x.el +0 -156
  18. data/workshop/emacs.d/elpa/archives/gnu/archive-contents +0 -1240
  19. data/workshop/emacs.d/elpa/archives/melpa/archive-contents +0 -2
  20. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-autoloads.el +0 -65
  21. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-config.el +0 -551
  22. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-config.elc +0 -0
  23. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-pkg.el +0 -6
  24. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete.el +0 -2164
  25. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete.elc +0 -0
  26. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ada-mode +0 -72
  27. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/c++-mode +0 -99
  28. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/c-mode +0 -55
  29. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/caml-mode +0 -231
  30. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/clojure-mode +0 -580
  31. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/clojurescript-mode +0 -475
  32. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/coq-mode +0 -278
  33. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/css-mode +0 -874
  34. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/erlang-mode +0 -216
  35. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ess-julia-mode +0 -37
  36. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/go-mode +0 -25
  37. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/haskell-mode +0 -679
  38. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/java-mode +0 -53
  39. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/js-mode +0 -148
  40. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/julia-mode +0 -37
  41. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/lua-mode +0 -21
  42. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/nim-mode +0 -70
  43. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/objc-mode +0 -161
  44. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/octave-mode +0 -46
  45. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/php-mode +0 -6144
  46. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/python-mode +0 -379
  47. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/qml-mode +0 -183
  48. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ruby-mode +0 -181
  49. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/scala-mode +0 -1347
  50. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/scheme-mode +0 -216
  51. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/sclang-mode +0 -1481
  52. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/sh-mode +0 -182
  53. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/swift-mode +0 -87
  54. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/tcl-mode +0 -172
  55. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ts-mode +0 -797
  56. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/tuareg-mode +0 -231
  57. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/verilog-mode +0 -313
  58. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults-autoloads.el +0 -16
  59. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults-pkg.el +0 -2
  60. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults.el +0 -90
  61. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults.elc +0 -0
  62. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode-autoloads.el +0 -26
  63. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode-pkg.el +0 -2
  64. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode.el +0 -877
  65. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode.elc +0 -0
  66. data/workshop/emacs.d/elpa/haml-mode-readme.txt +0 -8
  67. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-light-theme.el +0 -918
  68. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-light-theme.elc +0 -0
  69. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme-autoloads.el +0 -32
  70. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme-pkg.el +0 -8
  71. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme.el +0 -912
  72. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme.elc +0 -0
  73. data/workshop/emacs.d/elpa/ox-bibtex-chinese-readme.txt +0 -21
  74. data/workshop/emacs.d/elpa/popup-20160709.729/popup-autoloads.el +0 -15
  75. data/workshop/emacs.d/elpa/popup-20160709.729/popup-pkg.el +0 -2
  76. data/workshop/emacs.d/elpa/popup-20160709.729/popup.el +0 -1432
  77. data/workshop/emacs.d/elpa/popup-20160709.729/popup.elc +0 -0
  78. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode-autoloads.el +0 -33
  79. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode-pkg.el +0 -2
  80. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode.el +0 -470
  81. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode.elc +0 -0
  82. data/workshop/emacs.d/elpa/yaml-mode-readme.txt +0 -25
  83. data/workshop/emacs.d/haml-mode-master/.gitignore +0 -1
  84. data/workshop/emacs.d/haml-mode-master/.mailmap +0 -2
  85. data/workshop/emacs.d/haml-mode-master/MIT-LICENSE +0 -20
  86. data/workshop/emacs.d/haml-mode-master/README.md +0 -47
  87. data/workshop/emacs.d/haml-mode-master/haml-mode.el +0 -887
  88. data/workshop/emacs.d/iceberg_theme.el +0 -202
  89. data/workshop/emacs.d/init-open-recentf.el +0 -133
  90. data/workshop/emacs.d/install-elisp.el +0 -366
  91. data/workshop/emacs.d/notes +0 -12
  92. data/workshop/emacs.d/processing-mode/processing-mode.el +0 -275
  93. data/workshop/emacs.d/recentf +0 -31
  94. data/workshop/emacs.d/wiki-mode/wiki.el +0 -976
@@ -1,16 +0,0 @@
1
- ;;; better-defaults-autoloads.el --- automatically extracted autoloads
2
- ;;
3
- ;;; Code:
4
- (add-to-list 'load-path (directory-file-name (or (file-name-directory #$) (car load-path))))
5
-
6
- ;;;### (autoloads nil nil ("better-defaults.el") (23335 35529 359202
7
- ;;;;;; 945000))
8
-
9
- ;;;***
10
-
11
- ;; Local Variables:
12
- ;; version-control: never
13
- ;; no-byte-compile: t
14
- ;; no-update-autoloads: t
15
- ;; End:
16
- ;;; better-defaults-autoloads.el ends here
@@ -1,2 +0,0 @@
1
- ;;; -*- no-byte-compile: t -*-
2
- (define-package "better-defaults" "20170613.2104" "Fixing weird quirks and poor defaults" 'nil :commit "12d9e6dbf24a8a3369b19650d74471b17b27f78d" :url "https://github.com/technomancy/better-defaults" :keywords '("convenience"))
@@ -1,90 +0,0 @@
1
- ;;; better-defaults.el --- Fixing weird quirks and poor defaults
2
-
3
- ;; Copyright © 2013-2016 Phil Hagelberg and contributors
4
-
5
- ;; Author: Phil Hagelberg
6
- ;; URL: https://github.com/technomancy/better-defaults
7
- ;; Package-Version: 20170613.2104
8
- ;; Version: 0.1.3
9
- ;; Created: 2013-04-16
10
- ;; Keywords: convenience
11
-
12
- ;; This file is NOT part of GNU Emacs.
13
-
14
- ;;; Commentary:
15
-
16
- ;; There are a number of unfortunate facts about the way Emacs works
17
- ;; out of the box. While all users will eventually need to learn their
18
- ;; way around in order to customize it to their particular tastes,
19
- ;; this package attempts to address the most obvious of deficiencies
20
- ;; in uncontroversial ways that nearly everyone can agree upon.
21
-
22
- ;; Obviously there are many further tweaks you could do to improve
23
- ;; Emacs, (like those the Starter Kit and similar packages) but this
24
- ;; package focuses only on those that have near-universal appeal.
25
-
26
- ;;; License:
27
-
28
- ;; This program is free software; you can redistribute it and/or modify
29
- ;; it under the terms of the GNU General Public License as published by
30
- ;; the Free Software Foundation; either version 3, or (at your option)
31
- ;; any later version.
32
- ;;
33
- ;; This program is distributed in the hope that it will be useful,
34
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
35
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36
- ;; GNU General Public License for more details.
37
- ;;
38
- ;; You should have received a copy of the GNU General Public License
39
- ;; along with GNU Emacs; see the file COPYING. If not, write to the
40
- ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
41
- ;; Boston, MA 02110-1301, USA.
42
-
43
- ;;; Code:
44
-
45
- (progn
46
- (unless (fboundp 'helm-mode)
47
- (ido-mode t)
48
- (setq ido-enable-flex-matching t))
49
-
50
- (menu-bar-mode -1)
51
- (when (fboundp 'tool-bar-mode)
52
- (tool-bar-mode -1))
53
- (when (fboundp 'scroll-bar-mode)
54
- (scroll-bar-mode -1))
55
- (when (fboundp 'horizontal-scroll-bar-mode)
56
- (horizontal-scroll-bar-mode -1))
57
-
58
- (autoload 'zap-up-to-char "misc"
59
- "Kill up to, but not including ARGth occurrence of CHAR." t)
60
-
61
- (require 'uniquify)
62
- (setq uniquify-buffer-name-style 'forward)
63
-
64
- (require 'saveplace)
65
- (setq-default save-place t)
66
-
67
- (global-set-key (kbd "M-/") 'hippie-expand)
68
- (global-set-key (kbd "C-x C-b") 'ibuffer)
69
- (global-set-key (kbd "M-z") 'zap-up-to-char)
70
-
71
- (global-set-key (kbd "C-s") 'isearch-forward-regexp)
72
- (global-set-key (kbd "C-r") 'isearch-backward-regexp)
73
- (global-set-key (kbd "C-M-s") 'isearch-forward)
74
- (global-set-key (kbd "C-M-r") 'isearch-backward)
75
-
76
- (show-paren-mode 1)
77
- (setq-default indent-tabs-mode nil)
78
- (setq save-interprogram-paste-before-kill t
79
- apropos-do-all t
80
- mouse-yank-at-point t
81
- require-final-newline t
82
- visible-bell t
83
- load-prefer-newer t
84
- ediff-window-setup-function 'ediff-setup-windows-plain
85
- save-place-file (concat user-emacs-directory "places")
86
- backup-directory-alist `(("." . ,(concat user-emacs-directory
87
- "backups")))))
88
-
89
- (provide 'better-defaults)
90
- ;;; better-defaults.el ends here
@@ -1,26 +0,0 @@
1
- ;;; haml-mode-autoloads.el --- automatically extracted autoloads
2
- ;;
3
- ;;; Code:
4
- (add-to-list 'load-path (directory-file-name (or (file-name-directory #$) (car load-path))))
5
-
6
- ;;;### (autoloads nil "haml-mode" "haml-mode.el" (23227 13867 412282
7
- ;;;;;; 441000))
8
- ;;; Generated autoloads from haml-mode.el
9
-
10
- (autoload 'haml-mode "haml-mode" "\
11
- Major mode for editing Haml files.
12
-
13
- \\{haml-mode-map}
14
-
15
- \(fn)" t nil)
16
-
17
- (add-to-list 'auto-mode-alist '("\\.haml\\'" . haml-mode))
18
-
19
- ;;;***
20
-
21
- ;; Local Variables:
22
- ;; version-control: never
23
- ;; no-byte-compile: t
24
- ;; no-update-autoloads: t
25
- ;; End:
26
- ;;; haml-mode-autoloads.el ends here
@@ -1,2 +0,0 @@
1
- ;;; -*- no-byte-compile: t -*-
2
- (define-package "haml-mode" "20170923.2153" "Major mode for editing Haml files" '((emacs "24") (cl-lib "0.5")) :commit "1cbb2de8f0fc25f35448c5cad04642f28078f3bb" :url "https://github.com/nex3/haml-mode" :keywords '("markup" "languages" "html"))
@@ -1,877 +0,0 @@
1
- ;;; haml-mode.el --- Major mode for editing Haml files
2
-
3
- ;; Copyright (c) 2007, 2008 Natalie Weizenbaum
4
-
5
- ;; Author: Natalie Weizenbaum
6
- ;; URL: https://github.com/nex3/haml-mode
7
- ;; Package-Requires: ((emacs "24") (cl-lib "0.5"))
8
- ;; Package-Version: 20170923.2153
9
- ;; Package-X-Original-Version: 0
10
- ;; Created: 2007-03-08
11
- ;; By: Natalie Weizenbaum
12
- ;; Keywords: markup, languages, html
13
-
14
- ;;; Commentary:
15
-
16
- ;; Because Haml's indentation schema is similar
17
- ;; to that of YAML and Python, many indentation-related
18
- ;; functions are similar to those in yaml-mode and python-mode.
19
-
20
- ;; To install, save this on your load path and add the following to
21
- ;; your .emacs file:
22
- ;;
23
- ;; (require 'haml-mode)
24
-
25
- ;;; Code:
26
-
27
- (require 'cl-lib)
28
- (require 'ruby-mode)
29
-
30
- ;; Additional (optional) libraries for fontification
31
- (require 'css-mode nil t)
32
- (require 'textile-mode nil t)
33
- (require 'markdown-mode nil t)
34
- (require 'js nil t)
35
-
36
- ;; User definable variables
37
-
38
- (defgroup haml nil
39
- "Support for the Haml template language."
40
- :group 'languages
41
- :prefix "haml-")
42
-
43
- (defcustom haml-mode-hook nil
44
- "Hook run when entering Haml mode."
45
- :type 'hook
46
- :group 'haml)
47
-
48
- (defcustom haml-indent-offset 2
49
- "Amount of offset per level of indentation."
50
- :type 'integer
51
- :group 'haml)
52
-
53
- (defcustom haml-backspace-backdents-nesting t
54
- "Non-nil to have `haml-electric-backspace' re-indent blocks of code.
55
- This means that all code nested beneath the backspaced line is
56
- re-indented along with the line itself."
57
- :type 'boolean
58
- :group 'haml)
59
-
60
- (defvar haml-indent-function 'haml-indent-p
61
- "A function for checking if nesting is allowed.
62
- This function should look at the current line and return t
63
- if the next line could be nested within this line.
64
-
65
- The function can also return a positive integer to indicate
66
- a specific level to which the current line could be indented.")
67
-
68
- (defconst haml-tag-beg-re
69
- "^[ \t]*\\([%\\.#][a-z0-9_:\\-]+\\)+\\(?:(.*)\\|{.*}\\|\\[.*\\]\\)*"
70
- "A regexp matching the beginning of a Haml tag, through (), {}, and [].")
71
-
72
- (defvar haml-block-openers
73
- `(,(concat haml-tag-beg-re "[><]*[ \t]*$")
74
- "^[ \t]*[&!]?[-=~].*do[ \t]*\\(|.*|[ \t]*\\)?$"
75
- ,(concat "^[ \t]*[&!]?[-=~][ \t]*\\("
76
- (regexp-opt '("if" "unless" "while" "until" "else" "for"
77
- "begin" "elsif" "rescue" "ensure" "when"))
78
- "\\)")
79
- "^[ \t]*/\\(\\[.*\\]\\)?[ \t]*$"
80
- "^[ \t]*-#"
81
- "^[ \t]*:")
82
- "A list of regexps that match lines of Haml that open blocks.
83
- That is, a Haml line that can have text nested beneath it should
84
- be matched by a regexp in this list.")
85
-
86
-
87
- ;; Font lock
88
-
89
- (defun haml-nested-regexp (re)
90
- "Create a regexp to match a block starting with RE.
91
- The line containing RE is matched, as well as all lines indented beneath it."
92
- (concat "^\\([ \t]*\\)\\(" re "\\)\\([ \t]*\\(?:\n\\(?:\\1 +[^\n]*\\)?\\)*\n?\\)$"))
93
-
94
- (defconst haml-font-lock-keywords
95
- `((haml-highlight-interpolation 1 font-lock-variable-name-face prepend)
96
- (haml-highlight-ruby-tag 1 font-lock-preprocessor-face)
97
- (haml-highlight-ruby-script 1 font-lock-preprocessor-face)
98
- ;; TODO: distinguish between "/" comments, which can contain HAML
99
- ;; output directives, and "-#", which are completely ignored
100
- haml-highlight-comment
101
- haml-highlight-filter
102
- ("^!!!.*" 0 font-lock-constant-face)
103
- ("\\s| *$" 0 font-lock-string-face)))
104
-
105
- (defconst haml-filter-re (haml-nested-regexp ":[[:alnum:]_\\-]+"))
106
- (defconst haml-comment-re (haml-nested-regexp "\\(?:-\\#\\|/\\)[^\n]*"))
107
-
108
- (defun haml-highlight-comment (limit)
109
- "Highlight any -# or / comment found up to LIMIT."
110
- (when (re-search-forward haml-comment-re limit t)
111
- (let ((beg (match-beginning 0))
112
- (end (match-end 0)))
113
- (put-text-property beg end 'face 'font-lock-comment-face)
114
- (goto-char end))))
115
-
116
- ;; Fontifying sub-regions for other languages
117
-
118
- (defun haml-fontify-region
119
- (beg end keywords syntax-table syntax-propertize-fn)
120
- "Fontify a region between BEG and END using another mode's fontification.
121
-
122
- KEYWORDS, SYNTAX-TABLE, SYNTACTIC-KEYWORDS and
123
- SYNTAX-PROPERTIZE-FN are the values of that mode's
124
- `font-lock-keywords', `font-lock-syntax-table',
125
- `font-lock-syntactic-keywords', and `syntax-propertize-function'
126
- respectively."
127
- (save-excursion
128
- (save-match-data
129
- (let ((font-lock-keywords keywords)
130
- (font-lock-syntax-table syntax-table)
131
- (syntax-propertize-function syntax-propertize-fn)
132
- (font-lock-multiline 'undecided)
133
- (font-lock-dont-widen t)
134
- font-lock-keywords-only
135
- font-lock-extend-region-functions
136
- font-lock-keywords-case-fold-search)
137
- (save-restriction
138
- (narrow-to-region (1- beg) end)
139
- ;; font-lock-fontify-region apparently isn't inclusive,
140
- ;; so we have to move the beginning back one char
141
- (font-lock-fontify-region (1- beg) end))))))
142
-
143
- (defun haml-fontify-region-as-ruby (beg end)
144
- "Use Ruby's font-lock variables to fontify the region between BEG and END."
145
- (haml-fontify-region beg end ruby-font-lock-keywords
146
- ruby-font-lock-syntax-table
147
- (if (fboundp 'ruby-syntax-propertize)
148
- 'ruby-syntax-propertize
149
- 'ruby-syntax-propertize-function)))
150
-
151
- (defun haml-fontify-region-as-css (beg end)
152
- "Fontify CSS code from BEG to END.
153
-
154
- This requires that `css-mode' is available.
155
- `css-mode' is included with Emacs 23."
156
- (when (boundp 'css-font-lock-keywords)
157
- (haml-fontify-region beg end
158
- css-font-lock-keywords
159
- css-mode-syntax-table
160
- 'css-syntax-propertize-function)))
161
-
162
- (defun haml-fontify-region-as-javascript (beg end)
163
- "Fontify javascript code from BEG to END.
164
-
165
- This requires that Karl Landström's javascript mode be available, either as the
166
- \"js.el\" bundled with Emacs >= 23, or as \"javascript.el\" found in ELPA and
167
- elsewhere."
168
- (when js--font-lock-keywords-3
169
- (when (and (fboundp 'js--update-quick-match-re)
170
- (null js--quick-match-re-func))
171
- (js--update-quick-match-re))
172
- (haml-fontify-region beg end
173
- js--font-lock-keywords-3
174
- js-mode-syntax-table
175
- #'js-syntax-propertize)))
176
-
177
- (defun haml-fontify-region-as-textile (beg end)
178
- "Highlight textile from BEG to END.
179
-
180
- This requires that `textile-mode' be available.
181
-
182
- Note that the results are not perfect, since `textile-mode' expects
183
- certain constructs such as \"h1.\" to be at the beginning of a line,
184
- and indented Haml filters always have leading whitespace."
185
- (if (boundp 'textile-font-lock-keywords)
186
- (haml-fontify-region beg end textile-font-lock-keywords textile-mode-syntax-table nil)))
187
-
188
- (defun haml-fontify-region-as-markdown (beg end)
189
- "Highlight markdown from BEG to END.
190
-
191
- This requires that `markdown-mode' be available."
192
- (if (boundp 'markdown-mode-font-lock-keywords)
193
- (haml-fontify-region beg end
194
- markdown-mode-font-lock-keywords
195
- markdown-mode-syntax-table
196
- nil)))
197
-
198
- (defvar haml-fontify-filter-functions-alist
199
- '(("ruby" . haml-fontify-region-as-ruby)
200
- ("css" . haml-fontify-region-as-css)
201
- ("javascript" . haml-fontify-region-as-javascript)
202
- ("textile" . haml-fontify-region-as-textile)
203
- ("markdown" . haml-fontify-region-as-markdown))
204
- "An alist of (FILTER-NAME . FUNCTION) used to fontify code regions.
205
- FILTER-NAME is a string and FUNCTION is a function which will be
206
- used to fontify the filter's indented code region. FUNCTION will
207
- be passed the extents of that region in two arguments BEG and
208
- END.")
209
-
210
- (defun haml-highlight-filter (limit)
211
- "Highlight any :filter region found in the text up to LIMIT."
212
- (when (re-search-forward haml-filter-re limit t)
213
- ;; fontify the filter name
214
- (put-text-property (match-beginning 2) (1+ (match-end 2))
215
- 'face font-lock-preprocessor-face)
216
- (let ((filter-name (substring (match-string 2) 1))
217
- (code-start (1+ (match-beginning 3)))
218
- (code-end (match-end 3)))
219
- (save-match-data
220
- (funcall (or (cdr (assoc filter-name haml-fontify-filter-functions-alist))
221
- #'(lambda (beg end)
222
- (put-text-property beg end
223
- 'face
224
- 'font-lock-string-face)))
225
- code-start code-end))
226
- (goto-char (match-end 0)))))
227
-
228
- (defconst haml-possibly-multiline-code-re
229
- "\\(\\(?:.*?,[ \t]*\n\\)*.*\\)"
230
- "Regexp to match trailing ruby code which may continue onto subsequent lines.")
231
-
232
- (defconst haml-ruby-script-re
233
- (concat "^[ \t]*\\(-\\|[&!]?\\(?:=\\|~\\)\\)[^=]" haml-possibly-multiline-code-re)
234
- "Regexp to match -, = or ~ blocks and any continued code lines.")
235
-
236
- (defun haml-highlight-ruby-script (limit)
237
- "Highlight a Ruby script expression (-, =, or ~).
238
- LIMIT works as it does in `re-search-forward'."
239
- (when (re-search-forward haml-ruby-script-re limit t)
240
- (haml-fontify-region-as-ruby (match-beginning 2) (match-end 2))))
241
-
242
- (defun haml-move (re)
243
- "Try matching and moving to the end of regular expression RE.
244
- Returns non-nil if the expression was sucessfully matched."
245
- (when (looking-at re)
246
- (goto-char (match-end 0))
247
- t))
248
-
249
- (defun haml-highlight-ruby-tag (limit)
250
- "Highlight Ruby code within a Haml tag.
251
- LIMIT works as it does in `re-search-forward'.
252
-
253
- This highlights the tag attributes and object refs of the tag,
254
- as well as the script expression (-, =, or ~) following the tag.
255
-
256
- For example, this will highlight all of the following:
257
- %p{:foo => 'bar'}
258
- %p[@bar]
259
- %p= 'baz'
260
- %p{:foo => 'bar'}[@bar]= 'baz'"
261
- (when (re-search-forward "^[ \t]*[%.#]" limit t)
262
- (forward-char -1)
263
-
264
- ;; Highlight tag, classes, and ids
265
- (while (haml-move "\\([.#%]\\)[a-z0-9_:\\-]*")
266
- (put-text-property (match-beginning 0) (match-end 0) 'face
267
- (cl-case (char-after (match-beginning 1))
268
- (?% font-lock-keyword-face)
269
- (?# font-lock-function-name-face)
270
- (?. font-lock-variable-name-face))))
271
-
272
- (cl-block loop
273
- (while t
274
- (let ((eol (save-excursion (end-of-line) (point))))
275
- (cl-case (char-after)
276
- ;; Highlight obj refs
277
- (?\[
278
- (forward-char 1)
279
- (let ((beg (point)))
280
- (haml-limited-forward-sexp eol)
281
- (haml-fontify-region-as-ruby beg (point))))
282
- ;; Highlight new attr hashes
283
- (?\(
284
- (forward-char 1)
285
- (while
286
- (and (haml-parse-new-attr-hash
287
- (lambda (type beg end)
288
- (cl-case type
289
- (name (put-text-property beg end
290
- 'face
291
- font-lock-constant-face))
292
- (value (haml-fontify-region-as-ruby beg end)))))
293
- (not (eobp)))
294
- (forward-line 1)
295
- (beginning-of-line)))
296
- ;; Highlight old attr hashes
297
- (?\{
298
- (let ((beg (point)))
299
- (haml-limited-forward-sexp eol)
300
-
301
- ;; Check for multiline
302
- (while (and (eolp) (eq (char-before) ?,) (not (eobp)))
303
- (forward-line)
304
- (let ((eol (save-excursion (end-of-line) (point))))
305
- ;; If no sexps are closed,
306
- ;; we're still continuing a multiline hash
307
- (if (>= (car (parse-partial-sexp (point) eol)) 0)
308
- (end-of-line)
309
- ;; If sexps have been closed,
310
- ;; set the point at the end of the total sexp
311
- (goto-char beg)
312
- (haml-limited-forward-sexp eol))))
313
-
314
- (haml-fontify-region-as-ruby (1+ beg) (point))))
315
- (t (cl-return-from loop))))))
316
-
317
- ;; Move past end chars
318
- (haml-move "[<>&!]+")
319
- ;; Highlight script
320
- (if (looking-at (concat "\\([=~]\\) " haml-possibly-multiline-code-re))
321
- (haml-fontify-region-as-ruby (match-beginning 2) (match-end 2))
322
- ;; Give font-lock something to highlight
323
- (forward-char -1)
324
- (looking-at "\\(\\)"))
325
- t))
326
-
327
- (defun haml-highlight-interpolation (limit)
328
- "Highlight Ruby interpolation (#{foo}).
329
- LIMIT works as it does in `re-search-forward'."
330
- (when (re-search-forward "\\(#{\\)" limit t)
331
- (save-match-data
332
- (forward-char -1)
333
- (let ((beg (point)))
334
- (haml-limited-forward-sexp limit)
335
- (haml-fontify-region-as-ruby (1+ beg) (point)))
336
- (when (eq (char-before) ?\})
337
- (put-text-property (1- (point)) (point)
338
- 'face font-lock-variable-name-face))
339
- t)))
340
-
341
- (defun haml-limited-forward-sexp (limit &optional arg)
342
- "Move forward using `forward-sexp' or to LIMIT, whichever comes first.
343
- With ARG, do it that many times."
344
- (let (forward-sexp-function)
345
- (condition-case err
346
- (save-restriction
347
- (narrow-to-region (point) limit)
348
- (forward-sexp arg))
349
- (scan-error
350
- (unless (equal (nth 1 err) "Unbalanced parentheses")
351
- (signal 'scan-error (cdr err)))
352
- (goto-char limit)))))
353
-
354
- (defun haml-find-containing-block (re)
355
- "If point is inside a block matching RE, return (start . end) for the block."
356
- (save-excursion
357
- (let ((pos (point))
358
- start end)
359
- (beginning-of-line)
360
- (when (and
361
- (or (looking-at re)
362
- (when (re-search-backward re nil t)
363
- (looking-at re)))
364
- (< pos (match-end 0)))
365
- (setq start (match-beginning 0)
366
- end (match-end 0)))
367
- (when start
368
- (cons start end)))))
369
-
370
- (defun haml-maybe-extend-region (extender)
371
- "Maybe extend the font lock region using EXTENDER.
372
- With point at the beginning of the font lock region, EXTENDER is called.
373
- If it returns a (START . END) pair, those positions are used to possibly
374
- extend the font lock region."
375
- (let ((old-beg font-lock-beg)
376
- (old-end font-lock-end))
377
- (save-excursion
378
- (goto-char font-lock-beg)
379
- (let ((new-bounds (funcall extender)))
380
- (when new-bounds
381
- (setq font-lock-beg (min font-lock-beg (car new-bounds))
382
- font-lock-end (max font-lock-end (cdr new-bounds))))))
383
- (or (/= old-beg font-lock-beg)
384
- (/= old-end font-lock-end))))
385
-
386
- (defun haml-extend-region-nested-below ()
387
- "Extend the font-lock region to any subsequent indented lines."
388
- (haml-maybe-extend-region
389
- (lambda ()
390
- (beginning-of-line)
391
- (when (looking-at (haml-nested-regexp "[^ \t].*"))
392
- (cons (match-beginning 0) (match-end 0))))))
393
-
394
- (defun haml-extend-region-to-containing-block (re)
395
- "Extend the font-lock region to the smallest containing block matching RE."
396
- (haml-maybe-extend-region
397
- (lambda ()
398
- (haml-find-containing-block re))))
399
-
400
- (defun haml-extend-region-filter ()
401
- "Extend the font-lock region to an enclosing filter."
402
- (haml-extend-region-to-containing-block haml-filter-re))
403
-
404
- (defun haml-extend-region-comment ()
405
- "Extend the font-lock region to an enclosing comment."
406
- (haml-extend-region-to-containing-block haml-comment-re))
407
-
408
- (defun haml-extend-region-ruby-script ()
409
- "Extend the font-lock region to encompass any current -/=/~ line."
410
- (haml-extend-region-to-containing-block haml-ruby-script-re))
411
-
412
- (defun haml-extend-region-multiline-hashes ()
413
- "Extend the font-lock region to encompass multiline attribute hashes."
414
- (haml-maybe-extend-region
415
- (lambda ()
416
- (let ((attr-props (haml-parse-multiline-attr-hash))
417
- multiline-end
418
- start)
419
- (when attr-props
420
- (setq start (cdr (assq 'point attr-props)))
421
-
422
- (end-of-line)
423
- ;; Move through multiline attrs
424
- (when (eq (char-before) ?,)
425
- (save-excursion
426
- (while (progn (end-of-line)
427
- (and (eq (char-before) ?,) (not (eobp))))
428
- (forward-line))
429
-
430
- (forward-line -1)
431
- (end-of-line)
432
- (setq multiline-end (point))))
433
-
434
- (goto-char (+ (cdr (assq 'point attr-props))
435
- (cdr (assq 'hash-indent attr-props))
436
- -1))
437
- (haml-limited-forward-sexp
438
- (or multiline-end
439
- (save-excursion (end-of-line) (point))))
440
- (cons start (point)))))))
441
-
442
- (defun haml-extend-region-contextual ()
443
- "Extend the font lock region piecemeal.
444
-
445
- The result of calling this function repeatedly until it returns
446
- nil is that (FONT-LOCK-BEG . FONT-LOCK-END) will be the smallest
447
- possible region in which font-locking could be affected by
448
- changes in the initial region."
449
- (or
450
- (haml-extend-region-filter)
451
- (haml-extend-region-comment)
452
- (haml-extend-region-ruby-script)
453
- (haml-extend-region-multiline-hashes)
454
- (haml-extend-region-nested-below)
455
- (font-lock-extend-region-multiline)))
456
-
457
-
458
- ;; Mode setup
459
-
460
- (defvar haml-mode-syntax-table
461
- (let ((table (make-syntax-table)))
462
- (modify-syntax-entry ?: "." table)
463
- (modify-syntax-entry ?' "\"" table)
464
- table)
465
- "Syntax table in use in `haml-mode' buffers.")
466
-
467
- (defvar haml-mode-map
468
- (let ((map (make-sparse-keymap)))
469
- (define-key map [backspace] 'haml-electric-backspace)
470
- (define-key map "\C-?" 'haml-electric-backspace)
471
- (define-key map "\C-c\C-f" 'haml-forward-sexp)
472
- (define-key map "\C-c\C-b" 'haml-backward-sexp)
473
- (define-key map "\C-c\C-u" 'haml-up-list)
474
- (define-key map "\C-c\C-d" 'haml-down-list)
475
- (define-key map "\C-c\C-k" 'haml-kill-line-and-indent)
476
- (define-key map "\C-c\C-r" 'haml-output-region)
477
- (define-key map "\C-c\C-l" 'haml-output-buffer)
478
- map))
479
-
480
- ;;;###autoload
481
- (define-derived-mode haml-mode prog-mode "Haml"
482
- "Major mode for editing Haml files.
483
-
484
- \\{haml-mode-map}"
485
- (setq font-lock-extend-region-functions '(haml-extend-region-contextual))
486
- (set (make-local-variable 'jit-lock-contextually) t)
487
- (set (make-local-variable 'font-lock-multiline) t)
488
- (set (make-local-variable 'indent-line-function) 'haml-indent-line)
489
- (set (make-local-variable 'indent-region-function) 'haml-indent-region)
490
- (set (make-local-variable 'parse-sexp-lookup-properties) t)
491
- (set (make-local-variable 'comment-start) "-#")
492
- (setq font-lock-defaults '((haml-font-lock-keywords) t t))
493
- (when (boundp 'electric-indent-inhibit)
494
- (setq electric-indent-inhibit t))
495
- (setq indent-tabs-mode nil))
496
-
497
- ;; Useful functions
498
-
499
- (defun haml-comment-block ()
500
- "Comment the current block of Haml code."
501
- (interactive)
502
- (save-excursion
503
- (let ((indent (current-indentation)))
504
- (back-to-indentation)
505
- (insert "-#")
506
- (newline)
507
- (indent-to indent)
508
- (beginning-of-line)
509
- (haml-mark-sexp)
510
- (haml-reindent-region-by haml-indent-offset))))
511
-
512
- (defun haml-uncomment-block ()
513
- "Uncomment the current block of Haml code."
514
- (interactive)
515
- (save-excursion
516
- (beginning-of-line)
517
- (while (not (looking-at haml-comment-re))
518
- (haml-up-list)
519
- (beginning-of-line))
520
- (haml-mark-sexp)
521
- (kill-line 1)
522
- (haml-reindent-region-by (- haml-indent-offset))))
523
-
524
- (defun haml-replace-region (start end)
525
- "Replace the current block of Haml code with the HTML equivalent.
526
- Called from a program, START and END specify the region to indent."
527
- (interactive "r")
528
- (save-excursion
529
- (goto-char end)
530
- (setq end (point-marker))
531
- (goto-char start)
532
- (let ((ci (current-indentation)))
533
- (while (re-search-forward "^ +" end t)
534
- (replace-match (make-string (- (current-indentation) ci) ? ))))
535
- (shell-command-on-region start end "haml" "haml-output" t)))
536
-
537
- (defun haml-output-region (start end)
538
- "Displays the HTML output for the current block of Haml code.
539
- Called from a program, START and END specify the region to indent."
540
- (interactive "r")
541
- (kill-new (buffer-substring start end))
542
- (with-temp-buffer
543
- (yank)
544
- (haml-indent-region (point-min) (point-max))
545
- (shell-command-on-region (point-min) (point-max) "haml" "haml-output")))
546
-
547
- (defun haml-output-buffer ()
548
- "Displays the HTML output for entire buffer."
549
- (interactive)
550
- (haml-output-region (point-min) (point-max)))
551
-
552
- ;; Navigation
553
-
554
- (defun haml-forward-through-whitespace (&optional backward)
555
- "Move the point forward through any whitespace.
556
- The point will move forward at least one line, until it reaches
557
- either the end of the buffer or a line with no whitespace.
558
-
559
- If BACKWARD is non-nil, move the point backward instead."
560
- (let ((arg (if backward -1 1))
561
- (endp (if backward 'bobp 'eobp)))
562
- (cl-loop do (forward-line arg)
563
- while (and (not (funcall endp))
564
- (looking-at "^[ \t]*$")))))
565
-
566
- (defun haml-at-indent-p ()
567
- "Return non-nil if the point is before any text on the line."
568
- (let ((opoint (point)))
569
- (save-excursion
570
- (back-to-indentation)
571
- (>= (point) opoint))))
572
-
573
- (defun haml-forward-sexp (&optional arg)
574
- "Move forward across one nested expression.
575
- With ARG, do it that many times. Negative arg -N means move
576
- backward across N balanced expressions.
577
-
578
- A sexp in Haml is defined as a line of Haml code as well as any
579
- lines nested beneath it."
580
- (interactive "p")
581
- (or arg (setq arg 1))
582
- (if (and (< arg 0) (not (haml-at-indent-p)))
583
- (back-to-indentation)
584
- (while (/= arg 0)
585
- (let ((indent (current-indentation)))
586
- (cl-loop do (haml-forward-through-whitespace (< arg 0))
587
- while (and (not (eobp))
588
- (not (bobp))
589
- (> (current-indentation) indent)))
590
- (unless (eobp)
591
- (back-to-indentation))
592
- (setq arg (+ arg (if (> arg 0) -1 1)))))))
593
-
594
- (defun haml-backward-sexp (&optional arg)
595
- "Move backward across one nested expression.
596
- With ARG, do it that many times. Negative arg -N means move
597
- forward across N balanced expressions.
598
-
599
- A sexp in Haml is defined as a line of Haml code as well as any
600
- lines nested beneath it."
601
- (interactive "p")
602
- (haml-forward-sexp (if arg (- arg) -1)))
603
-
604
- (defun haml-up-list (&optional arg)
605
- "Move out of one level of nesting.
606
- With ARG, do this that many times."
607
- (interactive "p")
608
- (or arg (setq arg 1))
609
- (while (> arg 0)
610
- (let ((indent (current-indentation)))
611
- (cl-loop do (haml-forward-through-whitespace t)
612
- while (and (not (bobp))
613
- (>= (current-indentation) indent)))
614
- (setq arg (1- arg))))
615
- (back-to-indentation))
616
-
617
- (defun haml-down-list (&optional arg)
618
- "Move down one level of nesting.
619
- With ARG, do this that many times."
620
- (interactive "p")
621
- (or arg (setq arg 1))
622
- (while (> arg 0)
623
- (let ((indent (current-indentation)))
624
- (haml-forward-through-whitespace)
625
- (when (<= (current-indentation) indent)
626
- (haml-forward-through-whitespace t)
627
- (back-to-indentation)
628
- (error "Nothing is nested beneath this line"))
629
- (setq arg (1- arg))))
630
- (back-to-indentation))
631
-
632
- (defun haml-mark-sexp ()
633
- "Mark the next Haml block."
634
- (let ((forward-sexp-function 'haml-forward-sexp))
635
- (mark-sexp)))
636
-
637
- (defun haml-mark-sexp-but-not-next-line ()
638
- "Mark the next Haml block, but not the next line.
639
- Put the mark at the end of the last line of the sexp rather than
640
- the first non-whitespace character of the next line."
641
- (haml-mark-sexp)
642
- (set-mark
643
- (save-excursion
644
- (goto-char (mark))
645
- (unless (eobp)
646
- (forward-line -1)
647
- (end-of-line))
648
- (point))))
649
-
650
- ;; Indentation and electric keys
651
-
652
- (defvar haml-empty-elements
653
- '("area" "base" "br" "col" "command" "embed" "hr" "img" "input"
654
- "keygen" "link" "meta" "param" "source" "track" "wbr")
655
- "A list of html elements which may not contain content.
656
-
657
- See http://www.w3.org/TR/html-markup/syntax.html.")
658
-
659
- (defun haml-unnestable-tag-p ()
660
- "Return t if the current line is an empty element tag, or one with content."
661
- (when (looking-at haml-tag-beg-re)
662
- (save-excursion
663
- (goto-char (match-end 0))
664
- (or (string-match-p (concat "%" (regexp-opt haml-empty-elements) "\\b")
665
- (match-string 1))
666
- (progn
667
- (when (looking-at "[{(]")
668
- (ignore-errors (forward-sexp)))
669
- (looking-at "\\(?:=\\|==\\| \\)[[:blank:]]*[^[:blank:]\r\n]+"))))))
670
-
671
- (defun haml-indent-p ()
672
- "Return t if the current line can have lines nested beneath it."
673
- (let ((attr-props (haml-parse-multiline-attr-hash)))
674
- (if attr-props
675
- (if (haml-unclosed-attr-hash-p)
676
- (cdr (assq 'hash-indent attr-props))
677
- (+ (cdr (assq 'indent attr-props)) haml-indent-offset))
678
- (unless (or (haml-unnestable-tag-p))
679
- (cl-loop for opener in haml-block-openers
680
- if (looking-at opener) return t
681
- finally return nil)))))
682
-
683
- (cl-defun haml-parse-multiline-attr-hash ()
684
- "Parses a multiline attribute hash, and returns
685
- an alist with the following keys:
686
-
687
- INDENT is the indentation of the line beginning the hash.
688
-
689
- HASH-INDENT is the indentation of the first character
690
- within the attribute hash.
691
-
692
- POINT is the character position at the beginning of the line
693
- beginning the hash."
694
- (save-excursion
695
- (while t
696
- (beginning-of-line)
697
- (if (looking-at (concat haml-tag-beg-re "\\([{(]\\)"))
698
- (progn
699
- (goto-char (1- (match-end 0)))
700
- (haml-limited-forward-sexp (save-excursion (end-of-line) (point)))
701
- (cl-return-from haml-parse-multiline-attr-hash
702
- (when (or (string-equal (match-string 1) "(") (eq (char-before) ?,))
703
- `((indent . ,(current-indentation))
704
- (hash-indent . ,(- (match-end 0) (match-beginning 0)))
705
- (point . ,(match-beginning 0))))))
706
- (when (bobp) (cl-return-from haml-parse-multiline-attr-hash))
707
- (forward-line -1)
708
- (unless (haml-unclosed-attr-hash-p)
709
- (cl-return-from haml-parse-multiline-attr-hash))))))
710
-
711
- (cl-defun haml-unclosed-attr-hash-p ()
712
- "Return t if this line has an unclosed attribute hash, new or old."
713
- (save-excursion
714
- (end-of-line)
715
- (when (eq (char-before) ?,) (cl-return-from haml-unclosed-attr-hash-p t))
716
- (re-search-backward "(\\|^")
717
- (haml-move "(")
718
- (haml-parse-new-attr-hash)))
719
-
720
- (cl-defun haml-parse-new-attr-hash (&optional (fn (lambda (type beg end) ())))
721
- "Parse a new-style attribute hash on this line, and returns
722
- t if it's not finished on the current line.
723
-
724
- FN should take three parameters: TYPE, BEG, and END.
725
- TYPE is the type of text parsed ('name or 'value)
726
- and BEG and END delimit that text in the buffer."
727
- (let ((eol (save-excursion (end-of-line) (point))))
728
- (while (not (haml-move ")"))
729
- (haml-move "[ \t]*")
730
- (unless (haml-move "[a-z0-9_:\\-]+")
731
- (cl-return-from haml-parse-new-attr-hash (haml-move "[ \t]*$")))
732
- (funcall fn 'name (match-beginning 0) (match-end 0))
733
- (haml-move "[ \t]*")
734
- (when (haml-move "=")
735
- (haml-move "[ \t]*")
736
- (unless (looking-at "[\"'@a-z0-9]") (cl-return-from haml-parse-new-attr-hash))
737
- (let ((beg (point)))
738
- (haml-limited-forward-sexp eol)
739
- (funcall fn 'value beg (point)))
740
- (haml-move "[ \t]*")))
741
- nil))
742
-
743
- (defun haml-compute-indentation ()
744
- "Calculate the maximum sensible indentation for the current line."
745
- (save-excursion
746
- (beginning-of-line)
747
- (if (bobp) (list 0 nil)
748
- (haml-forward-through-whitespace t)
749
- (let ((indent (funcall haml-indent-function)))
750
- (cond
751
- ((consp indent) indent)
752
- ((integerp indent) (list indent t))
753
- (indent (list (+ (current-indentation) haml-indent-offset) nil))
754
- (t (list (current-indentation) nil)))))))
755
-
756
- (defun haml-indent-region (start end)
757
- "Indent each nonblank line in the region.
758
- This is done by indenting the first line based on
759
- `haml-compute-indentation' and preserving the relative
760
- indentation of the rest of the region. START and END specify the
761
- region to indent.
762
-
763
- If this command is used multiple times in a row, it will cycle
764
- between possible indentations."
765
- (save-excursion
766
- (goto-char end)
767
- (setq end (point-marker))
768
- (goto-char start)
769
- (let (this-line-column current-column
770
- (next-line-column
771
- (if (and (equal last-command this-command) (/= (current-indentation) 0))
772
- (* (/ (1- (current-indentation)) haml-indent-offset) haml-indent-offset)
773
- (car (haml-compute-indentation)))))
774
- (while (< (point) end)
775
- (setq this-line-column next-line-column
776
- current-column (current-indentation))
777
- ;; Delete whitespace chars at beginning of line
778
- (delete-horizontal-space)
779
- (unless (eolp)
780
- (setq next-line-column (save-excursion
781
- (cl-loop do (forward-line 1)
782
- while (and (not (eobp)) (looking-at "^[ \t]*$")))
783
- (+ this-line-column
784
- (- (current-indentation) current-column))))
785
- ;; Don't indent an empty line
786
- (unless (eolp) (indent-to this-line-column)))
787
- (forward-line 1)))
788
- (move-marker end nil)))
789
-
790
- (defun haml-indent-line ()
791
- "Indent the current line.
792
- The first time this command is used, the line will be indented to the
793
- maximum sensible indentation. Each immediately subsequent usage will
794
- back-dent the line by `haml-indent-offset' spaces. On reaching column
795
- 0, it will cycle back to the maximum sensible indentation."
796
- (interactive "*")
797
- (let ((ci (current-indentation))
798
- (cc (current-column)))
799
- (cl-destructuring-bind (need strict) (haml-compute-indentation)
800
- (save-excursion
801
- (beginning-of-line)
802
- (delete-horizontal-space)
803
- (if (and (not strict) (equal last-command this-command) (/= ci 0))
804
- (indent-to (* (/ (1- ci) haml-indent-offset) haml-indent-offset))
805
- (indent-to need))))
806
- (when (< (current-column) (current-indentation))
807
- (forward-to-indentation 0))))
808
-
809
- (defun haml-reindent-region-by (n)
810
- "Add N spaces to the beginning of each line in the region.
811
- If N is negative, will remove the spaces instead. Assumes all
812
- lines in the region have indentation >= that of the first line."
813
- (let* ((ci (current-indentation))
814
- (indent-rx
815
- (concat "^"
816
- (if indent-tabs-mode
817
- (concat (make-string (/ ci tab-width) ?\t)
818
- (make-string (mod ci tab-width) ?\t))
819
- (make-string ci ?\s)))))
820
- (save-excursion
821
- (while (re-search-forward indent-rx (mark) t)
822
- (let ((ci (current-indentation)))
823
- (delete-horizontal-space)
824
- (beginning-of-line)
825
- (indent-to (max 0 (+ ci n))))))))
826
-
827
- (defun haml-electric-backspace (arg)
828
- "Delete characters or back-dent the current line.
829
- If invoked following only whitespace on a line, will back-dent
830
- the line and all nested lines to the immediately previous
831
- multiple of `haml-indent-offset' spaces. With ARG, do it that
832
- many times.
833
-
834
- Set `haml-backspace-backdents-nesting' to nil to just back-dent
835
- the current line."
836
- (interactive "*p")
837
- (if (or (/= (current-indentation) (current-column))
838
- (bolp)
839
- (save-excursion
840
- (beginning-of-line)
841
- (looking-at "^[ \t]+$")))
842
- (backward-delete-char arg)
843
- (save-excursion
844
- (beginning-of-line)
845
- (unwind-protect
846
- (progn
847
- (if haml-backspace-backdents-nesting
848
- (haml-mark-sexp-but-not-next-line)
849
- (set-mark (save-excursion (end-of-line) (point))))
850
- (haml-reindent-region-by (* (- arg) haml-indent-offset)))
851
- (pop-mark)))
852
- (back-to-indentation)))
853
-
854
- (defun haml-kill-line-and-indent ()
855
- "Kill the current line, and re-indent all lines nested beneath it."
856
- (interactive)
857
- (beginning-of-line)
858
- (haml-mark-sexp-but-not-next-line)
859
- (kill-line 1)
860
- (haml-reindent-region-by (* -1 haml-indent-offset)))
861
-
862
- (defun haml-indent-string ()
863
- "Return the indentation string for `haml-indent-offset'."
864
- (mapconcat 'identity (make-list haml-indent-offset " ") ""))
865
-
866
- ;;;###autoload
867
- (add-to-list 'auto-mode-alist '("\\.haml\\'" . haml-mode))
868
-
869
-
870
- ;; Local Variables:
871
- ;; coding: utf-8
872
- ;; byte-compile-warnings: (not cl-functions)
873
- ;; eval: (checkdoc-minor-mode 1)
874
- ;; End:
875
-
876
- (provide 'haml-mode)
877
- ;;; haml-mode.el ends here