From 5fee49b69d6605d3d695f2df56f2139c0b6ef11b Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Sun, 12 May 2024 21:12:32 +0530 Subject: (Emacs/elisp)+search.el I can now completing-read search git files from a ton of repositories AND grep them. --- Emacs/.config/emacs/config.org | 12 +++++++ Emacs/.config/emacs/elisp/search.el | 67 +++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 Emacs/.config/emacs/elisp/search.el (limited to 'Emacs') diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org index 2871505..45caf0d 100644 --- a/Emacs/.config/emacs/config.org +++ b/Emacs/.config/emacs/config.org @@ -759,6 +759,18 @@ eating up memory. "C-M-k" #'drag-stuff-up "C-M-l" #'drag-stuff-right)) #+end_src +** Search git directories efficiently +Using [[file:elisp/search.el][search.el]] I can search a set of +directories particularly efficiently. +#+begin_src emacs-lisp +(use-package emacs + :config + (load-file (concat user-emacs-directory "elisp/search.el")) + :general + (leader + "e" #'+search/file-search + "E" #'+search/search-all)) +#+end_src * Applications (loading) Emacs is basically an operating system whose primary datatype is text. Applications are interfaces/environments which serve a variety of diff --git a/Emacs/.config/emacs/elisp/search.el b/Emacs/.config/emacs/elisp/search.el new file mode 100644 index 0000000..8988572 --- /dev/null +++ b/Emacs/.config/emacs/elisp/search.el @@ -0,0 +1,67 @@ +;;; search.el --- Search a list of git directories at once! -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Aryadev Chavali + +;; Author: Aryadev Chavali +;; Keywords: + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License Version +;; 2 as published by the Free Software Foundation. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; Given a list of git source directories, provide a completing-read +;; interface which will narrow and give you a file. + +;;; Code: + +(defvar +search/directories + '("~/Dotfiles/" "~/Text/" "~/.local/src/dwm/" "~/.local/src/dwmblocks/" "~/.local/src/st/") + "List of directories to get candidates from.") + +(defun +search/get-candidates (directory) + "Get files from DIRECTORY using counsel-git-cands. +Returns a list of files with the directory preprended to them." + (let* ((default-directory directory) + (names (split-string + (shell-command-to-string "git ls-files -z --full-name --") + "\0"))) + (mapcar #'(lambda (name) + (concat directory name)) + names))) + +(defun +search/get-all-candidates () + (cl-reduce + #'(lambda (x y) (append x y)) + (mapcar #'(lambda (directory) + (+search/get-candidates (expand-file-name directory))) + +search/directories))) + +(defun +search/find-file () + (interactive) + (find-file + (completing-read "Find file: " + (+search/get-all-candidates) + nil + t))) + +(defun +search/search-all () + (interactive) + (let ((term (read-string "Search for: "))) + (grep (format "grep --color=auto -nH --null -e \"%s\" -- %s" + term + (cl-reduce #'(lambda (x y) (concat x " " y)) + (mapcar #'(lambda (x) (concat "\"" x "\"")) + (cl-remove-if #'directory-name-p (+search/get-all-candidates)))))))) + +(provide 'search) +;;; search.el ends here -- cgit v1.2.3-13-gbd6f