Provide custom actions for ivy and counsel-search

This commit is contained in:
ralesi 2016-05-17 17:08:08 -07:00 committed by syl20bnr
parent 4dead4cca7
commit 1ef6f10643
4 changed files with 80 additions and 14 deletions

View File

@ -30,3 +30,19 @@ with options to run in the shell.")
than this amount.")
(defvar spacemacs--counsel-initial-number-cand 100)
(defvar spacemacs--ivy-file-actions
'(("f" find-file-other-frame "other frame")
("w" find-file-other-window "other window")
("v" spacemacs/find-file-vsplit "in vertical split")
("s" spacemacs/find-file-split "in horizontal split")
("l" find-file-literally "literally"))
"Default ivy actions for files.")
(defvar spacemacs--ivy-grep-actions
(loop for j in spacemacs--ivy-file-actions
for key = (nth 0 j)
for func = (nth 1 j)
for desc = (nth 2 j)
collect `(,key (lambda (x) (spacemacs//counsel-with-git-grep (quote ,func) x)) ,desc))
"Default ivy actions to be used with git-grep output.")

View File

@ -232,6 +232,20 @@ To prevent this error we just wrap `describe-mode' to defeat the
(interactive)
(call-interactively 'describe-mode))))
(defun spacemacs//counsel-with-git-grep (func x)
(when (string-match "\\`\\(.*?\\):\\([0-9]+\\):\\(.*\\)\\'" x)
(with-ivy-window
(let ((file-name (match-string-no-properties 1 x))
(line-number (match-string-no-properties 2 x)))
(funcall func
(expand-file-name file-name counsel--git-grep-dir))
(goto-char (point-min))
(forward-line (1- (string-to-number line-number)))
(re-search-forward (ivy--regex ivy-text t) (line-end-position) t)
(unless (eq ivy-exit 'done)
(swiper--cleanup)
(swiper--add-overlays (ivy--regex ivy-text)))))))
;; Ivy
@ -254,7 +268,8 @@ To prevent this error we just wrap `describe-mode' to defeat the
(require (car repl))
(call-interactively (cdr repl))))))
;; perspectives
;; Perspectives
(defun spacemacs/ivy-perspectives ()
"Control Panel for perspectives. Has many actions.

View File

@ -17,6 +17,7 @@
flx
ivy
(ivy-spacemacs-help :location local)
perspectives
projectile
smex
swiper
@ -70,6 +71,12 @@
"skF" 'spacemacs/search-ack-region-or-symbol
"skp" 'spacemacs/search-project-ack
"skP" 'spacemacs/search-project-ack-region-or-symbol)
;; set additional ivy actions
(ivy-set-actions
'counsel-find-file
spacemacs--ivy-file-actions)
;; remaps built-in commands that have a counsel replacement
(counsel-mode 1)
(spacemacs|hide-lighter counsel-mode)
@ -119,6 +126,12 @@
"fr" 'ivy-recentf
"rl" 'ivy-resume
"bb" 'ivy-switch-buffer)
;; custom actions for recentf
(ivy-set-actions
'ivy-recentf
spacemacs--ivy-file-actions)
(ivy-mode 1)
(global-set-key (kbd "C-c C-r") 'ivy-resume)
(global-set-key (kbd "<f6>") 'ivy-resume)
@ -128,21 +141,22 @@
'spacemacs//counsel-occur)
(spacemacs/set-leader-keys-for-major-mode 'ivy-occur-grep-mode
"w" 'ivy-wgrep-change-to-wgrep-mode)
;; Perspectives support
(ivy-set-actions
'spacemacs/ivy-perspectives
'(("c" persp-kill-without-buffers "Close perspective(s)")
("k" persp-kill "Kill perspective(s)")))
(setq spacemacs-layouts-transient-state-remove-bindings
'("b" "l" "C" "X"))
(setq spacemacs-layouts-transient-state-add-bindings
'(("b" spacemacs/ivy-persp-buffer)
("l" spacemacs/ivy-perspectives)
("C" spacemacs/ivy-persp-close-other :exit t)
("X" spacemacs/ivy-persp-kill-other :exit t)))
;; Why do we do this ?
(ido-mode -1))))
(defun ivy/post-init-perspectives ()
(ivy-set-actions
'spacemacs/ivy-perspectives
'(("c" persp-kill-without-buffers "Close perspective(s)")
("k" persp-kill "Kill perspective(s)")))
(setq spacemacs-layouts-transient-state-remove-bindings
'("b" "l" "C" "X"))
(setq spacemacs-layouts-transient-state-add-bindings
'(("b" spacemacs/ivy-persp-buffer)
("l" spacemacs/ivy-perspectives)
("C" spacemacs/ivy-persp-close-other :exit t)
("X" spacemacs/ivy-persp-kill-other :exit t))))
(defun ivy/post-init-projectile ()
(setq projectile-completion-system 'ivy)
(spacemacs/set-leader-keys

View File

@ -868,6 +868,28 @@ Compare them on count first,and in case of tie sort them alphabetically."
(region-end))))
(evil-end-undo-step))
;; find file functions in split
(defun spacemacs//display-in-split (buffer alist)
"Split selected window and display BUFFER in the new window.
BUFFER and ALIST have the same form as in `display-buffer'. If ALIST contains
a split-side entry, its value must be usable as the SIDE argument for
`split-window'."
(let ((window (split-window nil nil (cdr (assq 'split-side alist)))))
(window--display-buffer buffer window 'window alist)
window))
(defun spacemacs/find-file-vsplit (file)
"find file in vertical split"
(interactive "FFind file (vsplit): ")
(let ((buffer (find-file-noselect file)))
(pop-to-buffer buffer '(spacemacs//display-in-split (split-side . right)))))
(defun spacemacs/find-file-split (file)
"find file in horizonatl split"
(interactive "FFind file (split): ")
(let ((buffer (find-file-noselect file)))
(pop-to-buffer buffer '(spacemacs//display-in-split (split-side . below)))))
(defun spacemacs//intersperse (seq separator)
"Returns a list with `SEPARATOR' added between each element
of the list `SEQ'."
@ -908,4 +930,3 @@ is nonempty."
(interactive)
(when compilation-last-buffer
(delete-windows-on compilation-last-buffer)))