From a4c539655876749ae37d55238057e85587754a5c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Apr 2019 23:22:06 -0400 Subject: [PATCH] Add better-jumper Replaces evil's jumplist; makes its functionality available for non evil users. --- core/core-editor.el | 38 ++++++++++++++++++++++++- core/packages.el | 2 ++ modules/completion/helm/config.el | 4 ++- modules/completion/ivy/config.el | 3 ++ modules/editor/evil/autoload/advice.el | 7 ----- modules/editor/evil/config.el | 5 ---- modules/emacs/imenu/config.el | 2 ++ modules/lang/cc/config.el | 3 +- modules/lang/org/config.el | 2 +- modules/tools/lookup/autoload/lookup.el | 2 +- modules/tools/lookup/config.el | 12 ++++---- 11 files changed, 55 insertions(+), 25 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index e877da0d3..9bfe01957 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -141,7 +141,43 @@ savehist file." ;; -;; Packages +;;; Packages + +(def-package! better-jumper + :after-call (pre-command-hook) + :init + (global-set-key [remap evil-jump-forward] #'better-jumper-jump-forward) + (global-set-key [remap evil-jump-backward] #'better-jumper-jump-backward) + :config + (add-hook 'better-jumper-post-jump-hook #'recenter) + + (defun doom*set-jump (orig-fn &rest args) + "Set a jump point and ensure ORIG-FN doesn't set any new jump points." + (better-jumper-set-jump (if (markerp (car args)) (car args))) + (let ((evil--jumps-jumping t) + (better-jumper--jumping t)) + (apply orig-fn args))) + + (defun doom*set-jump-maybe (orig-fn &rest args) + "Set a jump point if ORIG-FN returns non-nil." + (let ((origin (point-marker)) + (result + (let* ((evil--jumps-jumping t) + (better-jumper--jumping t)) + (apply orig-fn args)))) + (unless result + (with-current-buffer (marker-buffer origin) + (better-jumper-set-jump + (if (markerp (car args)) + (car args) + origin)))) + result)) + + (defun doom|set-jump () + "Run `better-jumper-set-jump' but return nil, for short-circuiting hooks." + (better-jumper-set-jump) + nil)) + (def-package! smartparens ;; Auto-close delimiters and blocks as you type. It's more powerful than that, diff --git a/core/packages.el b/core/packages.el index ad01ecc9a..e7fa99a2f 100644 --- a/core/packages.el +++ b/core/packages.el @@ -28,6 +28,8 @@ (package! ace-link) (package! ace-window) (package! avy) +(package! better-jumper + :recipe (:fetcher github :repo "gilbertw1/better-jumper")) (package! command-log-mode) (package! dtrt-indent) (package! helpful) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index ae32ddb7a..f4efe8ac6 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -143,7 +143,9 @@ be negative.") (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) (set-popup-rule! "^\\*helm-ag-edit" :size 0.35 :ttl 0 :quit nil) ;; Recenter after jumping to match - (advice-add #'helm-ag--find-file-action :after-while #'doom*recenter)) + (advice-add #'helm-ag--find-file-action :after-while #'doom*recenter) + ;; And record position before jumping + (advice-add #'helm-ag--find-file-action :around #'doom*set-jump-maybe)) ;; `helm-bookmark' diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 078ddb3e8..fbe32e6b6 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -161,6 +161,9 @@ immediately runs it on the current candidate (ending the ivy session)." (add-to-list 'swiper-font-lock-exclude #'+doom-dashboard-mode nil #'eq) + ;; Record in jumplist when opening files via counsel-{ag,rg,pt,git-grep} + (add-hook 'counsel-grep-post-action-hook #'better-jumper-set-jump) + ;; Factories (defun +ivy-action-reloading (cmd) (lambda (x) diff --git a/modules/editor/evil/autoload/advice.el b/modules/editor/evil/autoload/advice.el index 5c74d90a2..a02ac332a 100644 --- a/modules/editor/evil/autoload/advice.el +++ b/modules/editor/evil/autoload/advice.el @@ -191,13 +191,6 @@ more information on modifiers." (or (and (>= char ?2) (<= char ?9)) (funcall orig-fn char))) -;;;###autoload -(defun +evil*set-jump (orig-fn &rest args) - "Set a jump point and ensure ORIG-FN doesn't set any new jump points." - (evil-set-jump (if (markerp (car args)) (car args))) - (let ((evil--jumps-jumping t)) - (apply orig-fn args))) - ;;;###autoload (defun +evil*fix-dabbrev-in-minibuffer () "Make `try-expand-dabbrev' from `hippie-expand' work in minibuffer. See diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index 5e85f6f2e..e35fdc973 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -109,11 +109,6 @@ line with a linewise comment.") (advice-add #'evil-window-split :override #'+evil*window-split) (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) - ;; Integrate evil's jump-list into some navigational commands - (advice-add #'counsel-git-grep-action :around #'+evil*set-jump) - (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) - (advice-add #'xref-push-marker-stack :around #'+evil*set-jump) - ;; In evil, registers 2-9 are buffer-local. In vim, they're global, so... (advice-add #'evil-global-marker-p :around #'+evil*make-numbered-markers-global) diff --git a/modules/emacs/imenu/config.el b/modules/emacs/imenu/config.el index 88fed1090..4915b1f3f 100644 --- a/modules/emacs/imenu/config.el +++ b/modules/emacs/imenu/config.el @@ -3,6 +3,8 @@ ;; `imenu-anywhere' (setq imenu-anywhere-delimiter ": ") +(add-hook 'imenu-after-jump-hook #'better-jumper-set-jump) + (after! imenu-list (setq imenu-list-idle-update-delay 0.5) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index e6f83ae1c..dfc36a7f9 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -226,8 +226,7 @@ This is ignored by ccls.") ;; Use rtags-imenu instead of imenu/counsel-imenu (define-key! (c-mode-map c++-mode-map) [remap imenu] #'+cc/imenu) - (when (featurep 'evil) - (add-hook 'rtags-jump-hook #'evil-set-jump)) + (add-hook 'rtags-jump-hook #'better-jumper-set-jump) (add-hook 'rtags-after-find-file-hook #'recenter)) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 78717d13a..20cde0815 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -35,7 +35,6 @@ (add-hook 'org-load-hook #'+org|setup-evil-keybinds) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config - (add-hook 'org-open-at-point-functions #'evil-set-jump) ;; change `evil-org-key-theme' instead (advice-add #'evil-org-set-key-theme :override #'ignore) (def-package! evil-org-agenda @@ -475,6 +474,7 @@ conditions where a window's buffer hasn't changed at the time this hook is run." (+org|setup-hacks) (+org|setup-custom-links) + (add-hook 'org-open-at-point-functions #'doom|set-jump) ;; Cross-module configuration (set-popup-rules! diff --git a/modules/tools/lookup/autoload/lookup.el b/modules/tools/lookup/autoload/lookup.el index df58b3bec..20c365add 100644 --- a/modules/tools/lookup/autoload/lookup.el +++ b/modules/tools/lookup/autoload/lookup.el @@ -128,7 +128,7 @@ Otherwise, these properties are available to be set: #'switch-to-buffer) (marker-buffer result)) (goto-char result) - (recenter) + (better-jumper-set-jump) result))) diff --git a/modules/tools/lookup/config.el b/modules/tools/lookup/config.el index 43a0667db..bd21d6252 100644 --- a/modules/tools/lookup/config.el +++ b/modules/tools/lookup/config.el @@ -74,12 +74,6 @@ If the argument is interactive (satisfies `commandp'), it is called with `call-interactively' (with no arguments). Otherwise, it is called with one argument: the identifier at point.") -;; Recenter buffer after certain jumps -(add-hook! - '(imenu-after-jump-hook evil-jumps-post-jump-hook - counsel-grep-post-action-hook dumb-jump-after-jump-hook) - #'recenter) - ;; ;;; dumb-jump @@ -92,7 +86,8 @@ argument: the identifier at point.") dumb-jump-selector (cond ((featurep! :completion ivy) 'ivy) ((featurep! :completion helm) 'helm) - ('popup)))) + ('popup))) + (add-hook 'dumb-jump-after-jump-hook #'better-jumper-set-jump)) ;; @@ -102,6 +97,9 @@ argument: the identifier at point.") ;; set these up ourselves in other modules. (setq-default xref-backend-functions '(t)) +;; Use `better-jumper' instead of xref's marker stack +(advice-add #'xref-push-marker-stack :around #'doom*set-jump) + ;; ...however, it breaks `projectile-find-tag', unless we put it back. (defun +lookup*projectile-find-tag (orig-fn) (let ((xref-backend-functions '(etags--xref-backend t)))