branch: master
commit 2ad5fb1b126a6230062e1ecf2a748ffffe30c90d
Author: Oleh Krehel <[email protected]>
Commit: Oleh Krehel <[email protected]>
Add support for virtual buffers
* ivy.el (ivy-mode-map): New defvar. Remap `switch-to-buffer' to
`ivy-switch-buffer'.
(ivy-mode): Use `ivy-mode-map'.
(ivy--virtual-buffers): New devar.
(ivy--virtual-buffers): New defun.
(ivy-buffer-list): Return a list of buffers, taking
`ido-use-virtual-buffers' into account.
(ivy-switch-buffer): New command.
Fixes #84
---
ivy.el | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 81 insertions(+), 1 deletions(-)
diff --git a/ivy.el b/ivy.el
index d130a77..2168fb2 100644
--- a/ivy.el
+++ b/ivy.el
@@ -117,6 +117,12 @@ Only \"./\" and \"../\" apply here. They appear in reverse
order."
map)
"Keymap used in the minibuffer.")
+(defvar ivy-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [remap switch-to-buffer] 'ivy-switch-buffer)
+ map)
+ "Keymap for `ivy-mode'.")
+
;;* Globals
(cl-defstruct ivy-state
prompt collection
@@ -701,14 +707,19 @@ The history, defaults and input-method arguments are
ignored for now."
;;;###autoload
(define-minor-mode ivy-mode
- "Toggle Ivy mode on or off.
+ "Toggle Ivy mode on or off.
With ARG, turn Ivy mode on if arg is positive, off otherwise.
Turning on Ivy mode will set `completing-read-function' to
`ivy-completing-read'.
+Global bindings:
+\\{ivy-mode-map}
+
+Minibuffer bindings:
\\{ivy-minibuffer-map}"
:group 'ivy
:global t
+ :keymap ivy-mode-map
:lighter " ivy"
(if ivy-mode
(setq completing-read-function 'ivy-completing-read)
@@ -1081,6 +1092,75 @@ CANDS is a list of strings."
(put-text-property 0 (length res) 'read-only nil res)
res))))
+(defvar ivy--virtual-buffers nil
+ "Store the virtual buffers alist.")
+
+(defvar recentf-list)
+(defvar ido-use-faces)
+(defvar ido-process-ignore-lists)
+(defvar ido-ignored-list)
+(defvar ido-use-virtual-buffers)
+(declare-function ido-make-buffer-list "ido")
+
+(defun ivy--virtual-buffers ()
+ "Adapted from `ido-add-virtual-buffers-to-list'."
+ (unless recentf-mode
+ (recentf-mode 1))
+ (let ((bookmarks (and (boundp 'bookmark-alist)
+ bookmark-alist))
+ virtual-buffers name)
+ (dolist (head (append
+ recentf-list
+ (delete " - no file -"
+ (delq nil (mapcar (lambda (bookmark)
+ (cdr (assoc 'filename
bookmark)))
+ bookmarks)))))
+ (setq name (file-name-nondirectory head))
+ (when (equal name "")
+ (setq name (file-name-nondirectory (directory-file-name head))))
+ (when (equal name "")
+ (setq name head))
+ (and (not (equal name ""))
+ (null (get-file-buffer head))
+ (not (assoc name virtual-buffers))
+ (push (cons name head) virtual-buffers)))
+ (when virtual-buffers
+ (if ido-use-faces
+ (dolist (comp virtual-buffers)
+ (put-text-property 0 (length (car comp))
+ 'face 'ido-virtual
+ (car comp))))
+ (setq ivy--virtual-buffers (nreverse virtual-buffers))
+ (mapcar #'car ivy--virtual-buffers))))
+
+(defun ivy-buffer-list ()
+ "Return the current list of buffers.
+See `ido-make-buffer-list'."
+ (require 'ido)
+ (setq ivy--virtual-buffers nil)
+ (let ((ido-process-ignore-lists t)
+ ido-ignored-list)
+ (delete-dups
+ (append (ido-make-buffer-list nil)
+ (and
+ ido-use-virtual-buffers
+ (ivy--virtual-buffers))))))
+
+(defun ivy-switch-buffer ()
+ "Switch to another buffer."
+ (interactive)
+ (if (not ivy-mode)
+ (call-interactively 'switch-to-buffer)
+ (let ((bl (ivy-buffer-list)))
+ (ivy-read "Switch to buffer: " bl
+ :action
+ (lambda ()
+ (let ((virtual (assoc ivy--current ivy--virtual-buffers)))
+ (if virtual
+ (find-file (cdr virtual))
+ (switch-to-buffer
+ ivy--current nil 'force-same-window))))))))
+
(provide 'ivy)
;;; ivy.el ends here