(defvar liece-minibuffer-map nil)
(defvar liece-minibuffer-complete-function nil)
+(autoload 'completing-read-multiple "crm")
+(defvar crm-separator)
+
(unless liece-minibuffer-map
(setq liece-minibuffer-map
(let ((map (make-sparse-keymap)))
(_ "[Modes are: %s]")
(mapconcat (function car) liece-supported-user-mode-alist ""))))
-(defun liece-minibuffer-completing-default-read
- (prompt table &optional predicate require-match initial-input)
- "Completing-read w/ default argument like in 'kill-buffer'."
- (let ((default-read
- (completing-read
- (if initial-input
- (format "%s(default %s) " prompt initial-input)
- prompt)
- table predicate require-match nil)))
- (if (and (string= default-read "") initial-input)
- initial-input
- default-read)))
-
-(defun liece-minibuffer-completing-sequential-read
- (prompt &optional count table predicate require-match multiple-candidate)
- "Execute completing-read w/ default argument consequently."
- (let ((count (or count 0)) string result)
- (while (progn
- (setq string
- (completing-read
- (format "%s (%d): " prompt (incf count))
- table predicate require-match nil))
- (or multiple-candidate
- (remove-alist 'table string))
- (not (string= "" string)))
- (push string result))
- result))
+(defun liece-minibuffer-completing-read
+ (prompt table &optional predicate require-match initial-input history default)
+ (completing-read
+ (if default
+ (format "%s(default %s) " prompt default)
+ prompt)
+ table predicate require-match initial-input history default))
+
+(defvar liece-minibuffer-completion-separator ","
+ "Separator used for separating strings in `liece-minibuffer-completing-read-multiple'.
+It should be regular expression which doesn't match word-continuent characters.")
+
+(defvar liece-minibuffer-completion-table nil)
+
+(defun liece-minibuffer-completing-read-multiple-1 (string predicate flag)
+ "Function used by `liece-minibuffer-completing-read-multiple'.
+The value of STRING is the string to be completed.
+
+The value of PREDICATE is a function to filter possible matches, or
+nil if none.
+
+The value of FLAG is used to specify the type of completion operation.
+A value of nil specifies `try-completion'. A value of t specifies
+`all-completions'. A value of lambda specifes a test for an exact match.
+
+For more information on STRING, PREDICATE, and FLAG, see the Elisp
+Reference sections on 'Programmed Completion' and 'Basic Completion
+Functions'."
+ (let ((except
+ (butlast
+ (split-string string liece-minibuffer-completion-separator)))
+ (table
+ (copy-sequence liece-minibuffer-completion-table))
+ lead)
+ (when (string-match
+ (concat ".*" liece-minibuffer-completion-separator)
+ string)
+ (setq lead (substring string 0 (match-end 0))
+ string (substring string (match-end 0))))
+ (while except
+ (setq table (remassoc (car except) table)
+ except (cdr except)))
+ (if (null flag)
+ (progn
+ (setq string (try-completion string table predicate))
+ (or (eq t string)
+ (concat lead string)))
+ (if (eq flag 'lambda)
+ (eq t (try-completion string table predicate))
+ (if flag
+ (all-completions string table predicate))))))
+
+(defun liece-minibuffer-completing-read-multiple
+ (prompt table &optional predicate require-match initial-input
+ history default multiple-candidate)
+ "Execute `completing-read' consequently.
+
+See the documentation for `completing-read' for details on the arguments:
+PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HISTORY, DEFAULT."
+ (let ((prompt
+ (format "%s(punctuate by \"%s\") "
+ prompt liece-minibuffer-completion-separator)))
+ (if multiple-candidate
+ (let ((crm-separator
+ liece-minibuffer-completion-separator))
+ (completing-read-multiple
+ prompt table predicate require-match initial-input
+ history default))
+ (let ((liece-minibuffer-completion-table
+ table))
+ (split-string
+ (completing-read
+ prompt #'liece-minibuffer-completing-read-multiple-1
+ predicate require-match initial-input history default)
+ liece-minibuffer-completion-separator)))))
(provide 'liece-minibuf)