system-manager-wakasu
  1;;; config-search.el --- -*- lexical-binding: t; -*-
  2;;; Commentary:
  3;;; Search related configuration
  4;;; Code:
  5
  6(setq xref-search-program
  7      (cond
  8       ((or (executable-find "ripgrep")
  9            (executable-find "rg"))
 10        'ripgrep)
 11       ((executable-find "ugrep")
 12        'ugrep)
 13       (t
 14        'grep)))
 15
 16;; UseISearch
 17(use-package isearch
 18  :unless noninteractive
 19  :config
 20  (defun my-project-search-from-isearch ()
 21    (interactive)
 22    (let ((query (if isearch-regexp
 23               isearch-string
 24             (regexp-quote isearch-string))))
 25      (isearch-update-ring isearch-string isearch-regexp)
 26      (let (search-nonincremental-instead)
 27        (ignore-errors (isearch-done t t)))
 28      (project-find-regexp query)))
 29  (defun my-occur-from-isearch ()
 30    (interactive)
 31    (let ((query (if isearch-regexp
 32		     isearch-string
 33		   (regexp-quote isearch-string))))
 34      (isearch-update-ring isearch-string isearch-regexp)
 35      (let (search-nonincremental-instead)
 36        (ignore-errors (isearch-done t t)))
 37      (occur query)))
 38  (setq-default search-whitespace-regexp ".*?"
 39                isearch-lax-whitespace t
 40                isearch-regexp-lax-whitespace nil
 41		isearch-lazy-count t
 42		lazy-count-prefix-format nil
 43		lazy-count-suffix-format "   (%s/%s)")
 44  (defun stribb/isearch-region (&optional not-regexp no-recursive-edit)
 45    "If a region is active, make this the isearch default search
 46pattern."
 47    (interactive "P\np")
 48    (when (use-region-p)
 49      (let ((search (buffer-substring-no-properties
 50                     (region-beginning)
 51                     (region-end))))
 52        (message "stribb/ir: %s %d %d" search (region-beginning) (region-end))
 53        (setq deactivate-mark t)
 54        (isearch-yank-string search))))
 55  (advice-add 'isearch-forward-regexp :after 'stribb/isearch-region)
 56  (advice-add 'isearch-forward :after 'stribb/isearch-region)
 57  (advice-add 'isearch-backward-regexp :after 'stribb/isearch-region)
 58  (advice-add 'isearch-backward :after 'stribb/isearch-region)
 59
 60  (defun contrib/isearchp-remove-failed-part-or-last-char ()
 61    "Remove failed part of search string, or last char if successful.
 62Do nothing if search string is empty to start with."
 63    (interactive)
 64    (if (equal isearch-string "")
 65        (isearch-update)
 66      (if isearch-success
 67          (isearch-delete-char)
 68        (while (isearch-fail-pos) (isearch-pop-state)))
 69      (isearch-update)))
 70
 71  (defun contrib/isearch-done-opposite-end (&optional nopush edit)
 72    "End current search in the opposite side of the match.
 73Particularly useful when the match does not fall within the
 74confines of word boundaries (e.g. multiple words)."
 75    (interactive)
 76    (funcall #'isearch-done nopush edit)
 77    (when isearch-other-end (goto-char isearch-other-end)))
 78  :bind (("M-s M-o" . multi-occur)
 79         :map isearch-mode-map
 80	 ("C-o" . my-occur-from-isearch)
 81	 ("C-f" . my-project-search-from-isearch)
 82	 ("C-d" . isearch-forward-symbol-at-point)
 83         ("DEL" . contrib/isearchp-remove-failed-part-or-last-char)
 84         ("<C-return>" . contrib/isearch-done-opposite-end)))
 85;; -UseISearch
 86
 87;; UseGrep
 88(use-package grep
 89  :commands (find-grep grep find-grep-dired find-name-dired)
 90  :bind (("M-s n" . find-name-dired)
 91         ("M-s F" . find-grep)
 92         ("M-s G" . grep)
 93         ("M-s d" . find-grep-dired))
 94  :hook ((hook-mode . toggle-truncate-lines))
 95  :config
 96  (setq-default grep-template (string-join '("ugrep"
 97                                             "--color=always"
 98                                             "--ignore-binary"
 99                                             "--ignore-case"
100                                             "--include=<F>"
101                                             "--line-number"
102                                             "--null"
103                                             "--recursive"
104                                             "--regexp=<R>")
105                                           " "))
106  (add-to-list 'grep-find-ignored-directories "auto")
107  (add-to-list 'grep-find-ignored-directories "elpa"))
108;; -UseGrep
109
110;; UseWgrep
111(use-package wgrep
112  :unless noninteractive
113  :commands (wgrep-change-to-wgrep-mode)
114  :defer 2
115  :custom
116  (wgrep-auto-save-buffer t)
117  (wgrep-change-readonly-file t))
118;; -UseWgrep
119
120;; UseRG
121(use-package rg
122  :if (executable-find "rg")
123  :commands (rg rg-project rg-dwim)
124  :bind (("M-s r r" . rg)
125         ("M-s r p" . rg-project)
126         ("M-s r s" . rg-dwim))
127  :config
128  (setq rg-group-result t)
129  (setq rg-hide-command t)
130  (setq rg-show-columns nil)
131  (setq rg-show-header t)
132  (setq rg-default-alias-fallback "all")
133  (cl-pushnew '("tmpl" . "*.tmpl") rg-custom-type-aliases)
134  (cl-pushnew '("gotest" . "*_test.go") rg-custom-type-aliases)
135  (defun vde/rg-buffer-name ()
136    "Generate a rg buffer name from project if in one"
137    (let ((p (project-root (project-current))))
138      (if p
139	  (format "rg: %s" (abbreviate-file-name p))
140	"rg")))
141  (setq rg-buffer-name #'vde/rg-buffer-name)
142  ;; (when (f-dir-p "~/src/home/")
143  ;;   (rg-define-search rg-projects-dotemacs
144  ;;     "Search home"
145  ;;     :dir "~/src/home/"
146  ;;     :files "*.*"
147  ;;     :menu ("Projects" "H" "home")))
148  ;; (when (f-dir-p "~/src/github.com/NixOS/nixpkgs/")
149  ;;   (rg-define-search rg-projects-nixpkgs
150  ;;     "Search nixpkgs"
151  ;;     :dir "~/src/github.com/NixOS/nixpkgs/"
152  ;;     :files "*.*"
153  ;;     :menu ("Projects" "N" "nixpkgs")))
154  ;; (when (f-dir-p "~/src/tektoncd/pipeline/")
155  ;;   (rg-define-search rg-projects-tektoncd-pipeline
156  ;;     "Search tektoncd/pipeline"
157  ;;     :dir "~/src/tektoncd/pipeline/"
158  ;;     :files "*.*"
159  ;;     :menu ("tektoncd" "P" "pipeline")))
160  ;; (when (f-dir-p "~/src/tektoncd/operator/")
161  ;;   (rg-define-search rg-projects-tektoncd-operator
162  ;;     "Search tektoncd/operator"
163  ;;     :dir "~/src/tektoncd/operator/"
164  ;;     :files "*.*"
165  ;;     :menu ("tektoncd" "P" "operator")))
166  ;; (when (f-dir-p "~/src/tektoncd/cli/")
167  ;;   (rg-define-search rg-projects-tektoncd-cli
168  ;;     "Search tektoncd/cli"
169  ;;     :dir "~/src/tektoncd/cli/"
170  ;;     :files "*.*"
171  ;;     :menu ("tektoncd" "C" "cli")))
172  ;; (when (f-dir-p "~/src/chmouel/")
173  ;;   (rg-define-search rg-projects-chmouel
174  ;;     "Search chmouel"
175  ;;     :dir "~/src/chmouel/"
176  ;;     :files "*.*"
177  ;;     :menu ("Configs" "ch" "chmouel")))
178  )
179
180;; -UseRG
181
182(provide 'config-search)
183;;; config-search.el ends here