(Starting Liece): New section.
[elisp/liece.git] / lisp / liece-minibuf.el
index f0bbb53..1f44d85 100644 (file)
@@ -36,6 +36,9 @@
 (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)