X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/6777cf85866ccbc475453bb9a216878d49576a76..3f4f0809de70703fc3706c541d3fc27c5fc49a11:/counsel.el diff --git a/counsel.el b/counsel.el index f4d9df682..54729699b 100644 --- a/counsel.el +++ b/counsel.el @@ -707,6 +707,12 @@ Describe the selected candidate." (defvar counsel--git-dir nil "Store the base git directory.") +(ivy-set-actions + 'counsel-git + '(("j" + find-file-other-window + "other"))) + ;;;###autoload (defun counsel-git () "Find file in the current Git repository." @@ -957,9 +963,11 @@ When NO-ASYNC is non-nil, do it synchronously." (ivy--exhibit))))))))) (defun counsel-git-grep-occur () - "Generate a custom occur buffer for `counsel-git-grep'." - (ivy-occur-grep-mode) - (setq default-directory counsel--git-grep-dir) + "Generate a custom occur buffer for `counsel-git-grep'. +When REVERT is non-nil, regenerate the current *ivy-occur* buffer." + (unless (eq major-mode 'ivy-occur-grep-mode) + (ivy-occur-grep-mode) + (setq default-directory counsel--git-grep-dir)) (let ((cands (split-string (shell-command-to-string (format counsel-git-grep-cmd @@ -1329,11 +1337,14 @@ INITIAL-INPUT can be given as the initial minibuffer input." (defun counsel-ag-occur () "Generate a custom occur buffer for `counsel-ag'." - (ivy-occur-grep-mode) + (unless (eq major-mode 'ivy-occur-grep-mode) + (ivy-occur-grep-mode)) (setq default-directory counsel--git-grep-dir) (let* ((regex (counsel-unquote-regex-parens (setq ivy--old-re - (ivy--regex ivy-text)))) + (ivy--regex + (progn (string-match "\"\\(.*\\)\"" (buffer-name)) + (match-string 1 (buffer-name))))))) (cands (split-string (shell-command-to-string (format counsel-ag-base-command (shell-quote-argument regex))) @@ -1365,6 +1376,12 @@ This uses `counsel-ag' with `counsel-pt-base-command' replacing (call-interactively 'counsel-ag))) ;;** `counsel-grep' +(defcustom counsel-grep-base-command "grep -nE --ignore-case \"%s\" %s" + "Format string to use in `cousel-grep-function' to construct +the command." + :type 'string + :group 'ivy) + (defun counsel-grep-function (string) "Grep in the current directory for STRING." (if (< (length string) 2) @@ -1373,7 +1390,7 @@ This uses `counsel-ag' with `counsel-pt-base-command' replacing (setq ivy--old-re (ivy--regex string))))) (counsel--async-command - (format "grep -nE --ignore-case \"%s\" %s" regex counsel--git-grep-dir)) + (format counsel-grep-base-command regex counsel--git-grep-dir)) nil))) (defun counsel-grep-action (x) @@ -1393,6 +1410,34 @@ This uses `counsel-ag' with `counsel-pt-base-command' replacing (line-end-position)) (swiper--add-overlays (ivy--regex ivy-text)))))))) +(defun counsel-grep-occur () + "Generate a custom occur buffer for `counsel-grep'." + (unless (eq major-mode 'ivy-occur-grep-mode) + (ivy-occur-grep-mode)) + (let ((cands + (split-string + (shell-command-to-string + (format counsel-grep-base-command + (counsel-unquote-regex-parens + (setq ivy--old-re + (ivy--regex + (progn (string-match "\"\\(.*\\)\"" (buffer-name)) + (match-string 1 (buffer-name))) t))) + counsel--git-grep-dir)) + "\n" t)) + (file (file-name-nondirectory counsel--git-grep-dir))) + ;; Need precise number of header lines for `wgrep' to work. + (insert (format "-*- mode:grep; default-directory: %S -*-\n\n\n" + default-directory)) + (insert (format "%d candidates:\n" (length cands))) + (ivy--occur-insert-lines + (mapcar + (lambda (cand) (concat "./" file ":" cand)) + cands)))) + +(ivy-set-occur 'counsel-grep 'counsel-grep-occur) +(counsel-set-async-exit-code 'counsel-grep 1 "") + ;;;###autoload (defun counsel-grep () "Grep for a string in the current file."