From e9d2e60965d2d0299205116f7f7e33a6887b34f0 Mon Sep 17 00:00:00 2001 From: Oleh Krehel Date: Thu, 7 May 2015 12:42:58 +0200 Subject: [PATCH] Customize the leading char style for chars and words * avy-jump.el (avy--style-fn): New defun. (avy--generic-jump): Add a STYLE arg. (avy-goto-char-style): New defcustom. (avy-goto-word-style): New defcustom. (avy-goto-char): Update. (avy-goto-char-2): Update. (avy-goto-word-0): Update. (avy-goto-word-1): Simplify. (avy-goto-subword-0): Update doc. Fixes #5 --- avy-jump.el | 87 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 31 deletions(-) diff --git a/avy-jump.el b/avy-jump.el index 2f8617b..5f8334a 100644 --- a/avy-jump.el +++ b/avy-jump.el @@ -215,39 +215,64 @@ LEAF is ((BEG . END) . WND)." (cdr leaf) (selected-window)))) -(defun avy--generic-jump (regex flip) +(defun avy--style-fn (style) + "Transform STYLE symbol to a style function." + (cl-case style + (pre #'avy--overlay-pre) + (at #'avy--overlay-at) + (post #'avy--overlay-post) + (t (error "Unexpected style %S" style)))) + +(defun avy--generic-jump (regex window-flip style) "Jump to REGEX. -When FLIP is non-nil, flip `avy-all-windows'." +When WINDOW-FLIP is non-nil, do the opposite of `avy-all-windows'. +STYLE determines the leading char overlay style." (let ((avy-all-windows - (if flip + (if window-flip (not avy-all-windows) avy-all-windows))) (avy--goto (avy--process (avy--regex-candidates regex) - #'avy--overlay-post)))) + (avy--style-fn style))))) + +(defcustom avy-goto-char-style 'pre + "Method of displaying the overlays for `avy-goto-char' and `avy-goto-char-2'." + :type '(choice + (const :tag "Pre" pre) + (const :tag "At" at) + (const :tag "Post" post))) + +(defcustom avy-goto-word-style 'pre + "Method of displaying the overlays for `avy-goto-word-0' and `avy-goto-word-0'." + :type '(choice + (const :tag "Pre" pre) + (const :tag "At" at) + (const :tag "Post" post))) ;;* Commands ;;;###autoload (defun avy-goto-char (&optional arg) "Read one char and jump to it. -The window scope is determined by `avy-all-windows'. -When ARG is non-nil, flip the window scope." +The window scope is determined by `avy-all-windows' (ARG negates it)." (interactive "P") (avy--generic-jump - (regexp-quote (string (read-char "char: "))) arg)) + (regexp-quote (string (read-char "char: "))) + arg + avy-goto-char-style)) ;;;###autoload (defun avy-goto-char-2 (&optional arg) - "Read two chars and jump to them in current window. -When ARG is non-nil, flip the window scope." + "Read two consecutive chars and jump to the first one. +The window scope is determined by `avy-all-windows' (ARG negates it)." (interactive "P") (avy--generic-jump (regexp-quote (string (read-char "char 1: ") (read-char "char 2: "))) - arg)) + arg + avy-goto-char-style)) ;;;###autoload (defun avy-isearch () @@ -263,44 +288,44 @@ When ARG is non-nil, flip the window scope." ;;;###autoload (defun avy-goto-word-0 (arg) - "Jump to a word start." + "Jump to a word start. +The window scope is determined by `avy-all-windows' (ARG negates it)." (interactive "P") (let ((avy-keys (number-sequence ?a ?z))) - (avy--generic-jump "\\b\\sw" arg))) + (avy--generic-jump "\\b\\sw" arg avy-goto-word-style))) + +;;;###autoload +(defun avy-goto-word-1 (&optional arg) + "Read one char at word start and jump there. +The window scope is determined by `avy-all-windows' (ARG negates it)." + (interactive "P") + (let* ((str (string (read-char "char: "))) + (regex (if (and avy-word-punc-regexp + (string-match avy-word-punc-regexp str)) + str + (concat + "\\b" + str)))) + (avy--generic-jump regex arg avy-goto-word-style))) ;;;###autoload (defun avy-goto-subword-0 (&optional arg) - "Jump to a word or subword start." + "Jump to a word or subword start. +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)) (avy-keys (number-sequence ?a ?z)) - (case-fold-search nil) + (case-fold-search nil) (candidates (avy--regex-candidates "\\(\\b\\sw\\)\\|\\(?:[^A-Z]\\([A-Z]\\)\\)"))) (dolist (x candidates) (when (> (- (cdar x) (caar x)) 1) (cl-incf (caar x)))) (avy--goto - (avy--process candidates #'avy--overlay-pre)))) - -;;;###autoload -(defun avy-goto-word-1 () - "Jump to a word start in current window. -Read one char with which the word should start." - (interactive) - (let* ((str (string (read-char "char: "))) - (candidates (avy--regex-candidates - (if (and avy-word-punc-regexp - (string-match avy-word-punc-regexp str)) - str - (concat - "\\b" - str))))) - (avy--goto - (avy--process candidates #'avy--overlay-pre)))) + (avy--process candidates (avy--style-fn avy-goto-word-style))))) (defun avy--line (&optional arg) "Select line in current window."