avy.el (avy-org-goto-heading-timer): Simplify

Re #214
This commit is contained in:
Oleh Krehel
2017-08-13 11:54:44 +02:00
parent f4c45d329a
commit 8556274978

55
avy.el
View File

@@ -560,33 +560,16 @@ multiple DISPLAY-FN invokations."
"Read one or many characters and jump to matching Org headings.
The window scope is determined by `avy-all-windows' (ARG negates it)."
(interactive "P")
(let* ((avy-all-windows (if arg
(not avy-all-windows)
avy-all-windows))
(input (avy--read-string-with-timeout))
(regexp (rx-to-string `(seq bol (1+ "*") (1+ space) (0+ not-newline)
,input (0+ not-newline) eol))))
(let ((avy-all-windows (if arg
(not avy-all-windows)
avy-all-windows)))
(avy-with avy-goto-char-timer
(avy--process (avy--regex-candidates regexp)
(avy--style-fn avy-style)))))
(defun avy--read-string-with-timeout ()
"Read string from minibuffer with a timeout."
;; It's a shame that only `read-char' has the timeout option, so we
;; have to do this funky loop ourselves, instead of
;; e.g. `read-string' with a timeout.
(cl-loop with charnum
with string = ""
while (not (equal 13 charnum))
for charnum = (read-char (format "Prompt: %s" string )
t
(unless (string-empty-p string)
avy-timeout-seconds))
if (and charnum
(not (equal 13 charnum)))
concat (make-string 1 charnum) into string
else do (setq charnum 13)
finally return string))
(avy--process
(avy--read-candidates
(lambda (input)
(format "^\\*+ .*\\(%s\\)" input)))
(avy--style-fn avy-style))
(org-back-to-heading))))
;;** Rest
(defun avy-window-list ()
@@ -1809,7 +1792,7 @@ newline."
(defcustom avy-timeout-seconds 0.5
"How many seconds to wait for the second char."
:type 'float)
:type 'float)
(defun avy--read-candidates (&optional re-builder)
"Read as many chars as possible and return their occurences.
@@ -1817,8 +1800,14 @@ or `DEL' deletes the last char entered, and `RET' exits with the
may be read if it is entered before `avy-timeout-seconds'. `C-h'
or `DEL' deletes the last char entered, and `RET' exits with the
currently read string immediately instead of waiting for another
char for `avy-timeout-seconds'.
The format of the result is the same as that of `avy--regex-candidates'.
char for `avy-timeout-seconds'.
The format of the result is the same as that of `avy--regex-candidates'.
This function obeys `avy-all-windows' setting.
RE-BUILDER is a function that takes a string and returns a regex.
When nil, `regexp-quote' is used.
If a group is captured, the first group is highlighted.
Otherwise, the whole regex is highlighted."
(let ((str "")
(re-builder (or re-builder #'regexp-quote))
char break overlays regex)
(unwind-protect
@@ -1856,12 +1845,12 @@ This function obeys `avy-all-windows' setting."
(dolist (pair (avy--find-visible-regions
(window-start)
(window-end (selected-window) t)))
(save-excursion
(save-excursion
(goto-char (car pair))
(setq regex (funcall re-builder str))
(while (re-search-forward regex (cdr pair) t)
(unless (get-char-property (1- (point)) 'invisible)
(let ((ov (make-overlay
(while (re-search-forward regex (cdr pair) t)
(unless (get-char-property (1- (point)) 'invisible)
(let* ((idx (if (= (length (match-data)) 4) 1 0))
(ov (make-overlay
(match-beginning idx) (match-end idx))))
(setq found t)