feature/evil: fix o/O indentation in haskell-mode

Refactors +evil*insert-newline-*-and-respect-comments advice. This also
fixes an issue where o uses haskell's line indenter in haskell-mode,
which is naive. Instead, we use haskell-indentation-newline-and-indent,
which is smarter.

This is a dirty dirty hack. May Nyarlathotep have mercy on our souls.

Reported by @ar1a
This commit is contained in:
Henrik Lissner 2018-10-18 12:17:30 -04:00
parent 09f9e12638
commit 2ca2050c6d
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -1,41 +1,11 @@
;;; feature/evil/autoload/advice.el -*- lexical-binding: t; -*- ;;; feature/evil/autoload/advice.el -*- lexical-binding: t; -*-
;;;###autoload (defun +evil--insert-newline (&optional above noextranewline)
(defun +evil*insert-newline-below-and-respect-comments (orig-fn count)
(if (or (not +evil-want-o/O-to-continue-comments)
(not (eq this-command 'evil-open-below))
(evil-insert-state-p))
(funcall orig-fn count)
(cl-letf (((symbol-function 'evil-insert-newline-below)
(lambda ()
(let ((pos (save-excursion (beginning-of-line-text) (point))) (let ((pos (save-excursion (beginning-of-line-text) (point)))
comment-auto-fill-only-comments) comment-auto-fill-only-comments)
(evil-narrow-to-field
(evil-move-end-of-line)
(require 'smartparens) (require 'smartparens)
(cond ((sp-point-in-comment pos)
(setq evil-auto-indent nil)
(if comment-line-break-function
(funcall comment-line-break-function)
(comment-indent-new-line)))
(t
(insert (if use-hard-newlines hard-newline "\n"))
(back-to-indentation))))))))
(let ((evil-auto-indent evil-auto-indent))
(funcall orig-fn count)))))
;;;###autoload
(defun +evil*insert-newline-above-and-respect-comments (orig-fn count)
(if (or (not +evil-want-o/O-to-continue-comments)
(not (eq this-command 'evil-open-above))
(evil-insert-state-p))
(funcall orig-fn count)
(cl-letf (((symbol-function 'evil-insert-newline-above)
(lambda ()
(let ((pos (save-excursion (beginning-of-line-text) (point)))
comment-auto-fill-only-comments)
(evil-narrow-to-field (evil-narrow-to-field
(require 'smartparens) (if above
(if (save-excursion (nth 4 (sp--syntax-ppss pos))) (if (save-excursion (nth 4 (sp--syntax-ppss pos)))
(evil-save-goal-column (evil-save-goal-column
(setq evil-auto-indent nil) (setq evil-auto-indent nil)
@ -56,7 +26,41 @@
(evil-move-beginning-of-line) (evil-move-beginning-of-line)
(insert (if use-hard-newlines hard-newline "\n")) (insert (if use-hard-newlines hard-newline "\n"))
(forward-line -1) (forward-line -1)
(back-to-indentation))
(evil-move-end-of-line)
(cond ((sp-point-in-comment pos)
(setq evil-auto-indent nil)
(if comment-line-break-function
(funcall comment-line-break-function)
(comment-indent-new-line)))
;; Find a better way to do this
((and (eq major-mode 'haskell-mode)
(fboundp 'haskell-indentation-newline-and-indent))
(setq evil-auto-indent nil)
(haskell-indentation-newline-and-indent))
(t
(insert (if use-hard-newlines hard-newline "\n"))
(back-to-indentation))))))) (back-to-indentation)))))))
;;;###autoload
(defun +evil*insert-newline-below-and-respect-comments (orig-fn count)
(if (or (not +evil-want-o/O-to-continue-comments)
(not (eq this-command 'evil-open-below))
(evil-insert-state-p))
(funcall orig-fn count)
(cl-letf (((symbol-function 'evil-insert-newline-below)
(lambda () (+evil--insert-newline))))
(let ((evil-auto-indent evil-auto-indent))
(funcall orig-fn count)))))
;;;###autoload
(defun +evil*insert-newline-above-and-respect-comments (orig-fn count)
(if (or (not +evil-want-o/O-to-continue-comments)
(not (eq this-command 'evil-open-above))
(evil-insert-state-p))
(funcall orig-fn count)
(cl-letf (((symbol-function 'evil-insert-newline-above)
(lambda () (+evil--insert-newline 'above))))
(let ((evil-auto-indent evil-auto-indent)) (let ((evil-auto-indent evil-auto-indent))
(funcall orig-fn count))))) (funcall orig-fn count)))))