@@ -1436,23 +1436,37 @@ the left edge."
1436
1436
(evil-yank-characters beg end register yank-handler)
1437
1437
(goto-char beg)))))
1438
1438
1439
- (evil-define-operator evil-yank-line (beg end type register)
1440
- "Save whole lines into the kill-ring."
1441
- :motion evil-line-or-visual-line
1442
- :move-point nil
1443
- (interactive "<R><x>")
1439
+ (defun evil-expand-line-for-line-based-operators (beg end type)
1440
+ "Expand to line when in visual mode possibly changing BEG, END and TYPE.
1441
+ Avoids double expansion for line based commands like 'V' or 'D'."
1444
1442
(when (evil-visual-state-p)
1445
1443
(unless (memq type '(line block screen-line))
1446
- (let ((range (evil-expand beg end
1447
- (if (and evil-respect-visual-line-mode
1448
- visual-line-mode)
1449
- 'screen-line
1450
- 'line))))
1444
+ ;; Subtract 1 from end to avoid expanding to the next line
1445
+ ;; when \n is part of the visually selected region.
1446
+ ;; If removed (evil-expand beg end 'line)
1447
+ ;; will expand to the end of the next line instead of the current
1448
+ ;; line which will cause line expanding commands like 'Y' to
1449
+ ;; misbehave when used in visual state.
1450
+ (when (eq ?\n (char-before end))
1451
+ (cl-decf end))
1452
+ (let ((range (evil-expand beg end (if (and evil-respect-visual-line-mode
1453
+ visual-line-mode)
1454
+ 'screen-line
1455
+ 'line))))
1451
1456
(setq beg (evil-range-beginning range)
1452
1457
end (evil-range-end range)
1453
1458
type (evil-type range))))
1454
1459
(evil-exit-visual-state))
1455
- (evil-yank beg end type register))
1460
+ (list beg end type))
1461
+
1462
+ (evil-define-operator evil-yank-line (beg end type register)
1463
+ "Save whole lines into the kill-ring."
1464
+ :motion evil-line-or-visual-line
1465
+ :move-point nil
1466
+ (interactive "<R><x>")
1467
+ (cl-destructuring-bind
1468
+ (beg end type) (evil-expand-line-for-line-based-operators beg end type)
1469
+ (evil-yank beg end type register)))
1456
1470
1457
1471
(evil-define-operator evil-delete (beg end type register yank-handler)
1458
1472
"Delete text from BEG to END with TYPE.
@@ -1502,24 +1516,17 @@ Save in REGISTER or in the kill-ring with YANK-HANDLER."
1502
1516
"Delete to end of line."
1503
1517
:motion evil-end-of-line-or-visual-line
1504
1518
(interactive "<R><x>")
1505
- ;; Act linewise in Visual state
1506
- (when (and (evil-visual-state-p) (eq type 'inclusive))
1507
- (let ((range (evil-expand
1508
- beg end
1509
- (if (and evil-respect-visual-line-mode visual-line-mode)
1510
- 'screen-line 'line))))
1511
- (setq beg (car range)
1512
- end (cadr range)
1513
- type (evil-type range))))
1514
- (if (eq type 'block)
1515
- ;; Equivalent to $d, i.e., we use the block-to-eol selection and
1516
- ;; call `evil-delete'. In this case we fake the call to
1517
- ;; `evil-end-of-line' by setting `temporary-goal-column' and
1518
- ;; `last-command' appropriately as `evil-end-of-line' would do.
1519
- (let ((temporary-goal-column most-positive-fixnum)
1520
- (last-command 'next-line))
1521
- (evil-delete beg end 'block register yank-handler))
1522
- (evil-delete beg end type register yank-handler)))
1519
+ (cl-destructuring-bind
1520
+ (beg end type) (evil-expand-line-for-line-based-operators beg end type)
1521
+ (if (eq type 'block)
1522
+ ;; Equivalent to $d, i.e., we use the block-to-eol selection and
1523
+ ;; call `evil-delete'. In this case we fake the call to
1524
+ ;; `evil-end-of-line' by setting `temporary-goal-column' and
1525
+ ;; `last-command' appropriately as `evil-end-of-line' would do.
1526
+ (let ((temporary-goal-column most-positive-fixnum)
1527
+ (last-command 'next-line))
1528
+ (evil-delete beg end 'block register yank-handler))
1529
+ (evil-delete beg end type register yank-handler))))
1523
1530
1524
1531
(evil-define-operator evil-delete-whole-line
1525
1532
(beg end type register yank-handler)
@@ -1672,7 +1679,8 @@ of the block."
1672
1679
:motion evil-end-of-line-or-visual-line
1673
1680
(interactive "<R><x><y>")
1674
1681
(if (and (evil-visual-state-p) (eq type 'inclusive))
1675
- (cl-destructuring-bind (beg end &rest) (evil-line-expand beg end)
1682
+ (cl-destructuring-bind
1683
+ (beg end _type) (evil-expand-line-for-line-based-operators beg end type)
1676
1684
(evil-change-whole-line beg end register yank-handler))
1677
1685
(evil-change beg end type register yank-handler #'evil-delete-line)))
1678
1686
0 commit comments