aboutsummaryrefslogtreecommitdiff
path: root/evil-commands.el
diff options
context:
space:
mode:
authorAxel Forsman <axelsfor@gmail.com>2023-01-02 20:32:02 +0100
committerAxel Forsman <axelsfor@gmail.com>2023-01-08 22:15:44 +0100
commit84bd6798c70fc43ebdfbb935586bd424e00fe057 (patch)
tree5afc997d85d1fc3057c9e62e652583b294ea8a02 /evil-commands.el
parente324f8daf152301fd59b045da2331da7497aaec4 (diff)
Fix Normal mode "D"/"C" with count
Closes #1277
Diffstat (limited to 'evil-commands.el')
-rw-r--r--evil-commands.el129
1 files changed, 57 insertions, 72 deletions
diff --git a/evil-commands.el b/evil-commands.el
index 6ad86d0..915f26e 100644
--- a/evil-commands.el
+++ b/evil-commands.el
@@ -1484,83 +1484,68 @@ or line COUNT to the bottom of the window."
"Delete text from BEG to END with TYPE.
Save in REGISTER or in the kill-ring with YANK-HANDLER."
(interactive "<R><x><y>")
- (if (and (memq type '(inclusive exclusive))
- (not (evil-visual-state-p))
- (eq 'evil-delete evil-this-operator)
- (save-excursion (goto-char beg) (bolp))
- (save-excursion (goto-char end) (eolp))
- (<= 1 (evil-count-lines beg end)))
- ;; Imitate Vi strangeness: if motion meets above criteria,
- ;; delete linewise. Not for change operator or visual state.
- (let ((new-range (evil-expand beg end 'line)))
- (evil-delete (nth 0 new-range) (nth 1 new-range) 'line register yank-handler))
- (unless register
- (let ((text (filter-buffer-substring beg end)))
- (unless (string-match-p "\n" text)
- ;; set the small delete register
- (evil-set-register ?- text))))
- (let ((evil-was-yanked-without-register nil))
- (evil-yank beg end type register yank-handler))
- (cond
- ((eq type 'block)
- (evil-apply-on-block #'delete-region beg end nil))
- ((and (eq type 'line)
- (= end (point-max))
- (or (= beg end)
- (/= (char-before end) ?\n))
- (/= beg (point-min))
- (= (char-before beg) ?\n))
- (delete-region (1- beg) end))
- (t
- (delete-region beg end)))
- (when (and (called-interactively-p 'any)
- (eq type 'line))
- (evil-first-non-blank)
- (when (and (not evil-start-of-line)
- evil-operator-start-col
- ;; Special exceptions to ever saving column:
- (not (memq evil-this-motion '(evil-forward-word-begin
- evil-forward-WORD-begin))))
- (move-to-column evil-operator-start-col)))))
+ (when (and (memq type '(inclusive exclusive))
+ (not (evil-visual-state-p))
+ (eq 'evil-delete evil-this-operator)
+ (save-excursion (goto-char beg) (bolp))
+ (save-excursion (goto-char end) (eolp))
+ (<= 1 (evil-count-lines beg end)))
+ ;; Imitate Vi strangeness: if motion meets above criteria,
+ ;; delete linewise. Not for change operator or visual state.
+ (let ((new-range (evil-line-expand beg end)))
+ (setq beg (car new-range)
+ end (cadr new-range)
+ type 'line)))
+ (unless register
+ (let ((text (filter-buffer-substring beg end)))
+ (unless (string-match-p "\n" text)
+ ;; set the small delete register
+ (evil-set-register ?- text))))
+ (let ((evil-was-yanked-without-register nil))
+ (evil-yank beg end type register yank-handler))
+ (cond
+ ((eq type 'block)
+ (evil-apply-on-block #'delete-region beg end nil))
+ ((and (eq type 'line)
+ (= end (point-max))
+ (or (= beg end)
+ (/= (char-before end) ?\n))
+ (/= beg (point-min))
+ (= (char-before beg) ?\n))
+ (delete-region (1- beg) end))
+ (t (delete-region beg end)))
+ (when (and (eq type 'line)
+ (called-interactively-p 'any))
+ (evil-first-non-blank)
+ (when (and (not evil-start-of-line)
+ evil-operator-start-col
+ ;; Special exceptions to ever saving column:
+ (not (memq evil-this-motion '(evil-forward-word-begin
+ evil-forward-WORD-begin))))
+ (move-to-column evil-operator-start-col))))
(evil-define-operator evil-delete-line (beg end type register yank-handler)
"Delete to end of line."
- :motion nil
- :keep-visual t
+ :motion evil-end-of-line-or-visual-line
(interactive "<R><x>")
- ;; act linewise in Visual state
- (let* ((beg (or beg (point)))
- (end (or end beg))
- (visual-line-mode (and evil-respect-visual-line-mode
- visual-line-mode))
- (line-end (if visual-line-mode
- (save-excursion
- (end-of-visual-line)
- (point))
- (line-end-position))))
- (when (evil-visual-state-p)
- (unless (memq type '(line screen-line block))
- (let ((range (evil-expand beg end
- (if visual-line-mode
- 'screen-line
- 'line))))
- (setq beg (evil-range-beginning range)
- end (evil-range-end range)
- type (evil-type range))))
- (evil-exit-visual-state))
- (cond
- ((eq type 'block)
- ;; equivalent to $d, i.e., we use the block-to-eol selection and
+ ;; Act linewise in Visual state
+ (when (and (evil-visual-state-p) (eq type 'inclusive))
+ (let ((range (evil-expand
+ beg end
+ (if (and evil-respect-visual-line-mode visual-line-mode)
+ 'screen-line 'line))))
+ (setq beg (car range)
+ end (cadr range)
+ type (evil-type range))))
+ (if (eq type 'block)
+ ;; Equivalent to $d, i.e., we use the block-to-eol selection and
;; call `evil-delete'. In this case we fake the call to
;; `evil-end-of-line' by setting `temporary-goal-column' and
;; `last-command' appropriately as `evil-end-of-line' would do.
(let ((temporary-goal-column most-positive-fixnum)
(last-command 'next-line))
- (evil-delete beg end 'block register yank-handler)))
- ((memq type '(line screen-line))
- (evil-delete beg end type register yank-handler))
- (t
- (evil-delete beg line-end type register yank-handler)))))
+ (evil-delete beg end 'block register yank-handler))
+ (evil-delete beg end type register yank-handler)))
(evil-define-operator evil-delete-whole-line
(beg end type register yank-handler)
@@ -1717,9 +1702,9 @@ of the block."
"Change to end of line, or change whole line if characterwise visual mode."
:motion evil-end-of-line-or-visual-line
(interactive "<R><x><y>")
- (if (and (evil-visual-state-p) (eq 'inclusive type))
- (cl-destructuring-bind (beg* end* &rest) (evil-line-expand beg end)
- (evil-change-whole-line beg* end* register yank-handler))
+ (if (and (evil-visual-state-p) (eq type 'inclusive))
+ (cl-destructuring-bind (beg end &rest) (evil-line-expand beg end)
+ (evil-change-whole-line beg end register yank-handler))
(evil-change beg end type register yank-handler #'evil-delete-line)))
(evil-define-operator evil-change-whole-line
@@ -1728,7 +1713,7 @@ of the block."
:motion evil-line-or-visual-line
:type line
(interactive "<r><x>")
- (evil-change beg end 'line register yank-handler #'evil-delete-whole-line))
+ (evil-change beg end 'line register yank-handler))
(evil-define-command evil-copy (beg end address)
"Copy lines in BEG END below line given by ADDRESS."