74
74
:type 'integer
75
75
:group 'haskell-indentation )
76
76
77
- (defconst haskell-indentation-mode-map
77
+ (defcustom haskell-indentation-electric-flag nil
78
+ " Non-nil means insertion of some characters may auto reindent the line.
79
+ If the variable `electric-indent-mode' is non-nil then this variable is
80
+ overridden."
81
+ :type 'symbol
82
+ :group 'haskell-indentation )
83
+ (make-variable-buffer-local 'haskell-indentation-electric-flag )
84
+
85
+ (defvar haskell-indentation-mode-map
78
86
(let ((map (make-sparse-keymap )))
79
- (define-key map (kbd " RET" ) 'haskell-indentation-newline-and-indent )
80
- (define-key map (kbd " <backtab>" ) 'haskell-indentation-indent-backwards )
87
+ (define-key map (kbd " RET" ) #'haskell-indentation-newline-and-indent )
88
+ (define-key map (kbd " <backtab>" ) #'haskell-indentation-indent-backwards )
89
+ (define-key map (kbd " ," ) #'haskell-indentation-common-electric-command )
90
+ (define-key map (kbd " ;" ) #'haskell-indentation-common-electric-command )
91
+ (define-key map (kbd " )" ) #'haskell-indentation-common-electric-command )
92
+ (define-key map (kbd " }" ) #'haskell-indentation-common-electric-command )
93
+ (define-key map (kbd " ]" ) #'haskell-indentation-common-electric-command )
81
94
map)
82
95
" Keymap for `haskell-indentation-mode' ." )
83
96
@@ -94,11 +107,8 @@ set and deleted as if they were real tabs."
94
107
(when (and (bound-and-true-p haskell-indent-mode)
95
108
(fboundp 'turn-off-haskell-indent ))
96
109
(turn-off-haskell-indent))
97
- (when (and (bound-and-true-p haskell-simple-indent-mode)
98
- (fboundp 'haskell-simple-indent-mode ))
99
- (haskell-simple-indent-mode 0 ))
100
- (setq-local indent-line-function 'haskell-indentation-indent-line )
101
- (setq-local indent-region-function 'haskell-indentation-indent-region )))
110
+ (setq-local indent-line-function #'haskell-indentation-indent-line )
111
+ (setq-local indent-region-function #'haskell-indentation-indent-region )))
102
112
103
113
;;;### autoload
104
114
(defun turn-on-haskell-indentation ()
@@ -135,7 +145,7 @@ set and deleted as if they were real tabs."
135
145
Called from a program, takes three arguments, START, END and ARG.
136
146
You can remove all indentation from a region by giving a large
137
147
negative ARG. Handles bird style literate Haskell too."
138
- (interactive " r\n p" )
148
+ (interactive " * r\n p" )
139
149
(save-excursion
140
150
(goto-char end)
141
151
(let ((end-marker (point-marker )))
@@ -171,7 +181,7 @@ negative ARG. Handles bird style literate Haskell too."
171
181
172
182
(defun haskell-indentation-newline-and-indent ()
173
183
" Insert newline and indent."
174
- (interactive )
184
+ (interactive " * " )
175
185
; ; On RET (or C-j), we:
176
186
; ; - just jump to the next line if literate haskell, but outside code
177
187
(if (haskell-indentation-bird-outside-code-p)
@@ -224,7 +234,7 @@ Do nothing inside multiline comments and multiline strings.
224
234
Start enumerating the indentation points to the right. The user
225
235
can continue by repeatedly pressing TAB. When there is no more
226
236
indentation points to the right, we switch going to the left."
227
- (interactive )
237
+ (interactive " * " )
228
238
; ; try to repeat
229
239
(when (not (haskell-indentation-indent-line-repeat))
230
240
(setq haskell-indentation-dyn-last-direction nil )
@@ -296,7 +306,7 @@ fixes up only indentation."
296
306
297
307
(defun haskell-indentation-indent-backwards ()
298
308
" Indent the current line to the previous indentation point."
299
- (interactive )
309
+ (interactive " * " )
300
310
(cond
301
311
((and (memq last-command
302
312
'(indent-for-tab-command haskell-indentation-indent-backwards))
@@ -323,7 +333,30 @@ fixes up only indentation."
323
333
(car (haskell-indentation-first-indentation)) cursor-in-whitespace)
324
334
(haskell-indentation-reindent-to pi cursor-in-whitespace))))))
325
335
326
-
336
+ (defun haskell-indentation-common-electric-command (arg )
337
+ " Call `self-insert-command' to insert the character typed ARG times
338
+ and indent when all of the following are true:
339
+ 1) The character is the first non-whitespace character on the line.
340
+ 2) There is only one possible indentation position.
341
+ 3) The variable `electric-indent-mode' or `haskell-indentation-electric-flag'
342
+ is non-nil.
343
+ 4) The point is not in a comment, string, or quasiquote."
344
+ (interactive " *p" )
345
+ (let ((col (current-column ))
346
+ ind)
347
+ (self-insert-command arg)
348
+ (when (and (or haskell-indentation-electric-flag
349
+ electric-indent-mode)
350
+ (= (haskell-indentation-current-indentation)
351
+ col)
352
+ (> arg 0 )
353
+ (not (nth 8 (syntax-ppss )))
354
+ (= 1 (save-excursion
355
+ (move-to-column col)
356
+ (length (setq ind (haskell-indentation-find-indentations))))))
357
+ (haskell-indentation-reindent-to (car ind)))))
358
+
359
+
327
360
; ;----------------------------------------------------------------------------
328
361
; ; Parser Starts Here
329
362
@@ -740,8 +773,7 @@ For example
740
773
(throw 'parse-end nil ))))))
741
774
742
775
(defun haskell-indentation-toplevel-where ()
743
- " Parse 'where' that we may hit as a standalone in module
744
- declaration."
776
+ " Parse 'where' that we may hit as a standalone in module declaration."
745
777
(haskell-indentation-read-next-token)
746
778
747
779
(when (eq current-token 'end-tokens )
0 commit comments