diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f50a8cce3..479a91f66 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -127,36 +127,61 @@ line with a linewise comment.") (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) ;; Make o/O continue comments - (defun +evil*insert-newline-above-and-respect-comments (orig-fn) - (if (or (not +evil-want-o/O-to-continue-comments) - (evil-insert-state-p)) - (funcall orig-fn) - (evil-narrow-to-field - (if (nth 4 (syntax-ppss (line-end-position))) - (evil-save-goal-column - (comment-beginning) - ;; Use a dummy char to force correct indentation - (insert "_") - (save-excursion (call-interactively #'comment-indent-new-line)) - (delete-char -1)) - (evil-move-beginning-of-line) - (insert (if use-hard-newlines hard-newline "\n")) - (forward-line -1) - (back-to-indentation))))) - (advice-add #'evil-insert-newline-above :around #'+evil*insert-newline-above-and-respect-comments) + (defun +evil*insert-newline-above-and-respect-comments (orig-fn count) + (cl-letf* ((old-insert-newline-above (symbol-function 'evil-insert-newline-above)) + ((symbol-function 'evil-insert-newline-above) + (lambda () + (if (or (not +evil-want-o/O-to-continue-comments) + (evil-insert-state-p)) + (funcall old-insert-newline-above) + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (if (save-excursion (nth 4 (syntax-ppss pos))) + (evil-save-goal-column + (setq evil-auto-indent nil) + (goto-char pos) + (let ((ws (abs (skip-chars-backward " \t")))) + ;; FIXME oh god why + (save-excursion + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line)) + (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) + (eq (char-after) ?/)) + (insert "*")) + (insert + (make-string (max 0 (+ ws (skip-chars-backward " \t"))) + 32))) + (insert (make-string (max 1 ws) 32)))) + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation)))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count)))) + (advice-add #'evil-open-above :around #'+evil*insert-newline-above-and-respect-comments) - (defun +evil*insert-newline-below-and-respect-comments (orig-fn) - (if (or (not +evil-want-o/O-to-continue-comments) - (evil-insert-state-p)) - (funcall orig-fn) - (let ((comment-p (nth 4 (syntax-ppss (line-end-position))))) - (evil-narrow-to-field - (evil-move-end-of-line) - (if comment-p - (comment-indent-new-line) - (insert (if use-hard-newlines hard-newline "\n")) - (back-to-indentation)))))) - (advice-add #'evil-insert-newline-below :around #'+evil*insert-newline-below-and-respect-comments) + (defun +evil*insert-newline-below-and-respect-comments (orig-fn count) + (cl-letf* ((old-insert-newline-below (symbol-function 'evil-insert-newline-below)) + ((symbol-function 'evil-insert-newline-below) + (lambda () + (if (or (not +evil-want-o/O-to-continue-comments) + (evil-insert-state-p)) + (funcall old-insert-newline-below) + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (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))) + (t + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation))))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count)))) + (advice-add #'evil-open-below :around #'+evil*insert-newline-below-and-respect-comments) ;; --- custom interactive codes ----------- ;; These arg types will highlight matches in the current buffer