让`counsel-git-grep`支持过滤关键字

我的设置,

(defun counsel-etags-positive-regex (patterns)
  "Extract positive regex from PATTERNS."
  (let* ((re (car patterns)))
    (cond
     ((or (not re) (string= re ""))
      "[^ \t]+")
     (t
      (ivy--regex re)))))

(defun counsel-etags-exclusion-regex (patterns)
  "Extract exclusion PATTERNS."
  (let* ((re (cadr patterns)))
    (unless re (setq re ""))
    ;; remove trailing spaces
    (setq re (replace-regexp-in-string " +$" "" re))
    (cond
     ((string= re "")
      (setq re nil))
     (t
      (mapconcat 'ivy--regex
                 (split-string re " +")
                 "\\\|")))))

(defun my-counsel-git-grep-cmd-function-default (str)
  (let* ((patterns (split-string str " *!"))
         (pos-re (counsel-etags-positive-regex patterns))
         (neg-re (counsel-etags-exclusion-regex patterns))
         rlt)
    (setq rlt (format counsel-git-grep-cmd pos-re))
    (when neg-re
      (setq rlt (format "%s --and --not -e \"%s\"" rlt neg-re)))
    rlt))

(setq counsel-git-grep-cmd-function #'my-counsel-git-grep-cmd-function-default)

细节见 Counsel search commands do not support negated search terms · Issue #1342 · abo-abo/swiper · GitHub

3 个赞