The attached patch fixes this problem. It refines the
'haskell-indent-start-of-def' function, which previously searched for
the beginning of a definition by the first non-comment character after
searching backwards for an empty line. The code now searches backwards
for the furthest away line which is nonempty with zero indentation.
--
-David House, [EMAIL PROTECTED]
*** /home/david/sandbox/haskell-mode-2.1/haskell-indent.el 2005-11-07
20:04:15.000000000 +0000
--- /home/david/hs/emacs/haskell-indent.el 2006-12-28 19:50:17.000000000
+0000
***************
*** 320,327 ****
(defun haskell-indent-start-of-def ()
"Return the position of the start of a definition.
! It is at the first character which is not in a comment after nearest
! preceding non-empty line."
(save-excursion
(let (start-code
(save-point (point)))
--- 320,327 ----
(defun haskell-indent-start-of-def ()
"Return the position of the start of a definition.
! It is at the first character which is not in a comment on nearest
! preceding 0-indentation line."
(save-excursion
(let (start-code
(save-point (point)))
***************
*** 330,345 ****
(haskell-indent-within-literate-code)))
(setq start-code (1+ start-code))
(setq start-code (point-min)))
! ;; go backward until the first preceding empty line
(haskell-indent-forward-line -1)
! (while (and (not (haskell-indent-empty-line-p))
(> (point) start-code)
(= 0 (haskell-indent-forward-line -1))))
- ;; go forward after the empty line
- (if (haskell-indent-empty-line-p)
- (haskell-indent-forward-line 1))
- (setq start-code (point))
;; find the first line of code which is not a comment
(forward-comment (point-max))
(if (> (point) save-point)
start-code
--- 330,344 ----
(haskell-indent-within-literate-code)))
(setq start-code (1+ start-code))
(setq start-code (point-min)))
! ;; go backward until the first 0-indentation line
(haskell-indent-forward-line -1)
! (while (and (or
! (/= 0 (haskell-indent-current-indentation))
! (haskell-indent-empty-line-p))
(> (point) start-code)
(= 0 (haskell-indent-forward-line -1))))
;; find the first line of code which is not a comment
+ (setq start-code (point))
(forward-comment (point-max))
(if (> (point) save-point)
start-code