Commit 4170f62f authored by Paul Eggert's avatar Paul Eggert
Browse files

Merge from mainline.

parents 1963a2e0 49093f60
2011-04-14 Michael Albinus <michael.albinus@gmx.de>
* tramp.texi (Frequently Asked Questions): New item for disabling
Tramp in other packages.
2011-04-14 Teodor Zlatanov <tzz@lifelogs.com>
* gnus.texi (nnmairix caveats, Setup, Registry Article Refer Method)
(Fancy splitting to parent, Store arbitrary data): Updated
gnus-registry docs.
2011-04-13 Juanma Barranquero <lekktu@gmail.com>
* ede.texi: Fix typos.
2011-04-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (Window Layout): @itemize @code doesn't exist. It's @table
@code.
* gnus.texi (Window Layout): @itemize @code doesn't exist.
It's @table @code.
2011-03-19 Antoine Levitt <antoine.levitt@gmail.com>
......
......@@ -2123,7 +2123,7 @@ Results in --add-missing being passed to automake.
@end deffn
@deffn Method ede-proj-flush-autoconf :AFTER this
Flush the configure file (current buffer) to accomodate @var{THIS}.
Flush the configure file (current buffer) to accommodate @var{THIS}.
By flushing, remove any cruft that may be in the file. Subsequent
calls to @dfn{ede-proj-tweak-autoconf} can restore items removed by flush.
@end deffn
......@@ -2174,7 +2174,7 @@ These are removed with make clean.
@end deffn
@deffn Method ede-proj-tweak-autoconf :AFTER this
Tweak the configure file (current buffer) to accomodate @var{THIS}.
Tweak the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
@deffn Method ede-proj-compilers :AFTER obj
......@@ -2684,7 +2684,7 @@ Bonus: Return a cons cell: (COMPILED . UPTODATE).
@end deffn
@deffn Method ede-proj-flush-autoconf :AFTER this
Flush the configure file (current buffer) to accomodate @var{THIS}.
Flush the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
@deffn Method ede-buffer-mine :AFTER this buffer
......@@ -2697,7 +2697,7 @@ Return the variable name for @var{THIS}'s sources.
@end deffn
@deffn Method ede-proj-tweak-autoconf :AFTER this
Tweak the configure file (current buffer) to accomodate @var{THIS}.
Tweak the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
@deffn Method ede-update-version-in-source :AFTER this version
......@@ -2777,7 +2777,7 @@ Create or update the autoload target.
@end deffn
@deffn Method ede-proj-flush-autoconf :AFTER this
Flush the configure file (current buffer) to accomodate @var{THIS}.
Flush the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
@deffn Method ede-buffer-mine :AFTER this buffer
......@@ -2796,7 +2796,7 @@ Argument @var{THIS} is the target which needs to insert an info file.
@end deffn
@deffn Method ede-proj-tweak-autoconf :AFTER this
Tweak the configure file (current buffer) to accomodate @var{THIS}.
Tweak the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
@deffn Method ede-update-version-in-source :AFTER this version
......@@ -3008,7 +3008,7 @@ The preferred interpreter for this code.
@subsubsection Specialized Methods
@deffn Method ede-proj-tweak-autoconf :AFTER this
Tweak the configure file (current buffer) to accomodate @var{THIS}.
Tweak the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
......@@ -3536,7 +3536,7 @@ For example, C code uses .o on unix, and Emacs Lisp uses .elc.
@subsubsection Specialized Methods
@deffn Method ede-proj-flush-autoconf :AFTER this
Flush the configure file (current buffer) to accomodate @var{THIS}.
Flush the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
@deffn Method ede-proj-makefile-insert-rules :AFTER this
......@@ -3558,7 +3558,7 @@ Retrieves the slot @code{sourcetype} from an object of class @code{ede-compilati
@end deffn
@deffn Method ede-proj-tweak-autoconf :AFTER this
Tweak the configure file (current buffer) to accomodate @var{THIS}.
Tweak the configure file (current buffer) to accommodate @var{THIS}.
@end deffn
......
......@@ -22061,10 +22061,11 @@ mairix.)
@item
If you use the Gnus registry: don't use the registry with
@code{nnmairix} groups (put them in
@code{gnus-registry-unfollowed-groups}). Be @emph{extra careful} if
you use @code{gnus-registry-split-fancy-with-parent}; mails which are
split into @code{nnmairix} groups are usually gone for good as soon as
you check the group for new mail (yes, it has happened to me...).
@code{gnus-registry-unfollowed-groups}; this is the default). Be
@emph{extra careful} if you use
@code{gnus-registry-split-fancy-with-parent}; mails which are split
into @code{nnmairix} groups are usually gone for good as soon as you
check the group for new mail (yes, it has happened to me...).
 
@item
Therefore: @emph{Never ever} put ``real'' mails into @code{nnmairix}
......@@ -25916,8 +25917,7 @@ of all messages matching a particular set of criteria.
Fortunately, setting up the Gnus registry is pretty easy:
 
@lisp
(setq gnus-registry-max-entries 2500
gnus-registry-use-long-group-names t)
(setq gnus-registry-max-entries 2500)
 
(gnus-registry-initialize)
@end lisp
......@@ -25939,16 +25939,16 @@ what they do before you copy them blindly).
("spam" t)
("train" t))
gnus-registry-max-entries 500000
gnus-registry-use-long-group-names t
;; this is the default
gnus-registry-track-extra '(sender subject))
@end lisp
 
They say: keep a lot of messages around, use long group names, track
messages by sender and subject (not just parent Message-ID), and when
the registry splits incoming mail, use a majority rule to decide where
messages should go if there's more than one possibility. In addition,
the registry should ignore messages in groups that match ``nntp'',
``nnrss'', ``spam'', or ``train.''
They say: keep a lot of messages around, track messages by sender and
subject (not just parent Message-ID), and when the registry splits
incoming mail, use a majority rule to decide where messages should go
if there's more than one possibility. In addition, the registry
should ignore messages in groups that match ``nntp'', ``nnrss'',
``spam'', or ``train.''
 
You are doubtless impressed by all this, but you ask: ``I am a Gnus
user, I customize to live. Give me more.'' Here you go, these are
......@@ -25958,19 +25958,9 @@ the general settings.
The groups that will not be followed by
@code{gnus-registry-split-fancy-with-parent}. They will still be
remembered by the registry. This is a list of regular expressions.
@end defvar
@defvar gnus-registry-ignored-groups
The groups that will not be remembered by the registry. This is a
list of regular expressions, also available through Group/Topic
customization (so you can ignore or keep a specific group or a whole
topic).
@end defvar
@defvar gnus-registry-use-long-group-names
Whether the registry will use long group names. It's recommended to
set this to @code{t}, although everything works if you don't. Future
functionality will require it.
By default any group name that ends with ``delayed'', ``drafts'',
``queue'', or ``INBOX'', belongs to the nnmairix backend, or contains
the word ``archive'' is not followed.
@end defvar
 
@defvar gnus-registry-max-entries
......@@ -25978,8 +25968,15 @@ The number (an integer or @code{nil} for unlimited) of entries the
registry will keep.
@end defvar
 
@defvar gnus-registry-max-pruned-entries
The maximum number (an integer or @code{nil} for unlimited) of entries
the registry will keep after pruning.
@end defvar
@defvar gnus-registry-cache-file
The file where the registry will be stored between Gnus sessions.
The file where the registry will be stored between Gnus sessions. By
default the file name is @code{.gnus.registry.eioio} in the same
directory as your @code{.newsrc.eld}.
@end defvar
 
@node Registry Article Refer Method
......@@ -26003,8 +26000,7 @@ lines:
;; Keep enough entries to have a good hit rate when referring to an
;; article using the registry. Use long group names so that Gnus
;; knows where the article is.
(setq gnus-registry-max-entries 2500
gnus-registry-use-long-group-names t)
(setq gnus-registry-max-entries 2500)
 
(gnus-registry-initialize)
 
......@@ -26050,9 +26046,8 @@ following variables.
 
@defvar gnus-registry-track-extra
This is a list of symbols, so it's best to change it from the
Customize interface. By default it's @code{nil}, but you may want to
track @code{subject} and @code{sender} as well when splitting by parent.
It may work for you. It can be annoying if your mail flow is large and
Customize interface. By default it's @code{(subject sender)}, which
may work for you. It can be annoying if your mail flow is large and
people don't stick to the same groups.
@end defvar
 
......@@ -26060,7 +26055,8 @@ people don't stick to the same groups.
This is a symbol, so it's best to change it from the Customize
interface. By default it's @code{nil}, but you may want to set it to
@code{majority} or @code{first} to split by sender or subject based on
the majority of matches or on the first found.
the majority of matches or on the first found. I find @code{majority}
works best.
@end defvar
 
@node Store custom flags and keywords
......@@ -26095,17 +26091,12 @@ The registry has a simple API that uses a Message-ID as the key to
store arbitrary data (as long as it can be converted to a list for
storage).
 
@defun gnus-registry-store-extra-entry (id key value)
Store @code{value} in the extra data key @code{key} for message
@code{id}.
@end defun
@defun gnus-registry-delete-extra-entry (id key)
Delete the extra data key @code{key} for message @code{id}.
@defun gnus-registry-set-id-key (id key value)
Store @code{value} under @code{key} for message @code{id}.
@end defun
 
@defun gnus-registry-fetch-extra (id key)
Get the extra data key @code{key} for message @code{id}.
@defun gnus-registry-get-id-key (id key)
Get the data under @code{key} for message @code{id}.
@end defun
 
@defvar gnus-registry-extra-entries-precious
No preview for this file type
2011-04-15 Juanma Barranquero <lekktu@gmail.com>
* loadup.el: Use `string-to-number', not `string-to-int'.
2011-04-15 Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/gud.el (gud-gdb): Use completion-at-point instead of
gud-gdb-complete-command.
(gud-gdb-completions): New function, from gud-gdb-complete-command.
(gud-gdb-completion-at-point): New function.
(gud-gdb-completions): Remove.
2011-04-14 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-sh-handle-file-attributes): Handle the case
when the scripts fail. Use `tramp-do-file-attributes-with-ls' then.
(tramp-do-copy-or-rename-file-out-of-band): Do not check any longer
whether `executable-find' is bound.
* net/tramp-smb.el (tramp-smb-handle-copy-file): Fix docstring.
2011-04-14 Stefan Monnier <monnier@iro.umontreal.ca>
* minibuffer.el (completion-in-region-mode-predicate)
(completion-in-region-mode--predicate): New vars.
(completion-in-region, completion-in-region--postch)
(completion-in-region-mode): Use them.
(completion--capf-wrapper): Also return the hook function.
(completion-at-point, completion-help-at-point):
Adjust and provide a predicate.
Preserve arg names for advice of subr and lexical functions (bug#8457).
* help-fns.el (help-function-arglist): Consolidate the subr and
new-byte-code cases. Add argument `preserve-names' to extract names
from the docstring when needed.
* emacs-lisp/advice.el (ad-define-subr-args, ad-undefine-subr-args)
(ad-subr-args-defined-p, ad-get-subr-args, ad-subr-arglist): Remove.
(ad-arglist): Use help-function-arglist's new arg.
(ad-definition-type): Use cond.
2011-04-13 Juanma Barranquero <lekktu@gmail.com>
* autorevert.el (auto-revert-handler):
Bind `remote-file-name-inhibit-cache', not `tramp-cache-inhibit-cache',
which was removed in 2010-10-02T13:21:43Z!michael.albinus@gmx.de.
Don't quote lambda.
* image-mode.el (image-transform-set-scale):
Fix change in 2011-04-09T20:28:01Z!cyd@stupidchicken.com.
......
......@@ -434,9 +434,9 @@ This is an internal function used by Auto-Revert Mode."
(file-readable-p buffer-file-name)
(if auto-revert-tail-mode
;; Tramp caches the file attributes. Setting
;; `tramp-cache-inhibit' forces Tramp to
;; reread the values.
(let ((tramp-cache-inhibit-cache t))
;; `remote-file-name-inhibit-cache' forces Tramp
;; to reread the values.
(let ((remote-file-name-inhibit-cache t))
(/= auto-revert-tail-pos
(setq size
(nth 7 (file-attributes
......@@ -460,10 +460,10 @@ This is an internal function used by Auto-Revert Mode."
(when buffer-file-name
(setq eob (eobp))
(walk-windows
#'(lambda (window)
(and (eq (window-buffer window) buffer)
(= (window-point window) (point-max))
(push window eoblist)))
(lambda (window)
(and (eq (window-buffer window) buffer)
(= (window-point window) (point-max))
(push window eoblist)))
'no-mini t))
(if auto-revert-tail-mode
(auto-revert-tail-handler size)
......
......@@ -503,36 +503,6 @@
;; exact structure of the original argument list as long as the new argument
;; list takes a compatible number/magnitude of actual arguments.
;; @@@ Definition of subr argument lists:
;; ======================================
;; When advice constructs the advised definition of a function it has to
;; know the argument list of the original function. For functions and macros
;; the argument list can be determined from the actual definition, however,
;; for subrs there is no such direct access available. In Lemacs and for some
;; subrs in Emacs-19 the argument list of a subr can be determined from
;; its documentation string, in a v18 Emacs even that is not possible. If
;; advice cannot at all determine the argument list of a subr it uses
;; `(&rest ad-subr-args)' which will always work but is inefficient because
;; it conses up arguments. The macro `ad-define-subr-args' can be used by
;; the advice programmer to explicitly tell advice about the argument list
;; of a certain subr, for example,
;;
;; (ad-define-subr-args 'fset '(sym newdef))
;;
;; is used by advice itself to tell a v18 Emacs about the arguments of `fset'.
;; The following can be used to undo such a definition:
;;
;; (ad-undefine-subr-args 'fset)
;;
;; The argument list definition is stored on the property list of the subr
;; name symbol. When an argument list could be determined from the
;; documentation string it will be cached under that property. The general
;; mechanism for looking up the argument list of a subr is the following:
;; 1) look for a definition stored on the property list
;; 2) if that failed try to infer it from the documentation string and
;; if successful cache it on the property list
;; 3) otherwise use `(&rest ad-subr-args)'
;; @@ Activation and deactivation:
;; ===============================
;; The definition of an advised function does not change until all its advice
......@@ -1654,41 +1624,6 @@
;; (fii 3 2)
;; 5
;;
;; @@ Specifying argument lists of subrs:
;; ======================================
;; The argument lists of subrs cannot be determined directly from Lisp.
;; This means that Advice has to use `(&rest ad-subr-args)' as the
;; argument list of the advised subr which is not very efficient. In Lemacs
;; subr argument lists can be determined from their documentation string, in
;; Emacs-19 this is the case for some but not all subrs. To accommodate
;; for the cases where the argument lists cannot be determined (e.g., in a
;; v18 Emacs) Advice comes with a specification mechanism that allows the
;; advice programmer to tell advice what the argument list of a certain subr
;; really is.
;;
;; In a v18 Emacs the following will return the &rest idiom:
;;
;; (ad-arglist (symbol-function 'car))
;; (&rest ad-subr-args)
;;
;; To tell advice what the argument list of `car' really is we
;; can do the following:
;;
;; (ad-define-subr-args 'car '(list))
;; ((list))
;;
;; Now `ad-arglist' will return the proper argument list (this method is
;; actually used by advice itself for the advised definition of `fset'):
;;
;; (ad-arglist (symbol-function 'car))
;; (list)
;;
;; The defined argument list will be stored on the property list of the
;; subr name symbol. When advice looks for a subr argument list it first
;; checks for a definition on the property list, if that fails it tries
;; to infer it from the documentation string and caches it on the property
;; list if it was successful, otherwise `(&rest ad-subr-args)' will be used.
;;
;; @@ Advising interactive subrs:
;; ==============================
;; For the most part there is no difference between advising functions and
......@@ -2536,52 +2471,11 @@ See Info node `(elisp)Computed Advice' for detailed documentation."
If DEFINITION could be from a subr then its NAME should be
supplied to make subr arglist lookup more efficient."
(require 'help-fns)
(cond
((or (ad-macro-p definition) (ad-advice-p definition))
(help-function-arglist (cdr definition)))
(t (help-function-arglist definition))))
;; Store subr-args as `((arg1 arg2 ...))' so I can distinguish
;; a defined empty arglist `(nil)' from an undefined arglist:
(defmacro ad-define-subr-args (subr arglist)
`(put ,subr 'ad-subr-arglist (list ,arglist)))
(defmacro ad-undefine-subr-args (subr)
`(put ,subr 'ad-subr-arglist nil))
(defmacro ad-subr-args-defined-p (subr)
`(get ,subr 'ad-subr-arglist))
(defmacro ad-get-subr-args (subr)
`(car (get ,subr 'ad-subr-arglist)))
(defun ad-subr-arglist (subr-name)
"Retrieve arglist of the subr with SUBR-NAME.
Either use the one stored under the `ad-subr-arglist' property,
or try to retrieve it from the docstring and cache it under
that property, or otherwise use `(&rest ad-subr-args)'."
(if (ad-subr-args-defined-p subr-name)
(ad-get-subr-args subr-name)
;; says jwz: Should use this for Lemacs 19.8 and above:
;;((fboundp 'subr-min-args)
;; ...)
;; says hans: I guess what Jamie means is that I should use the values
;; of `subr-min-args' and `subr-max-args' to construct the subr arglist
;; without having to look it up via parsing the docstring, e.g.,
;; values 1 and 2 would suggest `(arg1 &optional arg2)' as an
;; argument list. However, that won't work because there is no
;; way to distinguish a subr with args `(a &optional b &rest c)' from
;; one with args `(a &rest c)' using that mechanism. Also, the argument
;; names from the docstring are more meaningful. Hence, I'll stick with
;; the old way of doing things.
(let ((doc (or (ad-real-documentation subr-name t) "")))
(if (not (string-match "\n\n\\((.+)\\)\\'" doc))
;; Signalling an error leads to bugs during bootstrapping because
;; the DOC file is not yet built (which is an error, BTW).
;; (error "The usage info is missing from the subr %s" subr-name)
'(&rest ad-subr-args)
(ad-define-subr-args
subr-name
(cdr (car (read-from-string
(downcase (match-string 1 doc))))))
(ad-get-subr-args subr-name)))))
(help-function-arglist
(if (or (ad-macro-p definition) (ad-advice-p definition))
(cdr definition)
definition)
'preserve-names))
(defun ad-docstring (definition)
"Return the unexpanded docstring of DEFINITION."
......@@ -2629,17 +2523,16 @@ definition (see the code for `documentation')."
(defun ad-definition-type (definition)
"Return symbol that describes the type of DEFINITION."
(if (ad-macro-p definition)
'macro
(if (ad-subr-p definition)
(if (ad-special-form-p definition)
'special-form
'subr)
(if (or (ad-lambda-p definition)
(ad-compiled-p definition))
'function
(if (ad-advice-p definition)
'advice)))))
(cond
((ad-macro-p definition) 'macro)
((ad-subr-p definition)
(if (ad-special-form-p definition)
'special-form
'subr))
((or (ad-lambda-p definition)
(ad-compiled-p definition))
'function)
((ad-advice-p definition) 'advice)))
(defun ad-has-proper-definition (function)
"True if FUNCTION is a symbol with a proper definition.
......@@ -3921,10 +3814,6 @@ undone on exit of this macro."
;; Use the advice mechanism to advise `documentation' to make it
;; generate proper documentation strings for advised definitions:
;; This makes sure we get the right arglist for `documentation'
;; during bootstrapping.
(ad-define-subr-args 'documentation '(function &optional raw))
;; @@ Starting, stopping and recovering from the advice package magic:
;; ===================================================================
......
2011-04-14 Teodor Zlatanov <tzz@lifelogs.com>
* gnus-registry.el: Updated gnus-registry docs.
2011-04-12 Teodor Zlatanov <tzz@lifelogs.com>
 
* gnus-registry.el (gnus-registry--split-fancy-with-parent-internal):
......
......@@ -33,9 +33,10 @@
;; you, submit a bug report and I'll be glad to fix it. It needs
;; documentation in the manual (also on my to-do list).
;; Put this in your startup file (~/.gnus.el for instance)
;; Put this in your startup file (~/.gnus.el for instance) or use Customize:
;; (setq gnus-registry-max-entries 2500)
;; (setq gnus-registry-max-entries 2500
;; gnus-registry-track-extra '(sender subject))
;; (gnus-registry-initialize)
......
......@@ -99,46 +99,55 @@ ARGLIST can also be t or a string of the form \"(FUN ARG1 ARG2 ...)\"."
(format "%S" (help-make-usage 'fn arglist))))))
;; FIXME: Move to subr.el?
(defun help-function-arglist (def)
(defun help-function-arglist (def &optional preserve-names)
"Return a formal argument list for the function DEF.
IF PRESERVE-NAMES is non-nil, return a formal arglist that uses
the same names as used in the original source code, when possible."
;; Handle symbols aliased to other symbols.
(if (and (symbolp def) (fboundp def)) (setq def (indirect-function def)))
;; If definition is a macro, find the function inside it.
(if (eq (car-safe def) 'macro) (setq def (cdr def)))
(cond
((and (byte-code-function-p def) (integerp (aref def 0)))
(let* ((args-desc (aref def 0))
(max (lsh args-desc -8))
(min (logand args-desc 127))
(rest (logand args-desc 128))
(arglist ()))
(dotimes (i min)
(push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
(when (> max min)
(push '&optional arglist)
(dotimes (i (- max min))
(push (intern (concat "arg" (number-to-string (+ 1 i min))))
arglist)))
(unless (zerop rest) (push '&rest arglist) (push 'rest arglist))
(nreverse arglist)))
((byte-code-function-p def) (aref def 0))
((and (byte-code-function-p def) (listp (aref def 0))) (aref def 0))
((eq (car-safe def) 'lambda) (nth 1 def))
((eq (car-safe def) 'closure) (nth 2 def))
((subrp def)
(let ((arity (subr-arity def))
(arglist ()))
(dotimes (i (car arity))
(push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
(cond
((not (numberp (cdr arglist)))
(push '&rest arglist)
(push 'rest arglist))
((< (car arity) (cdr arity))
(push '&optional arglist)
(dotimes (i (- (cdr arity) (car arity)))
(push (intern (concat "arg" (number-to-string
(+ 1 i (car arity)))))
arglist))))
(nreverse arglist)))
((or (and (byte-code-function-p def) (integerp (aref def 0)))
(subrp def))
(or (when preserve-names
(let* ((doc (condition-case nil (documentation def) (error nil)))
(docargs (if doc (car (help-split-fundoc doc nil))))
(arglist (if docargs
(cdar (read-from-string (downcase docargs)))))
(valid t))
;; Check validity.
(dolist (arg arglist)
(unless (and (symbolp arg)
(let ((name (symbol-name arg)))
(if (eq (aref name 0) ?&)
(memq arg '(&rest &optional))
(not (string-match "\\." name)))))
(setq valid nil)))
(when valid arglist)))
(let* ((args-desc (if (not (subrp def))
(aref def 0)
(let ((a (subr-arity def)))
(logior (car a)
(if (numberp (cdr a))
(lsh (cdr a) 8)
(lsh 1 7))))))
(max (lsh args-desc -8))
(min (logand args-desc 127))
(rest (logand args-desc 128))
(arglist ()))
(dotimes (i min)
(push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
(when (> max min)
(push '&optional arglist)
(dotimes (i (- max min))
(push (intern (concat "arg" (number-to-string (+ 1 i min))))
arglist)))
(unless (zerop rest) (push '&rest arglist) (push 'rest arglist))
(nreverse arglist))))
((and (eq (car-safe def) 'autoload) (not (eq (nth 4 def) 'keymap)))
"[Arg list not available until function definition is loaded.]")
(t t)))
......
......@@ -263,7 +263,7 @@
(let* ((base (concat "emacs-" emacs-version "."))
(files (file-name-all-completions base default-directory))
(versions (mapcar (function (lambda (name)
(string-to-int (substring name (length base)))))
(string-to-number (substring name (length base)))))
files)))
;; `emacs-version' is a constant, so we shouldn't change it with `setq'.
(defconst emacs-version
......
......@@ -58,6 +58,10 @@
;;; Todo:
;; - completion-insert-complete-hook (called after inserting a complete
;; completion), typically used for "complete-abbrev" where it would expand
;; the abbrev. Tho we'd probably want to provide it from the