evil-mode '>' evil-shift-left가 선택을 잃습니다.

evil-mode '>' evil-shift-left가 선택을 잃습니다.

Evil 모드 Evil-Shift-Left가 선택을 잃는 이유가 있나요?

즉, 선택 항목에서 '>' 및 '<'를 여러 번 눌러 텍스트를 왼쪽과 오른쪽으로 이동할 수 있는 기능을 원합니다.

아래 구현은 다음과 같습니다. 어쨌든 이 동작을 변경하기 위한 조언을 추가하시겠습니까?

악마 명령.el

(evil-define-operator evil-shift-right (beg end &optional count)
  "Shift text from BEG to END to the right.
The text is shifted to the nearest multiple of `evil-shift-width'
\(the rounding can be disabled by setting `evil-shift-round').
See also `evil-shift-left'."
  :type line
  (interactive "<r><vc>")
  (let ((beg (set-marker (make-marker) beg))
        (end (set-marker (make-marker) end)))
    (dotimes (i (or count 1))
      (if (not evil-shift-round)
          (indent-rigidly beg end evil-shift-width)
        (let* ((indent
                (save-excursion
                  (goto-char beg)
                  (evil-move-beginning-of-line nil)
                  (while (and (< (point) end) (looking-at "[ \t]*$"))
                    (forward-line))
                  (if (> (point) end) 0
                    (current-indentation))))
               (offset (- evil-shift-width (mod indent evil-shift-width))))
          (indent-rigidly beg end offset))))
    (set-marker beg nil)
    (set-marker end nil)))

답변1

이는 다시 선택하기 위한 현재 동작을 오버로드합니다(다음 위치에서 확인 가능).djoyner/dotfiles/emacs/lisp/evil-config.el#L36-L40).

; Overload shifts so that they don't lose the selection
(define-key evil-visual-state-map (kbd ">") 'djoyner/evil-shift-right-visual)
(define-key evil-visual-state-map (kbd "<") 'djoyner/evil-shift-left-visual)
(define-key evil-visual-state-map [tab] 'djoyner/evil-shift-right-visual)
(define-key evil-visual-state-map [S-tab] 'djoyner/evil-shift-left-visual)

(defun djoyner/evil-shift-left-visual ()
  (interactive)
  (evil-shift-left (region-beginning) (region-end))
  (evil-normal-state)
  (evil-visual-restore))

(defun djoyner/evil-shift-right-visual ()
  (interactive)
  (evil-shift-right (region-beginning) (region-end))
  (evil-normal-state)
  (evil-visual-restore))

답변2

@avsej가 이미 제공한 답변과 매우 유사하지만 을 사용하면 call-interactivelyevil-shift-{left,right}가 모든 인수(예: COUNT)를 수신하도록 보장됩니다. 예를 들어,

(defun my-visual-shift-left ()
  (interactive)
  (call-interactively 'evil-shift-left)
  (evil-normal-state)
  (evil-visual-restore))

이렇게 하면 한 번에 두 단위 이상 들여쓰기할 수 있습니다(예 4>: ).

관련 정보