;;; workgroups-ido --- ido and iswitchb compatibility
;;; Commentary:
;;; Code:
(require 'workgroups-variables)
(require 'cl-lib)
(require 'ido)
(defcustom wg-ido-entry-buffer-replacement-regexp "^ .*Minibuf.*$"
"Regexp matching the name of a buffer to replace `ido-entry-buffer'.
The regexp should match the name of a live buffer that will never
be a completion candidate under normal circumstances. You
probably don't want to change this. See
`wg-get-sneaky-ido-entry-buffer-replacement'."
:type 'regexp
:group 'workgroups)
(defun wg-read-buffer-mode ()
"Return the buffer switching package (ido or iswitchb) to use, or nil."
(if (eq wg-current-buffer-list-filter-id 'fallback) 'fallback
(cl-case (let (workgroups-mode) (command-remapping 'switch-to-buffer))
(ido-switch-buffer 'ido)
(otherwise 'fallback))))
(defun wg-read-buffer-function (&optional mode)
"Return MODE's or `wg-read-buffer-mode's `read-buffer' function."
(cl-case (or mode (wg-read-buffer-mode))
(ido 'ido-read-buffer)
(fallback (lambda (prompt &optional default require-match)
(let (read-buffer-function)
(read-buffer prompt default require-match))))))
(defun wg-completing-read
(prompt choices &optional pred require-match initial-input history default)
"Do a completing read. The function called depends on what's on."
(cl-ecase (wg-read-buffer-mode)
(ido
(ido-completing-read prompt choices pred require-match
initial-input history default))
(fallback
(completing-read prompt choices pred require-match
initial-input history default))))
(defun wg-get-sneaky-ido-entry-buffer-replacement (&optional regexp)
"Return a live buffer to replace `ido-entry-buffer'.
This is a workaround for an ido misfeature. IMHO, ido should
respect the value of `ido-temp-list' after
`ido-make-buffer-list-hook' has been run, since the user's
preference for the final value of `ido-temp-list', if any, has
been expressed in that hook. But ido conditionally rotates the
first match to the end after the hook has been run, based on the
value of `ido-entry-buffer'. So as a workaround, set
`ido-entry-buffer' to a buffer that will never be a completion
candidate under normal circumstances. See
`wg-ido-entry-buffer-replacement-regexp'."
(wg-get-first-buffer-matching-regexp
(or regexp wg-ido-entry-buffer-replacement-regexp)))
(defun wg-adjust-buffer-list-default (buflist &optional default)
"Adjust BUFLIST based on DEFAULT.
DEFAULT is the default completion candidate, and defaults to
`wg-buffer-internal-default-buffer'. Non-nil, this gets placed
at the beginning of BUFLIST. Otherwise rotate BUFLIST."
(wg-aif (or default wg-buffer-internal-default-buffer)
(wg-move-elt it buflist 0)
(wg-rotate-list buflist)))
(defun wg-finalize-buffer-list (buflist)
"Run `wg-buffer-list-finalization-hook' and return
`wg-temp-buffer-list'."
(let ((wg-temp-buffer-list buflist))
(run-hooks 'wg-buffer-list-finalization-hook)
wg-temp-buffer-list))
(defun wg-set-buffer-list-symbol (symbol)
"Set SYMBOL to the filtered buffer-list."
(when (and wg-current-buffer-list-filter-id (boundp symbol))
(set symbol
(wg-finalize-buffer-list
(wg-adjust-buffer-list-default
(wg-filtered-buffer-list t))))))
(defun wg-set-ido-buffer-list ()
"Set `ido-temp-list' with `wg-set-buffer-list-symbol'.
Added to `ido-make-buffer-list-hook'."
(wg-set-buffer-list-symbol 'ido-temp-list)
(wg-when-boundp (ido-entry-buffer)
(setq ido-entry-buffer (wg-get-sneaky-ido-entry-buffer-replacement))))
(provide 'workgroups-ido)
;;; workgroups-ido.el ends here