From bc83f463493d8aef2e0088db2824d422fc614719 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 Dec 2015 02:21:49 -0500 Subject: [PATCH] Incremental highlighting for :g[lobal] and :al[ign] --- core/core-evil.el | 32 +++++++++++++++++++++++++++++++- core/lib/defuns-editor.el | 11 +++++++++++ core/lib/defuns-evil.el | 38 ++++++++++++++++++++++++++++++++++++++ private/my-commands.el | 3 ++- 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/core/core-evil.el b/core/core-evil.el index c426f7e27..d40e2fb70 100644 --- a/core/core-evil.el +++ b/core/core-evil.el @@ -186,7 +186,37 @@ (setq file-name (replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" file-name t))) - file-name))) + file-name)) + + ;; Highlight buffer match interactive codes + (defvar narf-buffer-match-global evil-ex-substitute-global + "Whether or not buffer-match ex completion should add the ?g flag to searches.") + (evil-ex-define-argument-type buffer-match + :runner + (lambda (flag &optional arg) + (let ((hl-name 'evil-ex-buffer-match)) + (with-selected-window (minibuffer-selected-window) + (narf/-ex-match-init hl-name) + (narf/-ex-buffer-match arg hl-name (list (if narf-buffer-match-global ?g))))))) + (evil-define-interactive-code "" + "Ex buffer match argument." + :ex-arg buffer-match + (list (when (evil-ex-p) evil-ex-argument))) + + ;; Make :g[lobal] highlight matches + (evil-ex-define-argument-type global-match + :runner + (lambda (flag &optional arg) + (let ((hl-name 'evil-ex-global-match)) + (with-selected-window (minibuffer-selected-window) + (narf/-ex-match-init hl-name) + (let ((result (car-safe (evil-ex-parse-global arg)))) + (narf/-ex-buffer-match result hl-name nil (point-min) (point-max))))))) + (evil-define-interactive-code "" + "Ex global argument." + :ex-arg global-match + (when (evil-ex-p) + (evil-ex-parse-global evil-ex-argument)))) ;; evil plugins (use-package evil-anzu diff --git a/core/lib/defuns-editor.el b/core/lib/defuns-editor.el index 1c03dc360..a39ab6250 100644 --- a/core/lib/defuns-editor.el +++ b/core/lib/defuns-editor.el @@ -39,5 +39,16 @@ (beginning-of-line)) (setq *linum-mdown-line* nil)))) +;;;###autoload (autoload 'narf:align "defuns-editor" nil t) +(evil-define-operator narf:align (&optional beg end bang pattern) + (interactive "") + (align-regexp + beg end + (concat "\\(\\s-*\\)" + (if bang + (regexp-quote pattern) + (rxt-pcre-to-elisp pattern))) + 1 1)) + (provide 'defuns-editor) ;;; defuns-editor.el ends here diff --git a/core/lib/defuns-evil.el b/core/lib/defuns-evil.el index 6c96e648d..299e058f7 100644 --- a/core/lib/defuns-evil.el +++ b/core/lib/defuns-evil.el @@ -94,5 +94,43 @@ (define-key evil-inner-text-objects-map ,key (quote ,inner-name)) (define-key evil-outer-text-objects-map ,key (quote ,outer-name))))) +;;; Custom argument handlers +;;;###autoload +(defun narf/-ex-match-init (name &optional face update-hook) + (with-current-buffer evil-ex-current-buffer + (cond + ((eq flag 'start) + (evil-ex-make-hl name + :face (or face 'evil-ex-substitute-matches) + :update-hook (or update-hook #'evil-ex-pattern-update-ex-info)) + (setq flag 'update)) + + ((eq flag 'stop) + (evil-ex-delete-hl name))))) + +;;;###autoload +(defun narf/-ex-buffer-match (arg &optional hl-name flags beg end) + (when (and (eq flag 'update) + evil-ex-substitute-highlight-all + (not (zerop (length arg)))) + (condition-case lossage + (let ((pattern (evil-ex-make-substitute-pattern + (if evil-ex-bang (regexp-quote arg) arg) + (or flags (list)))) + (range (or (evil-copy-range evil-ex-range) + (evil-range (or beg (line-beginning-position)) + (or end (line-end-position)) + 'line + :expanded t)))) + (evil-expand-range range) + (evil-ex-hl-set-region hl-name + (evil-range-beginning range) + (evil-range-end range)) + (evil-ex-hl-change hl-name pattern)) + (end-of-file + (evil-ex-pattern-update-ex-info nil "incomplete replacement")) + (user-error + (evil-ex-pattern-update-ex-info nil (format "?%s" lossage)))))) + (provide 'defuns-evil) ;;; defuns-evil.el ends here diff --git a/private/my-commands.el b/private/my-commands.el index e268795af..55d14ba9e 100644 --- a/private/my-commands.el +++ b/private/my-commands.el @@ -9,7 +9,8 @@ (exmap "ag[cw]d" 'narf:helm-ag-search-cwd) (exmap "agr" 'narf:helm-ag-regex-search) (exmap "agr[cw]d" 'narf:helm-ag-regex-search-cwd) -(exmap "al[ign]" 'narf:whitespace-align) +(exmap "al[ign]" 'narf:align) +(exmap "wal[ign]" 'narf:whitespace-align) (exmap "bcomp[ile]" 'narf:compile-el) (exmap "big" 'narf:toggle-big-mode) (exmap "cap[ture]" 'helm-org-capture-templates)