SPC/DEL overlays work
This commit is contained in:
11
README.org
11
README.org
@@ -5,11 +5,8 @@ Evil's answer to Neovim's answer to the mouse
|
|||||||
|
|
||||||
* Tasks
|
* Tasks
|
||||||
|
|
||||||
** TODO Equivalence classes
|
** DONE Many targets w/ [[kbd:][SPC]] and [[kbd:][DEL]] labels
|
||||||
|
CLOSED: [2024-11-27 Wed 16:04]
|
||||||
** TODO Many targets w/ [[kbd:][SPC]] and [[kbd:][DEL]] labels
|
|
||||||
|
|
||||||
** TODO Match newlines with [[kbd:][SPC SPC]]
|
|
||||||
|
|
||||||
** DONE Passthrough input on fail
|
** DONE Passthrough input on fail
|
||||||
CLOSED: [2024-11-23 Sat 09:07]
|
CLOSED: [2024-11-23 Sat 09:07]
|
||||||
@@ -17,6 +14,10 @@ CLOSED: [2024-11-23 Sat 09:07]
|
|||||||
** DONE Leap backwards
|
** DONE Leap backwards
|
||||||
CLOSED: [2024-11-24 Sun 08:55]
|
CLOSED: [2024-11-24 Sun 08:55]
|
||||||
|
|
||||||
|
** TODO Equivalence classes
|
||||||
|
|
||||||
|
** TODO Match newlines with [[kbd:][SPC SPC]]
|
||||||
|
|
||||||
** TODO Leap from window
|
** TODO Leap from window
|
||||||
|
|
||||||
** TODO Only leap to visible targets
|
** TODO Only leap to visible targets
|
||||||
|
|||||||
54
evil-leap.el
54
evil-leap.el
@@ -57,6 +57,10 @@ jump."
|
|||||||
"TODO"
|
"TODO"
|
||||||
:group 'evil-leap)
|
:group 'evil-leap)
|
||||||
|
|
||||||
|
(defface evil-leap-further-label-face '((t :inherit shadow))
|
||||||
|
"TODO"
|
||||||
|
:group 'evil-leap)
|
||||||
|
|
||||||
(defcustom evil-leap-use-char-fold-table t
|
(defcustom evil-leap-use-char-fold-table t
|
||||||
"TODO"
|
"TODO"
|
||||||
:group 'evil-leap
|
:group 'evil-leap
|
||||||
@@ -120,7 +124,11 @@ jump."
|
|||||||
(make-overlay (+ pos 2) (+ pos 3)
|
(make-overlay (+ pos 2) (+ pos 3)
|
||||||
buffer)))
|
buffer)))
|
||||||
(label-string (string label)))
|
(label-string (string label)))
|
||||||
(put-text-property 0 1 'face 'evil-leap-label-face label-string)
|
(put-text-property 0 1
|
||||||
|
'face (if (eq label ?\s)
|
||||||
|
'evil-leap-further-label-face
|
||||||
|
'evil-leap-label-face)
|
||||||
|
label-string)
|
||||||
(overlay-put overlay 'category 'evil-leap)
|
(overlay-put overlay 'category 'evil-leap)
|
||||||
(overlay-put overlay 'before-string label-string)
|
(overlay-put overlay 'before-string label-string)
|
||||||
;; Normally, we want the labels to cover the buffer's text, rather than
|
;; Normally, we want the labels to cover the buffer's text, rather than
|
||||||
@@ -159,13 +167,11 @@ of Undefined Behaviour, should either `evil-leap-safe-labels' or
|
|||||||
;; ... If it doesn't, create a new hash table, stored in
|
;; ... If it doesn't, create a new hash table, stored in
|
||||||
;; `labeled-targets' at key '?\s', containing nought but a back-link key
|
;; `labeled-targets' at key '?\s', containing nought but a back-link key
|
||||||
;; ('?\d')[1], and the given label/target pair[2].
|
;; ('?\d')[1], and the given label/target pair[2].
|
||||||
(evil-leap--add-overlay-target! target label)
|
|
||||||
(ht-set! labeled-targets ?\s
|
(ht-set! labeled-targets ?\s
|
||||||
(ht (?\d labeled-targets) ; [1]
|
(ht (?\d labeled-targets) ; [1]
|
||||||
(label target)))) ; [2]
|
(label target)))) ; [2]
|
||||||
;; The label does not exist, meaning we needn't muck around with the next
|
;; The label does not exist, meaning we needn't muck around with the next
|
||||||
;; map. Proceed normally with `ht-set!'!
|
;; map. Proceed normally with `ht-set!'!
|
||||||
(evil-leap--add-overlay-target! target label)
|
|
||||||
(ht-set! labeled-targets label target)))
|
(ht-set! labeled-targets label target)))
|
||||||
|
|
||||||
(defun evil-leap--label-targets-safe (targets)
|
(defun evil-leap--label-targets-safe (targets)
|
||||||
@@ -206,6 +212,28 @@ represented by characters. Adds overlays for labels"
|
|||||||
(evil-leap--label-targets-safe targets)
|
(evil-leap--label-targets-safe targets)
|
||||||
(evil-leap--label-targets-unsafe targets))))
|
(evil-leap--label-targets-unsafe targets))))
|
||||||
|
|
||||||
|
(defun evil-leap--update-further-overlays! (labeled-targets)
|
||||||
|
(ht-each (lambda (k v)
|
||||||
|
(cond ((eq k ?\s)
|
||||||
|
(evil-leap--update-further-overlays! v))
|
||||||
|
((evil-leap-target-p v)
|
||||||
|
(evil-leap--add-overlay-target! v ?\s))
|
||||||
|
;; Auto-jumps and back-links are met with no-ops.
|
||||||
|
(t nil)))
|
||||||
|
labeled-targets))
|
||||||
|
|
||||||
|
(defun evil-leap--update-earlier-overlays! (labeled-targets)
|
||||||
|
(ht-each (lambda (k v)
|
||||||
|
(cond ((eq k ?\d)
|
||||||
|
(evil-leap--update-earlier-overlays! v))
|
||||||
|
((evil-leap-target-p v)
|
||||||
|
(when-let ((overlay (evil-leap-target-overlay v)))
|
||||||
|
(delete-overlay overlay)))
|
||||||
|
;; Auto-jumps and fore-links are met with no-ops.
|
||||||
|
(t nil)))
|
||||||
|
labeled-targets))
|
||||||
|
|
||||||
|
;; REVIEW: This could be more efficient. We needn't traverse /every/ target.
|
||||||
(defun evil-leap--update-target-overlays! (labeled-targets)
|
(defun evil-leap--update-target-overlays! (labeled-targets)
|
||||||
"TODO Create or update overlays to visually present a set of targets'
|
"TODO Create or update overlays to visually present a set of targets'
|
||||||
associated labels."
|
associated labels."
|
||||||
@@ -216,8 +244,17 @@ associated labels."
|
|||||||
((eq k 'auto-jump)
|
((eq k 'auto-jump)
|
||||||
nil)
|
nil)
|
||||||
|
|
||||||
|
;; Label every further
|
||||||
((eq k ?\s)
|
((eq k ?\s)
|
||||||
(error "TODO: Recurse into "))))
|
(evil-leap--update-further-overlays! v))
|
||||||
|
|
||||||
|
;; Delete every previous overlay.
|
||||||
|
((eq k ?\d)
|
||||||
|
(evil-leap--update-earlier-overlays! v))
|
||||||
|
|
||||||
|
;; Targets are simply labeled with their label. }:D
|
||||||
|
((evil-leap-target-p v)
|
||||||
|
(evil-leap--add-overlay-target! v k))))
|
||||||
labeled-targets))
|
labeled-targets))
|
||||||
|
|
||||||
(defun evil-leap--euclidean-distance (x1 y1 x2 y2)
|
(defun evil-leap--euclidean-distance (x1 y1 x2 y2)
|
||||||
@@ -259,15 +296,15 @@ associated labels."
|
|||||||
;; (with-output-to-temp-buffer (format "*select - %s*" (current-time))
|
;; (with-output-to-temp-buffer (format "*select - %s*" (current-time))
|
||||||
;; (pp labeled-targets))
|
;; (pp labeled-targets))
|
||||||
(evil-leap--try-auto-jump labeled-targets)
|
(evil-leap--try-auto-jump labeled-targets)
|
||||||
|
;; TODO: Overlays should be updated here.
|
||||||
|
(evil-leap--update-target-overlays! labeled-targets)
|
||||||
(let ((given-key (evil-read-key)))
|
(let ((given-key (evil-read-key)))
|
||||||
(if-let ((selected-target (ht-get labeled-targets given-key)))
|
(if-let ((selected-target (ht-get labeled-targets given-key)))
|
||||||
;; '?\s' and '?\d' are special targets that lead to alternative sets
|
;; '?\s' and '?\d' are special targets that lead to alternative sets
|
||||||
;; of labeled targets; if we find another hash table, select from that
|
;; of labeled targets; if we find another hash table, select from that
|
||||||
;; one instead.
|
;; one instead.
|
||||||
(if (ht-p selected-target)
|
(if (ht-p selected-target)
|
||||||
;; TODO: Overlays should be updated here.
|
(evil-leap-select-from-labeled-targets selected-target)
|
||||||
(progn (print "space or del!")
|
|
||||||
(evil-leap-select-from-labeled-targets selected-target))
|
|
||||||
(funcall evil-leap-action selected-target))
|
(funcall evil-leap-action selected-target))
|
||||||
;; If we are given a key that does not correspond to any label, we let
|
;; If we are given a key that does not correspond to any label, we let
|
||||||
;; it 'fall through' to give it a proper run through Emacs' command
|
;; it 'fall through' to give it a proper run through Emacs' command
|
||||||
@@ -333,6 +370,9 @@ corresponding to each occurence of P."
|
|||||||
;; We are forced to save-excursion a second time, lest we enter a
|
;; We are forced to save-excursion a second time, lest we enter a
|
||||||
;; feedback loop, where `re-search-forward' moves to a match, and
|
;; feedback loop, where `re-search-forward' moves to a match, and
|
||||||
;; `goto-char' jumps to a position *preceding* the match.
|
;; `goto-char' jumps to a position *preceding* the match.
|
||||||
|
;;
|
||||||
|
;; REVIEW: Alternatively, we could call `forwrad-char' as the last
|
||||||
|
;; action in the loop.
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(goto-char (match-beginning 0))
|
(goto-char (match-beginning 0))
|
||||||
(let ((second-char (aref (match-string 1) 0)) ; string->char
|
(let ((second-char (aref (match-string 1) 0)) ; string->char
|
||||||
|
|||||||
Reference in New Issue
Block a user