aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--evil-common.el36
-rw-r--r--evil-maps.el28
-rw-r--r--evil-tests.el21
-rw-r--r--evil-vars.el11
4 files changed, 78 insertions, 18 deletions
diff --git a/evil-common.el b/evil-common.el
index 45736a5..9cfa99b 100644
--- a/evil-common.el
+++ b/evil-common.el
@@ -29,6 +29,7 @@
(require 'rect)
(require 'thingatpt)
(require 'cl-lib)
+(require 'calc)
;;; Code:
@@ -2037,10 +2038,17 @@ or a marker object pointing nowhere."
(marker-position (cdr entry))))))))
(put 'evil-swap-out-markers 'permanent-local-hook t)
-(defun evil--eval-elisp-expr (input)
- "Eval INPUT and return stringified result, if of a suitable type."
- (let ((result (eval (car (read-from-string input)))))
+(defun evil--eval-expr (input)
+ "Eval INPUT and return stringified result, if of a suitable type.
+If INPUT starts with a number, +, -, or . use `calc-eval' instead."
+ (let* ((first-char (string-to-char input))
+ (calcable-p (or (<= ?0 first-char ?9) (memq first-char '(?- ?+ ?.))))
+ (result (if calcable-p
+ (let ((calc-multiplication-has-precedence nil))
+ (calc-eval input))
+ (eval (car (read-from-string input))))))
(cond
+ (calcable-p result)
((or (stringp result)
(numberp result)
(symbolp result))
@@ -2139,12 +2147,21 @@ The following special registers are supported.
((eq register ?-)
evil-last-small-deletion)
((eq register ?=)
- (let* ((enable-recursive-minibuffers t)
- (eval-input (read-string "=")))
- (if (remove ?\s (append eval-input nil))
- (setq evil-last-=-register-result
- (evil--eval-elisp-expr eval-input))
- evil-last-=-register-result)))
+ (let ((enable-recursive-minibuffers t))
+ (setq evil-last-=-register-input
+ (minibuffer-with-setup-hook
+ (lambda () (when evil-last-=-register-input
+ (add-hook 'pre-command-hook #'evil-ex-remove-default)))
+ (read-from-minibuffer
+ "="
+ (and evil-last-=-register-input
+ (propertize evil-last-=-register-input 'face 'shadow))
+ evil-eval-map
+ nil
+ 'evil-eval-history
+ evil-last-=-register-input
+ t)))
+ (evil--eval-expr evil-last-=-register-input)))
((eq register ?_) ; the black hole register
"")
(t
@@ -2221,6 +2238,7 @@ to keep Vim compatibility with register jumps."
(cons reg (evil-get-register reg t)))
'(?\" ?* ?+ ?% ?# ?/ ?: ?. ?-
?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
+ (list (cons ?= evil-last-=-register-input))
(cl-remove-if-not (lambda (reg) (number-or-marker-p (car reg))) register-alist)
nil)
#'(lambda (reg1 reg2) (< (car reg1) (car reg2)))))
diff --git a/evil-maps.el b/evil-maps.el
index becf1d5..09267ee 100644
--- a/evil-maps.el
+++ b/evil-maps.el
@@ -535,10 +535,17 @@ included in `evil-insert-state-bindings' by default."
;; search command line
(define-key evil-ex-search-keymap "\d" #'evil-ex-delete-backward-char)
+(define-key evil-ex-search-keymap "\C-b" 'move-beginning-of-line)
+(define-key evil-ex-search-keymap "\C-c" 'abort-recursive-edit)
+(define-key evil-ex-search-keymap "\C-g" 'abort-recursive-edit)
+(define-key evil-ex-search-keymap "\C-k" 'evil-insert-digraph)
(define-key evil-ex-search-keymap "\C-f" 'evil-ex-search-command-window)
(define-key evil-ex-search-keymap "\C-r" 'evil-paste-from-register)
(define-key evil-ex-search-keymap "\C-n" 'next-history-element)
(define-key evil-ex-search-keymap "\C-p" 'previous-history-element)
+(define-key evil-ex-search-keymap "\C-u" 'evil-delete-whole-line)
+(define-key evil-ex-search-keymap "\C-v" #'quoted-insert)
+(define-key evil-ex-search-keymap "\C-w" 'backward-kill-word)
;; ex command line
(define-key evil-ex-completion-map "\d" #'evil-ex-delete-backward-char)
@@ -569,6 +576,27 @@ included in `evil-insert-state-bindings' by default."
(define-key evil-ex-completion-map [return] 'exit-minibuffer)
(define-key evil-ex-completion-map (kbd "RET") 'exit-minibuffer)
+;; eval prompt (the `=' register)
+(define-key evil-eval-map "\C-b" 'move-beginning-of-line)
+(define-key evil-eval-map "\C-c" 'abort-recursive-edit)
+(define-key evil-eval-map "\C-g" 'abort-recursive-edit)
+(define-key evil-eval-map "\C-k" 'evil-insert-digraph)
+(define-key evil-eval-map "\C-p" #'previous-complete-history-element)
+(define-key evil-eval-map "\C-r" 'evil-paste-from-register)
+(define-key evil-eval-map "\C-n" #'next-complete-history-element)
+(define-key evil-eval-map "\C-u" 'evil-delete-whole-line)
+(define-key evil-eval-map "\C-v" #'quoted-insert)
+(define-key evil-eval-map "\C-w" 'backward-kill-word)
+(define-key evil-eval-map [escape] 'abort-recursive-edit)
+(define-key evil-eval-map [S-left] 'backward-word)
+(define-key evil-eval-map [S-right] 'forward-word)
+(define-key evil-eval-map [up] 'previous-complete-history-element)
+(define-key evil-eval-map [down] 'next-complete-history-element)
+(define-key evil-eval-map [prior] 'previous-history-element)
+(define-key evil-eval-map [next] 'next-history-element)
+(define-key evil-eval-map [return] 'exit-minibuffer)
+(define-key evil-eval-map (kbd "RET") 'exit-minibuffer)
+
;; evil-read-key
(define-key evil-read-key-map (kbd "ESC") #'keyboard-quit)
(define-key evil-read-key-map (kbd "C-]") #'keyboard-quit)
diff --git a/evil-tests.el b/evil-tests.el
index 5351246..9b56f52 100644
--- a/evil-tests.el
+++ b/evil-tests.el
@@ -2756,15 +2756,22 @@ word3[]"))
(ert-deftest evil-test-=-register ()
"\"= is not really a register . It inserts the result of evaluating some elisp"
- (evil-test-buffer
- :state insert
- "8x8= []"
- ("\C-r=(* 8 8)" [return])
- "8x8= 64"
- ([return] "16x4= \C-r=" [return])
- "8x8= 64
+ (ert-info ("Can eval elisp, and can fetch default (last) result")
+ (evil-test-buffer
+ :state insert
+ "8x8= []"
+ ("\C-r=(* 8 8)" [return])
+ "8x8= 64"
+ ([return] "16x4= \C-r=" [return])
+ "8x8= 64
16x4= 64"))
+ (ert-info ("Can eval infix math, and can use register at prompt")
+ (evil-test-buffer
+ "[5]0/10 * 100 = "
+ ("\"nyt=" "A\C-r=" "\C-rn" [return])
+ "50/10 * 100 = 500")))
+
(ert-deftest evil-test-align ()
"Test `evil-align-left', `evil-align-right' and `evil-align-center'."
:tags '(evil operator)
diff --git a/evil-vars.el b/evil-vars.el
index 50d303b..fdc1608 100644
--- a/evil-vars.el
+++ b/evil-vars.el
@@ -1405,8 +1405,8 @@ type.")
(evil-define-local-var evil-this-register nil
"Current register.")
-(evil-define-local-var evil-last-=-register-result nil
- "Most recent result from the `=' register. A string.")
+(defvar evil-last-=-register-input nil
+ "Most recent input from the `=' register. A string.")
(defvar evil-this-macro nil
"Current macro register.")
@@ -1861,6 +1861,13 @@ See `evil-ex-init-shell-argument-completion'.")
(defvar evil-previous-shell-command nil
"The last shell command.")
+;; Eval
+(defvar evil-eval-history nil
+ "History of eval input, from the `=' register.")
+
+(defvar evil-eval-map (make-sparse-keymap)
+ "Keymap for eval input.")
+
;; Searching
(defvar evil-ex-search-history nil
"The history for the search command.")