Navigate up & down in / search history when evil-set-initial-state is set to 'emacs ?
For some modes I find it more convenient to be in Emacs state and add some key Evil mappings as needed, like so: ;; start the Package Menu in Emacs mode, add some Evil mappings (evil-set-initial-state 'package-menu-mode 'emacs) (evil-add-hjkl-bindings package-menu-mode-map 'emacs (kbd "/") 'evil-search-forward (kbd "n") 'evil-search-next (kbd "N") 'evil-search-previous) This works quite nicely, except for one thing, I'm not finding a way to Navigate up & down in the search history initiated by / ('evil-search-forward). I have in my init file this: (setq evil-search-module 'evil-search) Which allows such navigation through search history -- but only when in Evil vi states, not when evil-set-initial-state is set to 'emacs. Any suggestions re how to achieve this in Emacs state? Thanks, John -- John Magolske http://b79.net/contact
Hello John,
For some modes I find it more convenient to be in Emacs state and add some key Evil mappings as needed, like so:
;; start the Package Menu in Emacs mode, add some Evil mappings (evil-set-initial-state 'package-menu-mode 'emacs) (evil-add-hjkl-bindings package-menu-mode-map 'emacs (kbd "/") 'evil-search-forward (kbd "n") 'evil-search-next (kbd "N") 'evil-search-previous)
Interesting, for Emacs state bindings I'd have modified the underlying keymap directly like so: (with-eval-after-load 'package (define-key package-menu-mode-map (kbd "/") 'evil-search-forward) ...)
This works quite nicely, except for one thing, I'm not finding a way to Navigate up & down in the search history initiated by / ('evil-search-forward). I have in my init file this:
(setq evil-search-module 'evil-search)
Which allows such navigation through search history -- but only when in Evil vi states, not when evil-set-initial-state is set to 'emacs.
Any suggestions re how to achieve this in Emacs state?
Could you please elaborate on the exact workflow? This sounds to me as if you want to initiate a search with `evil-search-forward`, then switch out the currently entered search term (which can be done with `M-p` and `M-n` already) and continue your session. These keys are bound to `isearch-ring-retreat` and `isearch-ring-advance`. But perhaps I'm misunderstanding you and you're envisioning a different workflow, like one not requiring to be in a search session for changing the search item. Cheers Vasilij Schneidermann
Hi Vasilij, Thanks for the reply & useful info! * Vasilij Schneidermann <[email protected]> [170315 08:50]:
For some modes I find it more convenient to be in Emacs state and add some key Evil mappings as needed, like so:
;; start the Package Menu in Emacs mode, add some Evil mappings (evil-set-initial-state 'package-menu-mode 'emacs) (evil-add-hjkl-bindings package-menu-mode-map 'emacs (kbd "/") 'evil-search-forward (kbd "n") 'evil-search-next (kbd "N") 'evil-search-previous)
Interesting, for Emacs state bindings I'd have modified the underlying keymap directly like so:
(with-eval-after-load 'package (define-key package-menu-mode-map (kbd "/") 'evil-search-forward) ...)
Seems evil-add-hjkl-bindings is similar, but adds the hjkl mappings in for starters. I modified that macro to include a few more mappings that I find myself wanting for general navigation: ;; Add hjkl and other vi bindings... (defmacro evil-add-hjkl-bindings-plus (keymap &optional state &rest bindings) "Add \"h\", \"j\", \"k\", \"l\", \"\/\", \"n\", \"N\", \"e\", \"b\" and other bindings to KEYMAP in STATE. Add additional BINDINGS if specified." (declare (indent defun)) `(evil-define-key ,state ,keymap "h" (lookup-key evil-motion-state-map "h") "j" (lookup-key evil-motion-state-map "j") "k" (lookup-key evil-motion-state-map "k") "l" (lookup-key evil-motion-state-map "l") ":" (lookup-key evil-motion-state-map ":") "/" 'evil-search-forward "n" 'evil-search-next "N" 'evil-search-previous "e" 'evil-forward-word-end "b" 'evil-backward-word-begin "DEL" 'scroll-down-command "SPC" 'scroll-up-command "q" '(lambda () (interactive) (quit-window t)) ,@bindings)) That way I don't have to re-type all that across multiple modes: (evil-set-initial-state 'package-menu-mode 'emacs) (evil-add-hjkl-bindings-plus package-menu-mode-map 'emacs) (evil-set-initial-state 'paradox-menu-mode 'emacs) (evil-add-hjkl-bindings-plus paradox-menu-mode-map 'emacs) (evil-set-initial-state 'help-mode 'emacs) (evil-add-hjkl-bindings-plus help-mode-map 'emacs) (evil-set-initial-state 'eww-mode 'emacs) (evil-add-hjkl-bindings-plus eww-mode-map 'emacs) (define-key isearch-mode-map (kbd "<up>") 'isearch-ring-retreat) (define-key isearch-mode-map (kbd "RET") 'isearch-exit)
[...] I'm not finding a way to Navigate up & down in the search history initiated by / ('evil-search-forward). I have in my init file this:
(setq evil-search-module 'evil-search)
Which allows such navigation through search history -- but only when in Evil vi states, not when evil-set-initial-state is set to 'emacs.
Any suggestions re how to achieve this in Emacs state?
Could you please elaborate on the exact workflow? This sounds to me as if you want to initiate a search with `evil-search-forward`, then switch out the currently entered search term (which can be done with `M-p` and `M-n` already) and continue your session. These keys are bound to `isearch-ring-retreat` and `isearch-ring-advance`.
Yes, for example (evil-set-initial-state 'package-menu-mode 'emacs) has the package menu coming up in Emacs/non-Evil state, which allows more of the package's bindings to come through. But there are a few Vi navigational functions I'd like to retain. And indeed, M-p and M-n do what I want here, thanks for cluing me in. I made some bindings like: (define-key isearch-mode-map (kbd "<up>") 'isearch-ring-retreat) (define-key isearch-mode-map (kbd "RET") 'isearch-exit) The behaviour is a bit different than what the evil-search search module provides, but it's close enough. Best regards, John -- John Magolske http://b79.net/contact
participants (2)
-
John Magolske -
Vasilij Schneidermann