diff options
| -rw-r--r-- | evil-common.el | 36 | ||||
| -rw-r--r-- | evil-maps.el | 28 | ||||
| -rw-r--r-- | evil-tests.el | 21 | ||||
| -rw-r--r-- | evil-vars.el | 11 |
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.") |
