parent
c897759d02
commit
d7cafcb964
1 changed files with 153 additions and 0 deletions
@ -0,0 +1,153 @@ |
||||
;;; avy-jump.el --- jump to things tree-style |
||||
|
||||
;; Author: Oleh Krehel <ohwoeowho@gmail.com> |
||||
;; Version: 0.1.0 |
||||
;; Keywords: point |
||||
|
||||
;; This file is not part of GNU Emacs |
||||
|
||||
;; This file is free software; you can redistribute it and/or modify |
||||
;; it under the terms of the GNU General Public License as published by |
||||
;; the Free Software Foundation; either version 3, or (at your option) |
||||
;; any later version. |
||||
|
||||
;; This program is distributed in the hope that it will be useful, |
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
;; GNU General Public License for more details. |
||||
|
||||
;; For a full copy of the GNU General Public License |
||||
;; see <http://www.gnu.org/licenses/>. |
||||
|
||||
;;; Commentary: |
||||
;; |
||||
;; This package offers various commands for navigating to things using `avy', such as |
||||
;; `avy-jump-char', `avy-double-char', and `avy-jump-line'. |
||||
|
||||
;;; Code: |
||||
(require 'avy) |
||||
(require 'ace-window) |
||||
|
||||
(defgroup avy-jump nil |
||||
"Jump to things tree-style." |
||||
:group 'convenience |
||||
:prefix "avy-") |
||||
|
||||
(defcustom avy-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) |
||||
"Keys for jumping.") |
||||
|
||||
(defun avy--goto (x) |
||||
"Goto X. |
||||
X is (POSITION . WINDOW)." |
||||
(select-window (cdr x)) |
||||
(goto-char (car x))) |
||||
|
||||
(defun avy--process (candidates action &optional nobackground) |
||||
"Select one of CANDIDATES using `avy-read'. |
||||
Call ACTION on that candidate." |
||||
(unwind-protect |
||||
(let ((aw-background (not nobackground))) |
||||
(aw--make-backgrounds (list (selected-window))) |
||||
(cl-case (length candidates) |
||||
(0 |
||||
(message "zero candidates")) |
||||
(1 |
||||
(funcall action (car candidates))) |
||||
(t |
||||
(funcall |
||||
action |
||||
(avy-read (avy-tree candidates avy-keys) |
||||
#'aw--lead-overlay |
||||
#'aw--remove-leading-chars))))) |
||||
(aw--done))) |
||||
|
||||
(defun avy--regex-candidates (regex &optional wnd) |
||||
"Return all elements that match REGEX in WND. |
||||
Each element of the list is (POSITION . WND)." |
||||
(let ((we (window-end)) |
||||
candidates) |
||||
(setq wnd (or wnd (selected-window))) |
||||
(save-window-excursion |
||||
(select-window wnd) |
||||
(save-excursion |
||||
(goto-char (window-start)) |
||||
(while (re-search-forward regex we t) |
||||
(push (cons (1- (point)) wnd) candidates))) |
||||
(nreverse candidates)))) |
||||
|
||||
(defun avy-jump-char () |
||||
"Read one char and jump to it in current window." |
||||
(interactive) |
||||
(avy--process (avy--regex-candidates |
||||
(string (read-char "char: ")) |
||||
(selected-window)) |
||||
#'avy--goto)) |
||||
|
||||
(defun avy-jump-double-char () |
||||
"Read two chars and jump to them in current window." |
||||
(interactive) |
||||
(avy--process (avy--regex-candidates |
||||
(string |
||||
(read-char "char 1: ") |
||||
(read-char "char 2: ")) |
||||
(selected-window)) |
||||
#'avy--goto)) |
||||
|
||||
(defun avy-jump-isearch () |
||||
"Jump to one of the current isearch candidates." |
||||
(interactive) |
||||
(let ((candidates |
||||
(mapcar (lambda (x) (cons (1+ (car x)) |
||||
(cdr x))) |
||||
(avy--regex-candidates isearch-string)))) |
||||
(avy--process candidates #'avy--goto t) |
||||
(isearch-done))) |
||||
|
||||
(defun avy-jump-zero-word () |
||||
"Jump to a word start in current buffer" |
||||
(interactive) |
||||
(let ((we (window-end)) |
||||
candidates) |
||||
(save-excursion |
||||
(goto-char (window-start)) |
||||
(while (< (point) we) |
||||
(forward-word 2) |
||||
(forward-word -1) |
||||
(push (cons (point) (selected-window)) |
||||
candidates))) |
||||
(avy--process (nreverse candidates) |
||||
#'avy--goto))) |
||||
|
||||
(defun avy-jump-one-word () |
||||
"Jump to a word start in current buffer. |
||||
Read one char with which the word should start." |
||||
(interactive) |
||||
(let ((candidates (avy--regex-candidates |
||||
(string (read-char "char: ")) |
||||
(selected-window)))) |
||||
(save-excursion |
||||
(setq candidates (cl-remove-if-not |
||||
(lambda (x) |
||||
(goto-char (car x)) |
||||
(looking-at "\\b")) |
||||
(nreverse candidates)))) |
||||
(avy--process candidates #'avy--goto))) |
||||
|
||||
(defun avy-jump-line () |
||||
"Jump to a line start in current buffer." |
||||
(interactive) |
||||
(let ((we (window-end)) |
||||
candidates) |
||||
(save-excursion |
||||
(goto-char (window-start)) |
||||
(while (< (point) we) |
||||
(push (cons (point) (selected-window)) |
||||
candidates) |
||||
(forward-line 1))) |
||||
(avy--process (nreverse candidates) |
||||
#'avy--goto |
||||
t))) |
||||
|
||||
(provide 'avy-jump) |
||||
|
||||
;;; avy-jump.el ends here |
||||
Loading…
Reference in new issue