浏览代码

All completing-read behavior for iswitchb users

This is enabled using org-completion-use-iswitchb, and follows the same
model of usage as for ido users.
John Wiegley 15 年之前
父节点
当前提交
5acac25dc1
共有 3 个文件被更改,包括 68 次插入32 次删除
  1. 6 0
      doc/org.texi
  2. 4 4
      lisp/org-agenda.el
  3. 58 28
      lisp/org.el

+ 6 - 0
doc/org.texi

@@ -9946,6 +9946,12 @@ This may be necessary in particular if files include other files via
 @cindex tag completion
 @cindex tag completion
 @cindex link abbreviations, completion of
 @cindex link abbreviations, completion of
 
 
+Emacs would not be Emacs without completion, and Org-mode uses it whenever it
+makes sense.  If you prefer an @i{iswitchb}- or @i{ido}-like interface for
+some of the completion prompts, you can specify your preferece by setting at
+most one of the variables @code{org-completion-use-iswitchb}
+@code{org-completion-use-ido}.
+
 Org supports in-buffer completion.  This type of completion does
 Org supports in-buffer completion.  This type of completion does
 not make use of the minibuffer.  You simply type a few letters into
 not make use of the minibuffer.  You simply type a few letters into
 the buffer and use the key to complete text right there.
 the buffer and use the key to complete text right there.

+ 4 - 4
lisp/org-agenda.el

@@ -3154,7 +3154,7 @@ for a keyword.  A numeric prefix directly selects the Nth keyword in
 	 rtn rtnall files file pos)
 	 rtn rtnall files file pos)
     (when (equal arg '(4))
     (when (equal arg '(4))
       (setq org-select-this-todo-keyword
       (setq org-select-this-todo-keyword
-	    (org-ido-completing-read "Keyword (or KWD1|K2D2|...): "
+	    (org-icompleting-read "Keyword (or KWD1|K2D2|...): "
 			     (mapcar 'list kwds) nil nil)))
 			     (mapcar 'list kwds) nil nil)))
     (and (equal 0 arg) (setq org-select-this-todo-keyword nil))
     (and (equal 0 arg) (setq org-select-this-todo-keyword nil))
     (org-set-local 'org-last-arg arg)
     (org-set-local 'org-last-arg arg)
@@ -4824,7 +4824,7 @@ to switch to narrowing."
 	(org-set-local 'org-global-tags-completion-table
 	(org-set-local 'org-global-tags-completion-table
 		       (org-global-tags-completion-table)))
 		       (org-global-tags-completion-table)))
       (let ((completion-ignore-case t))
       (let ((completion-ignore-case t))
-	(setq tag (org-ido-completing-read
+	(setq tag (org-icompleting-read
 		   "Tag: " org-global-tags-completion-table))))
 		   "Tag: " org-global-tags-completion-table))))
     (cond
     (cond
      ((equal char ?/)
      ((equal char ?/)
@@ -6416,7 +6416,7 @@ This will remove the markers, and the overlays."
       (setq cmd (list 'org-agenda-refile nil (list 'quote rfloc))))
       (setq cmd (list 'org-agenda-refile nil (list 'quote rfloc))))
 
 
      ((equal action ?t)
      ((equal action ?t)
-      (setq state (org-ido-completing-read
+      (setq state (org-icompleting-read
 		   "Todo state: "
 		   "Todo state: "
 		   (with-current-buffer (marker-buffer (car entries))
 		   (with-current-buffer (marker-buffer (car entries))
 		     (mapcar 'list org-todo-keywords-1))))
 		     (mapcar 'list org-todo-keywords-1))))
@@ -6425,7 +6425,7 @@ This will remove the markers, and the overlays."
 		   (org-agenda-todo ,state))))
 		   (org-agenda-todo ,state))))
 
 
      ((memq action '(?- ?+))
      ((memq action '(?- ?+))
-      (setq tag (org-ido-completing-read
+      (setq tag (org-icompleting-read
 		 (format "Tag to %s: " (if (eq action ?+) "add" "remove"))
 		 (format "Tag to %s: " (if (eq action ?+) "add" "remove"))
 		 (with-current-buffer (marker-buffer (car entries))
 		 (with-current-buffer (marker-buffer (car entries))
 		   (delq nil
 		   (delq nil

+ 58 - 28
lisp/org.el

@@ -2849,7 +2849,17 @@ This is needed for font-lock setup.")
   "Non-nil means, use ido completion wherever possible.
   "Non-nil means, use ido completion wherever possible.
 Note that `ido-mode' must be active for this variable to be relevant.
 Note that `ido-mode' must be active for this variable to be relevant.
 If you decide to turn this variable on, you might well want to turn off
 If you decide to turn this variable on, you might well want to turn off
-`org-outline-path-complete-in-steps'."
+`org-outline-path-complete-in-steps'.
+See also `org-completion-use-iswitchb'."
+  :group 'org-completion
+  :type 'boolean)
+
+(defcustom org-completion-use-iswitchb nil
+  "Non-nil means, use iswitchb completion wherever possible.
+Note that `iswitchb-mode' must be active for this variable to be relevant.
+If you decide to turn this variable on, you might well want to turn off
+`org-outline-path-complete-in-steps'.
+Note that thi variable has only an effect if `org-completion-use-ido' is nil."
   :group 'org-completion
   :group 'org-completion
   :type 'boolean)
   :type 'boolean)
 
 
@@ -6552,13 +6562,13 @@ WITH-CASE, the sorting considers case as well."
 
 
       (and (= (downcase sorting-type) ?f)
       (and (= (downcase sorting-type) ?f)
            (setq getkey-func
            (setq getkey-func
-                 (org-ido-completing-read "Sort using function: "
+                 (org-icompleting-read "Sort using function: "
                                   obarray 'fboundp t nil nil))
                                   obarray 'fboundp t nil nil))
            (setq getkey-func (intern getkey-func)))
            (setq getkey-func (intern getkey-func)))
 
 
       (and (= (downcase sorting-type) ?r)
       (and (= (downcase sorting-type) ?r)
            (setq property
            (setq property
-                 (org-ido-completing-read "Property: "
+                 (org-icompleting-read "Property: "
 				  (mapcar 'list (org-buffer-property-keys t))
 				  (mapcar 'list (org-buffer-property-keys t))
                                   nil t))))
                                   nil t))))
 
 
@@ -7529,7 +7539,8 @@ Use TAB to complete link prefixes, then RET for type-specific completion support
       (unwind-protect
       (unwind-protect
 	  (progn
 	  (progn
 	    (setq link
 	    (setq link
-		  (let ((org-completion-use-ido nil))
+		  (let ((org-completion-use-ido nil)
+			(org-completion-use-iswitchb nil))
 		    (org-completing-read
 		    (org-completing-read
 		     "Link: "
 		     "Link: "
 		     (append
 		     (append
@@ -7639,14 +7650,23 @@ Use TAB to complete link prefixes, then RET for type-specific completion support
 	 (copy-keymap minibuffer-local-completion-map)))
 	 (copy-keymap minibuffer-local-completion-map)))
     (org-defkey minibuffer-local-completion-map " " 'self-insert-command)
     (org-defkey minibuffer-local-completion-map " " 'self-insert-command)
     (org-defkey minibuffer-local-completion-map "?" 'self-insert-command)
     (org-defkey minibuffer-local-completion-map "?" 'self-insert-command)
-    (apply 'org-ido-completing-read args)))
+    (apply 'org-icompleting-read args)))
 
 
-(defun org-completing-read-no-ido (&rest args)
-  (let (org-completion-use-ido)
+(defun org-completing-read-no-i (&rest args)
+  (let (org-completion-use-ido org-completion-use-iswitchb)
     (apply 'org-completing-read args)))
     (apply 'org-completing-read args)))
 
 
-(defun org-ido-completing-read (&rest args)
-  "Completing-read using `ido-mode' speedups if available"
+(defun org-iswitchb-completing-read (prompt choices &rest args)
+  "Use iswitch as a completing-read replacement to choose from choices.
+PROMPT is a string to prompt with.  CHOICES is a list of strings to choose
+from."
+  (let ((iswitchb-make-buflist-hook
+         (lambda ()
+           (setq iswitchb-temp-buflist choices))))
+    (iswitchb-read-buffer prompt)))
+
+(defun org-icompleting-read (&rest args)
+  "Completing-read using `ido-mode' or `iswitchb' speedups if available"
   (if (and org-completion-use-ido
   (if (and org-completion-use-ido
 	   (fboundp 'ido-completing-read)
 	   (fboundp 'ido-completing-read)
 	   (boundp 'ido-mode) ido-mode
 	   (boundp 'ido-mode) ido-mode
@@ -7657,7 +7677,13 @@ Use TAB to complete link prefixes, then RET for type-specific completion support
 		   (mapcar (lambda (x) (car x)) (nth 1 args))
 		   (mapcar (lambda (x) (car x)) (nth 1 args))
 		 (nth 1 args))
 		 (nth 1 args))
 	       (cddr args)))
 	       (cddr args)))
-    (apply 'completing-read args)))
+    (if (and org-completion-use-iswitchb
+	     (boundp 'iswitchb-mode) iswitchb-mode
+	     (listp (second args)))
+	(apply 'org-iswitchb-completing-read (concat (car args))
+	       (mapcar (lambda (x) (car x)) (nth 1 args))
+	       (cddr args))
+      (apply 'completing-read args))))
 
 
 (defun org-extract-attributes (s)
 (defun org-extract-attributes (s)
   "Extract the attributes cookie from a string and set as text property."
   "Extract the attributes cookie from a string and set as text property."
@@ -8694,7 +8720,7 @@ See also `org-refile-use-outline-path' and `org-completion-use-ido'"
 	 (cfunc (if (and org-refile-use-outline-path
 	 (cfunc (if (and org-refile-use-outline-path
 			 org-outline-path-complete-in-steps)
 			 org-outline-path-complete-in-steps)
 		    'org-olpath-completing-read
 		    'org-olpath-completing-read
-		  'org-ido-completing-read))
+		  'org-icompleting-read))
 	 (extra (if org-refile-use-outline-path "/" ""))
 	 (extra (if org-refile-use-outline-path "/" ""))
 	 (filename (and cfn (expand-file-name cfn)))
 	 (filename (and cfn (expand-file-name cfn)))
 	 (tbl (mapcar
 	 (tbl (mapcar
@@ -8764,9 +8790,10 @@ See also `org-refile-use-outline-path' and `org-completion-use-ido'"
 (defun org-olpath-completing-read (prompt collection &rest args)
 (defun org-olpath-completing-read (prompt collection &rest args)
   "Read an outline path like a file name."
   "Read an outline path like a file name."
   (let ((thetable collection)
   (let ((thetable collection)
-	(org-completion-use-ido nil))   ; does not work with ido.
+	(org-completion-use-ido nil)	   ; does not work with ido.
+	(org-completion-use-iswitchb nil)) ; or iswitchb 
     (apply
     (apply
-     'org-ido-completing-read prompt
+     'org-icompleting-read prompt
      (lambda (string predicate &optional flag)
      (lambda (string predicate &optional flag)
        (let (rtn r f (l (length string)))
        (let (rtn r f (l (length string)))
 	 (cond
 	 (cond
@@ -9263,7 +9290,7 @@ For calling through lisp, arg is also interpreted in the following way:
 			     (or (not org-use-fast-todo-selection)
 			     (or (not org-use-fast-todo-selection)
 				 (not org-todo-key-trigger)))
 				 (not org-todo-key-trigger)))
 			;; Read a state with completion
 			;; Read a state with completion
-			(org-ido-completing-read
+			(org-icompleting-read
 			 "State: " (mapcar (lambda(x) (list x))
 			 "State: " (mapcar (lambda(x) (list x))
 					   org-todo-keywords-1)
 					   org-todo-keywords-1)
 			 nil t))
 			 nil t))
@@ -9864,7 +9891,7 @@ of `org-todo-keywords-1'."
 	(kwd-re
 	(kwd-re
 	 (cond ((null arg) org-not-done-regexp)
 	 (cond ((null arg) org-not-done-regexp)
 	       ((equal arg '(4))
 	       ((equal arg '(4))
-		(let ((kwd (org-ido-completing-read "Keyword (or KWD1|KWD2|...): "
+		(let ((kwd (org-icompleting-read "Keyword (or KWD1|KWD2|...): "
 					    (mapcar 'list org-todo-keywords-1))))
 					    (mapcar 'list org-todo-keywords-1))))
 		  (concat "\\("
 		  (concat "\\("
 			  (mapconcat 'identity (org-split-string kwd "|") "\\|")
 			  (mapconcat 'identity (org-split-string kwd "|") "\\|")
@@ -10250,9 +10277,9 @@ a      Show deadlines and scheduled items after a date."
      ((member ans '(?T ?m))
      ((member ans '(?T ?m))
       (call-interactively 'org-match-sparse-tree))
       (call-interactively 'org-match-sparse-tree))
      ((member ans '(?p ?P))
      ((member ans '(?p ?P))
-      (setq kwd (org-ido-completing-read "Property: "
+      (setq kwd (org-icompleting-read "Property: "
 				 (mapcar 'list (org-buffer-property-keys))))
 				 (mapcar 'list (org-buffer-property-keys))))
-      (setq value (org-ido-completing-read "Value: "
+      (setq value (org-icompleting-read "Value: "
 				   (mapcar 'list (org-property-values kwd))))
 				   (mapcar 'list (org-property-values kwd))))
       (unless (string-match "\\`{.*}\\'" value)
       (unless (string-match "\\`{.*}\\'" value)
 	(setq value (concat "\"" value "\"")))
 	(setq value (concat "\"" value "\"")))
@@ -10700,7 +10727,7 @@ also TODO lines."
     ;; Get a new match request, with completion
     ;; Get a new match request, with completion
     (let ((org-last-tags-completion-table
     (let ((org-last-tags-completion-table
 	   (org-global-tags-completion-table)))
 	   (org-global-tags-completion-table)))
-      (setq match (org-completing-read-no-ido
+      (setq match (org-completing-read-no-i
 		   "Match: " 'org-tags-completion-function nil nil nil
 		   "Match: " 'org-tags-completion-function nil nil nil
 		   'org-tags-history))))
 		   'org-tags-history))))
 
 
@@ -11037,7 +11064,7 @@ With prefix ARG, realign all tags in headings in the current buffer."
 		  (let ((org-add-colon-after-tag-completion t))
 		  (let ((org-add-colon-after-tag-completion t))
 		    (org-trim
 		    (org-trim
 		     (org-without-partial-completion
 		     (org-without-partial-completion
-		      (org-ido-completing-read "Tags: " 'org-tags-completion-function
+		      (org-icompleting-read "Tags: " 'org-tags-completion-function
 				       nil nil current 'org-tags-history)))))))
 				       nil nil current 'org-tags-history)))))))
 	(while (string-match "[-+&]+" tags)
 	(while (string-match "[-+&]+" tags)
 	  ;; No boolean logic, just a list
 	  ;; No boolean logic, just a list
@@ -11085,7 +11112,7 @@ This works in the agenda, and also in an org-mode buffer."
 		(if (org-mode-p)
 		(if (org-mode-p)
 		    (org-get-buffer-tags)
 		    (org-get-buffer-tags)
 		  (org-global-tags-completion-table))))
 		  (org-global-tags-completion-table))))
-	   (org-ido-completing-read
+	   (org-icompleting-read
 	    "Tag: " 'org-tags-completion-function nil nil nil
 	    "Tag: " 'org-tags-completion-function nil nil nil
 	    'org-tags-history))
 	    'org-tags-history))
 	 (progn
 	 (progn
@@ -11304,7 +11331,7 @@ Returns the new tags string, or nil to not change the current settings."
 		  (if exit-after-next (setq exit-after-next 'now)))
 		  (if exit-after-next (setq exit-after-next 'now)))
 		 ((= c ?\t)
 		 ((= c ?\t)
 		  (condition-case nil
 		  (condition-case nil
-		      (setq tg (org-ido-completing-read
+		      (setq tg (org-icompleting-read
 				"Tag: "
 				"Tag: "
 				(or buffer-tags
 				(or buffer-tags
 				    (with-current-buffer buf
 				    (with-current-buffer buf
@@ -11974,7 +12001,7 @@ in the current file."
   (interactive
   (interactive
    (let* ((completion-ignore-case t)
    (let* ((completion-ignore-case t)
 	  (keys (org-buffer-property-keys nil t t))
 	  (keys (org-buffer-property-keys nil t t))
-	  (prop0 (org-ido-completing-read "Property: " (mapcar 'list keys)))
+	  (prop0 (org-icompleting-read "Property: " (mapcar 'list keys)))
 	  (prop (if (member prop0 keys)
 	  (prop (if (member prop0 keys)
 		    prop0
 		    prop0
 		  (or (cdr (assoc (downcase prop0)
 		  (or (cdr (assoc (downcase prop0)
@@ -11986,7 +12013,7 @@ in the current file."
 	  (existing (mapcar 'list (org-property-values prop)))
 	  (existing (mapcar 'list (org-property-values prop)))
 	  (val (if allowed
 	  (val (if allowed
 		   (org-completing-read "Value: " allowed nil 'req-match)
 		   (org-completing-read "Value: " allowed nil 'req-match)
-		 (let (org-completion-use-ido)
+		 (let (org-completion-use-ido org-completion-use-iswitchb)
 		   (org-completing-read
 		   (org-completing-read
 		    (concat "Value" (if (and cur (string-match "\\S-" cur))
 		    (concat "Value" (if (and cur (string-match "\\S-" cur))
 					(concat "[" cur "]") "")
 					(concat "[" cur "]") "")
@@ -12000,7 +12027,7 @@ in the current file."
   "In the current entry, delete PROPERTY."
   "In the current entry, delete PROPERTY."
   (interactive
   (interactive
    (let* ((completion-ignore-case t)
    (let* ((completion-ignore-case t)
-	  (prop (org-ido-completing-read
+	  (prop (org-icompleting-read
 		 "Property: " (org-entry-properties nil 'standard))))
 		 "Property: " (org-entry-properties nil 'standard))))
      (list prop)))
      (list prop)))
   (message "Property %s %s" property
   (message "Property %s %s" property
@@ -12012,7 +12039,7 @@ in the current file."
   "Remove PROPERTY globally, from all entries."
   "Remove PROPERTY globally, from all entries."
   (interactive
   (interactive
    (let* ((completion-ignore-case t)
    (let* ((completion-ignore-case t)
-	  (prop (org-ido-completing-read
+	  (prop (org-icompleting-read
 		 "Globally remove property: "
 		 "Globally remove property: "
 		 (mapcar 'list (org-buffer-property-keys)))))
 		 (mapcar 'list (org-buffer-property-keys)))))
      (list prop)))
      (list prop)))
@@ -13412,8 +13439,8 @@ Due to some yet unresolved reason, the global function
 	 (or enabled (iswitchb-mode -1)))))
 	 (or enabled (iswitchb-mode -1)))))
 
 
 ;;;###autoload
 ;;;###autoload
-(defun org-ido-switchb (&optional arg)
-  "Use `org-ido-completing-read' to prompt for an Org buffer to switch to.
+(defun org-iswitchb (&optional arg)
+  "Use `org-icompleting-read' to prompt for an Org buffer to switch to.
 With a prefix argument, restrict available to files.
 With a prefix argument, restrict available to files.
 With two prefix arguments, restrict available buffers to agenda files."
 With two prefix arguments, restrict available buffers to agenda files."
   (interactive "P")
   (interactive "P")
@@ -13421,10 +13448,13 @@ With two prefix arguments, restrict available buffers to agenda files."
                      ((equal arg '(16)) (org-buffer-list 'agenda))
                      ((equal arg '(16)) (org-buffer-list 'agenda))
                      (t                 (org-buffer-list)))))
                      (t                 (org-buffer-list)))))
     (switch-to-buffer
     (switch-to-buffer
-     (org-ido-completing-read "Org buffer: "
+     (org-icompleting-read "Org buffer: "
                               (mapcar 'list (mapcar 'buffer-name blist))
                               (mapcar 'list (mapcar 'buffer-name blist))
                               nil t))))
                               nil t))))
 
 
+;;;###autoload
+(defalias 'org-ido-switchb 'org-iswitchb)
+
 (defun org-buffer-list (&optional predicate exclude-tmp)
 (defun org-buffer-list (&optional predicate exclude-tmp)
   "Return a list of Org buffers.
   "Return a list of Org buffers.
 PREDICATE can be `export', `files' or `agenda'.
 PREDICATE can be `export', `files' or `agenda'.