From: James Bunton Date: Tue, 20 Nov 2018 02:28:30 +0000 (+1100) Subject: use rg for my-find-test-file X-Git-Url: https://code.delx.au/dotemacs/commitdiff_plain/19a2f2718f4b3d9ea25282e1f9c03069d0cf951b use rg for my-find-test-file --- diff --git a/lisp/my-find-test-file.el b/lisp/my-find-test-file.el index 69ca72f..8f0c445 100644 --- a/lisp/my-find-test-file.el +++ b/lisp/my-find-test-file.el @@ -24,34 +24,33 @@ (and (my/prod-file-p prod-file) (string-match-p (concat base-name "[^/]*\\." extension "$") prod-file))) -(defun my/find-prod-or-test-file () - "Find test file in the current Git repository." - (interactive) - - (setq counsel--git-dir (locate-dominating-file - default-directory ".git")) - (if (null counsel--git-dir) - (error "Not in a git repository") - (setq counsel--git-dir (expand-file-name - counsel--git-dir)) - - (let* ((default-directory counsel--git-dir) - (files (split-string - (shell-command-to-string counsel-git-cmd) - "\n" - t)) - (base-name (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))) - (extension (file-name-extension (buffer-file-name))) - (predicate (if (my/prod-file-p (buffer-file-name)) #'my/matching-test-file-p #'my/matching-prod-file-p)) - (results nil)) - - (dolist (file files) - (if (funcall predicate file base-name extension) - (cl-pushnew file results))) - - (cl-case (length results) - (0 (message "No matching file found.")) - (1 (find-file (car results))) - (t (ivy-read "Find test file" results - :action #'counsel-git-action - :caller 'counsel-git)))))) +(defun my/find-prod-or-test-file (&optional initial-directory) + "Find test file in the current project. +INITIAL-DIRECTORY, if non-nil, is used as the root directory for search." + (interactive + (list (when current-prefix-arg + (read-directory-name "From directory: ")))) + (counsel-require-program "rg") + + (let* ((default-directory (or initial-directory + (locate-dominating-file default-directory ".git") + default-directory)) + (files (split-string + (shell-command-to-string counsel-rg-files-command) + "\n" + t)) + (base-name (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))) + (extension (file-name-extension (buffer-file-name))) + (predicate (if (my/prod-file-p (buffer-file-name)) #'my/matching-test-file-p #'my/matching-prod-file-p)) + (results nil)) + + (dolist (file files) + (if (funcall predicate file base-name extension) + (cl-pushnew file results))) + + (cl-case (length results) + (0 (message "No matching file found.")) + (1 (find-file (car results))) + (t (ivy-read "Find test file" results + :action #'counsel-git-action + :caller 'my/find-prod-or-test-file)))))