aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--evil-commands.el72
-rw-r--r--evil-common.el7
-rw-r--r--evil-core.el276
-rw-r--r--evil-jumps.el56
-rw-r--r--evil-states.el19
-rw-r--r--evil-tests.el25
6 files changed, 193 insertions, 262 deletions
diff --git a/evil-commands.el b/evil-commands.el
index 03fd063..3f9b5ab 100644
--- a/evil-commands.el
+++ b/evil-commands.el
@@ -706,29 +706,27 @@ Movement is restricted to the current line unless `evil-cross-lines' is non-nil.
(setq count (or count 1))
(let ((fwd (> count 0))
(visual (and evil-respect-visual-line-mode
- visual-line-mode)))
+ visual-line-mode))
+ case-fold-search)
(setq evil-last-find (list #'evil-find-char char fwd))
(when fwd (evil-forward-char 1 evil-cross-lines))
- (let ((case-fold-search nil))
- (unless (prog1
- (search-forward (char-to-string char)
- (cond (evil-cross-lines
- nil)
- ((and fwd visual)
- (save-excursion
- (end-of-visual-line)
- (point)))
- (fwd
- (line-end-position))
- (visual
- (save-excursion
- (beginning-of-visual-line)
- (point)))
- (t
- (line-beginning-position)))
- t count)
- (when fwd (backward-char)))
- (user-error "Can't find %c" char)))))
+ (unless (prog1
+ (search-forward
+ (char-to-string char)
+ (cond (evil-cross-lines nil)
+ ((and fwd visual)
+ (save-excursion
+ (end-of-visual-line)
+ (point)))
+ (fwd (line-end-position))
+ (visual
+ (save-excursion
+ (beginning-of-visual-line)
+ (point)))
+ (t (line-beginning-position)))
+ t count)
+ (when fwd (backward-char)))
+ (user-error "Can't find `%c'" char))))
(evil-define-motion evil-find-char-backward (count char)
"Move to the previous COUNT'th occurrence of CHAR."
@@ -4476,13 +4474,8 @@ and open a new buffer or edit a certain FILE."
(if evil-split-window-below 'below 'above))))
(when (and (not count) evil-auto-balance-windows)
(balance-windows (window-parent)))
- (let ((buffer (generate-new-buffer "*new*")))
- (set-window-buffer new-window buffer)
- (select-window new-window)
- (with-current-buffer buffer
- (funcall (default-value 'major-mode))))
- (when file
- (evil-edit file))))
+ (select-window new-window)
+ (evil-buffer-new file)))
(evil-define-command evil-window-vnew (count file)
"Split the current window vertically
@@ -4493,25 +4486,18 @@ and open a new buffer name or edit a certain FILE."
(if evil-vsplit-window-right 'right 'left))))
(when (and (not count) evil-auto-balance-windows)
(balance-windows (window-parent)))
- (let ((buffer (generate-new-buffer "*new*")))
- (set-window-buffer new-window buffer)
- (select-window new-window)
- (with-current-buffer buffer
- (funcall (default-value 'major-mode))))
- (when file
- (evil-edit file))))
-
-(evil-define-command evil-buffer-new (count file)
- "Create a new buffer replacing the current window, optionally
- editing a certain FILE"
+ (select-window new-window)
+ (evil-buffer-new file)))
+
+(evil-define-command evil-buffer-new (&optional file)
+ "Edit a new unnamed buffer or FILE."
:repeat nil
- (interactive "P<f>")
+ (interactive "<f>")
(if file
(evil-edit file)
(let ((buffer (generate-new-buffer "*new*")))
- (set-window-buffer nil buffer)
- (with-current-buffer buffer
- (funcall (default-value 'major-mode))))))
+ (set-buffer-major-mode buffer)
+ (set-window-buffer nil buffer))))
(evil-define-command evil-window-increase-height (count)
"Increase current window height by COUNT."
diff --git a/evil-common.el b/evil-common.el
index fef5b18..bc76653 100644
--- a/evil-common.el
+++ b/evil-common.el
@@ -410,7 +410,7 @@ See also `evil-get-command-property'."
To set multiple properties at once, see
`evil-set-command-properties' and `evil-add-command-properties'."
(evil-put-property 'evil-command-properties command property value))
-(defalias 'evil-put-command-property 'evil-set-command-property)
+(defalias 'evil-put-command-property #'evil-set-command-property)
(defun evil-add-command-properties (command &rest properties)
"Add PROPERTIES to COMMAND.
@@ -3625,7 +3625,7 @@ make the entries undoable as a single action. See
"Execute BODY with enabled undo.
If undo is disabled in the current buffer, the undo information
is stored in `evil-temporary-undo' instead of `buffer-undo-list'."
- (declare (debug t))
+ (declare (indent defun) (debug t))
(let ((undo-list (make-symbol "undo-list")))
`(let ((,undo-list buffer-undo-list)
(evil-undo-system evil-undo-system))
@@ -3645,7 +3645,7 @@ is stored in `evil-temporary-undo' instead of `buffer-undo-list'."
(defmacro evil-with-single-undo (&rest body)
"Execute BODY as a single undo step."
- (declare (debug t))
+ (declare (indent defun) (debug t))
`(let (evil-undo-list-pointer)
(evil-with-undo
(evil-start-undo-step)
@@ -4000,7 +4000,6 @@ should be left-aligned for left justification."
;;; View helper
(defvar-local evil-list-view-select-action nil)
-(put 'evil-list-view-select-action 'permanent-local t)
(define-derived-mode evil-list-view-mode tabulated-list-mode
"Evil List View"
diff --git a/evil-core.el b/evil-core.el
index 62ec6ab..d773b2e 100644
--- a/evil-core.el
+++ b/evil-core.el
@@ -104,107 +104,90 @@
;; ("visual"), Replace state ("replace"), Operator-Pending state
;; ("operator"), Motion state ("motion") and Emacs state ("emacs").
-(require 'evil-common)
-
;;; Code:
+(require 'advice)
+(require 'evil-common)
+
(declare-function evil-emacs-state-p "evil-states")
(declare-function evil-ex-p "evil-ex")
-(defvar evil-mode-buffers)
(define-minor-mode evil-local-mode
"Minor mode for setting up Evil in a single buffer."
:init-value nil
- (cond
- ((evil-disabled-buffer-p)
- ;; Don't leave the mode variable on in buffers where evil disabled, because
- ;; functions that check this variable will get an incorrect result (e.g.,
- ;; evil-refresh-cursor).
- (setq evil-local-mode nil))
- (evil-local-mode
- (setq emulation-mode-map-alists
- (evil-concat-lists '(evil-mode-map-alist)
- emulation-mode-map-alists))
- (evil-initialize-local-keymaps)
- ;; restore the proper value of `major-mode' in Fundamental buffers
- (when (eq major-mode 'turn-on-evil-mode)
- (setq major-mode 'fundamental-mode))
- (when (minibufferp)
- (setq-local evil-default-state 'insert)
- (setq-local evil-echo-state nil))
- (setq evil-input-method current-input-method)
- ;; The initial state is usually setup by `evil-initialize' when
- ;; the major-mode in a buffer changes. This preliminary
- ;; initialization is only for the case when `evil-local-mode' is
- ;; called directly for the first time in a buffer.
- (unless evil-state (evil-initialize-state))
- (add-hook 'input-method-activate-hook 'evil-activate-input-method t t)
- (add-hook 'input-method-deactivate-hook 'evil-deactivate-input-method t t)
- (add-hook 'activate-mark-hook 'evil-visual-activate-hook nil t)
- (add-hook 'pre-command-hook 'evil-repeat-pre-hook)
- (add-hook 'post-command-hook 'evil-repeat-post-hook))
- (t
+ (if evil-local-mode
+ (progn
+ (cl-pushnew 'evil-mode-map-alist emulation-mode-map-alists)
+ (evil-initialize-local-keymaps)
+ (when (minibufferp)
+ (setq-local evil-default-state 'insert
+ evil-echo-state nil))
+ (setq evil-input-method current-input-method)
+ (evil-initialize-state)
+ (add-hook 'input-method-activate-hook #'evil-activate-input-method t t)
+ (add-hook 'input-method-deactivate-hook #'evil-deactivate-input-method t t)
+ (add-hook 'activate-mark-hook 'evil-visual-activate-hook nil t)
+ ;; FIXME: Add these hooks buffer-locally
+ (add-hook 'pre-command-hook 'evil-repeat-pre-hook)
+ (add-hook 'post-command-hook 'evil-repeat-post-hook))
(evil-refresh-mode-line)
(remove-hook 'activate-mark-hook 'evil-visual-activate-hook t)
- (remove-hook 'input-method-activate-hook 'evil-activate-input-method t)
- (remove-hook 'input-method-deactivate-hook 'evil-deactivate-input-method t)
- (evil-change-state nil))))
+ (remove-hook 'input-method-activate-hook #'evil-activate-input-method t)
+ (remove-hook 'input-method-deactivate-hook #'evil-deactivate-input-method t)
+ (evil-change-state nil)))
;; Make the variable permanent local. This is particular useful in
;; conjunction with nXhtml/mumamo because mumamo does not touch these
;; variables.
(put 'evil-local-mode 'permanent-local t)
-(defun turn-on-evil-mode (&optional arg)
+(defun turn-on-evil-mode ()
"Turn on Evil in the current buffer."
(interactive)
- (evil-local-mode (or arg 1)))
+ (evil-local-mode))
-(defun turn-off-evil-mode (&optional arg)
+(defun turn-off-evil-mode ()
"Turn off Evil in the current buffer."
(interactive)
- (evil-local-mode (or arg -1)))
+ (evil-local-mode -1))
;; The function `evil-initialize' should only be used to initialize
;; `evil-local-mode' from the globalized minor-mode `evil-mode'. It is
;; called whenever evil is enabled in a buffer for the first time or
-;; when evil is active and the major-mode of the buffer changes. In
-;; addition to enabling `evil-local-mode' it also sets the initial
-;; evil-state according to the major-mode.
+;; when evil is active and the major-mode of the buffer changes.
(defun evil-initialize ()
"Enable Evil in the current buffer, if appropriate.
-To enable Evil globally, do (evil-mode 1)."
- (unless (and (minibufferp) (not evil-want-minibuffer))
- (evil-local-mode 1)
- (evil-initialize-state)))
+To enable Evil globally, do (evil-mode)."
+ (if evil-local-mode
+ ;; Set Evil state according to new major-mode
+ (evil-initialize-state)
+ (or (and (minibufferp) (not evil-want-minibuffer))
+ (evil-disabled-buffer-p)
+ (evil-local-mode))))
+
+(defalias 'evil--fundamental-mode #'fundamental-mode)
;;;###autoload (autoload 'evil-mode "evil" nil t)
(define-globalized-minor-mode evil-mode
evil-local-mode evil-initialize
- :group 'evil)
-
-;; No hooks are run in Fundamental buffers, so other measures are
-;; necessary to initialize Evil in these buffers. When Evil is
-;; enabled globally, the default value of `major-mode' is set to
-;; `turn-on-evil-mode', so that Evil is enabled in Fundamental
-;; buffers as well. Then, the buffer-local value of `major-mode' is
-;; changed back to `fundamental-mode'. (Since the `evil-mode' function
-;; is created by a macro, we use `defadvice' to augment it.)
-(defadvice evil-mode (after start-evil activate)
- "Enable Evil in Fundamental mode."
+ :group 'evil
+ ;; Hooks used to not run in Fundamental buffers (bug#23827), so
+ ;; other measures are necessary to initialize Evil there. When Evil
+ ;; is enabled globally, the default value of `major-mode' is set to
+ ;; the `evil--fundamental-mode' alias, sidestepping the restriction.
(if evil-mode
(progn
- (when (eq (default-value 'major-mode) 'fundamental-mode)
- ;; changed back by `evil-local-mode'
- (setq-default major-mode 'turn-on-evil-mode))
+ (and (eval-when-compile (version< emacs-version "26.1"))
+ (eq (default-value 'major-mode) 'fundamental-mode)
+ (setq-default major-mode 'evil--fundamental-mode))
(ad-enable-regexp "^evil")
(ad-activate-regexp "^evil")
- (with-no-warnings (evil-esc-mode 1)))
- (when (eq (default-value 'major-mode) 'turn-on-evil-mode)
+ (evil-esc-mode 1))
+ (when (eq (default-value 'major-mode) 'evil--fundamental-mode)
(setq-default major-mode 'fundamental-mode))
(ad-disable-regexp "^evil")
(ad-update-regexp "^evil")
- (with-no-warnings (evil-esc-mode -1))))
+ (evil-esc-mode -1)))
(defun evil-change-state (state &optional message)
"Change the state to STATE.
@@ -218,13 +201,13 @@ If STATE is nil, disable all states."
"Save the current state; execute BODY; restore the state."
(declare (indent defun)
(debug t))
- `(let* ((evil-state evil-state)
- (evil-previous-state evil-previous-state)
- (evil-previous-state-alist (copy-tree evil-previous-state-alist))
- (evil-next-state evil-next-state)
- (old-state evil-state)
- (inhibit-quit t)
- (buf (current-buffer)))
+ `(let ((evil-state evil-state)
+ (evil-previous-state evil-previous-state)
+ (evil-previous-state-alist (copy-tree evil-previous-state-alist))
+ (evil-next-state evil-next-state)
+ (old-state evil-state)
+ (inhibit-quit t)
+ (buf (current-buffer)))
(unwind-protect
(progn ,@body)
(when (buffer-live-p buf)
@@ -241,53 +224,48 @@ Restore the previous state afterwards."
(evil-change-state ',state)
,@body)))
-(defun evil-initializing-p (&optional buffer)
- "Whether Evil is in the process of being initialized."
- (memq (or buffer (current-buffer)) evil-mode-buffers))
-
(defun evil-initialize-state (&optional state buffer)
"Set up the initial state for BUFFER.
BUFFER defaults to the current buffer.
Uses STATE if specified, or calls `evil-initial-state-for-buffer'.
See also `evil-set-initial-state'."
(with-current-buffer (or buffer (current-buffer))
- (if state (evil-change-state state)
- (evil-change-to-initial-state buffer))))
+ (evil-change-state
+ (or state (evil-initial-state-for-buffer buffer)))))
(put 'evil-initialize-state 'permanent-local-hook t)
(defun evil-initial-state-for-buffer-name (&optional name default)
"Return the initial Evil state to use for a buffer with name NAME.
Matches the name against the regular expressions in
`evil-buffer-regexps'. If none matches, returns DEFAULT."
- (let ((name (if (stringp name) name (buffer-name name)))
- regexp state)
- (when (stringp name)
+ (let ((name (if (stringp name) name (buffer-name name))))
+ (when name
(catch 'done
(dolist (entry evil-buffer-regexps default)
- (setq regexp (car entry)
- state (cdr entry))
- (when (string-match regexp name)
- (throw 'done state)))))))
+ (let ((regexp (car entry))
+ (state (cdr entry)))
+ (when (string-match-p regexp name)
+ (throw 'done state))))))))
(defun evil-disabled-buffer-p (&optional buffer)
"Whether Evil should be disabled in BUFFER."
(null (evil-initial-state-for-buffer-name buffer 'undefined)))
-(defun evil-initial-state-for-buffer (&optional buffer default)
+(defun evil-initial-state-for-buffer (&optional buffer)
"Return the initial Evil state to use for BUFFER.
BUFFER defaults to the current buffer. Returns DEFAULT
if no initial state is associated with BUFFER.
See also `evil-initial-state'."
(with-current-buffer (or buffer (current-buffer))
- (or (evil-initial-state-for-buffer-name (buffer-name))
+ (or (evil-initial-state-for-buffer-name)
(catch 'done
(dolist (mode minor-mode-map-alist)
- (setq mode (car-safe mode))
- (when (and (boundp mode) (symbol-value mode))
- (when (setq mode (evil-initial-state mode))
- (throw 'done mode)))))
+ (setq mode (car mode))
+ (and (boundp mode) (symbol-value mode)
+ (setq mode (evil-initial-state mode))
+ (throw 'done mode))))
(evil-initial-state major-mode nil t)
- default)))
+ evil-default-state)))
(defun evil-initial-state (mode &optional default follow-parent checked-modes)
"Return the Evil state to use for MODE or its alias.
@@ -298,30 +276,24 @@ The initial state for a mode can be set with
If FOLLOW-PARENT is non-nil, also check parent modes of MODE and
its alias. CHECKED-MODES is used internally and should not be set
initially."
- (cond
- ((and mode (symbolp mode) (memq mode checked-modes))
- (error "Circular reference detected in ancestors of %s\n%s"
+ (when (memq mode checked-modes)
+ (error "Circular reference detected in ancestors of `%s'\n%s"
major-mode checked-modes))
- ((and mode (symbolp mode))
- (let ((mode-alias (let ((func (symbol-function mode)))
- (when (symbolp func)
- func)))
- state modes)
- (or
- (catch 'done
- (dolist (entry (evil-state-property t :modes) default)
- (setq state (car entry)
- modes (symbol-value (cdr entry)))
- (when (or (memq mode modes)
- (and mode-alias
- (memq mode-alias modes)))
- (throw 'done state))))
- (when follow-parent
- (evil-initial-state (get mode 'derived-mode-parent)
- nil t (cons mode checked-modes)))
- (when follow-parent
- (evil-initial-state (get mode-alias 'derived-mode-parent)
- nil t (cons mode-alias checked-modes))))))))
+ (let ((mode-alias (let ((func (symbol-function mode)))
+ (when (symbolp func) func))))
+ (or (cl-dolist (entry (evil-state-property t :modes) default)
+ (let ((state (car entry))
+ (modes (symbol-value (cdr entry))))
+ (when (or (memq mode modes)
+ (and mode-alias (memq mode-alias modes)))
+ (cl-return state))))
+ (and follow-parent (get mode 'derived-mode-parent)
+ (evil-initial-state (get mode 'derived-mode-parent)
+ nil t (cons mode checked-modes)))
+ (and follow-parent mode-alias
+ (get mode-alias 'derived-mode-parent)
+ (evil-initial-state (get mode-alias 'derived-mode-parent)
+ nil t (cons mode-alias checked-modes))))))
(defun evil-set-initial-state (mode state)
"Set the initial state for major mode MODE to STATE.
@@ -341,8 +313,7 @@ then this function does nothing."
:suppress-operator t
(with-current-buffer (or buffer (current-buffer))
(when evil-local-mode
- (evil-change-state (evil-initial-state-for-buffer
- buffer (or evil-default-state 'normal))
+ (evil-change-state (evil-initial-state-for-buffer buffer)
message))))
(evil-define-command evil-change-to-previous-state
@@ -372,11 +343,11 @@ then this function does nothing."
(when (get-buffer (ad-get-arg 1))
(with-current-buffer (ad-get-arg 1)
(unless evil-local-mode
- (save-match-data (evil-local-mode 1)))))))
+ (save-match-data (evil-initialize)))))))
;; Refresh cursor color.
;; Cursor color can only be set for each frame but not for each buffer.
-(add-hook 'window-configuration-change-hook 'evil-refresh-cursor)
+(add-hook 'window-configuration-change-hook #'evil-refresh-cursor)
(defadvice select-window (after evil activate)
(evil-refresh-cursor))
@@ -450,18 +421,15 @@ then this function does nothing."
(defmacro evil-without-input-method-hooks (&rest body)
"Execute body with evil's activate/deactivate-input-method hooks deactivated.
-
This allows input methods to be used in normal-state."
+ (declare (indent defun))
`(unwind-protect
(progn
- (remove-hook 'input-method-activate-hook 'evil-activate-input-method t)
- (remove-hook 'input-method-deactivate-hook
- 'evil-deactivate-input-method t)
+ (remove-hook 'input-method-activate-hook #'evil-activate-input-method t)
+ (remove-hook 'input-method-deactivate-hook #'evil-deactivate-input-method t)
,@body)
- (progn
- (add-hook 'input-method-activate-hook 'evil-activate-input-method nil t)
- (add-hook 'input-method-deactivate-hook
- 'evil-deactivate-input-method nil t))))
+ (add-hook 'input-method-activate-hook #'evil-activate-input-method nil t)
+ (add-hook 'input-method-deactivate-hook #'evil-deactivate-input-method nil t)))
(defadvice toggle-input-method (around evil)
"Refresh `evil-input-method'."
@@ -540,16 +508,11 @@ may be specified before the body code:
(setq key (pop body)
arg (pop body))
(cond
- ((eq key :mode)
- (setq mode arg))
- ((eq key :local)
- (setq local arg))
- ((eq key :func)
- (setq func arg))
- ((eq key :intercept)
- (setq intercept arg))
- ((eq key :overriding)
- (setq overriding arg))))
+ ((eq key :mode) (setq mode arg))
+ ((eq key :local) (setq local arg))
+ ((eq key :func) (setq func arg))
+ ((eq key :intercept) (setq intercept arg))
+ ((eq key :overriding) (setq overriding arg))))
(setq mode (or mode
(intern (replace-regexp-in-string
"\\(?:-\\(?:mode-\\)?\\(?:key\\)?map\\)?$"
@@ -582,10 +545,8 @@ may be specified before the body code:
,@(when doc `(,doc))
(interactive)
(cond
- ((numberp arg)
- (setq ,mode (> arg 0)))
- (t
- (setq ,mode (not ,mode))))
+ ((numberp arg) (setq ,mode (> arg 0)))
+ (t (setq ,mode (not ,mode))))
,@body))
',keymap)))
@@ -924,14 +885,10 @@ If STATE is nil, it means any state."
(let ((entry (and (keymapp map)
(lookup-key map [intercept-state]))))
(cond
- ((null entry)
- nil)
- ((null state)
- map)
- ((eq entry state)
- map)
- ((eq entry 'all)
- map))))
+ ((null entry) nil)
+ ((null state) map)
+ ((eq entry state) map)
+ ((eq entry 'all) map))))
(defun evil-overriding-keymap-p (map &optional state)
"Whether MAP is an overriding keymap for STATE.
@@ -939,16 +896,11 @@ If STATE is nil, it means any state."
(let ((entry (and (keymapp map)
(lookup-key map [override-state]))))
(cond
- ((null entry)
- nil)
- ((keymapp entry)
- (evil-overriding-keymap-p entry state))
- ((null state)
- map)
- ((eq entry state)
- map)
- ((eq entry 'all)
- map))))
+ ((null entry) nil)
+ ((keymapp entry) (evil-overriding-keymap-p entry state))
+ ((null state) map)
+ ((eq entry state) map)
+ ((eq entry 'all) map))))
(defun evil-intercept-keymap-state (map)
"Return the state for the intercept keymap MAP.
@@ -1054,13 +1006,12 @@ mode, in which case `evil-define-minor-mode-key' is used."
`(keymapp ,keymap))
'(condition-case-unless-debug err
(evil-define-key* ,state ,keymap ,key ,def ,@bindings)
- (error
- (message "error in evil-define-key: %s"
- (error-message-string err))))
+ (error "error in evil-define-key: %s"
+ (error-message-string err)))
'after-load-functions t nil
(format "evil-define-key-in-%s"
',(if (symbolp keymap) keymap 'keymap))))))
-(defalias 'evil-declare-key 'evil-define-key)
+(defalias 'evil-declare-key #'evil-define-key)
(defun evil-define-key* (state keymap key def &rest bindings)
"Create a STATE binding from KEY to DEF for KEYMAP.
@@ -1342,8 +1293,7 @@ If ARG is nil, don't display a message in the echo area.%s" name doc)
(evil-normalize-keymaps)
,@body))
(t
- (unless evil-local-mode
- (evil-local-mode 1))
+ (unless evil-local-mode (evil-local-mode))
(let ((evil-next-state ',state)
input-method-activate-hook
input-method-deactivate-hook)
diff --git a/evil-jumps.el b/evil-jumps.el
index 6c0203c..2e08f86 100644
--- a/evil-jumps.el
+++ b/evil-jumps.el
@@ -95,9 +95,8 @@ Otherwise the jump commands act only within the current buffer."
(insert (apply #'format format args) "\n"))))
(defun evil--jumps-get-current (&optional window)
- (unless window
- (setq window (frame-selected-window)))
- (let* ((jump-struct (gethash window evil--jumps-window-jumps)))
+ (unless window (setq window (selected-window)))
+ (let ((jump-struct (gethash window evil--jumps-window-jumps)))
(unless jump-struct
(setq jump-struct (make-evil-jumps-struct))
(puthash window jump-struct evil--jumps-window-jumps))
@@ -168,28 +167,28 @@ Otherwise the jump commands act only within the current buffer."
(defun evil--jumps-push ()
"Push the current cursor/file position to the jump list."
- (let ((target-list (evil--jumps-get-window-jump-list)))
- (let ((file-name (buffer-file-name))
- (buffer-name (buffer-name))
- (current-pos (point-marker))
- (first-pos nil)
- (first-file-name nil)
- (excluded nil))
- (when (and (not file-name)
- (string-match-p evil--jumps-buffer-targets buffer-name))
- (setq file-name buffer-name))
- (when file-name
- (dolist (pattern evil-jumps-ignored-file-patterns)
- (when (string-match-p pattern file-name)
- (setq excluded t)))
- (unless excluded
- (unless (ring-empty-p target-list)
- (setq first-pos (car (ring-ref target-list 0)))
- (setq first-file-name (car (cdr (ring-ref target-list 0)))))
- (unless (and (equal first-pos current-pos)
- (equal first-file-name file-name))
- (evil--jumps-message "pushing %s on %s" current-pos file-name)
- (ring-insert target-list `(,current-pos ,file-name))))))
+ (let ((target-list (evil--jumps-get-window-jump-list))
+ (file-name (buffer-file-name))
+ (buffer-name (buffer-name))
+ (current-pos (point-marker))
+ (first-pos nil)
+ (first-file-name nil)
+ (excluded nil))
+ (when (and (not file-name)
+ (string-match-p evil--jumps-buffer-targets buffer-name))
+ (setq file-name buffer-name))
+ (when file-name
+ (dolist (pattern evil-jumps-ignored-file-patterns)
+ (when (string-match-p pattern file-name)
+ (setq excluded t)))
+ (unless excluded
+ (unless (ring-empty-p target-list)
+ (setq first-pos (car (ring-ref target-list 0)))
+ (setq first-file-name (car (cdr (ring-ref target-list 0)))))
+ (unless (and (equal first-pos current-pos)
+ (equal first-file-name file-name))
+ (evil--jumps-message "pushing %s on %s" current-pos file-name)
+ (ring-insert target-list `(,current-pos ,file-name)))))
(evil--jumps-message "%s %s"
(selected-window)
(and (not (ring-empty-p target-list))
@@ -240,6 +239,7 @@ POS defaults to point."
(when pos
(goto-char pos))
(evil--jumps-push))))
+(put 'evil-set-jump 'permanent-local-hook t)
(defun evil--jump-backward (count)
(setq evil--jumps-jumping-backward t)
@@ -288,6 +288,7 @@ POS defaults to point."
(evil--jumps-message "removing %s" key)
(remhash key evil--jumps-window-jumps)))
evil--jumps-window-jumps)))
+(put 'evil--jumps-window-configuration-hook 'permanent-local-hook t)
(defun evil--jump-hook (&optional command)
"`pre-command-hook' for evil-jumps.
@@ -299,6 +300,7 @@ change the current buffer."
(evil-set-jump)
(setf (evil-jumps-struct-previous-pos (evil--jumps-get-current))
(point-marker))))
+(put 'evil--jump-hook 'permanent-local-hook t)
(defun evil--jump-handle-buffer-crossing ()
(let ((jumping-backward evil--jumps-jumping-backward))
@@ -330,6 +332,7 @@ change the current buffer."
(not (eq previous-buffer (window-buffer window))))))
(evil-set-jump previous-pos)
(set-marker previous-pos nil))))))))
+(put 'evil--jump-handle-buffer-crossing 'permanent-local-hook t)
(if (bound-and-true-p savehist-loaded)
(evil--jumps-savehist-load)
@@ -345,8 +348,7 @@ change the current buffer."
(remove-hook 'pre-command-hook #'evil--jump-hook t)
(remove-hook 'post-command-hook #'evil--jump-handle-buffer-crossing t)
(remove-hook 'next-error-hook #'evil-set-jump t)
- (remove-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook t)
- (evil--jump-handle-buffer-crossing)))
+ (remove-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook t)))
(add-hook 'evil-local-mode-hook #'evil--jumps-install-or-uninstall)
diff --git a/evil-states.el b/evil-states.el
index 05f46a5..47ff9b2 100644
--- a/evil-states.el
+++ b/evil-states.el
@@ -48,8 +48,7 @@ AKA \"Command\" state."
"Reset command loop variables in Normal state.
Also prevent point from reaching the end of the line.
If the region is activated, enter Visual state."
- (unless (or (evil-initializing-p)
- (null this-command))
+ (unless (null this-command)
(setq command (or command this-command))
(when (evil-normal-state-p)
(setq evil-this-type nil
@@ -449,17 +448,13 @@ or `block'."
SELECTION is a kind of selection as defined by
`evil-define-visual-selection', such as `char', `line'
or `block'."
- (let (message)
- (setq selection (or selection evil-visual-selection))
- (when selection
- (setq message
- (symbol-value (intern (format "evil-visual-%s-message"
- selection))))
+ (unless selection (setq selection evil-visual-selection))
+ (when selection
+ (let ((message (symbol-value (intern (format "evil-visual-%s-message"
+ selection)))))
(cond
- ((functionp message)
- (funcall message))
- ((stringp message)
- (evil-echo "%s" message))))))
+ ((functionp message) (funcall message))
+ ((stringp message) (evil-echo "%s" message))))))
(defun evil-visual-select (beg end &optional type dir message)
"Create a Visual selection of type TYPE from BEG to END.
diff --git a/evil-tests.el b/evil-tests.el
index e2a637b..51eb5ab 100644
--- a/evil-tests.el
+++ b/evil-tests.el
@@ -9328,7 +9328,7 @@ parameter set."
;;; ESC
(ert-deftest evil-test-esc-count ()
- "Test if prefix-argument is transfered for key sequences with meta-key"
+ "Test if prefix-argument is transferred for key sequences with meta-key"
:tags '(evil esc)
(unless noninteractive
(ert-info ("Test M-<right>")
@@ -9370,11 +9370,10 @@ parameter set."
(ert-info ("Execute yanked macro")
(evil-test-buffer
"[i]foo\e"
- ("\"qd$@q\"qp"
- "fooifoo\e")))
+ ("\"qD@q\"qp"
+ "fooifoo\e")))
(ert-info ("Paste recorded marco")
(evil-test-buffer
- ""
(evil-set-register ?q (vconcat "ifoo" [escape]))
("@q\"qp")
"fooifoo\e")))
@@ -9453,14 +9452,14 @@ parameter set."
(ert-info ("Jump across files")
(let ((temp-file (make-temp-file "evil-test-")))
(unwind-protect
- (evil-test-buffer
- "[z] z z z z z z"
- ("\M-x" "find-file" [return] temp-file [return] "inew buffer" [escape])
- "new buffe[r]"
- ("\C-o")
- "[z] z z z z z z"
- ("\C-i")
- "new buffe[r]")
+ (evil-test-buffer
+ "[z] z z z z z z"
+ ("\M-x" "find-file" [return] temp-file [return] "inew buffer" [escape])
+ "new buffe[r]"
+ ("\C-o")
+ "[z] z z z z z z"
+ ("\C-i")
+ "new buffe[r]")
(delete-file temp-file)
(with-current-buffer (get-file-buffer temp-file)
(set-buffer-modified-p nil))
@@ -9708,7 +9707,7 @@ main(argc, argv) char **argv; {
;; is sufficient for `evil-initial-state-for-buffer' to work.
(should-error (evil-initial-state-for-buffer)))
(put 'test-1-mode 'derived-mode-parent 'prog-mode))))
- (defalias 'test-1-alias-mode 'test-1-mode)
+ (defalias 'test-1-alias-mode #'test-1-mode)
(define-derived-mode test-3-mode test-1-alias-mode "Test3")
(evil-set-initial-state 'test-1-mode 'insert)
(ert-info ("Check inheritance from major mode aliases")