diff --git a/CHANGELOG.develop b/CHANGELOG.develop index 331a96f51..32265977c 100644 --- a/CHANGELOG.develop +++ b/CHANGELOG.develop @@ -2813,6 +2813,8 @@ Other: - Added smerge transient state key bindings (thanks to duianto): ~SPC g r e >~ ediff ~SPC g r K >~ kill current + - Added current and total conflicts to smerge transient state's hint + (thanks to Miciah Dashiel Butler Masters) - New packages: - =browse-at-remote= which replaces =github-browse-file= (thanks Eugene Yaremenko) diff --git a/layers/+source-control/version-control/config.el b/layers/+source-control/version-control/config.el index 28e128dd3..293145211 100644 --- a/layers/+source-control/version-control/config.el +++ b/layers/+source-control/version-control/config.el @@ -9,6 +9,9 @@ ;; ;;; License: GPLv3 +(defvar spacemacs--smerge-ts-full-hint-toggle nil + "Display smerge transient-state documentation.") + (defvar version-control-global-margin t "If non-nil, will show diff margins globally.") diff --git a/layers/+source-control/version-control/funcs.el b/layers/+source-control/version-control/funcs.el index 29e31fe60..86b7aac9e 100644 --- a/layers/+source-control/version-control/funcs.el +++ b/layers/+source-control/version-control/funcs.el @@ -128,3 +128,27 @@ :off (spacemacs/vcs-disable-margin-globally) :documentation "Enable diff margins globally." :evil-leader "T C-d") + +(defun spacemacs//smerge-ts-hint () + "Return a hint for the smerge transient state. +Return a string indicating the index of the current conflict and +the number of conflicts detected by `smerge-mode'." + (concat + (cl-loop for ol being the overlays + with pos = (point) + if (eq (overlay-get ol 'smerge) 'conflict) + count ol into total + and if (<= (overlay-start ol) pos) + count ol into idx + finally return (format "conflict [%d/%d]" idx total)) + (if spacemacs--smerge-ts-full-hint-toggle + spacemacs--smerge-ts-full-hint + (concat " ([" + (propertize "?" 'face 'hydra-face-red) + "] help)")))) + +(defun spacemacs//smerge-ts-toggle-hint () + "Toggle the full hint docstring for the smerge transient state." + (interactive) + (setq spacemacs--smerge-ts-full-hint-toggle + (not spacemacs--smerge-ts-full-hint-toggle))) diff --git a/layers/+source-control/version-control/packages.el b/layers/+source-control/version-control/packages.el index 9fe7996f3..1b64b106b 100644 --- a/layers/+source-control/version-control/packages.el +++ b/layers/+source-control/version-control/packages.el @@ -263,21 +263,24 @@ :diminish smerge-mode :commands spacemacs/smerge-transient-state/body :init - (spacemacs/set-leader-keys - "gr" 'spacemacs/smerge-transient-state/body) - :config (progn - (spacemacs|define-transient-state smerge - :title "Smerge Transient State" - :doc " + (spacemacs/set-leader-keys + "gr" 'spacemacs/smerge-transient-state/body) + (spacemacs|transient-state-format-hint smerge + spacemacs--smerge-ts-full-hint + "\n Movement^^^^ Merge Action^^ Diff^^ Other ---------------^^^^ ----------------^^ --------------^^ ---------------------------^^ [_n_]^^ next hunk [_b_] keep base [_<_] base/mine [_C_] combine curr/next hunks [_N_/_p_] prev hunk [_m_] keep mine [_=_] mine/other [_u_] undo [_j_]^^ next line [_a_] keep all [_>_] base/other [_q_] quit [_k_]^^ prev line [_o_] keep other [_r_] refine - ^^^^ [_c_] keep current [_e_] ediff - ^^^^ [_K_] kill current" + ^^^^ [_c_] keep current [_e_] ediff [_?_]^^ toggle help + ^^^^ [_K_] kill current") + (spacemacs|define-transient-state smerge + :title "Smerge Transient State" + :hint-is-doc t + :dynamic-hint (spacemacs//smerge-ts-hint) :bindings ;; move ("n" smerge-next) @@ -301,7 +304,8 @@ ("C" smerge-combine-with-next) ("K" smerge-kill-current) ("u" undo-tree-undo) - ("q" nil :exit t))))) + ("q" nil :exit t) + ("?" spacemacs//smerge-ts-toggle-hint))))) (defun version-control/init-browse-at-remote () (use-package browse-at-remote