diff options
| author | Trey Peacock <git@treypeacock.com> | 2021-01-23 12:52:11 -0700 |
|---|---|---|
| committer | James N <james@jojojames.com> | 2021-01-31 21:00:05 -0800 |
| commit | 3dc3c72a49c725899080e5aa5cd9fc16cd967f2e (patch) | |
| tree | 5431f275e27f575f2d0615c9e6b3ec648eac0611 /modes | |
| parent | ee41c6f2aec0d8c3192f5404cebb27e5cb6e584a (diff) | |
consult-evil-mark
Jump to evil markers in current buffer
Diffstat (limited to 'modes')
| -rw-r--r-- | modes/consult/evil-collection-consult.el | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/modes/consult/evil-collection-consult.el b/modes/consult/evil-collection-consult.el index 67c1cc2..0602f2a 100644 --- a/modes/consult/evil-collection-consult.el +++ b/modes/consult/evil-collection-consult.el @@ -30,12 +30,62 @@ (require 'evil-collection) (require 'consult nil t) +(defvar consult-line-numbers-widen) +(declare-function consult--forbid-minibuffer "consult") +(declare-function consult--fontify-all "consult") +(declare-function consult--in-range-p "consult") +(declare-function consult--line-with-cursor "consult") +(declare-function consult--remove-dups "consult") +(declare-function consult--add-line-number "consult") +(declare-function consult--mark-candidates "consult") +(declare-function consult-mark "consult") + (defun evil-collection-consult-set-bindings () "Set the bindings." (evil-set-command-property 'consult-outline :jump t) (evil-set-command-property 'consult-mark :jump t) (evil-set-command-property 'consult-line :jump t)) +(defun evil-collection-consult-evil-mark-ring () + "Return alist of char & marker for evil markers in current buffer." + (sort (cl-remove-if (lambda (elem) + (or (not (evil-global-marker-p (car elem))) + (not (markerp (cdr-safe elem))))) + evil-markers-alist) + #'car-less-than-car)) + +(defun evil-collection-consult--mark-candidates () + "Return alist of lines containing markers. +The alist contains (string . position) pairs." + (consult--forbid-minibuffer) + (unless (evil-collection-consult-evil-mark-ring) + (user-error "No marks")) + (consult--fontify-all) + (let* ((max-line 0) + (candidates)) + (save-excursion + (dolist (marker (evil-collection-consult-evil-mark-ring)) + (let ((pos (marker-position (cdr marker)))) + (when (consult--in-range-p pos) + (goto-char pos) + (let ((line (line-number-at-pos pos consult-line-numbers-widen))) + (setq max-line (max line max-line)) + (push (list (cdr marker) line (format "%s: %s" (char-to-string (car marker)) + (consult--line-with-cursor (cdr marker)))) + candidates)))))) + (nreverse (consult--remove-dups (consult--add-line-number max-line candidates))))) + +(defun evil-collection-consult-mark () + "Jump to an evil marker in the current buffer." + (interactive) + (unwind-protect + (progn + (advice-add #'consult--mark-candidates :override + #'evil-collection-consult--mark-candidates) + (consult-mark)) + (advice-remove #'consult--mark-candidates + #'evil-collection-consult--mark-candidates))) + ;;;###autoload (defun evil-collection-consult-setup () "Set up `evil' bindings for `consult'." |
