evil-mode '>' evil-shift-left теряет выбор

967
justingordon

Есть ли какая-то причина, по которой злой режим зло-сдвиг влево теряет выбор?

То есть, я бы хотел, чтобы возможность выбора несколько раз нажимать '>' и '<', чтобы сдвигать текст влево и вправо.

Вот реализация ниже. В любом случае, чтобы добавить совет, чтобы изменить это поведение?

зло commands.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))) 
4
Обратите внимание, что даже если это удобная функциональность, нажатие `u` для отмены сделает текст строчными и потребуется 2x отмены, чтобы отменить отступ. Совсем недавно я использовал `.` для выполнения нескольких смен вместо того, чтобы полагаться на выбор. ideasman42 7 лет назад 0

2 ответа на вопрос

3
avsej

This overloads the current behavior to re-select (found at 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)) 
Это качается! Только что попробовал. Любить это! justingordon 9 лет назад 0
0
ivan

Очень похоже на ответ, уже предоставленный @avsej, но используя call-interactivelyгарантирует, что evil-shift- получает все свои аргументы (например COUNT). Например,

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

Таким образом, вы все еще можете делать отступ более чем на одну единицу за раз (например 4>).

Похожие вопросы