Merge pull request #150 from bandresen/feature_hydra

Add feature/hydra; add smerge + git-gutter hydras
This commit is contained in:
Henrik Lissner 2017-07-17 12:41:08 +02:00 committed by GitHub
commit 9de677d49c
8 changed files with 201 additions and 1 deletions

View file

@ -34,6 +34,7 @@
jump ; helping you get around jump ; helping you get around
snippets ; my elves. They type so I don't have to snippets ; my elves. They type so I don't have to
file-templates ; auto-snippets for empty files file-templates ; auto-snippets for empty files
hydra ; keybindings that stick around
spellcheck ; tasing you for misspelling mispelling spellcheck ; tasing you for misspelling mispelling
syntax-checker ; tasing you for every semicolon you forget syntax-checker ; tasing you for every semicolon you forget
version-control ; remember, remember that commit in November version-control ; remember, remember that commit in November

View file

@ -0,0 +1,2 @@
;;; feature/hydra/autoload/evil.el -*- lexical-binding: t; -*-

View file

@ -0,0 +1,2 @@
;;; feature/hydra/autoload/hydras.el -*- lexical-binding: t; -*-

View file

@ -0,0 +1,94 @@
;;; feature/hydra/config.el -*- lexical-binding: t; -*-
(def-package! hydra
:commands (+hydra-zoom/body +hydra-window/body)
:config
(defhydra +hydra-zoom (:hint t :color red)
"zoom"
("j" text-scale-increase "in")
("k" text-scale-decrease "out")
("0" (text-scale-set 0) "reset"))
(defhydra +hydra-window (:hint nil)
"
Split: _v_ert _s_:horz
Delete: _c_lose _o_nly
Switch Window: _h_:left _j_:down _k_:up _l_:right
Buffers: _p_revious _n_ext _b_:select _f_ind-file
Resize: _H_:splitter left _J_:splitter down _K_:splitter up _L_:splitter right
Move: _a_:up _z_:down _i_menu"
("z" scroll-up-line)
("a" scroll-down-line)
("i" idomenu)
("h" windmove-left)
("j" windmove-down)
("k" windmove-up)
("l" windmove-right)
("p" previous-buffer)
("n" next-buffer)
("b" ido-switch-buffer)
("f" ido-find-file)
("s" split-window-below)
("v" split-window-right)
("c" delete-window)
("o" delete-other-windows)
("H" hydra-move-splitter-left)
("J" hydra-move-splitter-down)
("K" hydra-move-splitter-up)
("L" hydra-move-splitter-right)
("q" nil)))
(when (featurep! :completion ivy)
(def-package! ivy-hydra
:config
(define-key ivy-mode-map (kbd "C-o")
(defhydra coo-ivy (:hint nil :color pink)
"
Move ^^^^^^^^^^ | Call ^^^^ | Cancel^^ | Options^^ | Action _w_/_s_/_a_: %s(ivy-action-name)
----------^^^^^^^^^^-+--------------^^^^-+-------^^-+--------^^-+---------------------------------
_g_ ^ ^ _k_ ^ ^ _u_ | _f_orward _o_ccur | _i_nsert | _c_alling: %-7s(if ivy-calling \"on\" \"off\") _C_ase-fold: %-10`ivy-case-fold-search
^^ _h_ ^+^ _l_ ^^ | _RET_ done ^^ | _q_uit | _m_atcher: %-7s(ivy--matcher-desc) _t_runcate: %-11`truncate-lines
_G_ ^ ^ _j_ ^ ^ _d_ | _TAB_ alt-done ^^ | ^ ^ | _<_/_>_: shrink/grow
"
;; arrows
("j" ivy-next-line)
("k" ivy-previous-line)
("l" ivy-alt-done)
("h" ivy-backward-delete-char)
("g" ivy-beginning-of-buffer)
("G" ivy-end-of-buffer)
("d" ivy-scroll-up-command)
("u" ivy-scroll-down-command)
("e" ivy-scroll-down-command)
;; actions
("q" keyboard-escape-quit :exit t)
("C-g" keyboard-escape-quit :exit t)
("<escape>" keyboard-escape-quit :exit t)
("C-o" nil)
("i" nil)
("TAB" ivy-alt-done :exit nil)
("C-j" ivy-alt-done :exit nil)
;; ("d" ivy-done :exit t)
("RET" ivy-done :exit t)
("C-m" ivy-done :exit t)
("f" ivy-call)
("c" ivy-toggle-calling)
("m" ivy-toggle-fuzzy)
(">" ivy-minibuffer-grow)
("<" ivy-minibuffer-shrink)
("w" ivy-prev-action)
("s" ivy-next-action)
("a" ivy-read-action)
("t" (setq truncate-lines (not truncate-lines)))
("C" ivy-toggle-case-fold)
("o" ivy-occur :exit t)))))

View file

@ -0,0 +1,7 @@
;; -*- no-byte-compile: t; -*-
;;; feature/hydra/packages.el
(package! hydra)
(when (featurep! :completion ivy)
(package! ivy-hydra))

View file

@ -31,7 +31,38 @@
(when git-gutter-mode (when git-gutter-mode
(git-gutter) (git-gutter)
nil)) nil))
(add-hook '+evil-esc-hook #'+version-control|update-git-gutter t))) (add-hook '+evil-esc-hook #'+version-control|update-git-gutter t))
(when (featurep! :feature hydra)
(require 'hydra)
(defhydra +hydra-git-gutter (:body-pre (git-gutter-mode 1)
:hint nil)
"
Movement Hunk Actions Misc. gg: +%-4s(car (git-gutter:statistic))/ -%-3s(cdr (git-gutter:statistic))
^_g_^ [_s_] stage [_R_] set start Rev
^_k_^ [_r_] revert
^ ^ [_m_] mark
^ ^ [_p_] popup
^_j_^ [_q_] quit
^_G_^ [_Q_] Quit and disable"
("j" (progn (git-gutter:next-hunk 1)
(recenter)))
("k" (progn (git-gutter:previous-hunk 1)
(recenter)))
("g" (progn (goto-char (point-min))
(git-gutter:next-hunk 1)))
("G" (progn (goto-char (point-min))
(git-gutter:previous-hunk 1)))
("s" git-gutter:stage-hunk)
("r" git-gutter:revert-hunk)
("m" git-gutter:mark-hunk)
("p" git-gutter:popup-hunk)
("R" git-gutter:set-start-revision)
("q" nil :color blue)
("Q" (git-gutter-mode -1) :color blue))))
(def-package! git-timemachine (def-package! git-timemachine

View file

@ -38,6 +38,15 @@ repository root."
(+vcs*update-header-line) (+vcs*update-header-line)
(setq-local header-line-format nil))) (setq-local header-line-format nil)))
;;;###autoload
(defun +vcs|enable-smerge-mode-maybe ()
"Auto-enable `smerge-mode' when merge conflict is detected."
(save-excursion
(goto-char (point-min))
(when (re-search-forward "^<<<<<<< " nil :noerror)
(smerge-mode 1)
(when +vcs-auto-hydra-smerge (+hydra-smerge/body)))))
;;;###autoload ;;;###autoload
(defun +vcs*update-header-line (&rest _) (defun +vcs*update-header-line (&rest _)
"Show revision details in the header-line, instead of the minibuffer. "Show revision details in the header-line, instead of the minibuffer.

View file

@ -2,6 +2,9 @@
(setq vc-make-backup-files nil) (setq vc-make-backup-files nil)
(defvar +vcs-auto-hydra-smerge t
"When entering `smerge-mode' automatically open associated hydra.")
(load! +git) (load! +git)
;; (load! +hg) ;; (load! +hg)
@ -13,3 +16,54 @@
(set! :evil-state 'vc-annotate-mode 'normal) (set! :evil-state 'vc-annotate-mode 'normal)
(set! :evil-state 'vc-git-log-view-mode 'normal)) (set! :evil-state 'vc-git-log-view-mode 'normal))
(def-package! smerge-mode
:init
(add-hook 'find-file-hook #'+vcs|enable-smerge-mode-maybe)
:config
(when (featurep! :feature hydra)
(require 'hydra)
(when (version< emacs-version "26")
(defalias 'smerge-keep-upper 'smerge-keep-mine)
(defalias 'smerge-keep-lower 'smerge-keep-other)
(defalias 'smerge-diff-base-upper 'smerge-diff-base-mine)
(defalias 'smerge-diff-upper-lower 'smerge-diff-mine-other)
(defalias 'smerge-diff-base-lower 'smerge-diff-base-other))
(defhydra +hydra-smerge (:hint nil
:pre (smerge-mode 1)
;; Disable `smerge-mode' when quitting hydra if
;; no merge conflicts remain.
:post (smerge-auto-leave))
"
Movement Keep Diff Other smerge
^_g_^ [_b_] base [_<_] upper/base [_C_] Combine
^_C-k_^ [_u_] upper [_=_] upper/lower [_r_] resolve
^_k_ ^ [_l_] lower [_>_] base/lower [_R_] remove
^_j_ ^ [_a_] all [_H_] hightlight
^_C-j_^ [_RET_] current [_E_] ediff
^_G_^ [_q_] quit"
("g" (progn (goto-char (point-min)) (smerge-next)))
("G" (progn (goto-char (point-max)) (smerge-prev)))
("C-j" smerge-next)
("C-k" smerge-prev)
("j" next-line)
("k" previous-line)
("b" smerge-keep-base)
("u" smerge-keep-upper)
("l" smerge-keep-lower)
("a" smerge-keep-all)
("RET" smerge-keep-current)
("\C-m" smerge-keep-current)
("<" smerge-diff-base-upper)
("=" smerge-diff-upper-lower)
(">" smerge-diff-base-lower)
("H" smerge-refine)
("E" smerge-ediff)
("C" smerge-combine-with-next)
("r" smerge-resolve)
("R" smerge-kill-current)
("q" nil :color blue))))