我的设置,
(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