1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-14 16:50:58 +00:00

* viper-cmd.el (viper-prefix-commands): make into a defconst.

(viper-exec-buffer-search): use regexp-quote to quote the buffer
	string.
	(viper-minibuffer-setup-sentinel): make some variables buffer-local.
	(viper-skip-separators): bug fix.
	(viper-set-searchstyle-toggling-macros): allow to unset macros in a
	particular major mode.
	(viper-del-backward-char-in-replace): don't put deleted char on the
	kill ring.

	* viper-ex.el (viper-color-display-p): new function.
	(viper-has-face-support-p): use viper-color-display-p.

	* viper-keym.el (viper-gnus-modifier-map): new keymap.

	* viper-macs.el (viper-unrecord-kbd-macro): bug fix.

	* viper-util.el (viper-glob-unix-files): fix shell status check.
	(viper-file-remote-p): make equivalent to file-remote-p.

	* viper.el (viper-major-mode-modifier-list): use
	viper-gnus-modifier-map.
This commit is contained in:
Michael Kifer 2005-02-19 19:32:47 +00:00
parent c3a0cca735
commit 3f9526a371
9 changed files with 148 additions and 66 deletions

View File

@ -1,3 +1,28 @@
2005-02-19 Michael Kifer <kifer@cs.stonybrook.edu>
* viper-cmd.el (viper-prefix-commands): make into a defconst.
(viper-exec-buffer-search): use regexp-quote to quote the buffer
string.
(viper-minibuffer-setup-sentinel): make some variables buffer-local.
(viper-skip-separators): bug fix.
(viper-set-searchstyle-toggling-macros): allow to unset macros in a
particular major mode.
(viper-del-backward-char-in-replace): don't put deleted char on the
kill ring.
* viper-ex.el (viper-color-display-p): new function.
(viper-has-face-support-p): use viper-color-display-p.
* viper-keym.el (viper-gnus-modifier-map): new keymap.
* viper-macs.el (viper-unrecord-kbd-macro): bug fix.
* viper-util.el (viper-glob-unix-files): fix shell status check.
(viper-file-remote-p): make equivalent to file-remote-p.
* viper.el (viper-major-mode-modifier-list): use
viper-gnus-modifier-map.
2005-02-19 David Kastrup <dak@gnu.org> 2005-02-19 David Kastrup <dak@gnu.org>
* subr.el (subregexp-context-p): Fix garbled doc string by adding * subr.el (subregexp-context-p): Fix garbled doc string by adding

View File

@ -1063,7 +1063,7 @@ as a Meta key and any number of multiple escapes is allowed."
;; call the actual function to execute ESC (if no other symbols followed) ;; call the actual function to execute ESC (if no other symbols followed)
;; or the key bound to the ESC sequence (if the sequence was issued ;; or the key bound to the ESC sequence (if the sequence was issued
;; with very short delay between characters. ;; with very short delay between characters).
(if (eq cmd 'viper-intercept-ESC-key) (if (eq cmd 'viper-intercept-ESC-key)
(setq cmd (setq cmd
(cond ((eq viper-current-state 'vi-state) (cond ((eq viper-current-state 'vi-state)
@ -1529,7 +1529,8 @@ as a Meta key and any number of multiple escapes is allowed."
nil) nil)
(defun viper-exec-buffer-search (m-com com) (defun viper-exec-buffer-search (m-com com)
(setq viper-s-string (buffer-substring (point) viper-com-point)) (setq viper-s-string
(regexp-quote (buffer-substring (point) viper-com-point)))
(setq viper-s-forward t) (setq viper-s-forward t)
(setq viper-search-history (cons viper-s-string viper-search-history)) (setq viper-search-history (cons viper-s-string viper-search-history))
(setq viper-intermediate-command 'viper-exec-buffer-search) (setq viper-intermediate-command 'viper-exec-buffer-search)
@ -1982,6 +1983,16 @@ Undo previous insertion and inserts new."
(let ((hook (if viper-vi-style-in-minibuffer (let ((hook (if viper-vi-style-in-minibuffer
'viper-change-state-to-insert 'viper-change-state-to-insert
'viper-change-state-to-emacs))) 'viper-change-state-to-emacs)))
;; making buffer-local variables so that normal buffers won't affect the
;; minibuffer and vice versa. Otherwise, command arguments will affect
;; minibuffer ops and insertions from the minibuffer will change those in
;; the normal buffers
(make-local-variable 'viper-d-com)
(make-local-variable 'viper-last-insertion)
(make-local-variable 'viper-command-ring)
(setq viper-d-com nil
viper-last-insertion nil
viper-command-ring nil)
(funcall hook) (funcall hook)
)) ))
@ -2707,7 +2718,7 @@ On reaching beginning of line, stop and signal error."
(viper-backward-char-carefully) (viper-backward-char-carefully)
(if (looking-at "\n") (if (looking-at "\n")
(viper-skip-all-separators-backward 'within-line) (viper-skip-all-separators-backward 'within-line)
(or (bobp) (forward-char))))) (or (viper-looking-at-separator) (forward-char)))))
(defun viper-forward-word-kernel (val) (defun viper-forward-word-kernel (val)
@ -3630,33 +3641,39 @@ the Emacs binding of `/'."
(setq msg "Search style remains unchanged"))) (setq msg "Search style remains unchanged")))
(princ msg t))) (princ msg t)))
(defun viper-set-searchstyle-toggling-macros (unset) (defun viper-set-searchstyle-toggling-macros (unset &optional major-mode)
"Set the macros for toggling the search style in Viper's vi-state. "Set the macros for toggling the search style in Viper's vi-state.
The macro that toggles case sensitivity is bound to `//', and the one that The macro that toggles case sensitivity is bound to `//', and the one that
toggles regexp search is bound to `///'. toggles regexp search is bound to `///'.
With a prefix argument, this function unsets the macros. " With a prefix argument, this function unsets the macros.
If MAJOR-MODE is set, set the macros only in that major mode."
(interactive "P") (interactive "P")
(or noninteractive (let (scope)
(if (not unset) (if (and major-mode (symbolp major-mode))
(progn (setq scope major-mode)
;; toggle case sensitivity in search (setq scope 't))
(viper-record-kbd-macro (or noninteractive
"//" 'vi-state (if (not unset)
[1 (meta x) v i p e r - t o g g l e - s e a r c h - s t y l e return] (progn
't) ;; toggle case sensitivity in search
;; toggle regexp/vanila search (viper-record-kbd-macro
(viper-record-kbd-macro "//" 'vi-state
"///" 'vi-state [1 (meta x) v i p e r - t o g g l e - s e a r c h - s t y l e return]
[2 (meta x) v i p e r - t o g g l e - s e a r c h - s t y l e return] scope)
't) ;; toggle regexp/vanila search
(if (interactive-p) (viper-record-kbd-macro
(message "///" 'vi-state
"// and /// now toggle case-sensitivity and regexp search"))) [2 (meta x) v i p e r - t o g g l e - s e a r c h - s t y l e return]
(viper-unrecord-kbd-macro "//" 'vi-state) scope)
(sit-for 2) (if (interactive-p)
(viper-unrecord-kbd-macro "///" 'vi-state)))) (message
"// and /// now toggle case-sensitivity and regexp search")))
(viper-unrecord-kbd-macro "//" 'vi-state)
(sit-for 2)
(viper-unrecord-kbd-macro "///" 'vi-state)))
))
(defun viper-set-parsing-style-toggling-macro (unset) (defun viper-set-parsing-style-toggling-macro (unset)
"Set `%%%' to be a macro that toggles whether comment fields should be parsed for matching parentheses. "Set `%%%' to be a macro that toggles whether comment fields should be parsed for matching parentheses.
This is used in conjunction with the `%' command. This is used in conjunction with the `%' command.
@ -4112,7 +4129,8 @@ Null string will repeat previous search."
(interactive) (interactive)
(if (and viper-ex-style-editing (bolp)) (if (and viper-ex-style-editing (bolp))
(beep 1) (beep 1)
(delete-backward-char 1 t))) ;; don't put on kill ring
(delete-backward-char 1 nil)))
(defun viper-del-backward-char-in-replace () (defun viper-del-backward-char-in-replace ()
@ -4124,13 +4142,15 @@ cursor move past the beginning of line."
(interactive) (interactive)
(cond (viper-delete-backwards-in-replace (cond (viper-delete-backwards-in-replace
(cond ((not (bolp)) (cond ((not (bolp))
(delete-backward-char 1 t)) ;; don't put on kill ring
(delete-backward-char 1 nil))
(viper-ex-style-editing (viper-ex-style-editing
(beep 1)) (beep 1))
((bobp) ((bobp)
(beep 1)) (beep 1))
(t (t
(delete-backward-char 1 t)))) ;; don't put on kill ring
(delete-backward-char 1 nil))))
(viper-ex-style-editing (viper-ex-style-editing
(if (bolp) (if (bolp)
(beep 1) (beep 1)

View File

@ -1,6 +1,6 @@
;;; viper-ex.el --- functions implementing the Ex commands for Viper ;;; viper-ex.el --- functions implementing the Ex commands for Viper
;; Copyright (C) 1994, 95, 96, 97, 98, 2000, 01, 02, 04 Free Software Foundation, Inc. ;; Copyright (C) 1994, 95, 96, 97, 98, 2000, 01, 02, 04, 05 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu> ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>

View File

@ -70,6 +70,16 @@
window-system window-system
)) ))
(defun viper-color-display-p ()
(condition-case nil
(viper-cond-compile-for-xemacs-or-emacs
(eq (device-class (selected-device)) 'color) ; xemacs form
(if (fboundp 'display-color-p) ; emacs form
(display-color-p)
(x-display-color-p))
)
(error nil)))
;; in XEmacs: device-type is tty on tty and stream in batch. ;; in XEmacs: device-type is tty on tty and stream in batch.
(defun viper-window-display-p () (defun viper-window-display-p ()
(and (viper-device-type) (not (memq (viper-device-type) '(tty stream pc))))) (and (viper-device-type) (not (memq (viper-device-type) '(tty stream pc)))))
@ -97,6 +107,7 @@ In all likelihood, you don't need to bother with this setting."
(defun viper-has-face-support-p () (defun viper-has-face-support-p ()
(cond ((viper-window-display-p)) (cond ((viper-window-display-p))
(viper-force-faces) (viper-force-faces)
((viper-color-display-p))
(viper-emacs-p (memq (viper-device-type) '(pc))) (viper-emacs-p (memq (viper-device-type) '(pc)))
(viper-xemacs-p (memq (viper-device-type) '(tty pc))))) (viper-xemacs-p (memq (viper-device-type) '(tty pc)))))

View File

@ -455,6 +455,10 @@ Useful in some modes, such as Gnus, MH, etc.")
(define-key viper-dired-modifier-map ":" 'viper-ex) (define-key viper-dired-modifier-map ":" 'viper-ex)
(define-key viper-dired-modifier-map "/" 'viper-search-forward) (define-key viper-dired-modifier-map "/" 'viper-search-forward)
(defvar viper-gnus-modifier-map (make-sparse-keymap)
"This map modifies Gnus behavior.")
(define-key viper-gnus-modifier-map ":" 'viper-ex)
;;; Code ;;; Code

View File

@ -329,6 +329,8 @@ a key is a symbol, e.g., `a', `\\1', `f2', etc., or a list, e.g.,
;; Accepts as macro names: strings and vectors. ;; Accepts as macro names: strings and vectors.
;; strings must be strings of characters; vectors must be vectors of keys ;; strings must be strings of characters; vectors must be vectors of keys
;; in canonic form. The canonic form is essentially the form used in XEmacs ;; in canonic form. The canonic form is essentially the form used in XEmacs
;; More general definitions are inherited by more specific scopes:
;; global->major mode->buffer. More specific definitions override more general
(defun viper-record-kbd-macro (macro-name state macro-body &optional scope) (defun viper-record-kbd-macro (macro-name state macro-body &optional scope)
"Record a Vi macro. Can be used in `.viper' file to define permanent macros. "Record a Vi macro. Can be used in `.viper' file to define permanent macros.
MACRO-NAME is a string of characters or a vector of keys. STATE is MACRO-NAME is a string of characters or a vector of keys. STATE is
@ -451,22 +453,22 @@ If SCOPE is nil, the user is asked to specify the scope."
(list (list (cons scope nil)) nil (cons t nil)))))) (list (list (cons scope nil)) nil (cons t nil))))))
(setq old-elt (assoc macro-name (eval macro-alist-var))) (setq old-elt (assoc macro-name (eval macro-alist-var)))
(if (null old-elt) (if (null old-elt)
(progn (progn
;; insert new-elt in macro-alist-var and keep the list sorted ;; insert new-elt in macro-alist-var and keep the list sorted
(define-key (define-key
keymap keymap
(vector (viper-key-to-emacs-key (aref macro-name 0))) (vector (viper-key-to-emacs-key (aref macro-name 0)))
'viper-exec-mapped-kbd-macro) 'viper-exec-mapped-kbd-macro)
(setq lis (eval macro-alist-var)) (setq lis (eval macro-alist-var))
(while (and lis (string< (viper-array-to-string (car (car lis))) (while (and lis (string< (viper-array-to-string (car (car lis)))
(viper-array-to-string macro-name))) (viper-array-to-string macro-name)))
(setq lis2 (cons (car lis) lis2)) (setq lis2 (cons (car lis) lis2))
(setq lis (cdr lis))) (setq lis (cdr lis)))
(setq lis2 (reverse lis2)) (setq lis2 (reverse lis2))
(set macro-alist-var (append lis2 (cons new-elt lis))) (set macro-alist-var (append lis2 (cons new-elt lis)))
(setq old-elt new-elt))) (setq old-elt new-elt)))
(setq old-sub-elt (setq old-sub-elt
(cond ((eq scope t) (viper-kbd-global-pair old-elt)) (cond ((eq scope t) (viper-kbd-global-pair old-elt))
((symbolp scope) (assoc scope (viper-kbd-mode-alist old-elt))) ((symbolp scope) (assoc scope (viper-kbd-mode-alist old-elt)))
@ -484,6 +486,11 @@ If SCOPE is nil, the user is asked to specify the scope."
;; macro name must be a vector of viper-style keys ;; macro name must be a vector of viper-style keys
;; viper-unrecord-kbd-macro doesn't have scope. Macro definitions are inherited
;; from global -> major mode -> buffer
;; More specific definition overrides more general
;; Can't unrecord definition for more specific, if a more general definition is
;; in effect
(defun viper-unrecord-kbd-macro (macro-name state) (defun viper-unrecord-kbd-macro (macro-name state)
"Delete macro MACRO-NAME from Viper STATE. "Delete macro MACRO-NAME from Viper STATE.
MACRO-NAME must be a vector of viper-style keys. This command is used by Viper MACRO-NAME must be a vector of viper-style keys. This command is used by Viper
@ -546,7 +553,7 @@ name from there."
(setq macro-pair mode-mapping) (setq macro-pair mode-mapping)
(message "%S is unmapped for %s in %S" (message "%S is unmapped for %s in %S"
(viper-display-macro macro-name) state-name major-mode)) (viper-display-macro macro-name) state-name major-mode))
((cdr (setq macro-pair (viper-kbd-global-pair macro-entry))) ((cdr (setq macro-pair global-mapping))
(message (message
"Global mapping for %S in %s is removed" "Global mapping for %S in %s is removed"
(viper-display-macro macro-name) state-name)) (viper-display-macro macro-name) state-name))
@ -560,7 +567,7 @@ name from there."
(progn (progn
(set macro-alist-var (delq macro-entry (eval macro-alist-var))) (set macro-alist-var (delq macro-entry (eval macro-alist-var)))
(if (viper-can-release-key (aref macro-name 0) (if (viper-can-release-key (aref macro-name 0)
(eval macro-alist-var)) (eval macro-alist-var))
(define-key (define-key
keymap keymap
(vector (viper-key-to-emacs-key (aref macro-name 0))) (vector (viper-key-to-emacs-key (aref macro-name 0)))

View File

@ -662,14 +662,8 @@
;; define remote file test ;; define remote file test
(or (fboundp 'viper-file-remote-p) ; user supplied his own function: use it (defun viper-file-remote-p (file-name)
(defun viper-file-remote-p (file-name) (file-remote-p file-name))
(car (cond ((featurep 'efs-auto) (efs-ftp-path file-name))
((fboundp 'file-remote-p) (file-remote-p file-name))
(t (require 'ange-ftp)
;; Can happen only in Emacs, since XEmacs has file-remote-p
(ange-ftp-ftp-name file-name))))))
;; This is a simple-minded check for whether a file is under version control. ;; This is a simple-minded check for whether a file is under version control.

View File

@ -3,12 +3,12 @@
;; and a venomous VI PERil. ;; and a venomous VI PERil.
;; Viper Is also a Package for Emacs Rebels. ;; Viper Is also a Package for Emacs Rebels.
;; Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02 Free Software Foundation, Inc. ;; Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02, 05 Free Software Foundation, Inc.
;; Author: Michael Kifer <kifer@cs.stonybrook.edu> ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
;; Keywords: emulations ;; Keywords: emulations
(defconst viper-version "3.11.2 of January 4, 2002" (defconst viper-version "3.11.4 of February 19, 2005"
"The current version of Viper") "The current version of Viper")
;; This file is part of GNU Emacs. ;; This file is part of GNU Emacs.
@ -466,7 +466,7 @@ unless it is coming up in a wrong Viper state."
(nth 0 triple) (nth 1 triple) (eval (nth 2 triple)))) (nth 0 triple) (nth 1 triple) (eval (nth 2 triple))))
viper-major-mode-modifier-list)) viper-major-mode-modifier-list))
;; We change standard bindings in some major mode, making them slightly ;; We change standard bindings in some major modes, making them slightly
;; different than in "normal" vi/insert/emacs states ;; different than in "normal" vi/insert/emacs states
(defcustom viper-major-mode-modifier-list (defcustom viper-major-mode-modifier-list
'((help-mode emacs-state viper-slash-and-colon-map) '((help-mode emacs-state viper-slash-and-colon-map)
@ -482,8 +482,8 @@ unless it is coming up in a wrong Viper state."
(dired-mode emacs-state viper-dired-modifier-map) (dired-mode emacs-state viper-dired-modifier-map)
(tar-mode emacs-state viper-slash-and-colon-map) (tar-mode emacs-state viper-slash-and-colon-map)
(mh-folder-mode emacs-state viper-slash-and-colon-map) (mh-folder-mode emacs-state viper-slash-and-colon-map)
(gnus-group-mode emacs-state viper-slash-and-colon-map) (gnus-group-mode emacs-state viper-gnus-modifier-map)
(gnus-summary-mode emacs-state viper-slash-and-colon-map) (gnus-summary-mode emacs-state viper-gnus-modifier-map)
(Info-mode emacs-state viper-slash-and-colon-map) (Info-mode emacs-state viper-slash-and-colon-map)
(Buffer-menu-mode emacs-state viper-slash-and-colon-map) (Buffer-menu-mode emacs-state viper-slash-and-colon-map)
) )

View File

@ -2285,7 +2285,7 @@ It is also possible to impose Vi on some major modes, even though they may
bind common keys to specialized commands. This might make sense for modes bind common keys to specialized commands. This might make sense for modes
that bind only a small number of common keys. For instance, Viper subverts that bind only a small number of common keys. For instance, Viper subverts
the Shell mode by changing the bindings for @kbd{C-m} and @kbd{C-d} using the Shell mode by changing the bindings for @kbd{C-m} and @kbd{C-d} using
@code{viper-add-local-keys} described in section on customization @code{viper-add-local-keys} described in the section on customization
(@pxref{Customization}). (@pxref{Customization}).
In some cases, some @emph{minor} modes might override certain essential In some cases, some @emph{minor} modes might override certain essential
@ -2294,7 +2294,7 @@ can happen only in the beginning, when the minor mode kicks in. Typing
@code{M-x viper-mode} will correct the situation. Viper knows about @code{M-x viper-mode} will correct the situation. Viper knows about
several such minor modes and takes care of them, so the above trick several such minor modes and takes care of them, so the above trick
is usually not necessary. If you find that some minor mode, e.g., is usually not necessary. If you find that some minor mode, e.g.,
@code{nasty-mode.el} interferes with Viper, putting the following in @code{nasty-mode} interferes with Viper, putting the following in
@file{.viper} should fix the problem: @file{.viper} should fix the problem:
@lisp @lisp
(viper-harness-minor-mode "nasty-mode") (viper-harness-minor-mode "nasty-mode")
@ -2305,7 +2305,7 @@ offending minor mode with the suffixes @file{.el} and @file{.elc} removed.
It may not be always obvious which minor mode is at fault. The only It may not be always obvious which minor mode is at fault. The only
guidance here is to look into the file that defines the minor mode you are guidance here is to look into the file that defines the minor mode you are
suspecting, say @code{nasty-mode.el}, and see if it has a variable called suspecting, say @file{nasty-mode.el}, and see if it has a variable called
@code{nasty-mode-map}. Then check if there is a statement of the form @code{nasty-mode-map}. Then check if there is a statement of the form
@lisp @lisp
(define-key nasty-mode-map key function) (define-key nasty-mode-map key function)
@ -2316,6 +2316,18 @@ keys. If so, use the above line to harness @code{nasty-mode}. If your
suspicion is wrong, no harm is done if you harness a minor mode that suspicion is wrong, no harm is done if you harness a minor mode that
doesn't need to be harnessed. doesn't need to be harnessed.
It is recommended to harness even those minor modes that don't override
Viper keys, but still have their own keymaps. A general way to
make a minor mode, @code{my-mode},
compatible with Viper is to have the file @file{my-mode.el} include the following code:
@lisp
(when (fboundp 'viper-harness-minor-mode)
(let ((lib (file-name-sans-extension
(file-name-nondirectory load-file-name))))
(viper-harness-minor-mode lib)))
@end lisp
@vindex @code{viper-want-emacs-keys-in-vi} @vindex @code{viper-want-emacs-keys-in-vi}
@vindex @code{viper-want-emacs-keys-in-insert} @vindex @code{viper-want-emacs-keys-in-insert}
@vindex @code{viper-always} @vindex @code{viper-always}
@ -2371,11 +2383,19 @@ this in @file{~/.viper}:
@end example @end example
@findex @code{viper-set-searchstyle-toggling-macros} @findex @code{viper-set-searchstyle-toggling-macros}
If you don't like this feature as a default, but would still like to have
it in some major modes, you can do so by first unsetting it globally, as
shown above, and then setting it in the desired major modes as follows:
@example
(viper-set-searchstyle-toggling-macros nil 'c-mode)
(viper-set-searchstyle-toggling-macros nil 'lisp-mode)
@end example
@item Vi-isms in Emacs state @item Vi-isms in Emacs state
Some people find it useful to use the Vi-style search key, `/', to invoke Some people find it useful to use the Vi-style search key, `/', to invoke
search in modes which Viper leaves in emacs-state. These modes are: search in modes which Viper leaves in emacs-state. These modes are:
@code{dired-mode}, @code{mh-folder-mode}, @code{gnus-group-mode}, @code{dired-mode}, @code{mh-folder-mode},
@code{gnus-summary-mode}, @code{Info-mode}, and @code{Buffer-menu-mode} @code{Info-mode}, and @code{Buffer-menu-mode}
(more may be added in the future). So, in the above modes, Viper binds `/' (more may be added in the future). So, in the above modes, Viper binds `/'
so that it will behave Vi-style. Furthermore, in those major modes, Viper so that it will behave Vi-style. Furthermore, in those major modes, Viper
binds `:' to invoke ex-style commands, like in vi-state. And, as described binds `:' to invoke ex-style commands, like in vi-state. And, as described
@ -4470,6 +4490,7 @@ gviswana@@cs.wisc.edu (Guhan Viswanathan),
gvr@@halcyon.com (George V.@: Reilly), gvr@@halcyon.com (George V.@: Reilly),
hatazaki@@bach.convex.com (Takao Hatazaki), hatazaki@@bach.convex.com (Takao Hatazaki),
hpz@@ibmhpz.aug.ipp-garching.mpg.de (Hans-Peter Zehrfeld), hpz@@ibmhpz.aug.ipp-garching.mpg.de (Hans-Peter Zehrfeld),
irie@@t.email.ne.jp (Irie Tetsuya),
jackr@@dblues.engr.sgi.com (Jack Repenning), jackr@@dblues.engr.sgi.com (Jack Repenning),
jamesm@@bga.com (D.J.@: Miller II), jamesm@@bga.com (D.J.@: Miller II),
jjm@@hplb.hpl.hp.com (Jean-Jacques Moreau), jjm@@hplb.hpl.hp.com (Jean-Jacques Moreau),