Skip to content

Commit

Permalink
Emacs: Allow arbitrary load order for Helm
Browse files Browse the repository at this point in the history
  • Loading branch information
Ambrevar committed May 27, 2017
1 parent 3ff30b9 commit 4c00ce9
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 85 deletions.
23 changes: 10 additions & 13 deletions .emacs.d/init.el
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,6 @@ To view where the bindings are set in your config files, lookup
(require 'main nil t)
(require 'visual nil t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Load first.

;; Helm
(add-to-list 'package-selected-packages 'helm)
(add-to-list 'package-selected-packages 'helm-descbinds)
(add-to-list 'package-selected-packages 'helm-ls-git)
;; (add-to-list 'package-selected-packages 'helm-pt) ; No need?
(add-to-list 'package-selected-packages 'wgrep-helm)
(add-to-list 'package-selected-packages 'wgrep-pt)
(when (require 'helm-config nil t)
(require 'tool-helm))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Major modes

Expand Down Expand Up @@ -262,6 +249,16 @@ To view where the bindings are set in your config files, lookup
;; GUD (GDB, etc.)
(add-hook 'gud-mode-hook (lambda () (require 'mode-gud)))

;; Helm
(add-to-list 'package-selected-packages 'helm)
(add-to-list 'package-selected-packages 'helm-descbinds)
(add-to-list 'package-selected-packages 'helm-ls-git)
;; (add-to-list 'package-selected-packages 'helm-pt) ; No need?
(add-to-list 'package-selected-packages 'wgrep-helm)
(add-to-list 'package-selected-packages 'wgrep-pt)
(when (require 'helm-config nil t)
(require 'tool-helm))

;; Indentation engine fix.
(require 'smiext "tool-smiext")

Expand Down
152 changes: 80 additions & 72 deletions .emacs.d/lisp/tool-evil.el
Original file line number Diff line number Diff line change
Expand Up @@ -3,83 +3,91 @@
;; TODO: Turn off bindings from tool-helm.el when evil is loaded?
;; TODO: Add hjkl to debugger output mode.
;; TODO: Navigate visual lines with j/k?
;; TODO: M-; comments next line in VISUAL. This is because of a different newline definition between Emacs and Vim.
;; https://github.com/redguardtoo/evil-nerd-commenter
;; Not so different, cannot comment up without M--.

;; TODO: M-; comments next line in VISUAL. This is because of a different
;; newline definition between Emacs and Vim.
;; https://github.com/redguardtoo/evil-nerd-commenter: Not so different, cannot
;; comment up without M--.

;; 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.
;; - relative-line-number: linum must be disabled before running this.
(when (require 'linum-relative nil t)
;; TODO: Current symbol is displayed on all lines in occur, set-variables,
;; helm-occur, etc. https://github.com/coldnew/linum-relative/issues/40
;; TODO: Current symbol is displayed on all lines when we run `occur', `set-variables',
;; `helm-occur', etc: https://github.com/coldnew/linum-relative/issues/40
(setq linum-relative-current-symbol "")
(linum-relative-toggle))

;; The evil-leader package might seem worthless but it centralizes the leader
;; key configuration and automatically makes it available in relevant states. We
;; do not map <leader><leader> to most used command since it could be
;; misleading. Maybe the helm buffer menu would be interesting to have though.
;; key configuration and automatically makes it available in relevant states.
;; TODO: We do not map <leader><leader> to most used command since it could be
;; misleading. Maybe the helm buffer menu would be interesting to have though?
(when (require 'evil-leader nil t)
;; TODO: dired/info can not super <SPC> as leader. Use ',' as leader key?
(evil-leader/set-leader "<SPC>")
(evil-leader/set-key
"RET" 'spawn-terminal
"\\" 'toggle-window-split
"b" 'buffer-menu
"e" 'find-file
"h" 'help-command ; Does not work in insert mode. M-h creates conflicts, so let's keep C-h for insert mode.
"k" 'kill-this-buffer ; TODO: In Vim its :bd, so should we map to " d"? Then git project should be something else.
"o" 'delete-other-windows
"w" 'evil-window-next
"|" 'swap-windows ; TODO: Map to " x" (Vim has ^W x)? helm-marks would then need to be mapped to '' for instance.
)
(when (require 'magit nil t)
;; Use S-SPC instead of SPC to browse commit details.
(evil-leader/set-key "v" 'magit-status))
(when (require 'helm-config nil t)
(evil-leader/set-key
"r" 'helm-resume
"b" 'helm-mini
"d" 'helm-browse-project
"e" 'helm-find-files
"E" 'helm-find
"g" 'helm-grep-git-or-ag
"G" 'helm-grep-git-all-or-ag
"ha" 'helm-apropos))
;; leader mode must be set before evil-mode.
;; Leader mode must be set before evil-mode.
(global-evil-leader-mode))

(evil-mode 1)

(evil-global-set-key 'normal "\M-6" 'evil-switch-to-windows-last-buffer)
(evil-global-set-key 'normal (kbd "M-v") 'evil-visual-block)
(evil-global-set-key 'motion (kbd "M-b") 'evil-scroll-page-up)
(evil-global-set-key 'motion (kbd "M-f") 'evil-scroll-page-down)
(evil-global-set-key 'motion (kbd "M-r") 'undo-tree-redo)
;; TODO: dired/info can not super <SPC> as leader. Use ',' as leader key?
(evil-leader/set-leader "<SPC>")
(evil-leader/set-key
"RET" 'spawn-terminal
"\\" 'toggle-window-split
"b" 'buffer-menu
"e" 'find-file
;; "h" 'help-command ; Does not work in insert mode. M-h creates conflicts, so let's keep C-h for insert mode.
"k" 'kill-this-buffer ; TODO: In Vim its :bd, so should we map to " d"? Then git project should be something else.
"o" 'delete-other-windows
"w" 'evil-window-next
"|" 'swap-windows ; TODO: Map to " x" (Vim has ^W x)? helm-marks would then need to be mapped to '' for instance.
)
(when (require 'magit nil t)
;; Use S-SPC instead of SPC to browse commit details.
(evil-leader/set-key "v" 'magit-status))

;; TODO: Remove M-bindings that are useless when Ctrl is properly mapped.
;; (evil-global-set-key 'normal "\M-6" 'evil-switch-to-windows-last-buffer)
;; (evil-global-set-key 'normal (kbd "M-v") 'evil-visual-block)
;; (evil-global-set-key 'motion (kbd "M-b") 'evil-scroll-page-up)
;; (evil-global-set-key 'motion (kbd "M-f") 'evil-scroll-page-down)
;; (evil-global-set-key 'motion (kbd "M-r") 'undo-tree-redo)

;; Tweak motion map: useful for info-mode, help-mode, etc.
;; See `evil-motion-state-modes'.
;; TODO: Map n/p, l/r for help-mode and Info-mode.
;; TODO: Map n/p, l/r for help-mode and Info-mode?
(evil-global-set-key 'motion (kbd "TAB") 'forward-button)
(evil-global-set-key 'motion (kbd "<backtab>") 'backward-button)
(evil-define-key 'motion Info-mode-map "\M-f" 'Info-scroll-up)
(evil-define-key 'motion Info-mode-map "\M-b" 'Info-scroll-down)

(when (require 'helm-config nil t)
;; This separates Vim marks into Emacs marks and Emacs bookmarks.
(evil-global-set-key 'normal "m" 'helm-filtered-bookmarks)
;; TODO: This does not work well together with Evil.
;; Alternative: show-marks with helm?
;; Back to where search started with C-o. Alternative without Ctrl? Seems that '' does it.

;; This depends on the local configuration of Helm which might not be loaded
;; yet.
(with-eval-after-load 'tool-helm
(evil-leader/set-key
"b" 'helm-mini
"d" 'helm-browse-project
"e" 'helm-find-files
"E" 'helm-find
"g" 'helm-grep-git-or-ag
"G" 'helm-grep-git-all-or-ag
;; "ha" 'helm-apropos
"m" 'helm-filtered-bookmarks ; This must be a leader binding: normal mode "m" could get shadowed (e.g. dired).
;; "q" 'read-only-mode ; Bad cause in wdired, it's a different mapping.
"r" 'helm-resume)

;; TODO: show-marks with helm? Evil mixes up the mark ring.
;; Back to where search started with C-o or ''(?).
(evil-global-set-key 'normal "'" 'helm-mark-or-exchange-rect)
;; TODO: Yank ring pasting behaves like Emacs, not Vim.
(evil-global-set-key 'normal "\M-p" 'helm-show-kill-ring)

;; TODO: Should we stick to M-based bindings or use C-based?
;; Magit uses C-jk, helm uses C-space.
;; Evil has C-w, C-o, C-p, C-r.
;; Emacs has C-xC-q, C-xC-o.
;; In environments where Caps is not Ctrl, C-bindings are painful.
(define-key helm-map (kbd "M-\\") 'helm-toggle-resplit-and-swap-windows) ; Or use M-t (helm standard binding is C-t).
(define-key helm-map (kbd "M-f") 'helm-next-page)
(define-key helm-map (kbd "M-b") 'helm-previous-page)
(define-key helm-map (kbd "C-f") 'helm-next-page)
(define-key helm-map (kbd "C-b") 'helm-previous-page)
(define-key helm-map (kbd "M-j") 'helm-next-line)
(define-key helm-map (kbd "M-k") 'helm-previous-line)
(define-key helm-map (kbd "M-h") 'helm-next-source)
Expand All @@ -100,6 +108,9 @@
;; (evil-ex-define-cmd "ls" 'helm-buffers-list)
;; (evil-ex-define-cmd "edit" 'helm-find-files)

;; Add support for magit.
(require 'evil-magit nil t)
;; TODO: C-jk is the default, M-jk is more intuitive if we use it for helm. Set it?
(when (and (require 'magit-mode nil t) (require 'evil-magit nil t))
(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))
Expand Down Expand Up @@ -142,22 +153,18 @@
;; - 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.
(add-hook
'org-mode-hook
(lambda ()
(when (require 'evil-leader nil t)
(evil-leader/set-key-for-mode 'org-mode "a" 'org-agenda))
(evil-define-key 'normal org-mode-map "<" 'org-up-element)
(dolist (state '(normal insert))
(evil-define-key state org-mode-map
(kbd "M-l") 'org-shiftright
(kbd "M-h") 'org-shiftleft
(kbd "M-k") 'org-shiftup
(kbd "M-j") 'org-shiftdown
(kbd "M-L") 'org-shiftmetaright
(kbd "M-H") 'org-shiftmetaleft
(kbd "M-K") 'org-shiftmetaup
(kbd "M-J") 'org-shiftmetadown))))
(when (require 'evil-leader nil t)
(evil-leader/set-key-for-mode 'org-mode "a" 'org-agenda))
(evil-define-key 'normal org-mode-map
"\M-l" 'org-shiftright
"\M-h" 'org-shiftleft
"\M-k" 'org-shiftup
"\M-j" 'org-shiftdown
"\M-L" 'org-shiftmetaright
"\M-H" 'org-shiftmetaleft
"\M-K" 'org-shiftmetaup
"\M-J" 'org-shiftmetadown
"<" 'org-up-element)

;; Package-menu mode
(delete 'package-menu-mode evil-emacs-state-modes)
Expand All @@ -176,11 +183,12 @@
(call-interactively (key-binding (kbd "M-.")))))

;; Multiple cursors.
;; TODO: Not able to execute arbitrary commands with multiple cursors.
;; https://github.com/gabesoft/evil-mc/issues/65
;; TODO: Figure out better bindings, current ones shadow 'paste', history browsing, Magit update "gr" (Use ?g instead), etc.
(when (require 'evil-mc nil t)
(global-evil-mc-mode 1)
(when (require 'evil-mc-extras nil t)
(global-evil-mc-extras-mode 1)))
;; (when (require 'evil-mc-extras nil t)
;; (global-evil-mc-extras-mode 1))
)


(provide 'tool-evil)

0 comments on commit 4c00ce9

Please sign in to comment.