Skip to content

Is this a useful feature to add? #1408

@DEADB17

Description

@DEADB17

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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions