Major changes: - Replace Projectile with built-in project.el for project management - Add comprehensive Org mode configuration with TODO keywords and org-kanban support - Fix multiple parsing errors and keybinding conflicts Key improvements: - Faster startup with built-in project.el (no external dependencies) - Better integration with Eglot LSP client - Proper Org TODO keyword highlighting and kanban column ordering - Fixed unbalanced parentheses in init-completion.el and init-utils.el - Resolved keybinding conflicts (C-c d g → C-c G d, removed C-u C-c C-r) - Updated all file paths in init-utils.el to use lisp/ subdirectory The configuration now loads cleanly without errors and maintains backward compatibility with most Projectile keybindings (C-c p prefix) while also supporting the standard project.el bindings (C-x p prefix). 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
205 lines
6.6 KiB
EmacsLisp
205 lines
6.6 KiB
EmacsLisp
;;; init-search.el --- Search and navigation tools -*- lexical-binding: t -*-
|
|
;;; Commentary:
|
|
;;; Configuration for search tools like deadgrep, ripgrep, and wgrep
|
|
|
|
;;; Code:
|
|
|
|
;;; Deadgrep - fast search with ripgrep
|
|
(use-package deadgrep
|
|
:ensure t
|
|
:defer t
|
|
:commands deadgrep
|
|
:bind (("C-c G d" . deadgrep)))
|
|
|
|
;;; Wgrep - editable grep buffers
|
|
(use-package wgrep
|
|
:ensure t
|
|
:defer t
|
|
:after grep
|
|
:config
|
|
(setq wgrep-auto-save-buffer t)
|
|
(setq wgrep-enable-key "r"))
|
|
|
|
;;; Ripgrep
|
|
(use-package ripgrep
|
|
:ensure t
|
|
:defer t
|
|
:commands (ripgrep-regexp))
|
|
|
|
;;; Live search functions using consult-ripgrep
|
|
(with-eval-after-load 'consult
|
|
(defun search-project-for-symbol-at-point ()
|
|
"Search project for symbol at point using consult-ripgrep."
|
|
(interactive)
|
|
(require 'project)
|
|
(let ((root (or (when-let ((proj (project-current)))
|
|
(project-root proj))
|
|
default-directory)))
|
|
(if (use-region-p)
|
|
(consult-ripgrep root
|
|
(buffer-substring-no-properties (region-beginning) (region-end)))
|
|
(consult-ripgrep root (thing-at-point 'symbol)))))
|
|
|
|
(defun search-project ()
|
|
"Live search in project files using consult-ripgrep."
|
|
(interactive)
|
|
(require 'project)
|
|
(let ((root (or (when-let ((proj (project-current)))
|
|
(project-root proj))
|
|
default-directory)))
|
|
(consult-ripgrep root)))
|
|
|
|
(defun search-current-directory ()
|
|
"Live search in current directory using consult-ripgrep."
|
|
(interactive)
|
|
(consult-ripgrep default-directory)))
|
|
|
|
;;; Enhanced grep with live preview
|
|
(use-package consult
|
|
:defer t
|
|
:config
|
|
;; Configure ripgrep arguments for better results
|
|
(setq consult-ripgrep-args
|
|
"rg --null --line-buffered --color=never --max-columns=1000 --path-separator / --smart-case --no-heading --with-filename --line-number --search-zip")
|
|
|
|
;; Preview at point for grep commands
|
|
(consult-customize
|
|
consult-ripgrep consult-git-grep consult-grep
|
|
:preview-key '(:debounce 0.4 any)))
|
|
|
|
;;; Set up search keymap
|
|
(define-prefix-command 'search-map)
|
|
(global-set-key (kbd "C-c s") 'search-map)
|
|
|
|
;;; Convenient keybindings for search - using deferred loading
|
|
(define-key search-map (kbd "p")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(require 'project)
|
|
(let ((root (or (when-let ((proj (project-current)))
|
|
(project-root proj))
|
|
default-directory)))
|
|
(if (fboundp 'search-project)
|
|
(call-interactively 'search-project)
|
|
(consult-ripgrep root)))))
|
|
|
|
(define-key search-map (kbd "s")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(require 'project)
|
|
(let ((root (or (when-let ((proj (project-current)))
|
|
(project-root proj))
|
|
default-directory)))
|
|
(if (fboundp 'search-project-for-symbol-at-point)
|
|
(call-interactively 'search-project-for-symbol-at-point)
|
|
(consult-ripgrep root (thing-at-point 'symbol))))))
|
|
|
|
(define-key search-map (kbd "d")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(consult-ripgrep default-directory)))
|
|
|
|
(define-key search-map (kbd "r")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(call-interactively 'consult-ripgrep)))
|
|
|
|
(define-key search-map (kbd "g")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(call-interactively 'consult-grep)))
|
|
|
|
(define-key search-map (kbd "G")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(call-interactively 'consult-git-grep)))
|
|
|
|
(define-key search-map (kbd "l")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(call-interactively 'consult-line)))
|
|
|
|
(define-key search-map (kbd "L")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(call-interactively 'consult-line-multi)))
|
|
|
|
(define-key search-map (kbd "o")
|
|
(lambda () (interactive)
|
|
(require 'consult)
|
|
(call-interactively 'consult-outline)))
|
|
|
|
;;; Alternative: Helm-ag for live search (if you prefer helm)
|
|
;; Uncomment if you want to use helm-ag instead
|
|
;; (use-package helm-ag
|
|
;; :ensure t
|
|
;; :defer t
|
|
;; :config
|
|
;; (setq helm-ag-base-command "rg --vimgrep --no-heading --smart-case"))
|
|
|
|
;;; Ag (The Silver Searcher) - alternative to ripgrep
|
|
(use-package ag
|
|
:ensure t
|
|
:defer t
|
|
:commands (ag ag-project ag-regexp)
|
|
:config
|
|
(setq ag-highlight-search t)
|
|
(setq ag-reuse-buffers t))
|
|
|
|
;;; Rg.el - Another ripgrep interface
|
|
(use-package rg
|
|
:ensure t
|
|
:defer t
|
|
:commands (rg rg-project rg-dwim)
|
|
:config
|
|
(rg-enable-default-bindings))
|
|
|
|
;;; Search and replace across project
|
|
(defun project-search-and-replace (search-string replace-string)
|
|
"Search for SEARCH-STRING and replace with REPLACE-STRING in project."
|
|
(interactive
|
|
(list (read-string "Search: " (thing-at-point 'symbol))
|
|
(read-string "Replace: ")))
|
|
(let ((project-root (or (when-let ((proj (project-current)))
|
|
(project-root proj))
|
|
default-directory)))
|
|
(rg search-string "*" project-root)
|
|
(with-current-buffer "*rg*"
|
|
(wgrep-change-to-wgrep-mode)
|
|
(goto-char (point-min))
|
|
(while (re-search-forward search-string nil t)
|
|
(replace-match replace-string))
|
|
(wgrep-finish-edit))))
|
|
|
|
(define-key search-map (kbd "R") 'project-search-and-replace)
|
|
|
|
;;; Help function to show all search keybindings
|
|
(defun show-search-help ()
|
|
"Show available search commands and keybindings."
|
|
(interactive)
|
|
(with-output-to-temp-buffer "*Search Commands Help*"
|
|
(princ "=== SEARCH COMMANDS ===\n\n")
|
|
(princ "LIVE SEARCH (with preview):\n")
|
|
(princ " C-c s p : Search in project files (live)\n")
|
|
(princ " C-c s s : Search project for symbol at point\n")
|
|
(princ " C-c s d : Search in current directory\n")
|
|
(princ " C-c s r : Consult ripgrep (specify directory)\n")
|
|
(princ " C-c s l : Search lines in current buffer\n")
|
|
(princ " C-c s L : Search lines in multiple buffers\n")
|
|
(princ " C-c s o : Search outline/headings in buffer\n\n")
|
|
(princ "OTHER SEARCH TOOLS:\n")
|
|
(princ " C-c s g : Consult grep\n")
|
|
(princ " C-c s G : Consult git-grep\n")
|
|
(princ " C-c d g : Deadgrep (ripgrep with nice UI)\n")
|
|
(princ " C-c s R : Project search and replace\n")
|
|
(princ " M-s . : isearch symbol at point\n\n")
|
|
(princ "TIPS:\n")
|
|
(princ " - In consult-ripgrep, use '#pattern' to filter results\n")
|
|
(princ " - Use C-SPC to preview different results\n")
|
|
(princ " - In deadgrep results, press 'r' to enable wgrep mode for editing\n")))
|
|
|
|
(define-key search-map (kbd "h") 'show-search-help)
|
|
(define-key search-map (kbd "?") 'show-search-help)
|
|
|
|
(provide 'init-search)
|
|
;;; init-search.el ends here |