-
-
Notifications
You must be signed in to change notification settings - Fork 338
Closed
Description
When doing counse-ag searches I find it useful to be able to specify extra switches along with the search pattern. This allows to get interactive results instead of the two step process of calling counsel-ag with a prefix argument.
For example:
[dir] ag: --elisp --ignore site-lisp -- let
Searches for the pattern let only in emacs-lisp files ignoring the site-lisp directory.
So far I've been making these changes in my personal configuration, but if you think it's worth adding them to swiper I can create a PR.
Of course, if there is a better way to accomplish this let me know.
Thank you very much for swiper!
counsel-ag-function
(defun lr/parse-ag-input (string)
"Parse the user input as STRING into a list of two strings: (query extra-ag-args).
Where query is the search term and extra-ag-args are any additional switches."
(let ((query string)
(extra-ag-args ""))
(when (string-prefix-p "-" string)
(let ((index (search "-- " string)))
(when index
(setq query (substring string (+ 3 index)))
(setq extra-ag-args (concat " " (substring string 0 index))))))
(list query extra-ag-args)))
(defun lr/counsel-ag-function (original/counsel-ag-function &rest args)
(let* ((string (car args))
(base-cmd (cadr args))
(extra-ag-args (caddr args))
(result (lr/parse-ag-input string)))
(setq string (car result))
(setq extra-ag-args (concat extra-ag-args (cadr result)))
(funcall original/counsel-ag-function string base-cmd extra-ag-args)))
(advice-add 'counsel-ag-function :around #'lr/counsel-ag-function)counsel-ag-occur
(defun lr/counsel-grep-like-occur (cmd-template)
(unless (eq major-mode 'ivy-occur-grep-mode)
(ivy-occur-grep-mode)
(setq default-directory counsel--git-dir))
(setq ivy-text
(and (string-match "\"\\(.*\\)\"" (buffer-name))
(match-string 1 (buffer-name))))
(let ((result (lr/parse-ag-input ivy-text))
(extra-ag-args nil)
(cmd nil)
(cands nil))
(setq ivy-text (car result))
(setq extra-ag-args (cadr result))
(setq cmd (format cmd-template
extra-ag-args
(shell-quote-argument
(counsel-unquote-regex-parens
(ivy--regex ivy-text)))))
(message "%s" cmd)
(setq cands (split-string (shell-command-to-string cmd) "\n" t))
;; Need precise number of header lines for `wgrep' to work.
(insert (format "-*- mode:grep; default-directory: %S -*-\n\n\n"
default-directory))
(insert (format "%d candidates:\n" (length cands)))
(ivy--occur-insert-lines
(mapcar
(lambda (cand) (concat "./" cand))
cands))))
(defun lr/counsel-ag-occur ()
"Generate a custom occur buffer for `counsel-ag'."
(lr/counsel-grep-like-occur
"ag --nocolor --nogroup %s -- %s"))
(advice-add 'counsel-ag-occur :override #'lr/counsel-ag-occur)Metadata
Metadata
Assignees
Labels
No labels