branch: elpa/evil-goggles
commit 674a1be5aace01fbf41a56dfddaf77cf6d8e167c
Merge: bc318ad4b7 89fcaebb6e
Author: Evgeni Kolev <[email protected]>
Commit: Evgeni Kolev <[email protected]>
Merge branch 'hint-only-when-command-is-interactive'. Close #18
---
.travis.yml | 2 +-
README.md | 6 +++++
evil-goggles.el | 58 +++++++++++++++++++++++++++++++++++++++++++----
test/evil-goggles-test.el | 7 ++++++
test/make-evil-test.el | 1 +
test/make-test.el | 1 +
6 files changed, 70 insertions(+), 5 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index fd72ae8386..659b84c42a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ env:
global:
- CURL="curl -fsSkL --retry 9 --retry-delay 9"
matrix:
- - EMACS_VERSION=25.2
+ - EMACS_VERSION=25.3
addons:
apt:
diff --git a/README.md b/README.md
index 64262c3333..2e02975494 100644
--- a/README.md
+++ b/README.md
@@ -59,6 +59,8 @@ try for example `yy`, `p`, `dd` in normal state.
#### edit actions with hint
- delete
+- change
+- substitue
- yank
- paste
- indent (`=` operator)
@@ -110,6 +112,8 @@ By default, all goggles' faces inherit
`evil-goggles-default-face`, which in tur
evil-goggles-default-face - inherits from `region` by default
evil-goggles-delete-face - this, and the others below, inherit from
`evil-goggles-default-face`
+evil-goggles-change-face
+evil-goggles-substitute-face
evil-goggles-indent-face
evil-goggles-yank-face
evil-goggles-join-face
@@ -156,6 +160,8 @@ evil-goggles-record-macro-face
;; list of all on/off variables, their default value is `t`:
;;
;; evil-goggles-enable-delete
+;; evil-goggles-enable-change
+;; evil-goggles-enable-substitute
;; evil-goggles-enable-indent
;; evil-goggles-enable-yank
;; evil-goggles-enable-join
diff --git a/evil-goggles.el b/evil-goggles.el
index f8f1b0644a..48c2b57b6c 100644
--- a/evil-goggles.el
+++ b/evil-goggles.el
@@ -193,7 +193,7 @@ visualized by the hint.
The hint is displayed for `evil-goggles-async-duration' seconds if
non-nil, else for `evil-goggles-duration' seconds."
(declare (indent 3) (debug t))
- `(evil-goggles--if-hint-on ,beg ,end (progn ,@body)
+ `(evil-goggles--if-can-show-hint ,beg ,end (progn ,@body)
(evil-goggles--show-overlay ,beg ,end ,face (or
evil-goggles-async-duration evil-goggles-duration)
,@body)))
@@ -237,13 +237,13 @@ This function returns a list - either ('blink face) or
('pulse bg)."
(t
`(blink ,face)))))
-(defmacro evil-goggles--if-hint-on (beg end body1 &rest body2)
+(defmacro evil-goggles--if-can-show-hint (beg end body1 &rest body2)
"Run one block of code if hint is visible, run the other if not.
If hint is visible, check it's ok to display it from BEG to END. If
it's not, do BODY1, else BODY2."
(declare (indent 3) (debug t)) ;; TODO indent like `if'
- `(if (and (not evil-goggles--on) (evil-goggles--show-p ,beg ,end))
+ `(if (and (not evil-goggles--on) (evil-goggles--show-p ,beg ,end)
(called-interactively-p 'any))
(let ((evil-goggles--on t))
,@body2)
,body1))
@@ -263,7 +263,7 @@ BODY is executed after the hint has been removed, hence the
hint is
The hint is displayed for `evil-goggles-blocking-duration' seconds if
non-nil, else for `evil-goggles-duration' seconds."
(declare (indent 3) (debug t))
- `(evil-goggles--if-hint-on ,beg ,end (progn ,@body)
+ `(evil-goggles--if-can-show-hint ,beg ,end (progn ,@body)
(if (or (eq evil-this-type 'block) evil-goggles--force-block)
(evil-goggles--show-block-overlay ,beg ,end ,face (or
evil-goggles-blocking-duration evil-goggles-duration))
(evil-goggles--show-overlay ,beg ,end ,face (or
evil-goggles-blocking-duration evil-goggles-duration)))
@@ -360,6 +360,7 @@ DUR-DOC is the docstring for DUR-NAME."
(user-error "Can't load package diff-mode"))
(custom-set-faces
'(evil-goggles-delete-face ((t (:inherit diff-removed))))
+ '(evil-goggles-change-face ((t (:inherit diff-removed))))
'(evil-goggles-paste-face ((t (:inherit diff-added))))
'(evil-goggles-yank-face ((t (:inherit diff-changed))))
'(evil-goggles-undo-redo-remove-face ((t (:inherit diff-removed))))
@@ -372,6 +373,7 @@ DUR-DOC is the docstring for DUR-NAME."
(user-error "Can't load package diff-mode"))
(custom-set-faces
'(evil-goggles-delete-face ((t (:inherit diff-refine-removed))))
+ '(evil-goggles-change-face ((t (:inherit diff-refine-removed))))
'(evil-goggles-paste-face ((t (:inherit diff-refine-added))))
'(evil-goggles-yank-face ((t (:inherit diff-refine-changed))))
'(evil-goggles-undo-redo-remove-face ((t (:inherit diff-refine-removed))))
@@ -402,6 +404,42 @@ BEG END &OPTIONAL TYPE REGISTER YANK-HANDLER are the
arguments of the original f
(evil-goggles--with-blocking-hint beg end 'evil-goggles-delete-face
(evil-goggles--funcall-preserve-interactive orig-fun beg end type register
yank-handler)))
+;;; change
+
+(evil-goggles--define-switch-and-face
+ evil-goggles-enable-change "If non-nil, enable change support"
+ evil-goggles-change-face "Face for change action")
+
+(defun evil-goggles--evil-change-advice (orig-fun beg end &optional type
register yank-handler delete-func)
+ "Around-advice for function `evil-change`.
+
+ORIG-FUN is the original function.
+BEG END TYPE REGISTER YANK-HANDLER DELETE-FUNC are the arguments of the
original function."
+ (evil-goggles--with-blocking-hint beg end 'evil-goggles-change-face
+ (funcall orig-fun beg end type register yank-handler delete-func)))
+
+(defun evil-goggles--evil-change-line-advice (orig-fun beg end &optional type
register yank-handler)
+ "Around-advice for function `evil-change-line`.
+
+ORIG-FUN is the original function.
+BEG END TYPE REGISTER YANK-HANDLER are the arguments of the original function."
+ (evil-goggles--with-blocking-hint beg end 'evil-goggles-change-face
+ (funcall orig-fun beg end type register yank-handler)))
+
+;;; substitute
+
+(evil-goggles--define-switch-and-face
+ evil-goggles-enable-substitute "If non-nil, enable substitute support"
+ evil-goggles-substitute-face "Face for substitute action")
+
+(defun evil-goggles--evil-change-whole-line-advice (orig-fun beg end &optional
type register yank-handler)
+ "Around-advice for function `evil-change-whole-line`.
+
+ORIG-FUN is the original function.
+BEG END TYPE REGISTER YANK-HANDLER are the arguments of the original function."
+ (evil-goggles--with-blocking-hint beg end 'evil-goggles-substitute-face
+ (funcall orig-fun beg end type register yank-handler)))
+
;;; indent
(evil-goggles--define-switch-and-face
@@ -770,6 +808,15 @@ COUNT BEG &OPTIONAL END TYPE REGISTER are the arguments of
the original function
(when evil-goggles-enable-delete
(advice-add 'evil-delete :around 'evil-goggles--evil-delete-advice))
+ ;; `c' and `C' normal state keys
+ (when evil-goggles-enable-change
+ (advice-add 'evil-change :around 'evil-goggles--evil-change-advice)
+ (advice-add 'evil-change-line :around
'evil-goggles--evil-change-line-advice))
+
+ ;; `s' and `S' normal state keys
+ (when evil-goggles-enable-substitute
+ (advice-add 'evil-change-whole-line :around
'evil-goggles--evil-change-whole-line-advice))
+
(when evil-goggles-enable-indent
(advice-add 'evil-indent :around 'evil-goggles--evil-indent-advice))
@@ -820,6 +867,9 @@ COUNT BEG &OPTIONAL END TYPE REGISTER are the arguments of
the original function
(advice-add 'evil-replace-with-register :around
'evil-goggles--evil-replace-with-register-advice)))
(t
(advice-remove 'evil-delete 'evil-goggles--evil-delete-advice)
+ (advice-remove 'evil-change 'evil-goggles--evil-change-advice)
+ (advice-remove 'evil-change-line 'evil-goggles--evil-change-line-advice)
+ (advice-remove 'evil-change-whole-line
'evil-goggles--evil-change-whole-line-advice)
(advice-remove 'evil-indent 'evil-goggles--evil-indent-advice)
(advice-remove 'evil-yank 'evil-goggles--evil-yank-advice)
(advice-remove 'undo-tree-undo 'evil-goggles--undo-tree-undo-advice)
diff --git a/test/evil-goggles-test.el b/test/evil-goggles-test.el
index efd65a1597..3fbf647222 100644
--- a/test/evil-goggles-test.el
+++ b/test/evil-goggles-test.el
@@ -81,3 +81,10 @@
(should (equal
(evil-goggles--should-blink-or-pulse 'evil-goggles--test-face)
'(blink evil-goggles-default-face))))))
+
+(ert-deftest evil-goggles-test-substitute ()
+ (ert-info ("Test visual substitute")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("v3lcABC" [escape])
+ ";; AB[C] buffer is for notes.")))
diff --git a/test/make-evil-test.el b/test/make-evil-test.el
index e5b8d724e6..1f1cb9c18f 100644
--- a/test/make-evil-test.el
+++ b/test/make-evil-test.el
@@ -6,6 +6,7 @@
(add-to-list 'load-path evil-goggles-root-path)
(add-to-list 'load-path evil-goggles-test-path)
+(setq load-prefer-newer t)
(load (concat (file-name-as-directory evil-goggles-test-path)
"evil-goggles-test.el") nil t)
(require 'cl)
diff --git a/test/make-test.el b/test/make-test.el
index 41a1c0d6a7..9300f4cc67 100644
--- a/test/make-test.el
+++ b/test/make-test.el
@@ -6,6 +6,7 @@
(add-to-list 'load-path evil-goggles-root-path)
(add-to-list 'load-path evil-goggles-test-path)
+(setq load-prefer-newer t)
(load (concat (file-name-as-directory evil-goggles-test-path)
"evil-goggles-test.el") nil t)
(ert-run-tests-batch-and-exit)