Commit c89164c5 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

(icomplete-pre-command-hook): Reconciled with keyboard macro operation.

(icomplete-post-command-hook): Likewise.
(window-minibuffer-p): Cleaned up according to suggestion from
Richard Mlynarik.
General rectification of doc strings and comments.
parent fea504fb
;;; icomplete.el - minibuffer completion incremental feedback ;;; icomplete.el - minibuffer completion incremental feedback
;;; This package is in the publid domain. ;;; This package is in the public domain.
;;; Author: Ken Manheimer <klm@nist.gov> ;;; Author: Ken Manheimer <klm@nist.gov>
;;; Maintainer: Ken Manheimer <klm@nist.gov> ;;; Maintainer: Ken Manheimer <klm@nist.gov>
;;; Version: icomplete.el,v 3.2 1993/11/19 18:42:52 klm Exp klm ;;; Version: icomplete.el,v 3.3 1993/12/11 11:27:35 klm Exp klm
;;; Created: Mar 1993 klm@nist.gov - first release to usenet ;;; Created: Mar 1993 klm@nist.gov - first release to usenet
;;; Keywords: help, abbrev ;;; Keywords: help, abbrev
...@@ -15,12 +15,22 @@ ...@@ -15,12 +15,22 @@
;;; the documentation string for 'icomplete-prompt' for a specific ;;; the documentation string for 'icomplete-prompt' for a specific
;;; description of icompletion. ;;; description of icompletion.
;;; This will not work on Emacs 18 versions - there may be a version ;;; It should run on most version of Emacs 19 (including Lucid emacs
;;; for v18 in the elisp archives, at archive.cis.ohio-state.edu, in ;;; 19 - thanks to the efforts of Colin Rafferty (craffert@lehman.com)
;;; /pub/gnu/emacs/elisp-archive. ;;; - thanks, Colin!) This version of icomplete will *not* work on
;;; Emacs 18 versions - the elisp archives, at
;;; archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive, probably
;;; still has a version that works in GNU Emacs v18.
;;; Thanks to Colin Rafferty for assistance reconciling for lemacs,
;;; and to Michael Cook, who implemented an incremental completion
;;; style in his 'iswitch' functions that served as the basis for
;;; icomplete.
;;; Code: ;;; Code:
;;;_* (Allout outline root topic. Please leave this in.)
;;;_ + Provide ;;;_ + Provide
(provide 'icomplete) (provide 'icomplete)
...@@ -29,69 +39,77 @@ ...@@ -29,69 +39,77 @@
(defvar icomplete-inhibit nil (defvar icomplete-inhibit nil
"*Set this variable to t at any time to inhibit icomplete.") "*Set this variable to t at any time to inhibit icomplete.")
;;;_ + Setup ;;;_ + Internal Variables
;;;_ - Internal Variables ;;;_ = icomplete-eoinput 1
;;;_ = icomplete-eoinput 1
(defvar icomplete-eoinput 1 (defvar icomplete-eoinput 1
"Point where minibuffer input ends and completion info begins.") "Point where minibuffer input ends and completion info begins.")
(make-variable-buffer-local 'icomplete-eoinput) (make-variable-buffer-local 'icomplete-eoinput)
;;;_ > icomplete-prime-session ()
;;;_ > icomplete-prime-session ()
;;;###autoload
(defun icomplete-prime-session () (defun icomplete-prime-session ()
"Prep emacs v 19 for icompletion. For emacs v19.18 and later revs, "Prep emacs v 19 for more finely-grained minibuffer completion-feedback.
icomplete is installed in 'minibuffer-setup-hook'. Global pre- and
post-command-hook functions are used in v19.17 and earlier revs." You can inhibit icomplete after loading by setting icomplete-inhibit
non-nil. Set the var back to nil to re-enable icomplete."
(let* ((v19-rev (and (string-match "^19\\.\\([0-9]+\\)" emacs-version) ;; For emacs v19.18 and later revs, the icomplete key function is
;; installed in 'minibuffer-setup-hook'. Global pre- and post-
;; command-hook functions are used in v19.17 and earlier v19 revs."
(let* ((v19-rev (and (string-match "^19\\.\\([0-9]+\\)" emacs-version)
(string-to-int (substring emacs-version (string-to-int (substring emacs-version
(match-beginning 1) (match-beginning 1)
(match-end 1)))))) (match-end 1))))))
(cond ((and v19-rev ; emacs v 19, some rev, (cond ((and v19-rev ; emacs v 19, some rev,
(> v19-rev 17)) (> v19-rev 17))
;; Post v19rev17, has minibuffer-setup-hook, use it: ;; Post v19rev17, has minibuffer-setup-hook, use it:
(add-hook 'minibuffer-setup-hook 'icomplete-prime-minibuffer)) (add-hook 'minibuffer-setup-hook 'icomplete-prime-minibuffer))
(v19-rev (v19-rev
;; v19rev17 and prior (including lucid): use global ;; v19rev17 and prior (including lucid): use global
;; pre- and post-command-hooks, instead: ;; pre- and post-command-hooks, instead:
(add-hook 'pre-command-hook 'icomplete-pre-command-hook 'append) (add-hook 'pre-command-hook 'icomplete-pre-command-hook 'append)
(add-hook 'post-command-hook (add-hook 'post-command-hook
'icomplete-post-command-hook 'append)) 'icomplete-post-command-hook 'append))
((format "icomplete: non v19 emacs, %s - %s" ((format "icomplete: non v19 emacs, %s - %s"
emacs-version "try elisp-archive icomplete"))))) emacs-version "try elisp-archive icomplete")))))
;;;_ > icomplete-prime-minibuffer () ;;;_ > icomplete-prime-minibuffer ()
(defun icomplete-prime-minibuffer () (defun icomplete-prime-minibuffer ()
"Prep emacs, v 19.18 or later, for icomplete. \(icomplete-prime- "Prep emacs, v 19.18 or later, for icomplete.
session establishes global hooks, instead, in emacs 19 versions 19.17
and prior.\) Run via minibuffer-setup-hook \(emacs 19.18 or later\), \(In emacs v19.17 and earlier, and in lemacs, icomplete-prime-session
adds icomplete pre- and post-command hooks to do icomplete display is used, instead to establish global hooks.\)
management."
Run via minibuffer-setup-hook, adds icomplete pre- and post-command
hooks at the start of each minibuffer."
;; We append the hooks because preliminary version of blink-paren ;; Append the hooks to avoid as much as posssible interference from
;; post-command-hook i have interferes with proper operation of ;; other hooks that foul up minibuffer quit.
;; minibuffer quit.
(make-local-variable 'pre-command-hook) (make-local-variable 'pre-command-hook)
(make-local-variable 'post-command-hook) (make-local-variable 'post-command-hook)
(add-hook 'pre-command-hook 'icomplete-pre-command-hook) (add-hook 'pre-command-hook 'icomplete-pre-command-hook)
(add-hook 'post-command-hook 'icomplete-post-command-hook)) (add-hook 'post-command-hook 'icomplete-post-command-hook))
;;;_ > icomplete-window-minibuffer-p () ;;;_ > icomplete-window-minibuffer-p ()
(defmacro icomplete-window-minibuffer-p () (defmacro icomplete-window-minibuffer-p ()
"Returns non-nil if current window is a minibuffer window. "Returns non-nil if current window is a minibuffer window.
Trivially equates to '(window-minibuffer-p nil)', with the nil
provided in case the argument is not optional in Lucid emacs (which
some net correspondance seems to indicate)."
'(window-minibuffer-p nil)) Trivially equates to '(window-minibuffer-p (selected-window))', with
the argument definitely provided for emacsen that require it, eg Lucid."
'(window-minibuffer-p (selected-window)))
;;;_ + Completion ;;;_ + Completion
;;;_ - Completion feedback hooks ;;;_ - Completion feedback hooks
;;;_ > icomplete-pre-command-hook () ;;;_ > icomplete-pre-command-hook ()
(defun icomplete-pre-command-hook () (defun icomplete-pre-command-hook ()
"Cleanup completions exhibit before user's new input (or whatever) is dealt "Cleanup completions display before user's new command is dealt with."
with."
(if (and (icomplete-window-minibuffer-p) (if (and (icomplete-window-minibuffer-p)
(not executing-macro)
(not (symbolp minibuffer-completion-table)) (not (symbolp minibuffer-completion-table))
(not icomplete-inhibit)) (not icomplete-inhibit))
(if (and (boundp 'icomplete-eoinput) (if (and (boundp 'icomplete-eoinput)
...@@ -99,16 +117,17 @@ with." ...@@ -99,16 +117,17 @@ with."
(if (> icomplete-eoinput (point-max)) (if (> icomplete-eoinput (point-max))
;; Oops, got rug pulled out from under us - reinit: ;; Oops, got rug pulled out from under us - reinit:
(setq icomplete-eoinput (point-max)) (setq icomplete-eoinput (point-max))
(let ((buffer-undo-list buffer-undo-list )) ; prevent entry (let ((buffer-undo-list buffer-undo-list )) ; prevent entry
(delete-region icomplete-eoinput (point-max)))) (delete-region icomplete-eoinput (point-max))))
;; Reestablish the local variable 'cause minibuffer-setup is weird:
(make-local-variable 'icomplete-eoinput) (make-local-variable 'icomplete-eoinput)
(setq icomplete-eoinput 1)))) (setq icomplete-eoinput 1))))
;;;_ > icomplete-post-command-hook () ;;;_ > icomplete-post-command-hook ()
(defun icomplete-post-command-hook () (defun icomplete-post-command-hook ()
"Exhibit completions, leaving icomplete-eoinput with position where user "Exhibit completions, leaving bookkeeping so pre- hook can tidy up."
input leaves off and exhibit begins, so icomplete-pre-command-hook can
subsequently cleanup."
(if (and (icomplete-window-minibuffer-p) ; ... in a minibuffer. (if (and (icomplete-window-minibuffer-p) ; ... in a minibuffer.
(not executing-macro)
(not icomplete-inhibit) ; ... not specifically inhibited. (not icomplete-inhibit) ; ... not specifically inhibited.
;(sit-for 0) ; ... redisplay and if there's input ;(sit-for 0) ; ... redisplay and if there's input
; waiting, then don't icomplete ; waiting, then don't icomplete
...@@ -120,17 +139,14 @@ subsequently cleanup." ...@@ -120,17 +139,14 @@ subsequently cleanup."
(icomplete-exhibit)))) (icomplete-exhibit))))
;;;_ > icomplete-window-setup-hook () ;;;_ > icomplete-window-setup-hook ()
(defun icomplete-window-setup-hook () (defun icomplete-window-setup-hook ()
"Exhibit completions, leaving icomplete-eoinput with position where user "Exhibit completions, leaving bookkeeping so pre- hook can tidy up."
input leaves off and exhibit begins, so icomplete-pre-command-hook can
subsequently cleanup."
(if (and (icomplete-window-minibuffer-p) ; ... in a minibuffer. (if (and (icomplete-window-minibuffer-p) ; ... in a minibuffer.
) )
(message "ic ws doing")(sit-for 1))) (message "ic ws doing")(sit-for 1)))
;;;_ > icomplete-exhibit () ;;;_ > icomplete-exhibit ()
(defun icomplete-exhibit () (defun icomplete-exhibit ()
"Exhibit completions, leaving icomplete-eoinput with position where user "Insert icomplete completions display."
input leaves off and exhibit begins, so icomplete-pre-command-hook can
subsequently cleanup."
(if (not (symbolp minibuffer-completion-table)) (if (not (symbolp minibuffer-completion-table))
(let ((contents (buffer-substring (point-min)(point-max))) (let ((contents (buffer-substring (point-min)(point-max)))
(buffer-undo-list t)) (buffer-undo-list t))
...@@ -157,8 +173,7 @@ subsequently cleanup." ...@@ -157,8 +173,7 @@ subsequently cleanup."
(defun icomplete-prompt (name candidates predicate require-match) (defun icomplete-prompt (name candidates predicate require-match)
"Identify prospective candidates for minibuffer completion. "Identify prospective candidates for minibuffer completion.
The display is updated with each minibuffer keystroke when icomplete The display is updated with each minibuffer keystroke during
is enabled \(by loading the 'icomplete' elisp package\) and doing
minibuffer completion. minibuffer completion.
Prospective completion suffixes (if any) are displayed, bracketed by Prospective completion suffixes (if any) are displayed, bracketed by
...@@ -222,10 +237,11 @@ matches exist." ...@@ -222,10 +237,11 @@ matches exist."
alternatives) alternatives)
close-bracket-prospects)))))) close-bracket-prospects))))))
;;;_ + Initialization ;;;_ - Initialization
(icomplete-prime-session) (icomplete-prime-session)
;;;_* Local emacs vars.
;;;_ + Local emacs vars.
'( '(
Local variables: Local variables:
eval: (save-excursion eval: (save-excursion
...@@ -242,3 +258,4 @@ eval: (save-excursion ...@@ -242,3 +258,4 @@ eval: (save-excursion
End:) End:)
;;; icomplete.el ends here ;;; icomplete.el ends here
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment