Emacs: Move mode-specific Evil bindings to seperate files
parent
f69a4b7fb7
commit
07ce33a9cb
|
@ -0,0 +1,42 @@
|
|||
;;; Evil+Calendar
|
||||
|
||||
(evil-define-key 'motion calendar-mode-map
|
||||
"v" 'calendar-set-mark
|
||||
"h" 'calendar-backward-day
|
||||
"0" 'calendar-beginning-of-week
|
||||
"$" 'calendar-end-of-week
|
||||
"l" 'calendar-forward-day
|
||||
"j" 'calendar-forward-week
|
||||
"k" 'calendar-backward-week
|
||||
"\C-f" 'calendar-scroll-left-three-months
|
||||
;; (kbd "<space>") 'scroll-other-window
|
||||
"." 'calendar-goto-today
|
||||
"<" 'calendar-scroll-right
|
||||
">" 'calendar-scroll-left
|
||||
"?" 'calendar-goto-info-node
|
||||
"D" 'diary-view-other-diary-entries
|
||||
"M" 'calendar-lunar-phases
|
||||
"S" 'calendar-sunrise-sunset
|
||||
"a" 'calendar-list-holidays
|
||||
"c" 'org-calendar-goto-agenda
|
||||
"d" 'diary-view-entries
|
||||
"\M-h" 'calendar-cursor-holidays
|
||||
"m" 'diary-mark-entries
|
||||
"o" 'calendar-other-month
|
||||
"q" 'calendar-exit
|
||||
"s" 'diary-show-all-entries
|
||||
"u" 'calendar-unmark
|
||||
"x" 'calendar-mark-holidays
|
||||
"\C-c\C-l" 'calendar-redraw
|
||||
"[" 'calendar-backward-year
|
||||
"]" 'calendar-forward-year
|
||||
"\M-<" 'calendar-beginning-of-year
|
||||
"\M-=" 'calendar-count-days-region
|
||||
"\M->" 'calendar-end-of-year
|
||||
"(" 'calendar-beginning-of-month
|
||||
")" 'calendar-end-of-month
|
||||
"\C-b" 'calendar-scroll-right-three-months
|
||||
"{" 'calendar-backward-month
|
||||
"}" 'calendar-forward-month)
|
||||
|
||||
(provide 'init-evil-calendar)
|
|
@ -0,0 +1,39 @@
|
|||
;;; Evil+Elfeed
|
||||
|
||||
(evil-set-initial-state 'elfeed-search-mode 'normal)
|
||||
|
||||
(evil-define-key 'normal elfeed-search-mode-map
|
||||
(kbd "<return>") 'elfeed-search-show-entry
|
||||
"R" 'elfeed-search-fetch
|
||||
"S" 'elfeed-search-set-filter
|
||||
"o" 'elfeed-search-browse-url
|
||||
"O" 'elfeed-play-in-mpv ; Custom function
|
||||
"r" 'elfeed-search-update--force
|
||||
"q" 'quit-window
|
||||
"s" 'elfeed-search-live-filter
|
||||
"y" 'elfeed-search-yank)
|
||||
|
||||
(evil-define-key '(normal visual) elfeed-search-mode-map
|
||||
"+" 'elfeed-search-tag-all
|
||||
"-" 'elfeed-search-untag-all
|
||||
"U" 'elfeed-search-tag-all-unread
|
||||
"u" 'elfeed-search-untag-all-unread)
|
||||
|
||||
(evil-define-key 'normal elfeed-show-mode-map
|
||||
"+" 'elfeed-show-tag
|
||||
"-" 'elfeed-show-untag
|
||||
"A" 'elfeed-show-add-enclosure-to-playlist
|
||||
"P" 'elfeed-show-play-enclosure
|
||||
"o" 'elfeed-show-visit
|
||||
"O" 'elfeed-play-in-mpv ; Custom function
|
||||
"d" 'elfeed-show-save-enclosure
|
||||
"r" 'elfeed-show-refresh
|
||||
"]" 'elfeed-show-next
|
||||
"[" 'elfeed-show-prev
|
||||
"\M-j" 'elfeed-show-next
|
||||
"\M-k" 'elfeed-show-prev
|
||||
"q" 'elfeed-kill-buffer
|
||||
"s" 'elfeed-show-new-live-search
|
||||
"y" 'elfeed-show-yank)
|
||||
|
||||
(provide 'init-evil-elfeed)
|
|
@ -0,0 +1,114 @@
|
|||
;;; Evil+EMMS
|
||||
(dolist (mode '(emms-browser-mode emms-playlist-mode))
|
||||
(evil-set-initial-state mode 'normal))
|
||||
|
||||
(defun evil/emms-playlist-mode-insert-newline-above ()
|
||||
"Insert a newline above point."
|
||||
(interactive)
|
||||
(emms-with-inhibit-read-only-t
|
||||
(evil-insert-newline-above)))
|
||||
|
||||
(defun evil/emms-playlist-mode-insert-newline-below ()
|
||||
"Insert a newline below point."
|
||||
(interactive)
|
||||
(emms-with-inhibit-read-only-t
|
||||
(evil-insert-newline-below)))
|
||||
|
||||
(defun evil/emms-playlist-mode-paste-before ()
|
||||
"Pastes the latest yanked playlist items before the cursor position.
|
||||
The return value is the yanked text."
|
||||
(interactive)
|
||||
(emms-with-inhibit-read-only-t
|
||||
(goto-char (point-at-bol))
|
||||
(yank)
|
||||
(emms-playlist-mode-correct-previous-yank)
|
||||
(evil-previous-line)
|
||||
(evil-beginning-of-line)))
|
||||
|
||||
(defun evil/emms-playlist-mode-paste-after ()
|
||||
"Pastes the latest yanked playlist items behind point.
|
||||
The return value is the yanked text."
|
||||
(interactive)
|
||||
(evil-next-line)
|
||||
(evil/emms-playlist-mode-paste-before))
|
||||
|
||||
(dolist (map (list emms-browser-mode-map emms-playlist-mode-map))
|
||||
(evil-define-key 'normal map
|
||||
"+" 'emms-volume-raise
|
||||
"=" 'emms-volume-raise
|
||||
"-" 'emms-volume-lower
|
||||
"u" 'emms-playlist-mode-undo))
|
||||
|
||||
(evil-define-key 'normal emms-browser-mode-map
|
||||
(kbd "C-<return>") 'emms-browser-add-tracks-and-play
|
||||
(kbd "<return>") 'emms-browser-add-tracks
|
||||
(kbd "<tab>") 'emms-browser-toggle-subitems
|
||||
"/" 'emms-isearch-buffer ; This shows hidden items during search.
|
||||
"g1" 'emms-browser-collapse-all
|
||||
"g2" 'emms-browser-expand-to-level-2
|
||||
"g3" 'emms-browser-expand-to-level-3
|
||||
"g4" 'emms-browser-expand-to-level-4
|
||||
"<" 'emms-browser-previous-filter
|
||||
">" 'emms-browser-next-filter
|
||||
"C" 'emms-browser-clear-playlist
|
||||
"D" 'emms-browser-delete-files
|
||||
"g0" 'emms-browser-expand-all
|
||||
"d" 'emms-browser-view-in-dired
|
||||
"\C-j" 'emms-browser-next-non-track
|
||||
"\C-k" 'emms-browser-prev-non-track
|
||||
"\M-j" 'emms-browser-next-non-track
|
||||
"\M-k" 'emms-browser-prev-non-track
|
||||
"[" 'emms-browser-prev-non-track
|
||||
"]" 'emms-browser-next-non-track
|
||||
"{" 'emms-browser-prev-non-track
|
||||
"}" 'emms-browser-next-non-track
|
||||
"ga" 'emms-browse-by-artist
|
||||
"gA" 'emms-browse-by-album
|
||||
"gb" 'emms-browse-by-genre
|
||||
"gy" 'emms-browse-by-year
|
||||
"gc" 'emms-browse-by-composer
|
||||
"gp" 'emms-browse-by-performer
|
||||
"x" 'emms-pause
|
||||
"s" (lookup-key emms-browser-mode-map (kbd "s"))
|
||||
"z" (lookup-key emms-browser-mode-map (kbd "W")))
|
||||
|
||||
(evil-define-key 'normal emms-playlist-mode-map
|
||||
"o" 'evil/emms-playlist-mode-insert-newline-below
|
||||
"O" 'evil/emms-playlist-mode-insert-newline-above
|
||||
"d" 'emms-playlist-mode-kill-track
|
||||
(kbd "<return>") 'emms-playlist-mode-play-smart
|
||||
"P" 'evil/emms-playlist-mode-paste-before
|
||||
"p" 'evil/emms-playlist-mode-paste-after
|
||||
"u" 'emms-playlist-mode-undo
|
||||
"<" 'emms-seek-backward
|
||||
">" 'emms-seek-forward
|
||||
"C" 'emms-playlist-mode-clear
|
||||
"D" 'emms-playlist-mode-kill-track
|
||||
"ze" 'emms-tag-editor-edit
|
||||
"x" 'emms-pause
|
||||
"R" 'emms-tag-editor-rename
|
||||
"a" 'emms-playlist-mode-add-contents
|
||||
"zp" 'emms-playlist-set-playlist-buffer
|
||||
"c" 'emms-playlist-mode-center-current
|
||||
"gd" 'emms-playlist-mode-goto-dired-at-point
|
||||
"zs" 'emms-show
|
||||
"\C-j" 'emms-next
|
||||
"\C-k" 'emms-previous
|
||||
"\M-j" 'emms-next
|
||||
"\M-k" 'emms-previous
|
||||
"r" 'emms-random
|
||||
"s" 'emms-stop
|
||||
"S" (lookup-key emms-playlist-mode-map (kbd "S"))
|
||||
"zf" (lookup-key emms-playlist-mode-map (kbd "/"))
|
||||
"zff" 'emms-playlist-limit-to-all
|
||||
"gg" 'emms-playlist-mode-first
|
||||
"G" 'emms-playlist-mode-last
|
||||
"]" 'emms-playlist-mode-next
|
||||
"[" 'emms-playlist-mode-previous
|
||||
"M-y" 'emms-playlist-mode-yank-pop)
|
||||
|
||||
(evil-define-key 'visual emms-playlist-mode-map
|
||||
"d" 'emms-playlist-mode-kill
|
||||
"D" 'emms-playlist-mode-kill)
|
||||
|
||||
(provide 'init-evil-emms)
|
|
@ -0,0 +1,41 @@
|
|||
;; Evil+Eshell
|
||||
|
||||
(defun evil/eshell-next-prompt ()
|
||||
(when (get-text-property (point) 'read-only)
|
||||
;; If at end of prompt, `eshell-next-prompt' will not move, so go backward.
|
||||
(beginning-of-line)
|
||||
(eshell-next-prompt 1)))
|
||||
|
||||
(defun evil/eshell-setup ()
|
||||
(dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook))
|
||||
(add-hook hook 'evil/eshell-next-prompt nil t)))
|
||||
|
||||
(add-hook 'eshell-mode-hook 'evil/eshell-setup)
|
||||
|
||||
(defun evil/eshell-interrupt-process ()
|
||||
(interactive)
|
||||
(eshell-interrupt-process)
|
||||
(evil-insert 1))
|
||||
|
||||
;;; `eshell-mode-map' is reset when Eshell is initialized in `eshell-mode'. We
|
||||
;;; need to add bindings to `eshell-first-time-mode-hook'.
|
||||
(defun evil/eshell-set-keys ()
|
||||
(with-eval-after-load 'init-helm
|
||||
(evil-define-key 'insert eshell-mode-map "\C-e" 'helm-find-files))
|
||||
(evil-define-key 'normal eshell-mode-map
|
||||
"[" 'eshell-previous-prompt
|
||||
"]" 'eshell-next-prompt
|
||||
"\M-k" 'eshell-previous-prompt
|
||||
"\M-j" 'eshell-next-prompt
|
||||
"0" 'eshell-bol
|
||||
(kbd "RET") 'eshell-send-input
|
||||
(kbd "C-c C-c") 'evil/eshell-interrupt-process
|
||||
"\M-h" 'eshell-backward-argument
|
||||
"\M-l" 'eshell-forward-argument)
|
||||
(evil-define-key 'insert
|
||||
eshell-mode-map "\M-h" 'eshell-backward-argument
|
||||
"\M-l" 'eshell-forward-argument))
|
||||
|
||||
(add-hook 'eshell-first-time-mode-hook 'evil/eshell-set-keys)
|
||||
|
||||
(provide 'init-evil-eshell)
|
|
@ -0,0 +1,34 @@
|
|||
;;; Evil+Helm
|
||||
|
||||
;; To navigate helm entries with hjkl, using the C- modifier would conflict
|
||||
;; with C-h (help prefix) and C-k (`evil-insert-digraph'). We use M- instead.
|
||||
(define-keys helm-map
|
||||
"C-\\" 'helm-toggle-resplit-and-swap-windows
|
||||
"C-f" 'helm-next-page
|
||||
"C-b" 'helm-previous-page
|
||||
"M-h" 'helm-next-source
|
||||
"M-j" 'helm-next-line
|
||||
"M-k" 'helm-previous-line
|
||||
"M-l" 'helm-execute-persistent-action
|
||||
"M-." 'helm-end-of-buffer
|
||||
"M-," 'helm-beginning-of-buffer
|
||||
"<escape>" 'helm-keyboard-quit)
|
||||
|
||||
(evil-define-key 'normal helm-map
|
||||
"\C-f" 'helm-next-page
|
||||
"\C-b" 'helm-previous-page)
|
||||
|
||||
(define-key helm-buffer-map (kbd "M-o") 'helm-buffer-switch-other-window)
|
||||
(define-key helm-moccur-map (kbd "M-o") 'helm-moccur-run-goto-line-ow)
|
||||
(define-key helm-grep-map (kbd "M-o") 'helm-grep-run-other-window-action)
|
||||
(define-key helm-map (kbd "C-/") 'helm-quit-and-find-file)
|
||||
|
||||
(dolist (map (list helm-find-files-map helm-read-file-map))
|
||||
(define-keys map
|
||||
"M-o" 'helm-ff-run-switch-other-window
|
||||
"C-/" 'helm-ff-run-find-sh-command
|
||||
"M-h" 'helm-find-files-up-one-level
|
||||
"M-l" 'helm-execute-persistent-action
|
||||
"C-l" nil)) ; So that the header displays the above binding.
|
||||
|
||||
(provide 'init-evil-helm)
|
|
@ -0,0 +1,22 @@
|
|||
;; Remap org-mode meta keys for convenience
|
||||
;; - org-evil: Not as polished as of May 2017.
|
||||
;; - evil-org: Depends on MELPA's org-mode, too big a dependency for me.
|
||||
;; See https://github.com/Somelauw/evil-org-mode/blob/master/doc/keythemes.org for inspiration.
|
||||
|
||||
(evil-define-key 'normal org-mode-map
|
||||
(kbd "M-<return>") (lambda () (interactive) (evil-insert 1) (org-meta-return))
|
||||
"L" 'org-shiftright
|
||||
"H" 'org-shiftleft
|
||||
"K" 'org-shiftup
|
||||
"J" 'org-shiftdown
|
||||
"\M-l" 'org-metaright
|
||||
"\M-h" 'org-metaleft
|
||||
"\M-k" 'org-metaup
|
||||
"\M-j" 'org-metadown
|
||||
"\M-L" 'org-shiftmetaright
|
||||
"\M-H" 'org-shiftmetaleft
|
||||
"\M-K" 'org-shiftmetaup
|
||||
"\M-J" 'org-shiftmetadown
|
||||
"<" 'org-up-element)
|
||||
|
||||
(provide 'init-evil-org)
|
|
@ -0,0 +1,10 @@
|
|||
;;; Evil+Package-menu-mode
|
||||
(evil-set-initial-state 'package-menu-mode 'normal)
|
||||
(evil-define-key 'normal package-menu-mode-map "q" 'quit-window)
|
||||
(evil-define-key 'normal package-menu-mode-map "i" 'package-menu-mark-install)
|
||||
(evil-define-key 'normal package-menu-mode-map "U" 'package-menu-mark-upgrades)
|
||||
(evil-define-key 'normal package-menu-mode-map "u" 'package-menu-mark-unmark)
|
||||
(evil-define-key 'normal package-menu-mode-map "d" 'package-menu-mark-delete)
|
||||
(evil-define-key 'normal package-menu-mode-map "x" 'package-menu-execute)
|
||||
|
||||
(provide 'init-evil-package)
|
|
@ -0,0 +1,59 @@
|
|||
;;; Evil+Transmission
|
||||
|
||||
(evil-set-initial-state 'transmission-mode 'normal)
|
||||
|
||||
(evil-define-key 'normal transmission-mode-map
|
||||
(kbd "<return>") 'transmission-files
|
||||
"D" 'transmission-delete
|
||||
"S" 'tabulated-list-sort
|
||||
"a" 'transmission-add
|
||||
"d" 'transmission-set-download
|
||||
"e" 'transmission-peers
|
||||
"i" 'transmission-info
|
||||
"U" 'transmission-set-ratio
|
||||
"x" 'transmission-move
|
||||
"q" 'transmission-quit
|
||||
"r" 'transmission-remove
|
||||
"s" 'transmission-toggle
|
||||
"I" 'transmission-trackers-add
|
||||
"u" 'transmission-set-upload
|
||||
"c" 'transmission-verify
|
||||
"C" 'transmission-set-bandwidth-priority)
|
||||
|
||||
(evil-define-key 'normal transmission-files-mode-map
|
||||
(kbd "<return>") 'transmission-find-file
|
||||
"\M-l" 'transmission-display-file
|
||||
"!" 'transmission-files-command
|
||||
"S" 'tabulated-list-sort
|
||||
"A" 'transmission-browse-url-of-file
|
||||
"X" 'transmission-files-command
|
||||
"^" 'quit-window
|
||||
"e" 'transmission-peers
|
||||
"i" 'transmission-info
|
||||
"x" 'transmission-move
|
||||
"o" 'transmission-find-file-other-window
|
||||
"q" 'quit-window
|
||||
"u" 'transmission-files-unwant
|
||||
"O" 'transmission-view-file
|
||||
"U" 'transmission-files-want
|
||||
"C" 'transmission-files-priority)
|
||||
|
||||
(evil-define-key 'normal transmission-info-mode-map
|
||||
"r" 'transmission-trackers-remove
|
||||
"c" 'transmission-copy-magnet
|
||||
"d" 'transmission-set-torrent-download
|
||||
"U" 'transmission-set-torrent-ratio
|
||||
"q" 'quit-window
|
||||
"a" 'transmission-trackers-add
|
||||
"u" 'transmission-set-torrent-upload
|
||||
"e" 'transmission-peers
|
||||
"x" 'transmission-move
|
||||
"I" 'transmission-trackers-add
|
||||
"C" 'transmission-set-bandwidth-priority)
|
||||
|
||||
(evil-define-key 'normal transmission-peers-mode-map
|
||||
"S" 'tabulated-list-sort
|
||||
"i" 'transmission-info
|
||||
"q" 'quit-window)
|
||||
|
||||
(provide 'init-evil-transmission)
|
|
@ -7,6 +7,10 @@
|
|||
;; - Navigating through the marks randomly produces a "Marker points into wrong buffer" error.
|
||||
;; https://github.com/emacs-evil/evil/issues/845#issuecomment-306050231
|
||||
|
||||
;; TODO: Make Evil commands react more dynamically with read-only text.
|
||||
;; Add support for I, C, D, S, s, c*, d*, R, r.
|
||||
;; See https://github.com/emacs-evil/evil/issues/852.
|
||||
|
||||
;; Several packages handle relative line numbering:
|
||||
;; - nlinum-relative: Seems slow as of May 2017.
|
||||
;; - linum-relative: integrates well but not with fringe string, must be a function.
|
||||
|
@ -86,34 +90,6 @@ See `eshell' for the numeric prefix ARG."
|
|||
"G" 'helm-grep-git-all-or-ag
|
||||
"r" 'helm-resume))
|
||||
|
||||
(with-eval-after-load 'init-helm
|
||||
;; To navigate helm entries with hjkl, using the C- modifier would conflict
|
||||
;; with C-h (help prefix) and C-k (`evil-insert-digraph'). We use M- instead.
|
||||
(define-keys helm-map
|
||||
"C-\\" 'helm-toggle-resplit-and-swap-windows
|
||||
"C-f" 'helm-next-page
|
||||
"C-b" 'helm-previous-page
|
||||
"M-h" 'helm-next-source
|
||||
"M-j" 'helm-next-line
|
||||
"M-k" 'helm-previous-line
|
||||
"M-l" 'helm-execute-persistent-action
|
||||
"M-." 'helm-end-of-buffer
|
||||
"M-," 'helm-beginning-of-buffer
|
||||
"<escape>" 'helm-keyboard-quit)
|
||||
(evil-define-key 'normal helm-map
|
||||
"\C-f" 'helm-next-page
|
||||
"\C-b" 'helm-previous-page)
|
||||
(define-key helm-buffer-map (kbd "M-o") 'helm-buffer-switch-other-window)
|
||||
(define-key helm-moccur-map (kbd "M-o") 'helm-moccur-run-goto-line-ow)
|
||||
(define-key helm-grep-map (kbd "M-o") 'helm-grep-run-other-window-action)
|
||||
(define-key helm-map (kbd "C-/") 'helm-quit-and-find-file)
|
||||
(dolist (map (list helm-find-files-map helm-read-file-map))
|
||||
(define-keys map
|
||||
"M-o" 'helm-ff-run-switch-other-window
|
||||
"C-/" 'helm-ff-run-find-sh-command
|
||||
"M-h" 'helm-find-files-up-one-level
|
||||
"M-l" 'helm-execute-persistent-action
|
||||
"C-l" nil))) ; So that the header displays the above binding.
|
||||
|
||||
;; Motion map: useful for `Info-mode', `help-mode', etc.
|
||||
;; See `evil-motion-state-modes'.
|
||||
|
@ -136,17 +112,6 @@ See `eshell' for the numeric prefix ARG."
|
|||
;;; https://github.com/emacs-evil/evil/issues/854#issuecomment-309085267
|
||||
(evil-set-initial-state 'term-mode 'emacs)
|
||||
|
||||
;; Add support for magit.
|
||||
(with-eval-after-load 'magit
|
||||
(when (require 'evil-magit nil t)
|
||||
(evil-magit-define-key evil-magit-state 'magit-mode-map "<" 'magit-section-up)
|
||||
;; C-j/k is the default, M-j/k is more intuitive if we use it for helm.
|
||||
(evil-magit-define-key evil-magit-state 'magit-mode-map "M-j" 'magit-section-forward)
|
||||
(evil-magit-define-key evil-magit-state 'magit-mode-map "M-k" 'magit-section-backward)))
|
||||
|
||||
;; Add support for ediff.
|
||||
(require 'evil-ediff nil t)
|
||||
|
||||
;; For git commit, web edits and others.
|
||||
;; Since `with-editor-mode' is not a major mode, `evil-set-initial-state' cannot
|
||||
;; be used.
|
||||
|
@ -185,75 +150,6 @@ See `eshell' for the numeric prefix ARG."
|
|||
"M-p" 'previous-history-element
|
||||
"M-n" 'next-history-element)
|
||||
|
||||
;; Remap org-mode meta keys for convenience
|
||||
;; - org-evil: Not as polished as of May 2017.
|
||||
;; - evil-org: Depends on MELPA's org-mode, too big a dependency for me.
|
||||
;; See https://github.com/Somelauw/evil-org-mode/blob/master/doc/keythemes.org for inspiration.
|
||||
(evil-define-key 'normal org-mode-map
|
||||
(kbd "M-<return>") (lambda () (interactive) (evil-insert 1) (org-meta-return))
|
||||
"L" 'org-shiftright
|
||||
"H" 'org-shiftleft
|
||||
"K" 'org-shiftup
|
||||
"J" 'org-shiftdown
|
||||
"\M-l" 'org-metaright
|
||||
"\M-h" 'org-metaleft
|
||||
"\M-k" 'org-metaup
|
||||
"\M-j" 'org-metadown
|
||||
"\M-L" 'org-shiftmetaright
|
||||
"\M-H" 'org-shiftmetaleft
|
||||
"\M-K" 'org-shiftmetaup
|
||||
"\M-J" 'org-shiftmetadown
|
||||
"<" 'org-up-element)
|
||||
|
||||
;;; Package-menu mode
|
||||
(evil-set-initial-state 'package-menu-mode 'normal)
|
||||
(evil-define-key 'normal package-menu-mode-map "q" 'quit-window)
|
||||
(evil-define-key 'normal package-menu-mode-map "i" 'package-menu-mark-install)
|
||||
(evil-define-key 'normal package-menu-mode-map "U" 'package-menu-mark-upgrades)
|
||||
(evil-define-key 'normal package-menu-mode-map "u" 'package-menu-mark-unmark)
|
||||
(evil-define-key 'normal package-menu-mode-map "d" 'package-menu-mark-delete)
|
||||
(evil-define-key 'normal package-menu-mode-map "x" 'package-menu-execute)
|
||||
|
||||
;; Eshell
|
||||
(defun evil/eshell-next-prompt ()
|
||||
(when (get-text-property (point) 'read-only)
|
||||
;; If at end of prompt, `eshell-next-prompt' will not move, so go backward.
|
||||
(beginning-of-line)
|
||||
(eshell-next-prompt 1)))
|
||||
(defun evil/eshell-setup ()
|
||||
(dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook))
|
||||
(add-hook hook 'evil/eshell-next-prompt nil t)))
|
||||
(add-hook 'eshell-mode-hook 'evil/eshell-setup)
|
||||
|
||||
(defun evil/eshell-interrupt-process ()
|
||||
(interactive)
|
||||
(eshell-interrupt-process)
|
||||
(evil-insert 1))
|
||||
|
||||
;;; `eshell-mode-map' is reset when Eshell is initialized in `eshell-mode'. We
|
||||
;;; need to add bindings to `eshell-first-time-mode-hook'.
|
||||
(defun evil/eshell-set-keys ()
|
||||
(with-eval-after-load 'init-helm
|
||||
(evil-define-key 'insert eshell-mode-map "\C-e" 'helm-find-files))
|
||||
(evil-define-key 'normal eshell-mode-map
|
||||
"[" 'eshell-previous-prompt
|
||||
"]" 'eshell-next-prompt
|
||||
"\M-k" 'eshell-previous-prompt
|
||||
"\M-j" 'eshell-next-prompt
|
||||
"0" 'eshell-bol
|
||||
(kbd "RET") 'eshell-send-input
|
||||
(kbd "C-c C-c") 'evil/eshell-interrupt-process
|
||||
"\M-h" 'eshell-backward-argument
|
||||
"\M-l" 'eshell-forward-argument)
|
||||
(evil-define-key 'insert
|
||||
eshell-mode-map "\M-h" 'eshell-backward-argument
|
||||
"\M-l" 'eshell-forward-argument))
|
||||
(add-hook 'eshell-first-time-mode-hook 'evil/eshell-set-keys)
|
||||
|
||||
;; TODO: Make Evil commands react more dynamically with read-only text.
|
||||
;; Add support for I, C, D, S, s, c*, d*, R, r.
|
||||
;; See https://github.com/emacs-evil/evil/issues/852.
|
||||
|
||||
;; Go-to-definition.
|
||||
;; From https://emacs.stackexchange.com/questions/608/evil-map-keybindings-the-vim-way.
|
||||
(evil-global-set-key
|
||||
|
@ -273,164 +169,6 @@ See `eshell' for the numeric prefix ARG."
|
|||
(when (require 'evil-mc-extras nil t)
|
||||
(global-evil-mc-extras-mode 1)))
|
||||
|
||||
;; nXML
|
||||
(evil-define-key 'normal nxml-mode-map "<" 'nxml-backward-up-element)
|
||||
|
||||
;; Calendar
|
||||
(evil-define-key 'motion calendar-mode-map
|
||||
"v" 'calendar-set-mark
|
||||
"h" 'calendar-backward-day
|
||||
"0" 'calendar-beginning-of-week
|
||||
"$" 'calendar-end-of-week
|
||||
"l" 'calendar-forward-day
|
||||
"j" 'calendar-forward-week
|
||||
"k" 'calendar-backward-week
|
||||
"\C-f" 'calendar-scroll-left-three-months
|
||||
;; (kbd "<space>") 'scroll-other-window
|
||||
"." 'calendar-goto-today
|
||||
"<" 'calendar-scroll-right
|
||||
">" 'calendar-scroll-left
|
||||
"?" 'calendar-goto-info-node
|
||||
"D" 'diary-view-other-diary-entries
|
||||
"M" 'calendar-lunar-phases
|
||||
"S" 'calendar-sunrise-sunset
|
||||
"a" 'calendar-list-holidays
|
||||
"c" 'org-calendar-goto-agenda
|
||||
"d" 'diary-view-entries
|
||||
"\M-h" 'calendar-cursor-holidays
|
||||
"m" 'diary-mark-entries
|
||||
"o" 'calendar-other-month
|
||||
"q" 'calendar-exit
|
||||
"s" 'diary-show-all-entries
|
||||
"u" 'calendar-unmark
|
||||
"x" 'calendar-mark-holidays
|
||||
"\C-c\C-l" 'calendar-redraw
|
||||
"[" 'calendar-backward-year
|
||||
"]" 'calendar-forward-year
|
||||
"\M-<" 'calendar-beginning-of-year
|
||||
"\M-=" 'calendar-count-days-region
|
||||
"\M->" 'calendar-end-of-year
|
||||
"(" 'calendar-beginning-of-month
|
||||
")" 'calendar-end-of-month
|
||||
"\C-b" 'calendar-scroll-right-three-months
|
||||
"{" 'calendar-backward-month
|
||||
"}" 'calendar-forward-month)
|
||||
|
||||
;;; Emms
|
||||
;;; It is important to set the bindings after emms-browser has loaded,
|
||||
;;; since the mode-maps are defconst'd.
|
||||
(with-eval-after-load 'emms-browser
|
||||
(dolist (mode '(emms-browser-mode emms-playlist-mode))
|
||||
(evil-set-initial-state mode 'normal))
|
||||
|
||||
(defun evil/emms-playlist-mode-insert-newline-above ()
|
||||
"Insert a newline above point."
|
||||
(interactive)
|
||||
(emms-with-inhibit-read-only-t
|
||||
(evil-insert-newline-above)))
|
||||
|
||||
(defun evil/emms-playlist-mode-insert-newline-below ()
|
||||
"Insert a newline below point."
|
||||
(interactive)
|
||||
(emms-with-inhibit-read-only-t
|
||||
(evil-insert-newline-below)))
|
||||
|
||||
(defun evil/emms-playlist-mode-paste-before ()
|
||||
"Pastes the latest yanked playlist items before the cursor position.
|
||||
The return value is the yanked text."
|
||||
(interactive)
|
||||
(emms-with-inhibit-read-only-t
|
||||
(goto-char (point-at-bol))
|
||||
(yank)
|
||||
(emms-playlist-mode-correct-previous-yank)
|
||||
(evil-previous-line)
|
||||
(evil-beginning-of-line)))
|
||||
|
||||
(defun evil/emms-playlist-mode-paste-after ()
|
||||
"Pastes the latest yanked playlist items behind point.
|
||||
The return value is the yanked text."
|
||||
(interactive)
|
||||
(evil-next-line)
|
||||
(evil/emms-playlist-mode-paste-before))
|
||||
|
||||
(dolist (map (list emms-browser-mode-map emms-playlist-mode-map))
|
||||
(evil-define-key 'normal map
|
||||
"+" 'emms-volume-raise
|
||||
"=" 'emms-volume-raise
|
||||
"-" 'emms-volume-lower
|
||||
"u" 'emms-playlist-mode-undo))
|
||||
|
||||
(evil-define-key 'normal emms-browser-mode-map
|
||||
(kbd "C-<return>") 'emms-browser-add-tracks-and-play
|
||||
(kbd "<return>") 'emms-browser-add-tracks
|
||||
(kbd "<tab>") 'emms-browser-toggle-subitems
|
||||
"/" 'emms-isearch-buffer ; This shows hidden items during search.
|
||||
"g1" 'emms-browser-collapse-all
|
||||
"g2" 'emms-browser-expand-to-level-2
|
||||
"g3" 'emms-browser-expand-to-level-3
|
||||
"g4" 'emms-browser-expand-to-level-4
|
||||
"<" 'emms-browser-previous-filter
|
||||
">" 'emms-browser-next-filter
|
||||
"C" 'emms-browser-clear-playlist
|
||||
"D" 'emms-browser-delete-files
|
||||
"g0" 'emms-browser-expand-all
|
||||
"d" 'emms-browser-view-in-dired
|
||||
"\C-j" 'emms-browser-next-non-track
|
||||
"\C-k" 'emms-browser-prev-non-track
|
||||
"\M-j" 'emms-browser-next-non-track
|
||||
"\M-k" 'emms-browser-prev-non-track
|
||||
"[" 'emms-browser-prev-non-track
|
||||
"]" 'emms-browser-next-non-track
|
||||
"{" 'emms-browser-prev-non-track
|
||||
"}" 'emms-browser-next-non-track
|
||||
"ga" 'emms-browse-by-artist
|
||||
"gA" 'emms-browse-by-album
|
||||
"gb" 'emms-browse-by-genre
|
||||
"gy" 'emms-browse-by-year
|
||||
"gc" 'emms-browse-by-composer
|
||||
"gp" 'emms-browse-by-performer
|
||||
"x" 'emms-pause
|
||||
"s" (lookup-key emms-browser-mode-map (kbd "s"))
|
||||
"z" (lookup-key emms-browser-mode-map (kbd "W")))
|
||||
|
||||
(evil-define-key 'normal emms-playlist-mode-map
|
||||
"o" 'evil/emms-playlist-mode-insert-newline-below
|
||||
"O" 'evil/emms-playlist-mode-insert-newline-above
|
||||
"d" 'emms-playlist-mode-kill-track
|
||||
(kbd "<return>") 'emms-playlist-mode-play-smart
|
||||
"P" 'evil/emms-playlist-mode-paste-before
|
||||
"p" 'evil/emms-playlist-mode-paste-after
|
||||
"u" 'emms-playlist-mode-undo
|
||||
"<" 'emms-seek-backward
|
||||
">" 'emms-seek-forward
|
||||
"C" 'emms-playlist-mode-clear
|
||||
"D" 'emms-playlist-mode-kill-track
|
||||
"ze" 'emms-tag-editor-edit
|
||||
"x" 'emms-pause
|
||||
"R" 'emms-tag-editor-rename
|
||||
"a" 'emms-playlist-mode-add-contents
|
||||
"zp" 'emms-playlist-set-playlist-buffer
|
||||
"c" 'emms-playlist-mode-center-current
|
||||
"gd" 'emms-playlist-mode-goto-dired-at-point
|
||||
"zs" 'emms-show
|
||||
"\C-j" 'emms-next
|
||||
"\C-k" 'emms-previous
|
||||
"\M-j" 'emms-next
|
||||
"\M-k" 'emms-previous
|
||||
"r" 'emms-random
|
||||
"s" 'emms-stop
|
||||
"S" (lookup-key emms-playlist-mode-map (kbd "S"))
|
||||
"zf" (lookup-key emms-playlist-mode-map (kbd "/"))
|
||||
"zff" 'emms-playlist-limit-to-all
|
||||
"gg" 'emms-playlist-mode-first
|
||||
"G" 'emms-playlist-mode-last
|
||||
"]" 'emms-playlist-mode-next
|
||||
"[" 'emms-playlist-mode-previous
|
||||
"M-y" 'emms-playlist-mode-yank-pop)
|
||||
(evil-define-key 'visual emms-playlist-mode-map
|
||||
"d" 'emms-playlist-mode-kill
|
||||
"D" 'emms-playlist-mode-kill))
|
||||
|
||||
;; Change mode-line color by Evil state.
|
||||
(setq evil-default-modeline-color (cons (face-background 'mode-line) (or (face-foreground 'mode-line) "black")))
|
||||
(defun evil-color-modeline ()
|
||||
|
@ -443,95 +181,6 @@ The return value is the yanked text."
|
|||
(add-hook 'post-command-hook 'evil-color-modeline)
|
||||
(setq evil-mode-line-format nil)
|
||||
|
||||
;; TODO: Use motion map for transmission, emms, elfeed...?
|
||||
|
||||
(with-eval-after-load 'transmission
|
||||
(evil-set-initial-state 'transmission-mode 'normal)
|
||||
(evil-define-key 'normal transmission-mode-map
|
||||
(kbd "<return>") 'transmission-files
|
||||
"D" 'transmission-delete
|
||||
"S" 'tabulated-list-sort
|
||||
"a" 'transmission-add
|
||||
"d" 'transmission-set-download
|
||||
"e" 'transmission-peers
|
||||
"i" 'transmission-info
|
||||
"U" 'transmission-set-ratio
|
||||
"x" 'transmission-move
|
||||
"q" 'transmission-quit
|
||||
"r" 'transmission-remove
|
||||
"s" 'transmission-toggle
|
||||
"I" 'transmission-trackers-add
|
||||
"u" 'transmission-set-upload
|
||||
"c" 'transmission-verify
|
||||
"C" 'transmission-set-bandwidth-priority)
|
||||
(evil-define-key 'normal transmission-files-mode-map
|
||||
(kbd "<return>") 'transmission-find-file
|
||||
"\M-l" 'transmission-display-file
|
||||
"!" 'transmission-files-command
|
||||
"S" 'tabulated-list-sort
|
||||
"A" 'transmission-browse-url-of-file
|
||||
"X" 'transmission-files-command
|
||||
"^" 'quit-window
|
||||
"e" 'transmission-peers
|
||||
"i" 'transmission-info
|
||||
"x" 'transmission-move
|
||||
"o" 'transmission-find-file-other-window
|
||||
"q" 'quit-window
|
||||
"u" 'transmission-files-unwant
|
||||
"O" 'transmission-view-file
|
||||
"U" 'transmission-files-want
|
||||
"C" 'transmission-files-priority)
|
||||
(evil-define-key 'normal transmission-info-mode-map
|
||||
"r" 'transmission-trackers-remove
|
||||
"c" 'transmission-copy-magnet
|
||||
"d" 'transmission-set-torrent-download
|
||||
"U" 'transmission-set-torrent-ratio
|
||||
"q" 'quit-window
|
||||
"a" 'transmission-trackers-add
|
||||
"u" 'transmission-set-torrent-upload
|
||||
"e" 'transmission-peers
|
||||
"x" 'transmission-move
|
||||
"I" 'transmission-trackers-add
|
||||
"C" 'transmission-set-bandwidth-priority)
|
||||
(evil-define-key 'normal transmission-peers-mode-map
|
||||
"S" 'tabulated-list-sort
|
||||
"i" 'transmission-info
|
||||
"q" 'quit-window))
|
||||
|
||||
(with-eval-after-load 'elfeed
|
||||
(evil-set-initial-state 'elfeed-search-mode 'normal)
|
||||
(evil-define-key 'normal elfeed-search-mode-map
|
||||
(kbd "<return>") 'elfeed-search-show-entry
|
||||
"R" 'elfeed-search-fetch
|
||||
"S" 'elfeed-search-set-filter
|
||||
"o" 'elfeed-search-browse-url
|
||||
"O" 'elfeed-play-in-mpv ; Custom function
|
||||
"r" 'elfeed-search-update--force
|
||||
"q" 'quit-window
|
||||
"s" 'elfeed-search-live-filter
|
||||
"y" 'elfeed-search-yank)
|
||||
(evil-define-key '(normal visual) elfeed-search-mode-map
|
||||
"+" 'elfeed-search-tag-all
|
||||
"-" 'elfeed-search-untag-all
|
||||
"U" 'elfeed-search-tag-all-unread
|
||||
"u" 'elfeed-search-untag-all-unread)
|
||||
(evil-define-key 'normal elfeed-show-mode-map
|
||||
"+" 'elfeed-show-tag
|
||||
"-" 'elfeed-show-untag
|
||||
"A" 'elfeed-show-add-enclosure-to-playlist
|
||||
"P" 'elfeed-show-play-enclosure
|
||||
"o" 'elfeed-show-visit
|
||||
"O" 'elfeed-play-in-mpv ; Custom function
|
||||
"d" 'elfeed-show-save-enclosure
|
||||
"r" 'elfeed-show-refresh
|
||||
"]" 'elfeed-show-next
|
||||
"[" 'elfeed-show-prev
|
||||
"\M-j" 'elfeed-show-next
|
||||
"\M-k" 'elfeed-show-prev
|
||||
"q" 'elfeed-kill-buffer
|
||||
"s" 'elfeed-show-new-live-search
|
||||
"y" 'elfeed-show-yank))
|
||||
|
||||
;; Add defun text-object.
|
||||
(evil-define-text-object evil-a-defun (count &optional beg end type)
|
||||
"Select a defun."
|
||||
|
@ -547,6 +196,39 @@ The return value is the yanked text."
|
|||
(evil-range (region-beginning) (region-end) type :expanded t)))
|
||||
(define-key evil-inner-text-objects-map "m" 'evgeni-inner-defun)
|
||||
|
||||
|
||||
|
||||
;; TODO: Use motion map for package, transmission, emms, elfeed...?
|
||||
(with-eval-after-load 'transmission (require 'init-evil-transmission))
|
||||
|
||||
(with-eval-after-load 'elfeed (require 'init-evil-elfeed))
|
||||
|
||||
;;; Emms: It is important to set the bindings after emms-browser has loaded,
|
||||
;;; since the mode-maps are defconst'd.
|
||||
(with-eval-after-load 'emms-browser (require 'init-evil-emms))
|
||||
|
||||
(require 'evil-mu4e)
|
||||
|
||||
(with-eval-after-load 'init-helm (require 'init-evil-helm))
|
||||
|
||||
(with-eval-after-load 'calendar (require 'init-evil-calendar))
|
||||
|
||||
;; nXML
|
||||
(evil-define-key 'normal nxml-mode-map "<" 'nxml-backward-up-element)
|
||||
|
||||
(with-eval-after-load 'magit
|
||||
(when (require 'evil-magit nil t)
|
||||
(evil-magit-define-key evil-magit-state 'magit-mode-map "<" 'magit-section-up)
|
||||
;; C-j/k is the default, M-j/k is more consistent with our customization for Helm.
|
||||
(evil-magit-define-key evil-magit-state 'magit-mode-map "M-j" 'magit-section-forward)
|
||||
(evil-magit-define-key evil-magit-state 'magit-mode-map "M-k" 'magit-section-backward)))
|
||||
|
||||
(require 'evil-ediff nil t)
|
||||
|
||||
(with-eval-after-load 'org (require 'init-evil-org))
|
||||
|
||||
(with-eval-after-load 'package (require 'init-evil-package))
|
||||
|
||||
(with-eval-after-load 'eshell (require 'init-evil-eshell))
|
||||
|
||||
(provide 'init-evil)
|
||||
|
|
Loading…
Reference in New Issue