1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

Merge remote-tracking branch 'savannah/master' into feature/tree-sitter

This commit is contained in:
Yuan Fu 2022-06-14 15:59:46 -07:00
commit 98bfb24081
No known key found for this signature in database
GPG key ID: 56E19BC57664A442
547 changed files with 36984 additions and 22924 deletions

View file

@ -1293,7 +1293,7 @@
Don't bug out on certain empty elements with ids Don't bug out on certain empty elements with ids
* lisp/net/shr.el (shr-descend): Fix empty-element #id targetting * lisp/net/shr.el (shr-descend): Fix empty-element #id targeting
(bug#52391). (bug#52391).
2021-12-09 Paul Eggert <eggert@cs.ucla.edu> 2021-12-09 Paul Eggert <eggert@cs.ucla.edu>

View file

@ -965,6 +965,7 @@ bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
[ ! -f config.log ] || mv -f config.log config.log~ [ ! -f config.log ] || mv -f config.log config.log~
rm -rf ${srcdir}/info rm -rf ${srcdir}/info
rm -f ${srcdir}/etc/refcards/emacsver.tex rm -f ${srcdir}/etc/refcards/emacsver.tex
rm -rf native-lisp/ lisp/leim/ja-dic/
${top_bootclean} ${top_bootclean}
### 'maintainer-clean' ### 'maintainer-clean'

View file

@ -275,14 +275,6 @@ Vibhav Pant
lisp/net/browse-url.el lisp/net/browse-url.el
lisp/erc/* lisp/erc/*
Alan Third
The NS port:
nextstep/*
src/ns*
src/*.m
lisp/term/ns-win.el
doc/emacs/macos.texi
Amin Bandali Amin Bandali
Eshell Eshell
lisp/eshell/* lisp/eshell/*
@ -313,7 +305,9 @@ Tramp
Modus themes Modus themes
Maintainer: Protesilaos Stavrou Maintainer: Protesilaos Stavrou
Repository and issue tracker: https://gitlab.com/protesilaos/modus-themes Repository: https://git.sr.ht/~protesilaos
Mailing list: https://lists.sr.ht/~protesilaos/modus-themes
Bug Reports: M-x modus-themes-report-bug
doc/misc/modus-themes.org doc/misc/modus-themes.org
etc/themes/modus*.el etc/themes/modus*.el

View file

@ -351,11 +351,13 @@ Optional argument TYPE is type of output (nil means all)."
\"https://www.w3.org/TR/html4/loose.dtd\">\n\n") \"https://www.w3.org/TR/html4/loose.dtd\">\n\n")
(defconst manual-meta-string (defconst manual-meta-string
"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"> "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n")
<link rev=\"made\" href=\"mailto:bug-gnu-emacs@gnu.org\">
(defconst manual-links-string
"<link rev=\"made\" href=\"mailto:bug-gnu-emacs@gnu.org\">
<link rel=\"icon\" type=\"image/png\" href=\"/graphics/gnu-head-mini.png\"> <link rel=\"icon\" type=\"image/png\" href=\"/graphics/gnu-head-mini.png\">
<meta name=\"ICBM\" content=\"42.256233,-71.006581\"> <meta name=\"ICBM\" content=\"42.256233,-71.006581\">
<meta name=\"DC.title\" content=\"gnu.org\">\n\n") <meta name=\"DC.title\" content=\"gnu.org\">\n")
(defconst manual-style-string "<style type=\"text/css\"> (defconst manual-style-string "<style type=\"text/css\">
@import url('/software/emacs/manual.css');\n</style>\n") @import url('/software/emacs/manual.css');\n</style>\n")
@ -486,6 +488,12 @@ the @import directive."
(delete-region opoint (point)) (delete-region opoint (point))
(search-forward "<meta http-equiv=\"Content-Style") (search-forward "<meta http-equiv=\"Content-Style")
(setq opoint (match-beginning 0))) (setq opoint (match-beginning 0)))
(search-forward "</title>\n")
(delete-region opoint (point))
(search-forward "<link href=")
(goto-char (match-beginning 0))
(insert manual-links-string)
(setq opoint (point))
(search-forward "</head>") (search-forward "</head>")
(goto-char (match-beginning 0)) (goto-char (match-beginning 0))
(delete-region opoint (point)) (delete-region opoint (point))

View file

@ -23,6 +23,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <unistd.h> #include <unistd.h>
#include <string.h>
void void
fatal (const char *fmt, ...) fatal (const char *fmt, ...)

View file

@ -334,6 +334,9 @@ looks like this:
</div> </div>
</div> </div>
Also, make sure the copyright years at the bottom of emacs.html are
up-to-date.
The file download.html may need to be updated, for example if the The file download.html may need to be updated, for example if the
MS-Windows binaries will be signed by a different person/key than MS-Windows binaries will be signed by a different person/key than
those mentioned there. those mentioned there.

View file

@ -89,6 +89,7 @@
;; PROPn: string representing the nth property value ;; PROPn: string representing the nth property value
(eval-when-compile (require 'cl-lib)) (eval-when-compile (require 'cl-lib))
(require 'generate-lisp-file)
(defvar unidata-list nil) (defvar unidata-list nil)
@ -1422,13 +1423,13 @@ Property value is a symbol `o' (Open), `c' (Close), or `n' (None)."
(or elt (user-error "Unknown output file: %s" basename)) (or elt (user-error "Unknown output file: %s" basename))
(or noninteractive (message "Generating %s..." file)) (or noninteractive (message "Generating %s..." file))
(with-temp-file file (with-temp-file file
(insert ";;; " basename " -*- lexical-binding:t -*- (generate-lisp-file-heading
;; " copyright " basename 'unidata-gen-file
;; Generated from Unicode data files by unidata-gen.el. :commentary (concat copyright " \
;; The sources for this file are found in the admin/unidata/ directory in The sources for this file are found in the admin/unidata/ directory in \
;; the Emacs sources. The Unicode data files are used under the the Emacs sources. The Unicode data files are used under the \
;; Unicode Terms of Use, as contained in the file copyright.html in that Unicode Terms of Use, as contained in the file copyright.html in that \
;; same directory.\n") same directory."))
(dolist (proplist (cdr elt)) (dolist (proplist (cdr elt))
(let ((prop (unidata-prop-prop proplist)) (let ((prop (unidata-prop-prop proplist))
(index (unidata-prop-index proplist)) (index (unidata-prop-index proplist))
@ -1446,21 +1447,15 @@ Property value is a symbol `o' (Open), `c' (Close), or `n' (None)."
(set-char-table-extra-slot table 3 describer)) (set-char-table-extra-slot table 3 describer))
(insert (format "(define-char-code-property '%S\n %S\n %S)\n" (insert (format "(define-char-code-property '%S\n %S\n %S)\n"
prop table docstring)))) prop table docstring))))
(insert ";; Local Variables:\n" (generate-lisp-file-trailer basename :inhibit-provide t))))
";; coding: utf-8\n"
";; version-control: never\n"
";; no-byte-compile: t\n"
";; no-update-autoloads: t\n"
";; End:\n\n"
(format ";;; %s ends here\n" basename)))))
(or noninteractive (message "Generating %s...done" file))) (or noninteractive (message "Generating %s...done" file)))
(defun unidata-gen-charprop (&optional charprop-file text) (defun unidata-gen-charprop (&optional charprop-file text)
(or charprop-file (setq charprop-file (pop command-line-args-left))) (or charprop-file (setq charprop-file (pop command-line-args-left)))
(with-temp-file charprop-file (with-temp-file charprop-file
(insert ";; Automatically generated by unidata-gen.el." (generate-lisp-file-heading
" -*- lexical-binding: t -*-\n" charprop-file 'unidata-gen-charprop
";; See the admin/unidata/ directory in the Emacs sources.\n") :commentary "See the admin/unidata/ directory in the Emacs sources.")
(if text (if text
(insert text) (insert text)
(dolist (elt unidata-file-alist) (dolist (elt unidata-file-alist)
@ -1469,19 +1464,7 @@ Property value is a symbol `o' (Open), `c' (Close), or `n' (None)."
(unidata-prop-prop proplist) (car elt) (unidata-prop-prop proplist) (car elt)
(unidata-prop-docstring proplist)))))) (unidata-prop-docstring proplist))))))
(or noninteractive (message "Writing %s..." charprop-file)) (or noninteractive (message "Writing %s..." charprop-file))
(insert "\n" (generate-lisp-file-trailer charprop-file)))
(format "(provide '%s)\n"
(file-name-sans-extension
(file-name-nondirectory charprop-file)))
" \n"
";; Local Variables:\n"
";; coding: utf-8\n"
";; version-control: never\n"
";; no-byte-compile: t\n"
";; no-update-autoloads: t\n"
";; End:\n\n"
(format ";;; %s ends here\n"
(file-name-nondirectory charprop-file)))))
(defun unidata-gen-scripts (&optional file) (defun unidata-gen-scripts (&optional file)
;; Running from Makefile. ;; Running from Makefile.

View file

@ -4,7 +4,7 @@
# shellcheck disable=SC2006,SC2268 # see below for rationale # shellcheck disable=SC2006,SC2268 # see below for rationale
timestamp='2022-01-09' timestamp='2022-05-08'
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
@ -1151,16 +1151,27 @@ EOF
;; ;;
x86_64:Linux:*:*) x86_64:Linux:*:*)
set_cc_for_build set_cc_for_build
CPU=$UNAME_MACHINE
LIBCABI=$LIBC LIBCABI=$LIBC
if test "$CC_FOR_BUILD" != no_compiler_found; then if test "$CC_FOR_BUILD" != no_compiler_found; then
if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ ABI=64
(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ sed 's/^ //' << EOF > "$dummy.c"
grep IS_X32 >/dev/null #ifdef __i386__
then ABI=x86
LIBCABI=${LIBC}x32 #else
fi #ifdef __ILP32__
ABI=x32
#endif
#endif
EOF
cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
eval "$cc_set_abi"
case $ABI in
x86) CPU=i686 ;;
x32) LIBCABI=${LIBC}x32 ;;
esac
fi fi
GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI GUESS=$CPU-pc-linux-$LIBCABI
;; ;;
xtensa*:Linux:*:*) xtensa*:Linux:*:*)
GUESS=$UNAME_MACHINE-unknown-linux-$LIBC GUESS=$UNAME_MACHINE-unknown-linux-$LIBC

View file

@ -310,7 +310,7 @@ rm -f makefile.tmp
sed -f ../msdos/sedlibcf.inp < gnulib.mk-in > gnulib.tmp sed -f ../msdos/sedlibcf.inp < gnulib.mk-in > gnulib.tmp
sed -f ../msdos/sedlibmk.inp < gnulib.tmp > gnulib.mk sed -f ../msdos/sedlibmk.inp < gnulib.tmp > gnulib.mk
rm -f gnulib.tmp rm -f gnulib.tmp
Rem Create directorys in lib/ that MKDIR_P is supposed to create Rem Create directories in lib/ that MKDIR_P is supposed to create
Rem but I have no idea how to do that on MS-DOS. Rem but I have no idea how to do that on MS-DOS.
mkdir sys mkdir sys
Rem Create .d files for new files in lib/ and lib/malloc/ Rem Create .d files for new files in lib/ and lib/malloc/

View file

@ -492,6 +492,7 @@ OPTION_DEFAULT_ON([threads],[don't compile with elisp threading support])
OPTION_DEFAULT_OFF([native-compilation],[compile with Emacs Lisp native compiler support]) OPTION_DEFAULT_OFF([native-compilation],[compile with Emacs Lisp native compiler support])
OPTION_DEFAULT_OFF([cygwin32-native-compilation],[use native compilation on 32-bit Cygwin]) OPTION_DEFAULT_OFF([cygwin32-native-compilation],[use native compilation on 32-bit Cygwin])
OPTION_DEFAULT_ON([xinput2],[don't use version 2 of the X Input Extension for input]) OPTION_DEFAULT_ON([xinput2],[don't use version 2 of the X Input Extension for input])
OPTION_DEFAULT_OFF([small-ja-dic],[generate a smaller-size Japanese dictionary])
AC_ARG_WITH([file-notification],[AS_HELP_STRING([--with-file-notification=LIB], AC_ARG_WITH([file-notification],[AS_HELP_STRING([--with-file-notification=LIB],
[use a file notification library (LIB one of: yes, inotify, kqueue, gfile, w32, no)])], [use a file notification library (LIB one of: yes, inotify, kqueue, gfile, w32, no)])],
@ -1025,6 +1026,7 @@ AS_IF([test $gl_gcc_warnings = no],
gl_WARN_ADD([-Wno-pointer-sign]) gl_WARN_ADD([-Wno-pointer-sign])
gl_WARN_ADD([-Wno-string-plus-int]) gl_WARN_ADD([-Wno-string-plus-int])
gl_WARN_ADD([-Wno-unknown-attributes]) gl_WARN_ADD([-Wno-unknown-attributes])
gl_WARN_ADD([-Wno-unknown-pragmas])
]) ])
],[ ],[
isystem='-isystem ' isystem='-isystem '
@ -1080,8 +1082,12 @@ AS_IF([test $gl_gcc_warnings = no],
# option problematic. # option problematic.
nw="$nw -Wsuggest-attribute=pure" nw="$nw -Wsuggest-attribute=pure"
# Emacs doesn't need this paranoia.
nw="$nw -Wbidi-chars=any,ucn"
if test "$emacs_cv_clang" = yes; then if test "$emacs_cv_clang" = yes; then
nw="$nw -Wdouble-promotion" nw="$nw -Wdouble-promotion"
nm="$nm -Wunknown-pragmas"
fi fi
# This causes too much noise in the MinGW build. # This causes too much noise in the MinGW build.
@ -1101,6 +1107,7 @@ AS_IF([test $gl_gcc_warnings = no],
gl_WARN_ADD([-Wno-type-limits]) # Too many warnings for now gl_WARN_ADD([-Wno-type-limits]) # Too many warnings for now
gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now
gl_WARN_ADD([-Wno-format-nonliteral]) gl_WARN_ADD([-Wno-format-nonliteral])
gl_WARN_ADD([-Wno-bidi-chars])
# clang is unduly picky about some things. # clang is unduly picky about some things.
if test "$emacs_cv_clang" = yes; then if test "$emacs_cv_clang" = yes; then
@ -1618,16 +1625,63 @@ AC_DEFUN([AC_TYPE_SIZE_T])
# Likewise for obsolescent test for uid_t, gid_t; Emacs assumes them. # Likewise for obsolescent test for uid_t, gid_t; Emacs assumes them.
AC_DEFUN([AC_TYPE_UID_T]) AC_DEFUN([AC_TYPE_UID_T])
# sqrt and other floating-point functions such as fmod and frexp # Check for all math.h functions that Emacs uses; on some platforms,
# are found in -lm on many systems. # -lm is needed for some of these functions.
OLD_LIBS=$LIBS AC_CACHE_CHECK([for math library],
AC_SEARCH_LIBS([sqrt], [m]) [emacs_cv_lib_math],
if test "X$LIBS" = "X$OLD_LIBS"; then [OLD_LIBS=$LIBS
LIB_MATH= AC_LINK_IFELSE(
else [AC_LANG_SOURCE([[
LIB_MATH=$ac_cv_search_sqrt #include <math.h>
fi int
LIBS=$OLD_LIBS main (int argc, char **argv)
{
double d = argc;
float f = argc;
int i = argc;
long l = argc;
d = acos (d);
d = asin (d);
d = atan (d);
d = atan2 (d, d);
d = ceil (d);
d = copysign (d, d);
d = cos (d);
d = exp (d);
d = fabs (d);
d = floor (d);
d = fmod (d, d);
d = frexp (d, &i);
d = ldexp (d, i);
d = log (d);
d = log2 (d);
d = log10 (d);
d = pow (d, d);
d = rint (d);
d = scalbn (d, l);
d = sin (d);
d = sqrt (d);
d = tan (d);
d = trunc (d);
f = fabsf (f);
f = powf (f, f);
i = ilogb (d);
i = signbit (d);
l = lrint (d);
l = lround (d);
return d == f && i == l;
}
]])],
[emacs_cv_lib_math='none required'],
[LIBS="-lm $LIBS"
AC_LINK_IFELSE([],
[emacs_cv_lib_math=-lm],
[AC_MSG_ERROR([Math library (-lm) not found])])])
LIBS=$OLD_LIBS])
case $emacs_cv_lib_math in
-*) LIB_MATH=$emacs_cv_lib_math;;
*) LIB_MATH=;;
esac
dnl Current possibilities handled by sed (aix4-2 -> aix, dnl Current possibilities handled by sed (aix4-2 -> aix,
dnl gnu-linux -> gnu/linux, etc.): dnl gnu-linux -> gnu/linux, etc.):
@ -2031,6 +2085,16 @@ Either fix this, or re-configure with the option '--without-ns'.])])
fi fi
fi fi
AC_CACHE_CHECK([for Mac OS X 12.0 or later],
[emacs_cv_macosx_12_0],
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <AvailabilityMacros.h>
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 120000
Mac OS X 12.x or later.
#endif
]])], [emacs_cv_macosx_12_0=no],
[emacs_cv_macosx_12_0=yes]))
if test "${with_native_image_api}" = yes; then if test "${with_native_image_api}" = yes; then
AC_DEFINE(HAVE_NATIVE_IMAGE_API, 1, [Define to use native OS APIs for images.]) AC_DEFINE(HAVE_NATIVE_IMAGE_API, 1, [Define to use native OS APIs for images.])
NATIVE_IMAGE_API="yes (ns)" NATIVE_IMAGE_API="yes (ns)"
@ -6203,6 +6267,9 @@ case "$opsys" in
if test "$NS_IMPL_COCOA" = "yes"; then if test "$NS_IMPL_COCOA" = "yes"; then
libs_nsgui="$libs_nsgui -framework IOKit -framework Carbon \ libs_nsgui="$libs_nsgui -framework IOKit -framework Carbon \
-framework IOSurface -framework QuartzCore" -framework IOSurface -framework QuartzCore"
if test "$emacs_cv_macosx_12_0" = "yes"; then
libs_nsgui="$libs_nsgui -framework UniformTypeIdentifiers"
fi
fi fi
else else
libs_nsgui= libs_nsgui=
@ -6465,6 +6532,7 @@ AS_ECHO([" Does Emacs use -lXaw3d? ${HAVE_XAW3D
Which dumping strategy does Emacs use? ${with_dumping} Which dumping strategy does Emacs use? ${with_dumping}
Does Emacs have native lisp compiler? ${HAVE_NATIVE_COMP} Does Emacs have native lisp compiler? ${HAVE_NATIVE_COMP}
Does Emacs use version 2 of the the X Input Extension? ${HAVE_XINPUT2} Does Emacs use version 2 of the the X Input Extension? ${HAVE_XINPUT2}
Does Emacs generate a smaller-size Japanese dictionary? ${with_small_ja_dic}
"]) "])
if test -n "${EMACSDATA}"; then if test -n "${EMACSDATA}"; then
@ -6563,6 +6631,9 @@ SUBDIR_MAKEFILES_IN=`echo " ${SUBDIR_MAKEFILES}" | sed -e 's| | $(srcdir)/|g' -e
AC_SUBST(SUBDIR_MAKEFILES_IN) AC_SUBST(SUBDIR_MAKEFILES_IN)
SMALL_JA_DIC=$with_small_ja_dic
AC_SUBST(SMALL_JA_DIC)
dnl You might wonder (I did) why epaths.h is generated by running make, dnl You might wonder (I did) why epaths.h is generated by running make,
dnl rather than just letting configure generate it from epaths.in. dnl rather than just letting configure generate it from epaths.in.
dnl One reason is that the various paths are not fully expanded (see above); dnl One reason is that the various paths are not fully expanded (see above);

View file

@ -411,10 +411,13 @@ away in the buffer to search for an expansion.
@vindex dabbrev-check-all-buffers @vindex dabbrev-check-all-buffers
@vindex dabbrev-check-other-buffers @vindex dabbrev-check-other-buffers
@vindex dabbrev-ignored-buffer-modes
After scanning the current buffer, @kbd{M-/} normally searches other After scanning the current buffer, @kbd{M-/} normally searches other
buffers. The variables @code{dabbrev-check-all-buffers} and buffers. The variables @code{dabbrev-check-all-buffers} and
@code{dabbrev-check-other-buffers} can be used to determine which @code{dabbrev-check-other-buffers} can be used to determine which
other buffers, if any, are searched. other buffers, if any, are searched. Buffers that have major modes
derived from any of the modes in @code{dabbrev-ignored-buffer-modes}
are ignored.
@vindex dabbrev-ignored-buffer-names @vindex dabbrev-ignored-buffer-names
@vindex dabbrev-ignored-buffer-regexps @vindex dabbrev-ignored-buffer-regexps

View file

@ -347,11 +347,11 @@ move to the column number specified by the argument's numeric value.
@kindex C-x C-n @kindex C-x C-n
@findex set-goal-column @findex set-goal-column
Use the current column of point as the @dfn{semipermanent goal column} Use the current column of point as the @dfn{semipermanent goal column}
for @kbd{C-n} and @kbd{C-p} (@code{set-goal-column}) in the current (@code{set-goal-column}) in the current buffer. When a semipermanent
buffer. When a semipermanent goal column is in effect, those commands goal column is in effect, @kbd{C-n}, @kbd{C-p}, @kbd{<prior>} and
always try to move to this column, or as close as possible to it, @kbd{<next>} always try to move to this column, or as close as
after moving vertically. The goal column remains in effect until possible to it, after moving vertically. The goal column remains in
canceled. effect until canceled.
@item C-u C-x C-n @item C-u C-x C-n
Cancel the goal column. Henceforth, @kbd{C-n} and @kbd{C-p} try to Cancel the goal column. Henceforth, @kbd{C-n} and @kbd{C-p} try to
@ -653,14 +653,14 @@ Toggle automatic display of the current line number or column number.
displayed before each line, see @ref{Display Custom}. displayed before each line, see @ref{Display Custom}.
@item M-= @item M-=
Display the number of lines, words, and characters that are present in Display the number of lines, sentences, words, and characters that are
the region (@code{count-words-region}). @xref{Mark}, for information present in the region (@code{count-words-region}). @xref{Mark}, for
about the region. information about the region.
@item M-x count-words @item M-x count-words
Display the number of lines, words, and characters that are present in Display the number of lines, sentences, words, and characters that are
the buffer. If the region is active (@pxref{Mark}), display the present in the buffer. If the region is active (@pxref{Mark}),
numbers for the region instead. display the numbers for the region instead.
@item C-x = @item C-x =
Display the character code of character after point, character position of Display the character code of character after point, character position of
@ -689,7 +689,7 @@ narrowed region and the line number relative to the whole buffer.
@kindex M-= @kindex M-=
@findex count-words-region @findex count-words-region
@kbd{M-=} (@code{count-words-region}) displays a message reporting @kbd{M-=} (@code{count-words-region}) displays a message reporting
the number of lines, words, and characters in the region the number of lines, sentences, words, and characters in the region
(@pxref{Mark}, for an explanation of the region). With a prefix (@pxref{Mark}, for an explanation of the region). With a prefix
argument, @kbd{C-u M-=}, the command displays a count for the entire argument, @kbd{C-u M-=}, the command displays a count for the entire
buffer. buffer.

View file

@ -178,7 +178,9 @@ list of customization variables and faces.
If you change the variable If you change the variable
@code{compilation-auto-jump-to-first-error} to a non-@code{nil} value, @code{compilation-auto-jump-to-first-error} to a non-@code{nil} value,
Emacs automatically visits the locus of the first error message that Emacs automatically visits the locus of the first error message that
appears in the @file{*compilation*} buffer. appears in the @file{*compilation*} buffer. (This variable can also
have the values @code{if-location-known} and @code{first-known}, which
modify the conditions for automatically visiting the error locus.)
Compilation mode provides the following additional commands. These Compilation mode provides the following additional commands. These
commands can also be used in @file{*grep*} buffers, where the commands can also be used in @file{*grep*} buffers, where the
@ -287,6 +289,19 @@ window so that the current error message is @var{n} lines from the
top, whether or not there is a fringe; the default value, @code{nil}, top, whether or not there is a fringe; the default value, @code{nil},
gives the behavior described above. gives the behavior described above.
@vindex compilation-hidden-output
Compilation output can sometimes be very verbose, and much of it isn't
of particular interest to a user. The
@code{compilation-hidden-output} user option should either be a regexp
or a list of regexps, and output that matches will be made invisible.
For instance, to hide the verbose output from recursive makefiles, you
can say something like:
@lisp
(setq compilation-hidden-output
'("^make[^\n]+\n"))
@end lisp
@vindex compilation-error-regexp-alist @vindex compilation-error-regexp-alist
@vindex grep-regexp-alist @vindex grep-regexp-alist
To parse messages from the compiler, Compilation mode uses the To parse messages from the compiler, Compilation mode uses the

View file

@ -800,29 +800,45 @@ changing any environment or registry settings.
@pindex addpm, MS-Windows installation program @pindex addpm, MS-Windows installation program
@cindex registry, setting environment variables (MS-Windows) @cindex registry, setting environment variables (MS-Windows)
On MS-Windows, the installation program @command{addpm.exe} adds On MS-Windows, the environment variables @env{emacs_dir},
values for @env{emacs_dir}, @env{EMACSLOADPATH}, @env{EMACSDATA}, @env{EMACSLOADPATH}, @env{EMACSDATA}, @env{EMACSPATH}, @env{EMACSDOC},
@env{EMACSPATH}, @env{EMACSDOC}, @env{SHELL} and @env{TERM} to the @env{SHELL}, @env{TERM}, @env{HOME}, @env{LANG}, and
@file{HKEY_LOCAL_MACHINE} section of the system registry, under @env{PRELOAD_WINSOCK} can also be set in the @file{HKEY_CURRENT_USER}
@file{/Software/GNU/Emacs}. It does this because there is no standard or the @file{HKEY_LOCAL_MACHINE} section of the system registry, under
place to set environment variables across different versions of the @file{/Software/GNU/Emacs} key. When Emacs starts, as well as
Windows. Running @command{addpm.exe} is no longer strictly necessary checking the environment, it also checks the system registry for those
in recent versions of Emacs, but if you are upgrading from an older variables.
version, running @command{addpm.exe} ensures that you do not have
older registry entries from a previous installation, which may not be
compatible with the latest version of Emacs.
When Emacs starts, as well as checking the environment, it also checks
the System Registry for those variables and for @env{HOME}, @env{LANG}
and @env{PRELOAD_WINSOCK}.
To determine the value of those variables, Emacs goes through the To determine the value of those variables, Emacs goes through the
following procedure. First, the environment is checked. If the following procedure. First, it checks the environment. If the
variable is not found there, Emacs looks for registry keys by that variable is not found there, Emacs looks for a registry key by the
name under @file{/Software/GNU/Emacs}; first in the name of the variable under @file{/Software/GNU/Emacs}; first in the
@file{HKEY_CURRENT_USER} section of the registry, and if not found @file{HKEY_CURRENT_USER} section of the registry, and if not found
there, in the @file{HKEY_LOCAL_MACHINE} section. Finally, if Emacs there, in the @file{HKEY_LOCAL_MACHINE} section. Finally, if Emacs
still cannot determine the values, compiled-in defaults are used. still cannot determine the values, it uses the compiled-in defaults.
Note that the registry settings have global system-wide effect: they
will affect all Emacs sessions run on the system. Thus, if you run
different Emacs versions, or use both installed and un-installed Emacs
executables, or build newer versions of Emacs, the settings in the
registry will cause all of them to use the same directories, which is
probably not what you want. For this reason, @emph{we recommend
against setting these variables in the registry}. If you have such
settings in the registry, we recommend that you remove them.
If you run the Emacs MS-Windows installation program
@command{addpm.exe}, it will update any existing registry settings of
the @env{emacs_dir}, @env{EMACSLOADPATH}, @env{EMACSDATA},
@env{EMACSPATH}, @env{EMACSDOC}, @env{SHELL}, and @env{TERM} variables
to have the values suitable for the installed Emacs version with which
@command{addpm.exe} came. Note that @command{addpm.exe} will
@emph{not} create any registry setting that didn't exist, it will only
update existing settings, which are most probably inherited from an
old Emacs installation, so that they are compatible with the newly
installed Emacs version. Running @command{addpm.exe} is no longer
necessary when installing recent versions of Emacs, so we only
recommend doing that if you are upgrading from an older version, and
cannot remove these settings from the registry for some reason.
In addition to the environment variables above, you can also add In addition to the environment variables above, you can also add
settings to the @file{/Software/GNU/Emacs} registry key to specify X settings to the @file{/Software/GNU/Emacs} registry key to specify X

View file

@ -122,7 +122,7 @@ listing. As an exception, if you type @kbd{C-x C-j} in a Dired
buffer, Emacs displays the directory listing of the parent directory buffer, Emacs displays the directory listing of the parent directory
and places point on the line that corresponds to the directory where and places point on the line that corresponds to the directory where
you invoked @code{dired-jump}. Typing @kbd{C-x 4 C-j} you invoked @code{dired-jump}. Typing @kbd{C-x 4 C-j}
(@code{dired-jump-other-window} has the same effect, but displays the (@code{dired-jump-other-window}) has the same effect, but displays the
Dired buffer in a new window. Dired buffer in a new window.
The variable @code{dired-listing-switches} specifies the options to The variable @code{dired-listing-switches} specifies the options to
@ -1711,6 +1711,9 @@ the originating program. Dragging files out of a Dired buffer is also
supported, by enabling the user option @code{dired-mouse-drag-files}, supported, by enabling the user option @code{dired-mouse-drag-files},
the mouse can be used to drag files onto other programs. When set to the mouse can be used to drag files onto other programs. When set to
@code{link}, it will make the other program (typically a file manager) @code{link}, it will make the other program (typically a file manager)
create a symbolic link to the file, and setting it to any other create a symbolic link to the file; when set to @code{move}, it will
non-@code{nil} value will make the other program open or create a copy make the other program move the file to a new location, and setting it
of the file. to any other non-@code{nil} value will make the other program open or
create a copy of the file. The keyboard modifiers pressed during the
drag-and-drop operation can also control what action the other program
takes towards the file.

View file

@ -1594,7 +1594,9 @@ charge on the mode-line, by using the command
@code{battery-mode-line-format} determines the way the battery charge @code{battery-mode-line-format} determines the way the battery charge
is displayed; the exact mode-line message depends on the operating is displayed; the exact mode-line message depends on the operating
system, and it usually shows the current battery charge as a system, and it usually shows the current battery charge as a
percentage of the total charge. percentage of the total charge. The functions in
@code{battery-update-functions} are run after updating the mode line,
and can be used to trigger actions based on the battery status.
@cindex mode line, 3D appearance @cindex mode line, 3D appearance
@cindex attributes of mode line, changing @cindex attributes of mode line, changing
@ -1980,7 +1982,7 @@ The command @kbd{M-x display-line-numbers-mode} provides a
convenient way to turn on display of line numbers. This mode has a globalized convenient way to turn on display of line numbers. This mode has a globalized
variant, @code{global-display-line-numbers-mode}. The user option variant, @code{global-display-line-numbers-mode}. The user option
@code{display-line-numbers-type} controls which sub-mode of @code{display-line-numbers-type} controls which sub-mode of
line-number display, described above, will these modes activate. line-number display, described above, these modes will activate.
@noindent @noindent
Note that line numbers are not displayed in the minibuffer and in the Note that line numbers are not displayed in the minibuffer and in the

View file

@ -326,6 +326,48 @@ of @code{require-final-newline} (@pxref{Customize Save}). If you have
already visited the same file in the usual (non-literal) manner, this already visited the same file in the usual (non-literal) manner, this
command asks you whether to visit it literally instead. command asks you whether to visit it literally instead.
@findex find-sibling-file
@vindex find-sibling-rules
Files are sometimes (loosely) tied to other files, and you could call
these files @dfn{sibling files}. For instance, when editing C files,
if you have a file called @samp{"foo.c"}, you often also have a file
called @samp{"foo.h"}, and that could be its sibling file. Or you may
have different versions of a file, for instance
@samp{"src/emacs/emacs-27/lisp/allout.el"} and
@samp{"src/emacs/emacs-28/lisp/allout.el"} might be considered
siblings. Emacs provides the @code{find-sibling-file} command to jump
between sibling files, but it's impossible to guess at which files a
user might want to be considered siblings, so Emacs lets you configure
this freely by altering the @code{find-sibling-rules} user option.
This is a list of match/expansion elements.
For instance, to do the @samp{".c"} to @samp{".h"} mapping, you could
say:
@lisp
(setq find-sibling-rules
'(("\\([^/]+\\)\\.c\\'" "\\1.h")))
@end lisp
(@code{ff-find-related-file} offers similar functionality especially
geared towards C files, @pxref{Other C Commands}.)
Or, if you want to consider all files under
@samp{"src/emacs/DIR/file-name"} to be siblings of other @var{dir}s,
you could say:
@lisp
(setq find-sibling-rules
'(("src/emacs/[^/]+/\\(.*\\)\\'" "src/emacs/.*/\\1")))
@end lisp
As you can see, this is a list of @var{(MATCH EXPANSION...)} elements.
The @var{match} is a regular expression that matches the visited file
name, and each @var{expansion} may refer to match groups by using
@samp{\\1} and so on. The resulting expansion string is then applied
to the file system to see if any files match this expansion
(interpreted as a regexp).
@vindex find-file-hook @vindex find-file-hook
@vindex find-file-not-found-functions @vindex find-file-not-found-functions
Two special hook variables allow extensions to modify the operation Two special hook variables allow extensions to modify the operation

View file

@ -128,6 +128,12 @@ In addition, the text in the region becomes the primary selection
non-@code{nil} value, dragging the mouse over a stretch of text also non-@code{nil} value, dragging the mouse over a stretch of text also
adds the text to the kill ring. The default is @code{nil}. adds the text to the kill ring. The default is @code{nil}.
If this variable is @code{non-empty}, only copy to the kill ring if
the region is non-empty. For instance, if you mouse drag an area that
is less than a half a character, you'd normally get the empty string
in your kill ring, but with @code{non-empty}, this short mouse drag
won't affect the kill ring.
@vindex mouse-scroll-min-lines @vindex mouse-scroll-min-lines
If you move the mouse off the top or bottom of the window while If you move the mouse off the top or bottom of the window while
dragging, the window scrolls at a steady rate until you move the mouse dragging, the window scrolls at a steady rate until you move the mouse
@ -136,6 +142,12 @@ entirely on the screen. The number of lines scrolled per step depends
on how far away from the window edge the mouse has gone; the variable on how far away from the window edge the mouse has gone; the variable
@code{mouse-scroll-min-lines} specifies a minimum step size. @code{mouse-scroll-min-lines} specifies a minimum step size.
@vindex mouse-drag-mode-line-buffer
If you enable the option @code{mouse-drag-mode-line-buffer} and
dragging files is supported by the window system, then dragging the
mouse on the buffer name portion of the mode line will drag that
buffer's file to another program or frame.
@findex mouse-yank-primary @findex mouse-yank-primary
@findex mouse-yank-at-click @findex mouse-yank-at-click
Clicking with the middle mouse button, @kbd{mouse-2}, moves point to Clicking with the middle mouse button, @kbd{mouse-2}, moves point to
@ -1651,11 +1663,15 @@ For additional customization options for displaying tooltips, use
@kbd{M-x customize-group @key{RET} tooltip @key{RET}}. @kbd{M-x customize-group @key{RET} tooltip @key{RET}}.
@vindex use-system-tooltips @vindex use-system-tooltips
If Emacs is built with the GTK+ toolkit or Haiku windowing support, If Emacs is built with the GTK+ toolkit, Nextstep windowing, or
it displays tooltips via the toolkit, using the default appearance of Haiku windowing support, it displays tooltips via the toolkit, using
the toolkit's tooltips. To disable this, change the variable the default appearance of the toolkit's tooltips.@footnote{The
foreground and background colors of toolkit-created tooltips on
Nextstep can also be customized by setting the @code{foreground} and
@code{background} frame parameters that are part of
@code{tooltip-frame-parameters}.} To disable this, change the variable
@code{use-system-tooltips} to @code{nil}. If you do this, or if Emacs @code{use-system-tooltips} to @code{nil}. If you do this, or if Emacs
is built without GTK+ or Haiku windowing support, most attributes of is built without the appropriate windowing support, most attributes of
the tooltip text are specified by the @code{tooltip} face, and by X the tooltip text are specified by the @code{tooltip} face, and by X
resources (@pxref{X Resources}). resources (@pxref{X Resources}).

View file

@ -229,9 +229,11 @@ from a variety of coding systems when reading or writing it.
@item Command @item Command
A command is a Lisp function specially defined to be able to serve as A command is a Lisp function specially defined to be able to serve as
a key binding in Emacs or to be invoked by its name a key binding in Emacs or to be invoked by its name
(@pxref{Glossary---Command Name}). When you type a key sequence (@pxref{Glossary---Command Name}). (Another term for @dfn{command} is
(q.v.), its binding (q.v.@:) is looked up in the relevant keymaps @dfn{interactive function}---they are used interchangeably.) When you
(q.v.@:) to find the command to run. @xref{Commands}. type a key sequence (q.v.), its binding (q.v.@:) is looked up in the
relevant keymaps (q.v.@:) to find the command to run.
@xref{Commands}.
@item Command History @item Command History
@xref{Glossary---Minibuffer History}. @xref{Glossary---Minibuffer History}.
@ -775,6 +777,14 @@ typing sequences of @acronym{ASCII} characters (q.v.). @xref{Input Methods}.
Insertion means adding text into the buffer, either from the keyboard Insertion means adding text into the buffer, either from the keyboard
or from some other place in Emacs. or from some other place in Emacs.
@item Interactive Function
A different term for @dfn{command} (q.v.).
@item Interactive Invocation
A function can be called from Lisp code, or called as a user level
command (via @kbd{M-x}, a key binding or a menu). In the latter case,
the function is said to be @dfn{called interactively}.
@item Interlocking @item Interlocking
@xref{Glossary---File Locking}. @xref{Glossary---File Locking}.

View file

@ -111,24 +111,27 @@ active (@pxref{Using Region}).
@kindex M-\ @kindex M-\
@findex delete-horizontal-space @findex delete-horizontal-space
@kindex M-SPC The other delete commands are those that delete only whitespace
@findex just-one-space
@findex cycle-spacing
The other delete commands are those that delete only whitespace
characters: spaces, tabs and newlines. @kbd{M-\} characters: spaces, tabs and newlines. @kbd{M-\}
(@code{delete-horizontal-space}) deletes all the spaces and tab (@code{delete-horizontal-space}) deletes all the spaces and tab
characters before and after point. With a prefix argument, this only characters before and after point. With a prefix argument, this only
deletes spaces and tab characters before point. @kbd{M-@key{SPC}} deletes spaces and tab characters before point.
(@code{just-one-space}) does likewise but leaves a single space before
@findex just-one-space
@code{just-one-space} does likewise but leaves a single space before
point, regardless of the number of spaces that existed previously point, regardless of the number of spaces that existed previously
(even if there were none before). With a numeric argument @var{n}, it (even if there were none before). With a numeric argument @var{n}, it
leaves @var{n} spaces before point if @var{n} is positive; if @var{n} leaves @var{n} spaces before point if @var{n} is positive; if @var{n}
is negative, it deletes newlines in addition to spaces and tabs, is negative, it deletes newlines in addition to spaces and tabs,
leaving @minus{}@var{n} spaces before point. The command @code{cycle-spacing} leaving @minus{}@var{n} spaces before point.
acts like a more flexible version of @code{just-one-space}. It
does different things if you call it repeatedly in succession. @kindex M-SPC
The first call acts like @code{just-one-space}, the next removes @findex cycle-spacing
all whitespace, and a third call restores the original whitespace. @vindex cycle-spacing-actions
The command @code{cycle-spacing} (@kbd{M-@key{SPC}}) acts like a more
flexible version of @code{just-one-space}. It performs different
space cleanup actions defined by @code{cycle-spacing-actions}, in a
cyclic manner, if you call it repeatedly in succession.
@kbd{C-x C-o} (@code{delete-blank-lines}) deletes all blank lines @kbd{C-x C-o} (@code{delete-blank-lines}) deletes all blank lines
after the current line. If the current line is blank, it deletes all after the current line. If the current line is blank, it deletes all

View file

@ -179,7 +179,7 @@ itself counts as the first repetition, since it is executed as you
define it, so @kbd{C-u 4 C-x )} executes the macro immediately 3 define it, so @kbd{C-u 4 C-x )} executes the macro immediately 3
additional times. additional times.
@findex kdb-macro-redisplay @findex kmacro-redisplay
@kindex C-x C-k d @kindex C-x C-k d
While executing a long-running keyboard macro, it can sometimes be While executing a long-running keyboard macro, it can sometimes be
useful to trigger a redisplay (to show how far we've gotten). The useful to trigger a redisplay (to show how far we've gotten). The

View file

@ -223,6 +223,7 @@ keystrokes. Here is a list of these events.
@table @key @table @key
@item ns-open-file @item ns-open-file
@cindex ns-open-file event
@vindex ns-pop-up-frames @vindex ns-pop-up-frames
This event occurs when another Nextstep application requests that This event occurs when another Nextstep application requests that
Emacs open a file. A typical reason for this would be a user Emacs open a file. A typical reason for this would be a user
@ -239,44 +240,29 @@ means to always visit the file in a new frame. A value of @code{nil}
means to always visit the file in the selected frame. means to always visit the file in the selected frame.
@item ns-open-temp-file @item ns-open-temp-file
@cindex ns-open-temp-file event
This event occurs when another application requests that Emacs open a This event occurs when another application requests that Emacs open a
temporary file. By default, this is handled by just generating a temporary file. By default, this is handled by just generating a
@code{ns-open-file} event, the results of which are described above. @code{ns-open-file} event, the results of which are described above.
@item ns-open-file-line @item ns-open-file-line
@cindex ns-open-file-line event
Some applications, such as ProjectBuilder and gdb, request not only a Some applications, such as ProjectBuilder and gdb, request not only a
particular file, but also a particular line or sequence of lines in particular file, but also a particular line or sequence of lines in
the file. Emacs handles this by visiting that file and highlighting the file. Emacs handles this by visiting that file and highlighting
the requested line (@code{ns-open-file-select-line}). the requested line (@code{ns-open-file-select-line}).
@item ns-drag-n-drop
This event occurs when a user drags an object from another application
into an Emacs frame. The default behavior is to open a file in the
window under the mouse, or to insert text at point of the window under
the mouse.
The sending application has some limited ability to decide how Emacs
handles the sent object, but the user may override the default
behavior by holding one or more modifier key.
@table @kbd
@item control
Insert as text in the current buffer. If the object is a file, this
will insert the filename.
@item alt/option
Attempt to open the object as though it is a file or URL.
@item super/command
Perform the default action for the type. This can be useful when an
application is overriding the default behavior.
@end table
The modifier keys listed above are defined by macOS and are unaffected
by user changes to the modifiers in Emacs.
@item ns-power-off @item ns-power-off
@cindex ns-power-off event
This event occurs when the user logs out and Emacs is still running, or when This event occurs when the user logs out and Emacs is still running, or when
``Quit Emacs'' is chosen from the application menu. ``Quit Emacs'' is chosen from the application menu.
The default behavior is to save all file-visiting buffers. The default behavior is to save all file-visiting buffers.
@item ns-show-prefs
@cindex ns-show-prefs event
This event occurs when the user selects ``Preferences'' from the
application menu. By default, it is bound to the command
@code{customize}.
@end table @end table
@cindex using Nextstep services (macOS) @cindex using Nextstep services (macOS)

View file

@ -1316,6 +1316,12 @@ point is on a directory entry, mark all files in that directory tree
(@code{vc-dir-mark-all-files}). With a prefix argument, mark all (@code{vc-dir-mark-all-files}). With a prefix argument, mark all
listed files and directories. listed files and directories.
@findex vc-dir-mark-by-regexp
@item %
You can use this command to mark files by regexp
(@code{vc-dir-mark-by-regexp}). If given a prefix, unmark files
instead.
@item G @item G
Add the file under point to the list of files that the VC should Add the file under point to the list of files that the VC should
ignore (@code{vc-dir-ignore}). For instance, if the VC is Git, it ignore (@code{vc-dir-ignore}). For instance, if the VC is Git, it
@ -1660,6 +1666,9 @@ support additional types of projects.
Which files do or don't belong to a project is also determined by Which files do or don't belong to a project is also determined by
the project back-end. For example, the VC back-end doesn't consider the project back-end. For example, the VC back-end doesn't consider
``ignored'' files (@pxref{VC Ignore}) to be part of the project. ``ignored'' files (@pxref{VC Ignore}) to be part of the project.
Also, the VC Project back-end considers ``untracked'' files by default.
That behavior is controllable with the variable
@code{project-vc-include-untracked}.
@menu @menu
* Project File Commands:: Commands for handling project files. * Project File Commands:: Commands for handling project files.
@ -2817,6 +2826,13 @@ place of a file name on the command line. @command{etags} will read from
standard input and mark the produced tags as belonging to the file standard input and mark the produced tags as belonging to the file
@var{file}. @var{file}.
For C and C++, if the source files don't observe the GNU Coding
Standards' convention if having braces (@samp{@{} and @samp{@}}) in
column zero only for top-level definitions, like functions and
@code{struct} definitions, we advise that you use the
@samp{--ignore-indentation} option, to prevent @command{etags} from
incorrectly interpreting closing braces in column zero.
@samp{etags --help} outputs the list of the languages @command{etags} @samp{etags --help} outputs the list of the languages @command{etags}
knows, and the file name rules for guessing the language. It also prints knows, and the file name rules for guessing the language. It also prints
a list of all the available @command{etags} options, together with a short a list of all the available @command{etags} options, together with a short

View file

@ -291,12 +291,23 @@ instead signal an error if the mark is inactive.
@cindex Delete Selection mode @cindex Delete Selection mode
@cindex mode, Delete Selection @cindex mode, Delete Selection
@findex delete-selection-mode @findex delete-selection-mode
@vindex delete-selection-temporary-region
By default, text insertion occurs normally even if the mark is By default, text insertion occurs normally even if the mark is
active---for example, typing @kbd{a} inserts the character @samp{a}, active---for example, typing @kbd{a} inserts the character @samp{a},
then deactivates the mark. Delete Selection mode, a minor mode, then deactivates the mark. Delete Selection mode, a minor mode,
modifies this behavior: if you enable that mode, then inserting text modifies this behavior: if you enable that mode, then inserting text
while the mark is active causes the text in the region to be deleted while the mark is active causes the text in the region to be deleted
first. To toggle Delete Selection mode on or off, type @kbd{M-x first. However, you can tune this behavior by customizing the
@code{delete-selection-temporary-region} option. Its default value is
@code{nil}, but you can set it to @code{t}, in which case only
temporarily-active regions will be replaced: those which are set by
dragging the mouse (@pxref{Setting Mark}) or by shift-selection
(@pxref{Shift Selection}), as well as by @kbd{C-u C-x C-x} when
Transient Mark Mode is disabled. You can further tune the behavior by
setting @code{delete-selection-temporary-region} to @code{selection}:
then temporary regions by @kbd{C-u C-x C-x} won't be replaced, only
the ones activated by dragging the mouse or shift-selection. To
toggle Delete Selection mode on or off, type @kbd{M-x
delete-selection-mode}. delete-selection-mode}.
@node Mark Ring @node Mark Ring

View file

@ -381,16 +381,16 @@ used with the completion list:
@vindex minibuffer-completion-auto-choose @vindex minibuffer-completion-auto-choose
@item M-@key{DOWN} @item M-@key{DOWN}
@itemx M-@key{UP} @itemx M-@key{UP}
These keys will navigate through the completions displayed in the While in the minibuffer, these keys navigate through the completions
completions buffer. When @code{minibuffer-completion-auto-choose} is displayed in the completions buffer. When
non-@code{nil} (which is the default), using these commands will @code{minibuffer-completion-auto-choose} is non-@code{nil} (which is
automatically insert the current completion candidate in the the default), using these commands also inserts the current completion
minibuffer. If this user option is @code{nil}, the keys will navigate candidate into the minibuffer. If
the same way as before, but won't automatically insert the candidate @code{minibuffer-completion-auto-choose} is @code{nil}, you can use
in the minibuffer. Instead you have to use the @kbd{M-@key{RET}} command to the @kbd{M-@key{RET}} command to insert the completion candidates into
do that. With a prefix argument, @kbd{C-u M-@key{RET}} inserts the the minibuffer. By default, that exits the minibuffer, but with a
currently active candidate to the minibuffer, but doesn't exit the prefix argument, @kbd{C-u M-@key{RET}} inserts the currently active
minibuffer. candidate without exiting the minibuffer.
@findex switch-to-completions @findex switch-to-completions
@item M-v @item M-v
@ -407,7 +407,10 @@ ways (@pxref{Windows}).
@itemx mouse-1 @itemx mouse-1
@itemx mouse-2 @itemx mouse-2
While in the completion list buffer, this chooses the completion at While in the completion list buffer, this chooses the completion at
point (@code{choose-completion}). point (@code{choose-completion}). With a prefix argument, @kbd{C-u
@key{RET}} inserts the completion at point into the minibuffer, but
doesn't exit the minibuffer---thus, you can change your mind and
choose another candidate.
@findex next-completion @findex next-completion
@item @key{TAB} @item @key{TAB}
@ -682,17 +685,20 @@ behavior only when there are @var{n} or fewer alternatives.
@vindex completions-format @vindex completions-format
When displaying completions, Emacs will normally pop up a new buffer When displaying completions, Emacs will normally pop up a new buffer
to display the completions. The completions will (by default) be to display the completions. The completions will by default be sorted
sorted in columns horizontally in alphabetical order, but this can be horizontally, using as many columns as will fit in the window-width,
changed by changing the @code{completions-format} user option. If but this can be changed by customizing the @code{completions-format}
@code{vertical}, sort the completions vertically in columns instead, user option. If its value is @code{vertical}, Emacs will sort the
and if @code{one-column}, just use a single column. completions vertically instead, and if it's @code{one-column}, Emacs
will use just one column.
@vindex completions-sort @vindex completions-sort
This user option controls how completions are sorted in the The @code{completions-sort} user option controls the order in which
@samp{*Completions*} buffer. The default is @code{alphabetical}, but the completions are sorted in the @samp{*Completions*} buffer. The
it can also be a function which will be called with the list of default is @code{alphabetical}, which sorts in alphabetical order.
completions, and should return the list in the desired order. The value @code{nil} disables sorting. The value can also be a
function, which will be called with the list of completions, and
should return the list in the desired order.
@vindex completions-max-height @vindex completions-max-height
When @code{completions-max-height} is non-@code{nil}, it limits the When @code{completions-max-height} is non-@code{nil}, it limits the

View file

@ -89,6 +89,11 @@ list of available packages from package archive servers. If the
network is unavailable, it falls back on the most recently retrieved network is unavailable, it falls back on the most recently retrieved
list. list.
The main command to use in the package list buffer is the @key{x}
command. If the package under point isn't installed already, this
command will install it. If the package under point is already
installed, this command will delete it.
The following commands are available in the package menu: The following commands are available in the package menu:
@table @kbd @table @kbd
@ -162,7 +167,10 @@ installed versions (marked with status @samp{obsolete}).
@findex package-menu-execute @findex package-menu-execute
Download and install all packages marked with @kbd{i}, and their Download and install all packages marked with @kbd{i}, and their
dependencies; also, delete all packages marked with @kbd{d} dependencies; also, delete all packages marked with @kbd{d}
(@code{package-menu-execute}). This also removes the marks. (@code{package-menu-execute}). This also removes the marks. If no
packages are marked, this command will install the package under point
(if it isn't installed already), or delete the package under point (if
it's already installed).
@item g @item g
@item r @item r
@ -321,12 +329,14 @@ version of the package, a newer version is also installed.
@findex package-install @findex package-install
@findex package-update @findex package-update
@findex package-update-all
Packages are most conveniently installed using the package menu Packages are most conveniently installed using the package menu
(@pxref{Package Menu}), but you can also use the command @kbd{M-x (@pxref{Package Menu}), but you can also use the command @kbd{M-x
package-install}. This prompts for the name of a package with the package-install}. This prompts for the name of a package with the
@samp{available} status, then downloads and installs it. Similarly, @samp{available} status, then downloads and installs it. Similarly,
if you want to update a package, you can use the @kbd{M-x if you want to update a package, you can use the @kbd{M-x
package-update} command. package-update} command, and if you just want to update all the
packages, you can use the @kbd{M-x package-update-all} command.
@cindex package requirements @cindex package requirements
A package may @dfn{require} certain other packages to be installed, A package may @dfn{require} certain other packages to be installed,

View file

@ -250,10 +250,10 @@ where it treats each chapter, section, etc., as a definition.
together.) together.)
@findex imenu @findex imenu
If you type @kbd{M-g i}, it reads the name of a definition using the If you type @kbd{M-g i} (@code{imenu}), it reads the name of a
minibuffer, then moves point to that definition. You can use definition using the minibuffer, then moves point to that definition.
completion to specify the name; the command always displays the whole You can use completion to specify the name; the command always
list of valid names. displays the whole list of valid names.
@findex imenu-add-menubar-index @findex imenu-add-menubar-index
Alternatively, you can bind the command @code{imenu} to a mouse Alternatively, you can bind the command @code{imenu} to a mouse
@ -1439,9 +1439,13 @@ performs completion using the function, variable, or property names
defined in the current Emacs session. defined in the current Emacs session.
In all other respects, in-buffer symbol completion behaves like In all other respects, in-buffer symbol completion behaves like
minibuffer completion. For instance, if Emacs cannot complete to a minibuffer completion. For instance, if Emacs cannot complete to
unique symbol, it displays a list of completion alternatives in a unique symbol, it displays a list of completion alternatives in
another window. @xref{Completion}. another window. Then you can use the keys @kbd{M-@key{DOWN}} and
@kbd{M-@key{UP}} to navigate through the completions displayed
in the completions buffer without leaving the original buffer,
and the key @kbd{M-@key{RET}} to insert the currently highlighted
completion to the buffer. @xref{Completion}.
In Text mode and related modes, @kbd{M-@key{TAB}} completes words In Text mode and related modes, @kbd{M-@key{TAB}} completes words
based on the spell-checker's dictionary. @xref{Spelling}. based on the spell-checker's dictionary. @xref{Spelling}.

View file

@ -1027,24 +1027,11 @@ you search for @samp{a.*?$} against the text @samp{abbab} followed by
a newline, it matches the whole string. Since it @emph{can} match a newline, it matches the whole string. Since it @emph{can} match
starting at the first @samp{a}, it does. starting at the first @samp{a}, it does.
@item @kbd{\@{@var{n}\@}} @cindex set of alternative characters, in regular expressions
is a postfix operator specifying @var{n} repetitions---that is, the @cindex character set, in regular expressions
preceding regular expression must match exactly @var{n} times in a
row. For example, @samp{x\@{4\@}} matches the string @samp{xxxx} and
nothing else.
@item @kbd{\@{@var{n},@var{m}\@}}
is a postfix operator specifying between @var{n} and @var{m}
repetitions---that is, the preceding regular expression must match at
least @var{n} times, but no more than @var{m} times. If @var{m} is
omitted, then there is no upper limit, but the preceding regular
expression must match at least @var{n} times.@* @samp{\@{0,1\@}} is
equivalent to @samp{?}. @* @samp{\@{0,\@}} is equivalent to
@samp{*}. @* @samp{\@{1,\@}} is equivalent to @samp{+}.
@item @kbd{[ @dots{} ]} @item @kbd{[ @dots{} ]}
is a @dfn{character set}, beginning with @samp{[} and terminated by is a @dfn{set of alternative characters}, or a @dfn{character set},
@samp{]}. beginning with @samp{[} and terminated by @samp{]}.
In the simplest case, the characters between the two brackets are what In the simplest case, the characters between the two brackets are what
this set can match. Thus, @samp{[ad]} matches either one @samp{a} or this set can match. Thus, @samp{[ad]} matches either one @samp{a} or
@ -1061,9 +1048,10 @@ which matches any lower-case @acronym{ASCII} letter or @samp{$}, @samp{%} or
period. As another example, @samp{[α-ωί]} matches all lower-case period. As another example, @samp{[α-ωί]} matches all lower-case
Greek letters. Greek letters.
@cindex character classes, in regular expressions
You can also include certain special @dfn{character classes} in a You can also include certain special @dfn{character classes} in a
character set. A @samp{[:} and balancing @samp{:]} enclose a character set. A @samp{[:} and balancing @samp{:]} enclose a
character class inside a character alternative. For instance, character class inside a set of alternative characters. For instance,
@samp{[[:alnum:]]} matches any letter or digit. @xref{Char Classes,,, @samp{[[:alnum:]]} matches any letter or digit. @xref{Char Classes,,,
elisp, The Emacs Lisp Reference Manual}, for a list of character elisp, The Emacs Lisp Reference Manual}, for a list of character
classes. classes.
@ -1131,13 +1119,13 @@ no preceding expression on which the @samp{*} can act. It is poor practice
to depend on this behavior; it is better to quote the special character anyway, to depend on this behavior; it is better to quote the special character anyway,
regardless of where it appears. regardless of where it appears.
As a @samp{\} is not special inside a character alternative, it can As a @samp{\} is not special inside a set of alternative characters, it can
never remove the special meaning of @samp{-} or @samp{]}. So you never remove the special meaning of @samp{-}, @samp{^} or @samp{]}.
should not quote these characters when they have no special meaning You should not quote these characters when they have no special
either. This would not clarify anything, since backslashes can meaning. This would not clarify anything, since backslashes
legitimately precede these characters where they @emph{have} special can legitimately precede these characters where they @emph{have}
meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string syntax), special meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string
which matches any single character except a backslash. syntax), which matches any single character except a backslash.
@node Regexp Backslash @node Regexp Backslash
@section Backslash in Regular Expressions @section Backslash in Regular Expressions
@ -1202,11 +1190,11 @@ matches the same text that matched the @var{d}th occurrence of a
@samp{\( @dots{} \)} construct. This is called a @dfn{back @samp{\( @dots{} \)} construct. This is called a @dfn{back
reference}. reference}.
After the end of a @samp{\( @dots{} \)} construct, the matcher remembers After the end of a @samp{\( @dots{} \)} construct, the matcher
the beginning and end of the text matched by that construct. Then, remembers the beginning and end of the text matched by that construct.
later on in the regular expression, you can use @samp{\} followed by the Then, later on in the regular expression, you can use @samp{\}
digit @var{d} to mean ``match the same text matched the @var{d}th time followed by the digit @var{d} to mean ``match the same text matched
by the @samp{\( @dots{} \)} construct''. the @var{d}th @samp{\( @dots{} \)} construct''.
The strings matching the first nine @samp{\( @dots{} \)} constructs The strings matching the first nine @samp{\( @dots{} \)} constructs
appearing in a regular expression are assigned numbers 1 through 9 in appearing in a regular expression are assigned numbers 1 through 9 in
@ -1223,6 +1211,21 @@ If a particular @samp{\( @dots{} \)} construct matches more than once
(which can easily happen if it is followed by @samp{*}), only the last (which can easily happen if it is followed by @samp{*}), only the last
match is recorded. match is recorded.
@item @kbd{\@{@var{m}\@}}
is a postfix operator specifying @var{m} repetitions---that is, the
preceding regular expression must match exactly @var{m} times in a
row. For example, @samp{x\@{4\@}} matches the string @samp{xxxx} and
nothing else.
@item @kbd{\@{@var{m},@var{n}\@}}
is a postfix operator specifying between @var{m} and @var{n}
repetitions---that is, the preceding regular expression must match at
least @var{m} times, but no more than @var{n} times. If @var{n} is
omitted, then there is no upper limit, but the preceding regular
expression must match at least @var{m} times.@* @samp{\@{0,1\@}} is
equivalent to @samp{?}. @* @samp{\@{0,\@}} is equivalent to
@samp{*}. @* @samp{\@{1,\@}} is equivalent to @samp{+}.
@item \` @item \`
matches the empty string, but only at the beginning of the string or matches the empty string, but only at the beginning of the string or
buffer (or its accessible portion) being matched against. buffer (or its accessible portion) being matched against.
@ -1824,12 +1827,18 @@ occurrence of @var{string}. When done, exit the recursive editing level
with @kbd{C-M-c} to proceed to the next occurrence. with @kbd{C-M-c} to proceed to the next occurrence.
@item e @item e
@itemx E
to edit the replacement string in the minibuffer. When you exit the to edit the replacement string in the minibuffer. When you exit the
minibuffer by typing @key{RET}, the minibuffer contents replace the minibuffer by typing @key{RET}, the minibuffer contents replace the
current occurrence of the pattern. They also become the new current occurrence of the pattern. They also become the new
replacement string for any further occurrences. replacement string for any further occurrences.
@item E
is like @kbd{e}, but the next replacement will be done with exact
case. I.e., if you have a @code{query-replace} from @samp{foo} to
@samp{bar}, a text like @samp{Foo} will be normally be replaced with
@samp{Bar}. Use this command to do the current replacement with exact
case.
@item C-l @item C-l
to redisplay the screen. Then you must type another character to to redisplay the screen. Then you must type another character to
specify what to do with this occurrence. specify what to do with this occurrence.

View file

@ -659,6 +659,7 @@ such as MIME support. Another available mode is MH-E
(@pxref{Top,,MH-E,mh-e, The Emacs Interface to MH}). (@pxref{Top,,MH-E,mh-e, The Emacs Interface to MH}).
@vindex mail-user-agent @vindex mail-user-agent
@findex define-mail-user-agent
You can choose any of these @dfn{mail user agents} as your preferred You can choose any of these @dfn{mail user agents} as your preferred
method for editing and sending mail. The commands @kbd{C-x m}, method for editing and sending mail. The commands @kbd{C-x m},
@kbd{C-x 4 m} and @kbd{C-x 5 m} use whichever agent you have @kbd{C-x 4 m} and @kbd{C-x 5 m} use whichever agent you have
@ -667,7 +668,10 @@ the bug reporter (@pxref{Bugs}). To specify a mail user agent,
customize the variable @code{mail-user-agent}. Currently, legitimate customize the variable @code{mail-user-agent}. Currently, legitimate
values include @code{message-user-agent} (Message mode) values include @code{message-user-agent} (Message mode)
@code{sendmail-user-agent} (Mail mode), @code{gnus-user-agent}, and @code{sendmail-user-agent} (Mail mode), @code{gnus-user-agent}, and
@code{mh-e-user-agent}. @code{mh-e-user-agent}. Additional options may be available; check
in the manual of your mail user agent package for details. You may
also define another mail user agent using
@code{define-mail-user-agent}.
If you select a different mail-composition method, the information If you select a different mail-composition method, the information
in this chapter about the mail buffer and Message mode does not apply; in this chapter about the mail buffer and Message mode does not apply;

View file

@ -269,7 +269,7 @@ with the file's version control type.
@vindex vc-handled-backends @vindex vc-handled-backends
The variable @code{vc-handled-backends} determines which version The variable @code{vc-handled-backends} determines which version
control systems VC should handle. The default value is @code{(RCS CVS control systems VC should handle. The default value is @code{(RCS CVS
SVN SCCS SRC Bzr Git Hg Mtn)}, so it contains all the version systems SVN SCCS SRC Bzr Git Hg)}, so it contains all the version systems
that are currently supported. If you want VC to ignore one or more of that are currently supported. If you want VC to ignore one or more of
these systems, exclude its name from the list. To disable VC these systems, exclude its name from the list. To disable VC
entirely, set this variable to @code{nil}. entirely, set this variable to @code{nil}.

View file

@ -541,10 +541,12 @@ file formerly visited.
@ref{Text}. @ref{Text}.
@defun buffer-modified-p &optional buffer @defun buffer-modified-p &optional buffer
This function returns @code{t} if the buffer @var{buffer} has been modified This function returns non-@code{nil} if @var{buffer} has
since it was last read in from a file or saved, or @code{nil} been modified since it was last read in from a file or saved, or
otherwise. If @var{buffer} is not supplied, the current buffer @code{nil} otherwise. If @var{buffer} has been auto-saved since the
is tested. time it was last modified, this function returns the symbol
@code{autosaved}. If @var{buffer} is @code{nil} or omitted, it
defaults to the current buffer.
@end defun @end defun
@defun set-buffer-modified-p flag @defun set-buffer-modified-p flag
@ -563,8 +565,10 @@ function @code{force-mode-line-update} works by doing this:
@end defun @end defun
@defun restore-buffer-modified-p flag @defun restore-buffer-modified-p flag
Like @code{set-buffer-modified-p}, but does not force redisplay Like @code{set-buffer-modified-p}, but does not force redisplay of
of mode lines. mode lines. This function also allows @var{flag}'s value to be
the symbol @code{autosaved}, which marks the buffer as modified and
auto-saved after the last modification.
@end defun @end defun
@deffn Command not-modified &optional arg @deffn Command not-modified &optional arg

View file

@ -2615,7 +2615,7 @@ POSITION is assumed to lie in a window text area."
@end example @end example
@end defun @end defun
@defun posn-col-row position @defun posn-col-row position &optional use-window
This function returns a cons cell @w{@code{(@var{col} . @var{row})}}, This function returns a cons cell @w{@code{(@var{col} . @var{row})}},
containing the estimated column and row corresponding to buffer containing the estimated column and row corresponding to buffer
position described by @var{position}. The return value is given in position described by @var{position}. The return value is given in
@ -2623,7 +2623,11 @@ units of the frame's default character width and default line height
(including spacing), as computed from the @var{x} and @var{y} values (including spacing), as computed from the @var{x} and @var{y} values
corresponding to @var{position}. (So, if the actual characters have corresponding to @var{position}. (So, if the actual characters have
non-default sizes, the actual row and column may differ from these non-default sizes, the actual row and column may differ from these
computed values.) computed values.) If the optional @var{window} argument is
non-@code{nil}, use the default character width in the window
indicated by @var{position} instead of the frame. (This makes a
difference if that window is showing a buffer with a non-default
zooming level, for instance.)
Note that @var{row} is counted from the top of the text area. If the Note that @var{row} is counted from the top of the text area. If the
window given by @var{position} possesses a header line (@pxref{Header window given by @var{position} possesses a header line (@pxref{Header

View file

@ -525,7 +525,7 @@ core pattern can have the following forms:
@table @code @table @code
@item _ @item _@r{ (underscore)}
Matches any @var{expval}. Matches any @var{expval}.
This is also known as @dfn{don't care} or @dfn{wildcard}. This is also known as @dfn{don't care} or @dfn{wildcard}.
@ -629,7 +629,10 @@ Attempts to match @var{pattern1}, @var{pattern2}, @dots{}, in order,
until one of them succeeds. In that case, @code{or} likewise matches, until one of them succeeds. In that case, @code{or} likewise matches,
and the rest of the sub-patterns are not tested. and the rest of the sub-patterns are not tested.
To present a consistent environment (@pxref{Intro Eval}) To present a consistent environment
@ifnottex
(@pxref{Intro Eval})
@end ifnottex
to @var{body-forms} (thus avoiding an evaluation error on match), to @var{body-forms} (thus avoiding an evaluation error on match),
the set of variables bound by the pattern is the union of the the set of variables bound by the pattern is the union of the
variables bound by each sub-pattern. If a variable is not bound by variables bound by each sub-pattern. If a variable is not bound by

View file

@ -376,7 +376,7 @@ name) and the new value, and should do whatever is necessary to update
the value properly for this option (which may not mean simply setting the value properly for this option (which may not mean simply setting
the option as a Lisp variable); preferably, though, it should not the option as a Lisp variable); preferably, though, it should not
modify its value argument destructively. The default for modify its value argument destructively. The default for
@var{setfunction} is @code{set-default}. @var{setfunction} is @code{set-default-toplevel-value}.
If you specify this keyword, the variable's documentation string If you specify this keyword, the variable's documentation string
should describe how to do the same job in hand-written Lisp code. should describe how to do the same job in hand-written Lisp code.
@ -387,7 +387,7 @@ Specify @var{getfunction} as the way to extract the value of this
option. The function @var{getfunction} should take one argument, a option. The function @var{getfunction} should take one argument, a
symbol, and should return whatever customize should use as the symbol, and should return whatever customize should use as the
current value for that symbol (which need not be the symbol's Lisp current value for that symbol (which need not be the symbol's Lisp
value). The default is @code{default-value}. value). The default is @code{default-toplevel-value}.
You have to really understand the workings of Custom to use You have to really understand the workings of Custom to use
@code{:get} correctly. It is meant for values that are treated in @code{:get} correctly. It is meant for values that are treated in
@ -409,11 +409,11 @@ do not reinitialize it if it is already non-void.
@item custom-initialize-default @item custom-initialize-default
Like @code{custom-initialize-set}, but use the function Like @code{custom-initialize-set}, but use the function
@code{set-default} to set the variable, instead of the variable's @code{set-default-toplevel-value} to set the variable, instead of the
@code{:set} function. This is the usual choice for a variable whose variable's @code{:set} function. This is the usual choice for a
@code{:set} function enables or disables a minor mode; with this choice, variable whose @code{:set} function enables or disables a minor mode;
defining the variable will not call the minor mode function, but with this choice, defining the variable will not call the minor mode
customizing the variable will do so. function, but customizing the variable will do so.
@item custom-initialize-reset @item custom-initialize-reset
Always use the @code{:set} function to initialize the variable. If Always use the @code{:set} function to initialize the variable. If
@ -424,7 +424,7 @@ This is the default @code{:initialize} function.
@item custom-initialize-changed @item custom-initialize-changed
Use the @code{:set} function to initialize the variable, if it is Use the @code{:set} function to initialize the variable, if it is
already set or has been customized; otherwise, just use already set or has been customized; otherwise, just use
@code{set-default}. @code{set-default-toplevel-value}.
@item custom-initialize-delay @item custom-initialize-delay
This function behaves like @code{custom-initialize-set}, but it This function behaves like @code{custom-initialize-set}, but it

View file

@ -2010,6 +2010,11 @@ Tables}). The width of a tab character is usually @code{tab-width}
(@pxref{Usual Display}). (@pxref{Usual Display}).
@end defun @end defun
@defun char-uppercase-p char
Return non-@code{nil} if @var{char} is an uppercase character
according to Unicode.
@end defun
@defun string-width string &optional from to @defun string-width string &optional from to
This function returns the width in columns of the string @var{string}, This function returns the width in columns of the string @var{string},
if it were displayed in the current buffer and the selected window. if it were displayed in the current buffer and the selected window.
@ -2252,20 +2257,6 @@ This is a convenience function that uses @code{window-text-pixel-size}
to compute the width of @var{string} (in pixels). to compute the width of @var{string} (in pixels).
@end defun @end defun
@defun window-char-pixel-width &optional window face
Return the average character width for the font used by @var{face} in
@var{window}. If @var{face} is @code{nil} or omitted, the
@code{default} face is used. If @var{windows} is @code{nil} or
omitted, the currently selected window is used.
@end defun
@defun window-char-pixel-height &optional window face
Return the average character height for the font used by @var{face} in
@var{window}. If @var{face} is @code{nil} or omitted, the
@code{default} face is used. If @var{windows} is @code{nil} or
omitted, the currently selected window is used.
@end defun
@defun line-pixel-height @defun line-pixel-height
This function returns the height in pixels of the line at point in the This function returns the height in pixels of the line at point in the
selected window. The value includes the line spacing of the line selected window. The value includes the line spacing of the line
@ -5066,7 +5057,7 @@ which are evaluated at display time. This could be unsafe in certain
situations, e.g., when the display specification was generated by some situations, e.g., when the display specification was generated by some
external program/agent. Wrapping a display specification in a list external program/agent. Wrapping a display specification in a list
that begins with the special symbol @code{disable-eval}, as in that begins with the special symbol @code{disable-eval}, as in
@w{@code{('disable-eval @var{spec})}}, will disable evaluation of any @w{@code{(disable-eval @var{spec})}}, will disable evaluation of any
Lisp in @var{spec}, while still supporting all the other display Lisp in @var{spec}, while still supporting all the other display
property features. property features.
@ -8228,7 +8219,10 @@ help buffer.
The window's display table, if there is one, takes precedence over the The window's display table, if there is one, takes precedence over the
buffer's display table. If neither exists, Emacs tries to use the buffer's display table. If neither exists, Emacs tries to use the
standard display table; if that is @code{nil}, Emacs uses the usual standard display table; if that is @code{nil}, Emacs uses the usual
character display conventions (@pxref{Usual Display}). character display conventions (@pxref{Usual Display}). (Emacs does
not ``merge'' display tables: For instance, if the window has a
display table, the buffer's display table and the standard display
table are completely ignored.)
Note that display tables affect how the mode line is displayed, so Note that display tables affect how the mode line is displayed, so
if you want to force redisplay of the mode line using a new display if you want to force redisplay of the mode line using a new display

View file

@ -593,6 +593,7 @@ Advising Emacs Lisp Functions
* Advising Named Functions:: Advising named functions. * Advising Named Functions:: Advising named functions.
* Advice Combinators:: Ways to compose advice. * Advice Combinators:: Ways to compose advice.
* Porting Old Advice:: Adapting code using the old defadvice. * Porting Old Advice:: Adapting code using the old defadvice.
* Advice and Byte Code:: Not all functions can be advised.
Macros Macros
@ -739,6 +740,7 @@ Reading and Printing Lisp Objects
* Output Functions:: Functions to print Lisp objects as text. * Output Functions:: Functions to print Lisp objects as text.
* Output Variables:: Variables that control what the printing * Output Variables:: Variables that control what the printing
functions do. functions do.
* Output Overrides:: Overriding output variables.
Minibuffers Minibuffers

View file

@ -435,7 +435,7 @@ expansion.
@cindex forms, special @cindex forms, special
@cindex evaluation of special forms @cindex evaluation of special forms
A @dfn{special form} is a primitive function specially marked so that A @dfn{special form} is a primitive specially marked so that
its arguments are not all evaluated. Most special forms define control its arguments are not all evaluated. Most special forms define control
structures or perform variable bindings---things which functions cannot structures or perform variable bindings---things which functions cannot
do. do.

View file

@ -581,9 +581,12 @@ contents of the file. This is better than simply deleting the buffer
contents and inserting the whole file, because (1) it preserves some contents and inserting the whole file, because (1) it preserves some
marker positions and (2) it puts less data in the undo list. marker positions and (2) it puts less data in the undo list.
It is possible to read a special file (such as a FIFO or an I/O device) It is possible to read a special file (such as a FIFO or an I/O
with @code{insert-file-contents}, as long as @var{replace} and device) with @code{insert-file-contents}, as long as @var{replace},
@var{visit} are @code{nil}. and @var{visit} and @var{beg} are @code{nil}. However, you should
normally use an @var{end} argument for these files to avoid inserting
(potentially) unlimited data into the buffer (for instance, when
inserting data from @file{/dev/urandom}).
@end defun @end defun
@defun insert-file-contents-literally filename &optional visit beg end replace @defun insert-file-contents-literally filename &optional visit beg end replace
@ -3112,10 +3115,16 @@ except those two. It is useful as the @var{match-regexp} argument to
returns @code{nil}, if directory @samp{/foo} is empty. returns @code{nil}, if directory @samp{/foo} is empty.
@end defvr @end defvr
@defun file-expand-wildcards pattern &optional full @defun file-expand-wildcards pattern &optional full regexp
This function expands the wildcard pattern @var{pattern}, returning This function expands the wildcard pattern @var{pattern}, returning
a list of file names that match it. a list of file names that match it.
@var{pattern} is, by default, a ``glob''/wildcard string, e.g.,
@samp{"/tmp/*.png"} or @samp{"/*/*/foo.png"}, but can also be a
regular expression if the optional @var{regexp} parameter is non-nil.
In any case, the matches are applied per sub-directory, so a match
can't span a parent/sub directory.
If @var{pattern} is written as an absolute file name, If @var{pattern} is written as an absolute file name,
the values are absolute also. the values are absolute also.

View file

@ -458,6 +458,18 @@ monitor, the same string as returned by the function
@var{display} should be the name of an X display (a string). @var{display} should be the name of an X display (a string).
@end deffn @end deffn
@cindex monitor change functions
@defvar display-monitors-changed-functions
This variable is an abnormal hook run when the monitor configuration
changes, which can happen if a monitor is rotated, moved, added or
removed from a multiple-monitor setup, if the primary monitor changes,
or if the resolution of a monitor changes. It is called with a single
argument consisting of the terminal on which the monitor configuration
changed. Programs should call @code{display-monitor-attributes-list}
with the terminal as the argument to retrieve the new monitor
configuration on that terminal.
@end defvar
@node Frame Geometry @node Frame Geometry
@section Frame Geometry @section Frame Geometry
@cindex frame geometry @cindex frame geometry
@ -683,9 +695,9 @@ The position of the top left corner of the native frame specifies the
indicate that position for the various builds: indicate that position for the various builds:
@itemize @w{} @itemize @w{}
@item (1) non-toolkit and terminal frames @item (1) non-toolkit, Haiku, and terminal frames
@item (2) Lucid, Motif, MS-Windows, and Haiku frames @item (2) Lucid, Motif, and MS-Windows frames
@item (3) GTK+ and NS frames @item (3) GTK+ and NS frames
@end itemize @end itemize
@ -1734,16 +1746,14 @@ fit will be clipped by the window manager.
@item fullscreen @item fullscreen
This parameter specifies whether to maximize the frame's width, height This parameter specifies whether to maximize the frame's width, height
or both. Its value can be @code{fullwidth}, @code{fullheight}, or both. Its value can be @code{fullwidth}, @code{fullheight},
@code{fullboth}, or @code{maximized}.@footnote{On Haiku, setting @code{fullboth}, or @code{maximized}. A @dfn{fullwidth} frame is as
@code{fullscreen} to @code{fullwidth} or @code{fullheight} has no
effect.} A @dfn{fullwidth} frame is as
wide as possible, a @dfn{fullheight} frame is as tall as possible, and wide as possible, a @dfn{fullheight} frame is as tall as possible, and
a @dfn{fullboth} frame is both as wide and as tall as possible. A a @dfn{fullboth} frame is both as wide and as tall as possible. A
@dfn{maximized} frame is like a ``fullboth'' frame, except that it usually @dfn{maximized} frame is like a ``fullboth'' frame, except that it
keeps its title bar and the buttons for resizing usually keeps its title bar and the buttons for resizing and closing
and closing the frame. Also, maximized frames typically avoid hiding the frame. Also, maximized frames typically avoid hiding any task bar
any task bar or panels displayed on the desktop. A ``fullboth'' frame, or panels displayed on the desktop. A ``fullboth'' frame, on the
on the other hand, usually omits the title bar and occupies the entire other hand, usually omits the title bar and occupies the entire
available screen space. available screen space.
Full-height and full-width frames are more similar to maximized Full-height and full-width frames are more similar to maximized
@ -3877,8 +3887,9 @@ in the buffer. The default is to use the @code{arrow} (non-text)
pointer style. pointer style.
@end defopt @end defopt
When using X, you can specify what the @code{text} pointer style When using some window systems, you can specify what the @code{text}
really looks like by setting the variable @code{x-pointer-shape}. pointer style really looks like by setting the variable
@code{x-pointer-shape}.
@defvar x-pointer-shape @defvar x-pointer-shape
This variable specifies the pointer shape to use ordinarily in the This variable specifies the pointer shape to use ordinarily in the
@ -3932,6 +3943,13 @@ overlay or a pair of markers stands for text in the overlay or between
the markers. The argument @var{data} may also be a vector of valid the markers. The argument @var{data} may also be a vector of valid
non-vector selection values. non-vector selection values.
If @var{data} is a string, then its text properties can specify values
used for individual data types. For example, if @var{data} has a
property named @code{text/uri-list}, then a call to
@code{gui-get-selection} with the data type @code{text/uri-list} will
result in the value of that property being used instead of @var{data}
itself.
This function returns @var{data}. This function returns @var{data}.
@end deffn @end deffn
@ -4018,16 +4036,46 @@ amount of different data types on the clipboard.
@section Drag and Drop @section Drag and Drop
@cindex drag and drop @cindex drag and drop
When the user drops something from another application over Emacs,
Emacs will try to insert any text and open any URL that was dropped.
If text was dropped, then it will always be inserted at the location
of the mouse pointer when the drop happened, or saved in the kill ring
if insertion failed (which can happen if the buffer is read-only). If
it was an URL, then Emacs tries to call an appropriate handler
function by first matching the URL against regexps defined in
@code{dnd-protocol-alist}, and then against @code{browse-url-handlers}
and @code{browse-url-default-handlers}, and failing that, inserting
the URL as plain text.
@defvar dnd-protocol-alist
This variable is a list of cons cells of the form
@w{@code{(@var{pattern} . @var{action})}}. @var{pattern} is a regexp
that URLs are matched against after being dropped. @var{action} is a
function that is called with two arguments should a URL being dropped
match @var{pattern}: the URL being dropped, and the action being
performed for the drop (one of the symbols @code{copy}, @code{move},
@code{link}, @code{private} or @code{ask}).
@end defvar
@cindex drag and drop, X
@cindex drag and drop, other formats
Emacs implements drag-and-drop for text and URLs individually for
each window system, and does not by default support the dropping of
anything else. Code that wishes to support the dropping of content
types not supported by Emacs can utilize the X-specific interface
described below:
@vindex x-dnd-test-function @vindex x-dnd-test-function
@vindex x-dnd-known-types @vindex x-dnd-known-types
When a user drags something from another application over Emacs, that other When a user drags something from another application over Emacs on
application expects Emacs to tell it if Emacs can handle the data that is the X Window System, that other application expects Emacs to tell it
dragged. The variable @code{x-dnd-test-function} is used by Emacs to determine if Emacs can handle the data that was dragged. The variable
what to reply. The default value is @code{x-dnd-default-test-function} @code{x-dnd-test-function} is used by Emacs to determine what to
which accepts drops if the type of the data to be dropped is present in reply. The default value is @code{x-dnd-default-test-function} which
@code{x-dnd-known-types}. You can customize @code{x-dnd-test-function} and/or accepts drops if the type of the data to be dropped is present in
@code{x-dnd-known-types} if you want Emacs to accept or reject drops based @code{x-dnd-known-types}. You can customize
on some other criteria. @code{x-dnd-test-function} and/or @code{x-dnd-known-types} if you want
Emacs to accept or reject drops based on some other criteria.
@vindex x-dnd-types-alist @vindex x-dnd-types-alist
If you want to change the way Emacs handles drop of different types If you want to change the way Emacs handles drop of different types
@ -4035,28 +4083,126 @@ or add a new type, customize @code{x-dnd-types-alist}. This requires
detailed knowledge of what types other applications use for drag and detailed knowledge of what types other applications use for drag and
drop. drop.
@vindex dnd-protocol-alist Those data types are typically implemented as special data types an
@vindex browse-url-handlers X selection provided by the other application can be converted to.
@vindex browse-url-default-handlers They can either be the same data types that are typically accepted by
When an URL is dropped on Emacs it may be a file, but it may also be @code{gui-set-selection}, or they can be MIME types, depending on the
another URL type (https, etc.). Emacs first checks specific drag-n-drop protocol being used. Plain text may be
@code{dnd-protocol-alist} to determine what to do with the URL@. If @code{"STRING"} or @code{"text/plain"}, for example.
there is no match there, Emacs looks for a match in
@code{browse-url-handlers} and @code{browse-url-default-handlers}. If
still no match has been found, the text for the URL is inserted. If
you want to alter Emacs behavior, you can customize these variables.
@cindex initiating drag-and-drop @cindex initiating drag-and-drop
On capable window systems, Emacs also supports dragging contents On capable window systems, Emacs also supports dragging contents
from its frames to windows of other applications. from its frames to windows of other applications.
@defun x-begin-drag targets &optional action frame return-frame allow-current-frame @cindex drop target, in drag-and-drop operations
@defun dnd-begin-text-drag text &optional frame action allow-same-frame
This function begins dragging text from @var{frame} to another program
(known as the @dfn{drop target}), and returns the result of
drag-and-drop operation when the text is dropped or the drag-and-drop
operation is canceled. @var{text} is the text that will be inserted
by the drop target.
@var{action} must be one of the symbols @code{copy} or @code{move},
where @code{copy} means that @var{text} should be inserted by the drop
target, and @code{move} means the same as @code{copy}, but in addition
the caller may have to delete @var{text} from its source as explained
below.
@var{frame} is the frame where the mouse is currently held down, or
@code{nil}, which means to use the selected frame. This function may
return immediately if no mouse buttons are held down, so it should be
only called immediately after a @code{down-mouse-1} or similar event
(@pxref{Mouse Events}), with @var{frame} set to the frame where that
event was generated (@pxref{Click Events}).
@var{allow-same-frame} specifies whether or not drops on top of
@var{frame} itself are to be ignored.
The return value specifies the action that the drop target actually
performed, and optionally what the caller should do. It can be one of
the following symbols:
@table @code
@item copy
The drop target inserted the dropped text.
@item move
The drop target inserted the dropped text, but in addition the caller
should delete @var{text} from wherever it originated, such as its
buffer.
@item private
The drop target performed some other unspecified action.
@item nil
The drag-and-drop operation was canceled.
@end table
@end defun
@defun dnd-begin-file-drag file &optional frame action allow-same-frame
This function begins dragging @var{file} from @var{frame} to another
program, and returns the result of the drag-and-drop operation when
the file is dropped or the drag-and-drop operation is canceled.
If @var{file} is a remote file, then a temporary copy will be made.
@var{action} must be one of the symbols @code{copy}, @code{move} or
@code{link}, where @code{copy} means that @var{file} should be opened
or copied by the drop target, @code{move} means the drop target should
move the file to another location, and @code{link} means the drop
target should create a symbolic link to @var{file}. It is an error to
specify @code{link} as the action if @var{file} is a remote file.
@var{frame} and @var{allow-same-frame} have the same meaning as in
@code{dnd-begin-text-drag}.
The return value is the action that the drop target actually
performed, which can be one of the following symbols:
@table @code
@item copy
The drop target opened or copied @var{file} to a different location.
@item move
The drop target moved @var{file} to a different location.
@item link
The drop target (usually a file manager) created a symbolic link to
@var{file}.
@item private
The drop target performed some other unspecified action.
@item nil
The drag-and-drop operation was canceled.
@end table
@end defun
@defun dnd-begin-drag-files files &optional frame action allow-same-frame
This function is like @code{dnd-begin-file-drag}, except that
@var{files} is a list of files. If the drop target doesn't support
dropping multiple files, then the first file will be used instead.
@end defun
@cindex initiating drag-and-drop, low-level
The high-level interfaces described above are implemented on top of
a lower-level primitive. If you need to drag content other than files
or text, use the low-level interface @code{x-begin-drag}
instead. However, using it will require detailed knowledge of the
data types and actions used by the programs to transfer content via
drag-and-drop on each platform you want to support.
@defun x-begin-drag targets &optional action frame return-frame allow-current-frame follow-tooltip
This function begins a drag from @var{frame}, and returns when the This function begins a drag from @var{frame}, and returns when the
drag-and-drop operation ends, either because the drop was successful, drag-and-drop operation ends, either because the drop was successful,
or because the drop was rejected. The drop occurs when all mouse or because the drop was rejected. The drop occurs when all mouse
buttons are released on top of an X window other than @var{frame} (the buttons are released on top of an X window other than @var{frame} (the
@dfn{drop target}), or any X window if @var{allow-current-frame} is @dfn{drop target}), or any X window if @var{allow-current-frame} is
non-@code{nil}. non-@code{nil}. If no mouse buttons are held down when the
drag-and-drop operation begins, this function may immediately return
@code{nil}.
@var{targets} is a list of strings describing selection targets, much @var{targets} is a list of strings describing selection targets, much
like the @var{data-type} argument to @code{gui-get-selection}, that like the @var{data-type} argument to @code{gui-get-selection}, that
@ -4085,6 +4231,12 @@ want to treat dragging content from one frame to another specially,
while also being able to drag content to other programs, but it is not while also being able to drag content to other programs, but it is not
guaranteed to work on all systems and with all window managers. guaranteed to work on all systems and with all window managers.
If @var{follow-tooltip} is non-@code{nil}, the position of any tooltip
(such as one shown by @code{tooltip-show}) will follow the location of
the mouse pointer whenever it moves during the drag-and-drop
operation. The tooltip will be hidden once all mouse buttons are
released.
If the drop was rejected or no drop target was found, this function If the drop was rejected or no drop target was found, this function
returns @code{nil}. Otherwise, it returns a symbol describing the returns @code{nil}. Otherwise, it returns a symbol describing the
action the target chose to perform, which can differ from @var{action} action the target chose to perform, which can differ from @var{action}
@ -4093,6 +4245,10 @@ is also a valid return value in addition to @code{XdndActionCopy} and
@code{XdndActionMove}; it means that the drop target chose to perform @code{XdndActionMove}; it means that the drop target chose to perform
an unspecified action, and no further processing is required by the an unspecified action, and no further processing is required by the
caller. caller.
The caller must cooperate with the target to fully perform the action
chosen by the target. For example, callers should delete the buffer
text that was dragged if this function returns @code{XdndActionMove}.
@end defun @end defun
@node Color Names @node Color Names

View file

@ -146,7 +146,12 @@ function:
This function returns @code{t} if @var{object} is any kind of This function returns @code{t} if @var{object} is any kind of
function, i.e., can be passed to @code{funcall}. Note that function, i.e., can be passed to @code{funcall}. Note that
@code{functionp} returns @code{t} for symbols that are function names, @code{functionp} returns @code{t} for symbols that are function names,
and returns @code{nil} for special forms. and returns @code{nil} for symbols that are macros or special forms.
If @var{object} is not a function, this function ordinarily returns
@code{nil}. However, the representation of function objects is
complicated, and for efficiency reasons in rare cases this function
can return @code{t} even when @var{object} is not a function.
@end defun @end defun
It is also possible to find out how many arguments an arbitrary It is also possible to find out how many arguments an arbitrary
@ -1712,6 +1717,7 @@ ways to do it. The added function is also called a piece of @emph{advice}.
* Advising Named Functions:: Advising named functions. * Advising Named Functions:: Advising named functions.
* Advice Combinators:: Ways to compose advice. * Advice Combinators:: Ways to compose advice.
* Porting Old Advice:: Adapting code using the old defadvice. * Porting Old Advice:: Adapting code using the old defadvice.
* Advice and Byte Code:: Not all functions can be advised.
@end menu @end menu
@node Core Advising Primitives @node Core Advising Primitives
@ -2133,6 +2139,37 @@ changing @code{ad-return-value}, whereas new @code{:after} advice cannot, so
when porting such old @code{after} advice, you'll need to turn it into new when porting such old @code{after} advice, you'll need to turn it into new
@code{:around} or @code{:filter-return} advice instead. @code{:around} or @code{:filter-return} advice instead.
@c This is its own node because we link to it from *Help* buffers.
@node Advice and Byte Code
@subsection Advice and Byte Code
@cindex compiler macros, advising
@cindex @code{byte-compile} and @code{byte-optimize}, advising
Not all functions can be reliably advised. The byte compiler may
choose to replace a call to a function with a sequence of instructions
that doesn't call the function you were interested in altering.
This usually happens due to one of the three following mechanisms:
@table @asis
@item @code{byte-compile} properties
If a function's symbol has a @code{byte-compile} property, that
property will be used instead of the symbol's function definition.
@xref{Compilation Functions}.
@item @code{byte-optimize} properties
If a function's symbol has a @code{byte-optimize} property, the byte
compiler may rewrite the function arguments, or decide to use a
different function altogether.
@item @code{compiler-macro} declare forms
A function can have a special @code{compiler-macro} @code{declare}
form in its definition (@pxref{Declare Form}) that defines an
@dfn{expander} to call when compiling the function. The expander
could then cause the produced byte-code not to call the original
function.
@end table
@node Obsolete Functions @node Obsolete Functions
@section Declaring Functions Obsolete @section Declaring Functions Obsolete
@cindex obsolete functions @cindex obsolete functions

View file

@ -345,7 +345,10 @@ stands for a key sequence @var{KEYSEQ}, which will use the same face
as a command substitution. This should be used only when a key as a command substitution. This should be used only when a key
sequence has no corresponding command, for example when it is read sequence has no corresponding command, for example when it is read
directly with @code{read-key-sequence}. It must be a valid key directly with @code{read-key-sequence}. It must be a valid key
sequence according to @code{key-valid-p}. sequence according to @code{key-valid-p}. It can also be used with
command names, like @samp{\`M-x foo'}, where you want this to be
fontified like a keyboard sequence, but you want to inhibit
translating it into a key sequence like @samp{\[foo]} does.
@item ` @item `
(grave accent) stands for a left quote. (grave accent) stands for a left quote.
@ -362,6 +365,10 @@ depending on the value of @code{text-quoting-style}.
quotes the following character and is discarded; thus, @samp{\=`} puts quotes the following character and is discarded; thus, @samp{\=`} puts
@samp{`} into the output, @samp{\=\[} puts @samp{\[} into the output, @samp{`} into the output, @samp{\=\[} puts @samp{\[} into the output,
and @samp{\=\=} puts @samp{\=} into the output. and @samp{\=\=} puts @samp{\=} into the output.
@item \+
This indicates that the symbol directly following should not be marked
as link in the @file{*Help*} buffer.
@end table @end table
@strong{Please note:} Each @samp{\} must be doubled when written in a @strong{Please note:} Each @samp{\} must be doubled when written in a
@ -386,7 +393,7 @@ quotes. You can customize it freely according to your personal
preference. preference.
@end defopt @end defopt
@defun substitute-command-keys string &optional no-face @defun substitute-command-keys string &optional no-face include-menus
@vindex help-key-binding@r{ (face)} @vindex help-key-binding@r{ (face)}
This function scans @var{string} for the above special sequences and This function scans @var{string} for the above special sequences and
replaces them by what they stand for, returning the result as a string. replaces them by what they stand for, returning the result as a string.
@ -436,6 +443,9 @@ RET minibuffer-complete-and-exit
C-g abort-recursive-edit C-g abort-recursive-edit
" "
The keymap description will normally exclude menu items, but if
@var{include-menus} is non-@code{nil}, include them.
@group @group
(substitute-command-keys (substitute-command-keys
"To abort a recursive edit from the minibuffer, type \ "To abort a recursive edit from the minibuffer, type \

View file

@ -529,7 +529,7 @@ primitive for autoloading; any Lisp program can call @code{autoload} at
any time. Magic comments are the most convenient way to make a function any time. Magic comments are the most convenient way to make a function
autoload, for packages installed along with Emacs. These comments do autoload, for packages installed along with Emacs. These comments do
nothing on their own, but they serve as a guide for the command nothing on their own, but they serve as a guide for the command
@code{update-file-autoloads}, which constructs calls to @code{autoload} @code{loaddefs-generate}, which constructs calls to @code{autoload}
and arranges to execute them when Emacs is built. and arranges to execute them when Emacs is built.
@defun autoload function filename &optional docstring interactive type @defun autoload function filename &optional docstring interactive type
@ -627,22 +627,19 @@ subroutines not loaded successfully because they come later in the file.
macro, then an error is signaled with data @code{"Autoloading failed to macro, then an error is signaled with data @code{"Autoloading failed to
define function @var{function-name}"}. define function @var{function-name}"}.
@findex update-file-autoloads @findex loaddefs-generate
@findex make-directory-autoloads
@cindex magic autoload comment @cindex magic autoload comment
@cindex autoload cookie @cindex autoload cookie
@anchor{autoload cookie} @anchor{autoload cookie}
A magic autoload comment (often called an @dfn{autoload cookie}) A magic autoload comment (often called an @dfn{autoload cookie})
consists of @samp{;;;###autoload}, on a line by itself, consists of @samp{;;;###autoload}, on a line by itself,
just before the real definition of the function in its just before the real definition of the function in its
autoloadable source file. The command @kbd{M-x update-file-autoloads} autoloadable source file. The function @code{loaddefs-generate}
writes a corresponding @code{autoload} call into @file{loaddefs.el}. writes a corresponding @code{autoload} call into @file{loaddefs.el}.
(The string that serves as the autoload cookie and the name of the (The string that serves as the autoload cookie and the name of the
file generated by @code{update-file-autoloads} can be changed from the file generated by @code{loaddefs-generate} can be changed from the
above defaults, see below.) above defaults, see below.)
Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}. Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}.
@kbd{M-x make-directory-autoloads} is even more powerful; it updates
autoloads for all files in the current directory.
The same magic comment can copy any kind of form into The same magic comment can copy any kind of form into
@file{loaddefs.el}. The form following the magic comment is copied @file{loaddefs.el}. The form following the magic comment is copied
@ -675,7 +672,7 @@ and @code{define-global-minor-mode}.
@emph{without} executing it when the file itself is loaded. To do this, @emph{without} executing it when the file itself is loaded. To do this,
write the form @emph{on the same line} as the magic comment. Since it write the form @emph{on the same line} as the magic comment. Since it
is in a comment, it does nothing when you load the source file; but is in a comment, it does nothing when you load the source file; but
@kbd{M-x update-file-autoloads} copies it to @file{loaddefs.el}, where @code{loaddefs-generate} copies it to @file{loaddefs.el}, where
it is executed while building Emacs. it is executed while building Emacs.
The following example shows how @code{doctor} is prepared for The following example shows how @code{doctor} is prepared for
@ -728,11 +725,11 @@ corresponding autoload calls written into a file whose name is
different from the default @file{loaddefs.el}. Emacs provides two different from the default @file{loaddefs.el}. Emacs provides two
variables to control this: variables to control this:
@defvar generate-autoload-cookie @defvar lisp-mode-autoload-regexp
The value of this variable should be a string whose syntax is a Lisp The value of this constant is a regexp that matches autoload cookies.
comment. @kbd{M-x update-file-autoloads} copies the Lisp form that @code{loaddefs-generate} copies the Lisp form that follows the
follows the cookie into the autoload file it generates. The default cookie into the autoload file it generates. This will match comments
value of this variable is @code{";;;###autoload"}. like like @samp{;;;###autoload} and @samp{;;;###calc-autoload}.
@end defvar @end defvar
@defvar generated-autoload-file @defvar generated-autoload-file
@ -769,7 +766,7 @@ contain definitions matching the prefix being completed. The variable
@code{definition-prefixes} holds a hashtable which maps a prefix to @code{definition-prefixes} holds a hashtable which maps a prefix to
the corresponding list of files to load for it. Entries to this the corresponding list of files to load for it. Entries to this
mapping are added by calls to @code{register-definition-prefixes} mapping are added by calls to @code{register-definition-prefixes}
which are generated by @code{update-file-autoloads} which are generated by @code{loaddefs-generate}
(@pxref{Autoload}). Files which don't contain any definitions worth (@pxref{Autoload}). Files which don't contain any definitions worth
loading (test files, for examples), should set loading (test files, for examples), should set
@code{autoload-compute-prefixes} to @code{nil} as a file-local @code{autoload-compute-prefixes} to @code{nil} as a file-local

View file

@ -309,6 +309,22 @@ The optional argument @var{history}, if non-@code{nil}, is a symbol
specifying a minibuffer history list to use (@pxref{Minibuffer specifying a minibuffer history list to use (@pxref{Minibuffer
History}). If it is omitted or @code{nil}, the history list defaults History}). If it is omitted or @code{nil}, the history list defaults
to @code{regexp-history}. to @code{regexp-history}.
@cindex @code{case-fold}, text property
@findex read-regexp-case-fold-search
The user can use the @kbd{M-c} command to indicate whether case
folding should be on or off. If the user has used this command, the
returned string will have the text property @code{case-fold} set to
either @code{fold} or @code{inhibit-fold}. It is up to the caller of
@code{read-regexp} to actually use this value, and the convenience
function @code{read-regexp-case-fold-search} is provided for that. A
typical usage pattern here might look like:
@lisp
(let* ((regexp (read-regexp "Search for: "))
(case-fold-search (read-regexp-case-fold-search regexp)))
(re-search-forward regexp))
@end lisp
@end defun @end defun
@defopt read-regexp-defaults-function @defopt read-regexp-defaults-function
@ -1121,6 +1137,11 @@ completion command (i.e., one of the commands in
@code{minibuffer-confirm-exit-commands}) and the resulting input is @code{minibuffer-confirm-exit-commands}) and the resulting input is
not an element of @var{collection}. @xref{Completion Commands}. not an element of @var{collection}. @xref{Completion Commands}.
@item
If a function, it is called with the input as the only argument. The
function should return a non-@code{nil} value if the input is
acceptable.
@item @item
Any other value of @var{require-match} behaves like @code{t}, except Any other value of @var{require-match} behaves like @code{t}, except
that the exit commands won't exit if it performs completion. that the exit commands won't exit if it performs completion.

View file

@ -2575,7 +2575,23 @@ mode line feature, except that it's controlled by
This variable, local in every buffer, specifies how to display the This variable, local in every buffer, specifies how to display the
header line, for windows displaying the buffer. The format of the value header line, for windows displaying the buffer. The format of the value
is the same as for @code{mode-line-format} (@pxref{Mode Line Data}). is the same as for @code{mode-line-format} (@pxref{Mode Line Data}).
It is normally @code{nil}, so that ordinary buffers have no header line. It is normally @code{nil}, so that ordinary buffers have no header
line.
@findex header-line-indent-mode
If @code{display-line-numbers-mode} is used, and you want the header
line to be indented by the same amount as the buffer contents, you can
use the @code{header-line-indent-mode} minor mode. This minor mode
keeps the @code{header-line-indent} variable updated, so that you can
say something like:
@lisp
(setq header-line-format
`("" header-line-format ,my-header-line))
@end lisp
This can be useful if you're displaying columnar data, and the header
line should align with that data in the buffer.
@end defvar @end defvar
@defun window-header-line-height &optional window @defun window-header-line-height &optional window
@ -3652,6 +3668,10 @@ the value is @code{nil}, Font Lock will call @code{jit-lock-register}
(@pxref{Other Font Lock Variables}) to set up for automatic (@pxref{Other Font Lock Variables}) to set up for automatic
refontification of buffer text following a modified line to reflect refontification of buffer text following a modified line to reflect
the new syntactic context due to the change. the new syntactic context due to the change.
To use only syntactic fontification, this variable should
be non-@code{nil}, while @code{font-lock-keywords} should be set to
@code{nil} (@pxref{Font Lock Basics}).
@end defvar @end defvar
@defvar font-lock-syntax-table @defvar font-lock-syntax-table

View file

@ -280,11 +280,12 @@ to the codepoints @code{#x3FFF80} through @code{#x3FFFFF}, inclusive
@defun string-to-unibyte string @defun string-to-unibyte string
This function returns a unibyte string containing the same sequence of This function returns a unibyte string containing the same sequence of
characters as @var{string}. It signals an error if @var{string} characters as @var{string}. If @var{string} is a unibyte string, it
contains a non-@acronym{ASCII} character. If @var{string} is a is returned unchanged. Otherwise, @acronym{ASCII} characters and
unibyte string, it is returned unchanged. Use this function for characters in the @code{eight-bit} charset are converted to their
@var{string} arguments that contain only @acronym{ASCII} and eight-bit corresponding byte values. Use this function for @var{string}
characters. arguments that contain only @acronym{ASCII} and eight-bit characters;
the function signals an error if any other characters are encountered.
@end defun @end defun
@defun byte-to-string byte @defun byte-to-string byte

View file

@ -178,6 +178,12 @@ files.
Skip the next @samp{N} characters (@pxref{Comments}). This is used in Skip the next @samp{N} characters (@pxref{Comments}). This is used in
byte-compiled files, and is not meant to be used in Emacs Lisp source byte-compiled files, and is not meant to be used in Emacs Lisp source
files. files.
@item #f
Indicates that the following form isn't readable by the Emacs Lisp
reader. This is only in text for display purposes (when that would
look prettier than alternative ways of indicating an unreadable form)
and will never appear in any Lisp file.
@end table @end table

View file

@ -329,10 +329,10 @@ file will not inhibit the message for someone else.
@end defopt @end defopt
@defopt initial-scratch-message @defopt initial-scratch-message
This variable, if non-@code{nil}, should be a string, which is This variable, if non-@code{nil}, should be a string, which is treated
treated as documentation to be as documentation to be inserted into the @file{*scratch*} buffer when
inserted into the @file{*scratch*} buffer when Emacs starts up. If it Emacs starts up or when that buffer is recreated. If it is
is @code{nil}, the @file{*scratch*} buffer is empty. @code{nil}, the @file{*scratch*} buffer is empty.
@end defopt @end defopt
@noindent @noindent
@ -1649,8 +1649,8 @@ this default may change in future Emacs releases, so callers requiring
a particular form should specify @var{form}. a particular form should specify @var{form}.
@strong{Common Lisp Note:} Common Lisp has different meanings for @strong{Common Lisp Note:} Common Lisp has different meanings for
@var{dow} and @var{utcoff}, and its @var{second} is an integer between @var{dow}, @code{dst} and @var{utcoff}, and its @var{second} is an
0 and 59 inclusive. integer between 0 and 59 inclusive.
To access (or alter) the elements in the calendrical information, the To access (or alter) the elements in the calendrical information, the
@code{decoded-time-second}, @code{decoded-time-minute}, @code{decoded-time-second}, @code{decoded-time-minute},

View file

@ -1011,16 +1011,18 @@ terminated (due to calling @code{exit} or to a signal). If it is
they exit. they exit.
@end defopt @end defopt
@defun delete-process process @defun delete-process &optional process
This function deletes a process, killing it with a @code{SIGKILL} This function deletes a process, killing it with a @code{SIGKILL}
signal if the process was running a program. The argument may be a signal if the process was running a program. The argument may be a
process, the name of a process, a buffer, or the name of a buffer. (A process, the name of a process, a buffer, or the name of a buffer. (A
buffer or buffer-name stands for the process that buffer or buffer-name stands for the process that
@code{get-buffer-process} returns.) Calling @code{delete-process} on @code{get-buffer-process} returns, and a missing or @code{nil}
a running process terminates it, updates the process status, and runs @var{process} means that the current buffer's process should be
the sentinel immediately. If the process has already terminated, killed.) Calling @code{delete-process} on a running process
calling @code{delete-process} has no effect on its status, or on the terminates it, updates the process status, and runs the sentinel
running of its sentinel (which will happen sooner or later). immediately. If the process has already terminated, calling
@code{delete-process} has no effect on its status, or on the running
of its sentinel (which will happen sooner or later).
If the process object represents a network, serial, or pipe If the process object represents a network, serial, or pipe
connection, its status changes to @code{closed}; otherwise, it changes connection, its status changes to @code{closed}; otherwise, it changes
@ -3468,20 +3470,67 @@ type values:
@itemx byte @itemx byte
Unsigned byte, with length 1. Unsigned byte, with length 1.
@item uint @var{bitlen} @item uint @var{bitlen} &optional @var{le}
Unsigned integer in network byte order, with @var{bitlen} bits. Unsigned integer in network byte order (big-endian), with @var{bitlen} bits.
@var{bitlen} has to be a multiple of 8. @var{bitlen} has to be a multiple of 8.
If @var{le} is non-@code{nil}, then use little-endian byte order.
@item uintr @var{bitlen} @item sint @var{bitlen} @var{le}
Unsigned integer in little endian order, with @var{bitlen} bits. Signed integer in network byte order (big-endian), with @var{bitlen} bits.
@var{bitlen} has to be a multiple of 8. @var{bitlen} has to be a multiple of 8.
If @var{le} is non-@code{nil}, then use little-endian byte order.
@item str @var{len} @item str @var{len}
String of bytes of length @var{len}. Unibyte string (@pxref{Text Representations}) of length @var{len} bytes.
When packing, the first @var{len} bytes of the input string are copied
to the packed output. If the input string is shorter than @var{len},
the remaining bytes will be null (zero) unless a pre-allocated string
was provided to @code{bindat-pack}, in which case the remaining bytes
are left unmodified. If the input string is multibyte with only ASCII
and @code{eight-bit} characters, it is converted to unibyte before it
is packed; other multibyte strings signal an error. When unpacking,
any null bytes in the packed input string will appear in the unpacked
output.
@item strz &optional @var{len} @item strz &optional @var{len}
Zero-terminated string of bytes, can be of arbitrary length or in a fixed-size If @var{len} is not provided: Variable-length null-terminated unibyte
field with length @var{len}. string (@pxref{Text Representations}). When packing, the entire input
string is copied to the packed output. The following byte will be
null (zero) unless a pre-allocated string was provided to
@code{bindat-pack}, in which case that byte is left unmodified. The
length of the packed output is the length of the input string plus one
(for the null terminator). The input string must not contain any null
bytes. If the input string is multibyte with only ASCII and
@code{eight-bit} characters, it is converted to unibyte before it is
packed; other multibyte strings signal an error. When unpacking, the
resulting string contains all bytes up to (but excluding) the null
byte.
@quotation Caution
If a pre-allocated string is provided to @code{bindat-pack}, the
packed output will not be properly null-terminated unless the
pre-allocated string already has a null byte at the appropriate
location.
@end quotation
If @var{len} is provided: @code{strz} behaves the same as @code{str}
with one difference: When unpacking, the first null byte encountered
in the packed string and all subsequent bytes are excluded from the
unpacked result.
@quotation Caution
The packed output will not be null-terminated unless one of the
following is true:
@itemize
@item
The input string is shorter than @var{len} bytes and either no pre-allocated
string was provided to @code{bindat-pack} or the appropriate byte in
the pre-allocated string was already null.
@item
The input string contains a null byte within the first @var{len}
bytes.
@end itemize
@end quotation
@item vec @var{len} [@var{type}] @item vec @var{len} [@var{type}]
Vector of @var{len} elements. The type of the elements is given by Vector of @var{len} elements. The type of the elements is given by

View file

@ -549,12 +549,12 @@ can act. It is poor practice to depend on this behavior; quote the
special character anyway, regardless of where it appears. special character anyway, regardless of where it appears.
As a @samp{\} is not special inside a character alternative, it can As a @samp{\} is not special inside a character alternative, it can
never remove the special meaning of @samp{-} or @samp{]}. So you never remove the special meaning of @samp{-}, @samp{^} or @samp{]}.
should not quote these characters when they have no special meaning You should not quote these characters when they have no special
either. This would not clarify anything, since backslashes can meaning. This would not clarify anything, since backslashes
legitimately precede these characters where they @emph{have} special can legitimately precede these characters where they @emph{have}
meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string syntax), special meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string
which matches any single character except a backslash. syntax), which matches any single character except a backslash.
In practice, most @samp{]} that occur in regular expressions close a In practice, most @samp{]} that occur in regular expressions close a
character alternative and hence are special. However, occasionally a character alternative and hence are special. However, occasionally a
@ -823,21 +823,22 @@ the characters that stand for them.
matches any character whose syntax is not @var{code}. matches any character whose syntax is not @var{code}.
@cindex category, regexp search for @cindex category, regexp search for
@item \c@var{c} @item \c@var{code}
matches any character whose category is @var{c}. Here @var{c} is a matches any character whose category is @var{code}. Here @var{code}
character that represents a category: thus, @samp{c} for Chinese is a character that represents a category: for example, in the standard
characters or @samp{g} for Greek characters in the standard category category table, @samp{c} stands for Chinese characters and @samp{g}
table. You can see the list of all the currently defined categories stands for Greek characters. You can see the list of all the
with @kbd{M-x describe-categories @key{RET}}. You can also define currently defined categories with @w{@kbd{M-x describe-categories
your own categories in addition to the standard ones using the @key{RET}}}. You can also define your own categories in addition to
@code{define-category} function (@pxref{Categories}). the standard ones using the @code{define-category} function
(@pxref{Categories}).
@item \C@var{c} @item \C@var{code}
matches any character whose category is not @var{c}. matches any character whose category is not @var{code}.
@end table @end table
The following regular expression constructs match the empty string---that is, The following regular expression constructs match the empty string---that is,
they don't use up any characters---but whether they match depends on the they don't consume any characters---but whether they match depends on the
context. For all, the beginning and end of the accessible portion of context. For all, the beginning and end of the accessible portion of
the buffer are treated as if they were the actual beginning and end of the buffer are treated as if they were the actual beginning and end of
the buffer. the buffer.

View file

@ -21,6 +21,7 @@ reading) or where to put it (if printing).
* Output Streams:: Various data types that can be used as output streams. * Output Streams:: Various data types that can be used as output streams.
* Output Functions:: Functions to print Lisp objects as text. * Output Functions:: Functions to print Lisp objects as text.
* Output Variables:: Variables that control what the printing functions do. * Output Variables:: Variables that control what the printing functions do.
* Output Overrides:: Overriding output variables.
@end menu @end menu
@node Streams Intro @node Streams Intro
@ -634,7 +635,7 @@ characters are used. @code{print} returns @var{object}. For example:
@end example @end example
@end defun @end defun
@defun prin1 object &optional stream @defun prin1 object &optional stream overrides
This function outputs the printed representation of @var{object} to This function outputs the printed representation of @var{object} to
@var{stream}. It does not print newlines to separate output as @var{stream}. It does not print newlines to separate output as
@code{print} does, but it does use quoting characters just like @code{print} does, but it does use quoting characters just like
@ -649,6 +650,10 @@ This function outputs the printed representation of @var{object} to
@result{} " came back" @result{} " came back"
@end group @end group
@end example @end example
If @var{overrides} is non-@code{nil}, it should either be @code{t}
(which tells @code{prin1} to use the defaults for all printer related
variables), or a list of settings. @xref{Output Overrides}, for details.
@end defun @end defun
@defun princ object &optional stream @defun princ object &optional stream
@ -694,7 +699,7 @@ newline character first, which enables you to display incomplete
lines. lines.
@end defun @end defun
@defun prin1-to-string object &optional noescape @defun prin1-to-string object &optional noescape overrides
@cindex object to string @cindex object to string
This function returns a string containing the text that @code{prin1} This function returns a string containing the text that @code{prin1}
would have printed for the same argument. would have printed for the same argument.
@ -708,6 +713,10 @@ would have printed for the same argument.
(prin1-to-string (mark-marker)) (prin1-to-string (mark-marker))
@result{} "#<marker at 2773 in strings.texi>" @result{} "#<marker at 2773 in strings.texi>"
@end group @end group
If @var{overrides} is non-@code{nil}, it should either be @code{t}
(which tells @code{prin1} to use the defaults for all printer related
variables), or a list of settings. @xref{Output Overrides}, for details.
@end example @end example
If @var{noescape} is non-@code{nil}, that inhibits use of quoting If @var{noescape} is non-@code{nil}, that inhibits use of quoting
@ -971,3 +980,84 @@ Letter, Number, Punctuation, Symbol and Private-use
(@pxref{Character Properties}), as well as the control characters (@pxref{Character Properties}), as well as the control characters
having their own escape syntax such as newline. having their own escape syntax such as newline.
@end defvar @end defvar
@node Output Overrides
@section Overriding Output Variables
@cindex overrides, in output functions
@cindex output variables, overriding
The previous section (@pxref{Output Functions}) lists the numerous
variables that control how the Emacs Lisp printer formats data for
outputs. These are generally available for users to change, but
sometimes you want to output data in the default format, or override
the user settings in some other way. For instance, if you're storing
Emacs Lisp data in a file, you don't want that data to be shortened by
a @code{print-length} setting.
The @code{prin1} and @code{prin1-to-string} functions therefore have
an optional @var{overrides} argument. This argument can either be
@code{t} (which means that all printing variables should be reset to
the default values), or a list of settings for some of the variables.
Each element in the list can be either @code{t} (which means ``reset
to defaults'', and will usually be the first element of the list), or
a pair whose @code{car} is a symbol that stands for an output variable
and whose @code{cdr} is the value for that variable.
For instance, this prints using nothing but defaults:
@lisp
(prin1 object nil t)
@end lisp
This prints @var{object} using the current printing settings, but
overrides the value of @code{print-length} to be 5:
@lisp
(prin1 object nil '((length . 5)))
@end lisp
And finally, this prints @var{object} using only default settings, but
with @code{print-length} bound to 5:
@lisp
(prin1 object nil '(t (length . 5)))
@end lisp
Below is a list of symbols that can be used, and which variables they
map to:
@table @code
@item length
This overrides @code{print-length}.
@item level
This overrides @code{print-level}.
@item circle
This overrides @code{print-circle}.
@item quoted
This overrides @code{print-quoted}.
@item escape-newlines
This overrides @code{print-escape-newlines}.
@item escape-control-characters
This overrides @code{print-escape-control-characters}.
@item escape-nonascii
This overrides @code{print-escape-nonascii}.
@item escape-multibyte
This overrides @code{print-escape-multibyte}.
@item charset-text-property
This overrides @code{print-charset-text-property}.
@item unreadeable-function
This overrides @code{print-unreadable-function}.
@item gensym
This overrides @code{print-gensym}.
@item continuous-numbering
This overrides @code{print-continuous-numbering}.
@item number-table
This overrides @code{print-number-table}.
@item float-format
This overrides @code{float-output-format}.
@item integers-as-characters
This overrides @code{print-integers-as-characters}.
@end table
In the future, more overrides may be offered that do not map directly
to a variable, but can only be used via this parameter.

View file

@ -443,12 +443,12 @@ strings.
@end defun @end defun
@defun string-pad string length &optional padding start @defun string-pad string length &optional padding start
Pad @var{string} to the be of @var{length} using @var{padding} as the Pad @var{string} to be of the given @var{length} using @var{padding}
padding character (defaulting to the space character). If as the padding character. @var{padding} defaults to the space
@var{string} is shorter than @var{length}, no padding is done. If character. If @var{string} is longer than @var{length}, no padding is
@var{start} is @code{nil} (or not present), the padding is done to the done. If @var{start} is @code{nil} or omitted, the padding is
end of the string, and if it's non-@code{nil}, to the start of the appended to the characters of @var{string}, and if it's
string. non-@code{nil}, the padding is prepended to @var{string}'s characters.
@end defun @end defun
@defun string-chop-newline string @defun string-chop-newline string
@ -464,23 +464,29 @@ Remove the final newline, if any, from @var{string}.
described in this section. @xref{Mutability}. described in this section. @xref{Mutability}.
The most basic way to alter the contents of an existing string is with The most basic way to alter the contents of an existing string is with
@code{aset} (@pxref{Array Functions}). @code{(aset @var{string} @code{aset} (@pxref{Array Functions}). @w{@code{(aset @var{string}
@var{idx} @var{char})} stores @var{char} into @var{string} at index @var{idx} @var{char})}} stores @var{char} into @var{string} at character
@var{idx}. Each character occupies one or more bytes, and if @var{char} index @var{idx}. It will automatically convert a pure-@acronym{ASCII}
needs a different number of bytes from the character already present at @var{string} to a multibyte string (@pxref{Text Representations}) if
that index, @code{aset} signals an error. needed, but we recommend to always make sure @var{string} is multibyte
(e.g., by using @code{string-to-multibyte}, @pxref{Converting
Representations}), if @var{char} is a non-@acronym{ASCII} character, not
a raw byte.
A more powerful function is @code{store-substring}: A more powerful function is @code{store-substring}:
@defun store-substring string idx obj @defun store-substring string idx obj
This function alters part of the contents of the string @var{string}, by This function alters part of the contents of the specified @var{string},
storing @var{obj} starting at index @var{idx}. The argument @var{obj} by storing @var{obj} starting at character index @var{idx}. The
may be either a character or a (smaller) string. argument @var{obj} may be either a character (in which case the function
behaves exactly as @code{aset}) or a (smaller) string. If @var{obj}
is a multibyte string, we recommend to make sure @var{string} is also
multibyte, even if it's pure-@acronym{ASCII}.
Since it is impossible to change the length of an existing string, it is Since it is impossible to change the number of characters in an
an error if @var{obj} doesn't fit within @var{string}'s actual length, existing string, it is en error if @var{obj} consists of more
or if any new character requires a different number of bytes from the characters than would fit in @var{string} starting at character index
character currently present at that point in @var{string}. @var{idx}.
@end defun @end defun
To clear out a string that contained a password, use To clear out a string that contained a password, use
@ -856,9 +862,7 @@ between 2 and 16 (inclusive), and integers are converted in that base.
If @var{base} is @code{nil}, then base ten is used. Floating-point If @var{base} is @code{nil}, then base ten is used. Floating-point
conversion only works in base ten; we have not implemented other conversion only works in base ten; we have not implemented other
radices for floating-point numbers, because that would be much more radices for floating-point numbers, because that would be much more
work and does not seem useful. If @var{string} looks like an integer work and does not seem useful.
but its value is too large to fit into a Lisp integer,
@code{string-to-number} returns a floating-point result.
The parsing skips spaces and tabs at the beginning of @var{string}, The parsing skips spaces and tabs at the beginning of @var{string},
then reads as much of @var{string} as it can interpret as a number in then reads as much of @var{string} as it can interpret as a number in
@ -1350,7 +1354,7 @@ given width, if specified.
This flag converts the substituted text to upper case (@pxref{Case This flag converts the substituted text to upper case (@pxref{Case
Conversion}). Conversion}).
@item _ @item _@r{ (underscore)}
This flag converts the substituted text to lower case (@pxref{Case This flag converts the substituted text to lower case (@pxref{Case
Conversion}). Conversion}).
@end table @end table

View file

@ -1034,6 +1034,9 @@ text in @var{string} according to the @code{yank-handler} text
property, as well as the variables @code{yank-handled-properties} and property, as well as the variables @code{yank-handled-properties} and
@code{yank-excluded-properties} (see below), before inserting the @code{yank-excluded-properties} (see below), before inserting the
result into the current buffer. result into the current buffer.
@var{string} will be run through @code{yank-transform-functions} (see
below) before inserting.
@end defun @end defun
@defun insert-buffer-substring-as-yank buf &optional start end @defun insert-buffer-substring-as-yank buf &optional start end
@ -1108,6 +1111,23 @@ or specifying key bindings. It takes effect after
@code{yank-handled-properties}. @code{yank-handled-properties}.
@end defopt @end defopt
@defvar yank-transform-functions
This variable is a list of functions. Each function is called (in
order) with the string to be yanked as the argument, and should
return a (possibly transformed) string. This variable can be set
globally, but can also be used to create new commands that are
variations on @code{yank}. For instance, to create a command that
works like @code{yank}, but cleans up whitespace before inserting, you
could say something like:
@lisp
(defun yank-with-clean-whitespace ()
(interactive)
(let ((yank-transform-functions
'(string-clean-whitespace)))
(call-interactively #'yank)))
@end lisp
@end defvar
@node Yank Commands @node Yank Commands
@subsection Functions for Yanking @subsection Functions for Yanking

View file

@ -694,26 +694,24 @@ starting double-quote is not part of the string!
@cindex curly quotes @cindex curly quotes
@cindex curved quotes @cindex curved quotes
When a documentation string refers to a Lisp symbol, write it as it When a documentation string refers to a Lisp symbol, write it as it
would be printed (which usually means in lower case), surrounding it would be printed (which usually means in lower case), with a grave
with curved single quotes (@t{..}). There are two exceptions: write accent @samp{`} before and apostrophe @samp{'} after it. There are
@code{t} and @code{nil} without surrounding punctuation. For example: two exceptions: write @code{t} and @code{nil} without surrounding
punctuation. For example:
@example @example
CODE can be lambda, nil, or t. CODE can be `lambda', nil, or t.
@end example @end example
@noindent Note that when Emacs displays these doc strings, Emacs will usually
@xref{Quotation Marks,,, emacs, The GNU Emacs Manual}, for how to display @samp{`} (grave accent) as @samp{} (left single quotation
enter curved single quotes. mark) and @samp{'} (apostrophe) as @samp{} (right single quotation
mark), if the display supports displaying these characters.
Documentation strings can also use an older single-quoting convention, @xref{Keys in Documentation}. (Some previous versions of this section
which quotes symbols with grave accent @t{`} and apostrophe recommended using the non-@acronym{ASCII} single quotation marks
@t{'}: @t{`like-this'} rather than @t{like-this}. This directly in doc strings, but this is now discouraged, since that leads
older convention was designed for now-obsolete displays in which grave to broken help string displays on terminals that don't support
accent and apostrophe were mirror images. displaying those characters.)
Documentation using this convention is converted to the user's
preferred format when it is copied into a help buffer. @xref{Keys in
Documentation}.
@cindex hyperlinks in documentation strings @cindex hyperlinks in documentation strings
Help mode automatically creates a hyperlink when a documentation string Help mode automatically creates a hyperlink when a documentation string

View file

@ -527,10 +527,11 @@ If @var{symbol} has a buffer-local binding in the current buffer,
rather than the buffer-local binding. It sets the default value if rather than the buffer-local binding. It sets the default value if
the default value is void. @xref{Buffer-Local Variables}. the default value is void. @xref{Buffer-Local Variables}.
If @var{symbol} is already lexically bound (e.g., if the @code{defvar} If @var{symbol} is already let bound (e.g., if the @code{defvar}
form occurs in a @code{let} form with lexical binding enabled), then form occurs in a @code{let} form), then @code{defvar} sets the toplevel
@code{defvar} sets the dynamic value. The lexical binding remains in default value, like @code{set-default-toplevel-value}.
effect until its binding construct exits. @xref{Variable Scoping}. The let binding remains in effect until its binding construct exits.
@xref{Variable Scoping}.
@cindex @code{eval-defun}, and @code{defvar} forms @cindex @code{eval-defun}, and @code{defvar} forms
@cindex @code{eval-last-sexp}, and @code{defvar} forms @cindex @code{eval-last-sexp}, and @code{defvar} forms

View file

@ -759,15 +759,6 @@ column and total width (@pxref{Coordinates and Windows}). The optional
argument @var{round} behaves as it does for @code{window-total-height}. argument @var{round} behaves as it does for @code{window-total-height}.
@end defun @end defun
@defun window-max-characters-per-line &optional window face
The maximum width of a line that can be displayed in a window (without
breaking the line) depends on many things, like the font used on the
line, and whether there are fringes around the window. This
convenience function can be used to calculate that number. If
@var{window} isn't given, this defaults to the currently selected
window. if @var{var} isn't given, the @code{default} face is used.
@end defun
@defun window-total-size &optional window horizontal round @defun window-total-size &optional window horizontal round
This function returns either the total height in lines or the total This function returns either the total height in lines or the total
width in columns of the window @var{window}. If @var{horizontal} is width in columns of the window @var{window}. If @var{horizontal} is
@ -838,14 +829,18 @@ This function returns the height, in lines, of the body of window
@var{window}. If @var{window} is omitted or @code{nil}, it defaults to @var{window}. If @var{window} is omitted or @code{nil}, it defaults to
the selected window; otherwise it must be a live window. the selected window; otherwise it must be a live window.
If the optional argument @var{pixelwise} is non-@code{nil}, this The optional argument @var{pixelwise} defines the units to use for the
function returns the body height of @var{window} counted in pixels. height. If @code{nil}, return the body height of @var{window} in
characters, rounded down to the nearest integer, if necessary. This
means that if a line at the bottom of the text area is only partially
visible, that line is not counted. It also means that the height of a
window's body can never exceed its total height as returned by
@code{window-total-height}.
If @var{pixelwise} is @code{nil}, the return value is rounded down to If @var{pixelwise} is @code{remap} and the default face is remapped
the nearest integer, if necessary. This means that if a line at the (@pxref{Face Remapping}), use the remapped face to determine the
bottom of the text area is only partially visible, that line is not character height. For any other non-@code{nil} value, return the
counted. It also means that the height of a window's body can never height in pixels.
exceed its total height as returned by @code{window-total-height}.
@end defun @end defun
@cindex window body width @cindex window body width
@ -866,14 +861,18 @@ This function returns the width, in columns, of the body of window
@var{window}. If @var{window} is omitted or @code{nil}, it defaults to @var{window}. If @var{window} is omitted or @code{nil}, it defaults to
the selected window; otherwise it must be a live window. the selected window; otherwise it must be a live window.
If the optional argument @var{pixelwise} is non-@code{nil}, this The optional argument @var{pixelwise} defines the units to use for the
function returns the body width of @var{window} in units of pixels. width. If @code{nil}, return the body width of @var{window} in
characters, rounded down to the nearest integer, if necessary. This
means that if a column on the right of the text area is only partially
visible, that column is not counted. It also means that the width of
a window's body can never exceed its total width as returned by
@code{window-total-width}.
If @var{pixelwise} is @code{nil}, the return value is rounded down to If @var{pixelwise} is @code{remap} and the default face is remapped
the nearest integer, if necessary. This means that if a column on the (@pxref{Face Remapping}), use the remapped face to determine the
right of the text area is only partially visible, that column is not character width. For any other non-@code{nil} value, return the width
counted. It also means that the width of a window's body can never in pixels.
exceed its total width as returned by @code{window-total-width}.
@end defun @end defun
@cindex window body size @cindex window body size
@ -2845,6 +2844,11 @@ the function specified in @code{pop-up-frame-function}
the newly created frame's parameters. the newly created frame's parameters.
@end defun @end defun
@defun display-buffer-full-frame buffer alist
This function displays the buffer on the current frame, deleting all
other windows so that it takes up the full frame.
@end defun
@defun display-buffer-in-child-frame buffer alist @defun display-buffer-in-child-frame buffer alist
This function tries to display @var{buffer} in a child frame This function tries to display @var{buffer} in a child frame
(@pxref{Child Frames}) of the selected frame, either reusing an (@pxref{Child Frames}) of the selected frame, either reusing an
@ -3300,6 +3304,13 @@ window has at least that many columns. If the value is @code{nil},
that means not to split this way. that means not to split this way.
@end defopt @end defopt
@defopt display-buffer-avoid-small-windows
If non-@code{nil}, this should be a number. Windows that have fewer
lines than that will be avoided when choosing an existing window. The
value is interpreted in units of the frame's canonical line height,
like @code{window-total-height} does (@pxref{Window Sizes}).
@end defopt
@defopt even-window-sizes @defopt even-window-sizes
This variable, if non-@code{nil}, causes @code{display-buffer} to even This variable, if non-@code{nil}, causes @code{display-buffer} to even
window sizes whenever it reuses an existing window, and that window is window sizes whenever it reuses an existing window, and that window is
@ -4173,6 +4184,13 @@ ignore this option, for example, when there is only one buffer left
these functions can switch to. these functions can switch to.
@end defopt @end defopt
@defopt switch-to-prev-buffer-skip-regexp
This user option should be either a regular expression or a list of
regular expressions. Buffers whose names match one of those regular
expressions will be ignored by @code{switch-to-prev-buffer} and
@code{switch-to-next-buffer} (except when there's no other buffer to
switch to).
@end defopt
@node Dedicated Windows @node Dedicated Windows
@section Dedicated Windows @section Dedicated Windows
@ -5508,7 +5526,7 @@ pixels, rather than in units of the normal line height.
@end example @end example
@end defun @end defun
@defun set-window-vscroll window lines &optional pixels-p @defun set-window-vscroll window lines &optional pixels-p preserve-vscroll-p
This function sets @var{window}'s vertical scroll position to This function sets @var{window}'s vertical scroll position to
@var{lines}. If @var{window} is @code{nil}, the selected window is @var{lines}. If @var{window} is @code{nil}, the selected window is
used. The argument @var{lines} should be zero or positive; if not, it used. The argument @var{lines} should be zero or positive; if not, it
@ -5530,6 +5548,12 @@ The return value is the result of this rounding.
If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of
pixels. In this case, the return value is @var{lines}. pixels. In this case, the return value is @var{lines}.
Normally, the vscroll does not take effect on windows that aren't the
@code{minibuffer-scroll-window} or the selected window when the
mini-window is resized (@pxref{Minibuffer Windows}). This ``frozen''
behavior is disabled when the @var{preserve-vscroll-p} parameter is
non-@code{nil}, which means to set the vscroll as usual.
@end defun @end defun
@defvar auto-window-vscroll @defvar auto-window-vscroll
@ -6123,11 +6147,10 @@ configuration on the current frame.
This function returns @code{t} if @var{object} is a window configuration. This function returns @code{t} if @var{object} is a window configuration.
@end defun @end defun
@defun compare-window-configurations config1 config2 @defun window-configuration-equal-p config1 config2
This function compares two window configurations as regards the This function says whether two window configurations have the same
structure of windows, but ignores the values of point and the window layout, but ignores the values of point and the saved scrolling
saved scrolling positions---it can return @code{t} even if those positions---it can return @code{t} even if those aspects differ.
aspects differ.
@end defun @end defun
@defun window-configuration-frame config @defun window-configuration-frame config

View file

@ -1,5 +1,5 @@
.\" See section COPYING for copyright and redistribution information. .\" See section COPYING for copyright and redistribution information.
.TH EMACS 1 "2021-09-28" "GNU Emacs @version@" "GNU" .TH EMACS 1 "2022-06-07" "GNU Emacs @version@" "GNU"
. .
. .
.SH NAME .SH NAME
@ -117,6 +117,10 @@ Load
.IR user 's .IR user 's
init file. init file.
.TP .TP
.BI \-\-init\-directory= "directory"
Start emacs with user-emacs-directory set to
.IR directory .
.TP
.BI \-t " file\fR,\fP " \-\-terminal= "file" .BI \-t " file\fR,\fP " \-\-terminal= "file"
Use specified Use specified
.I file .I file

View file

@ -1,5 +1,5 @@
.\" See section COPYING for copyright and redistribution information. .\" See section COPYING for copyright and redistribution information.
.TH ETAGS 1 "2021-03-30" "GNU Tools" "GNU" .TH ETAGS 1 "2022-06-10" "GNU Tools" "GNU"
.de BP .de BP
.sp .sp
.ti -.2i .ti -.2i
@ -122,7 +122,9 @@ current file. Only \fBetags\fP accepts this option.
.B \-I, \-\-ignore\-indentation .B \-I, \-\-ignore\-indentation
Don't rely on indentation as much as we normally do. Currently, this Don't rely on indentation as much as we normally do. Currently, this
means not to assume that a closing brace in the first column is the means not to assume that a closing brace in the first column is the
final brace of a function or structure definition in C and C++. final brace of a function or structure definition in C and C++. This
is important for code that doesn't observe the GNU Coding conventions
of placing only top-level braces in column zero.
.TP .TP
\fB\-l\fP \fIlanguage\fP, \fB\-\-language=\fIlanguage\fP \fB\-l\fP \fIlanguage\fP, \fB\-\-language=\fIlanguage\fP
Parse the following files according to the given language. More than Parse the following files according to the given language. More than

View file

@ -795,13 +795,7 @@ and interface. Example:
(dbus-get-all-managed-objects (dbus-get-all-managed-objects
:session "org.gnome.SettingsDaemon" "/") :session "org.gnome.SettingsDaemon" "/")
@result{} (("/org/gnome/SettingsDaemon/MediaKeys" @result{} (("/org/gnome/SettingsDaemon/Power"
("org.gnome.SettingsDaemon.MediaKeys")
("org.freedesktop.DBus.Peer")
("org.freedesktop.DBus.Introspectable")
("org.freedesktop.DBus.Properties")
("org.freedesktop.DBus.ObjectManager"))
("/org/gnome/SettingsDaemon/Power"
("org.gnome.SettingsDaemon.Power.Keyboard") ("org.gnome.SettingsDaemon.Power.Keyboard")
("org.gnome.SettingsDaemon.Power.Screen") ("org.gnome.SettingsDaemon.Power.Screen")
("org.gnome.SettingsDaemon.Power" ("org.gnome.SettingsDaemon.Power"

View file

@ -1742,23 +1742,6 @@ You will need an implementation of TeX for Windows.
A number of implementations are listed on the A number of implementations are listed on the
@uref{http://www.tug.org/interest.html#free, TeX Users Group} website. @uref{http://www.tug.org/interest.html#free, TeX Users Group} website.
@menu
* AUCTeX::
@end menu
@node AUCTeX
@subsection AUCTeX
@cindex auctex, precompiled for Windows
@cindex latex
@cindex preview-latex
AUCTeX is an Emacs package for writing LaTeX files, which also
includes preview-latex, an Emacs mode for previewing the formatted
contents of LaTeX documents. Pre-compiled versions for Windows are
available from
@uref{https://www.gnu.org/software/auctex/download-for-windows.html, the
AUCTeX site}.
@node Spell check @node Spell check
@section How do I perform spell checks? @section How do I perform spell checks?
@cindex spell checking @cindex spell checking

View file

@ -9,10 +9,9 @@
@copying @copying
Copyright @copyright{} 2001--2022 Free Software Foundation, Inc.@* Copyright @copyright{} 2001--2022 Free Software Foundation, Inc.@*
Copyright @copyright{} 1994, 1995, 1996, 1997, 1998, 1999, 2000 Copyright @copyright{} 1994--2000 Reuven M. Lerner@*
Reuven M. Lerner@* Copyright @copyright{} 1992--1993 Steven Byrnes@*
Copyright @copyright{} 1992, 1993 Steven Byrnes@* Copyright @copyright{} 1990--1992 Joseph Brian Wells@*
Copyright @copyright{} 1990, 1991, 1992 Joseph Brian Wells@*
@quotation @quotation
This list of frequently asked questions about GNU Emacs with answers This list of frequently asked questions about GNU Emacs with answers
@ -882,10 +881,11 @@ divergent TECO command sets and key bindings at MIT, and completed by
RMS. RMS.
Many people have said that TECO code looks a lot like line noise; you Many people have said that TECO code looks a lot like line noise; you
can read more at @uref{news:alt.lang.teco}. Someone has written a TECO can read more on
implementation in Emacs Lisp (to find it, see @ref{Packages that do not @uref{https://en.wikipedia.org/wiki/TECO_(text_editor), Wikipedia}.
come with Emacs}); it would be an interesting project to run the Someone has written a TECO implementation in Emacs Lisp (to find it,
original TECO Emacs inside of Emacs. see @ref{Packages that do not come with Emacs}); it would be an
interesting project to run the original TECO Emacs inside of Emacs.
@cindex Why Emacs? @cindex Why Emacs?
For some not-so-serious alternative reasons for Emacs to have that For some not-so-serious alternative reasons for Emacs to have that
@ -3712,7 +3712,6 @@ information is available from
* Compose Character:: * Compose Character::
* Binding combinations of modifiers and function keys:: * Binding combinations of modifiers and function keys::
* Meta key does not work in xterm:: * Meta key does not work in xterm::
* SPC no longer completes file names::
@end menu @end menu
@node Binding keys to commands @node Binding keys to commands
@ -4157,10 +4156,6 @@ If there is an @code{rlogin} connection between @code{xterm} and Emacs, the
@samp{-8} argument may need to be given to rlogin to make it pass all 8 bits @samp{-8} argument may need to be given to rlogin to make it pass all 8 bits
of every character. of every character.
@item
If Emacs is running on Ultrix, it is reported that evaluating
@code{(set-input-mode t nil)} helps.
@item @item
If all else fails, you can make @code{xterm} generate @kbd{@key{ESC} W} when If all else fails, you can make @code{xterm} generate @kbd{@key{ESC} W} when
you type @kbd{M-W}, which is the same conversion Emacs would make if it you type @kbd{M-W}, which is the same conversion Emacs would make if it
@ -4186,22 +4181,6 @@ You might have to replace @samp{Meta} with @samp{Alt}.
@end itemize @end itemize
@node SPC no longer completes file names
@section Why doesn't @key{SPC} complete file names anymore?
@cindex @kbd{SPC} file name completion
Starting with Emacs 22.1, @kbd{SPC} no longer completes file names in
the minibuffer, so that file names with embedded spaces could be typed
without the need to quote the spaces.
You can get the old behavior by binding @kbd{SPC} to
@code{minibuffer-complete-word} in the minibuffer, as follows:
@lisp
(define-key minibuffer-local-filename-completion-map (kbd "SPC")
'minibuffer-complete-word)
@end lisp
@c ------------------------------------------------------------ @c ------------------------------------------------------------
@node Alternate character sets @node Alternate character sets
@chapter Alternate character sets @chapter Alternate character sets
@ -4295,75 +4274,6 @@ add the following line to your @file{~/.emacs}:
(setq ps-multibyte-buffer 'bdf-font-except-latin) (setq ps-multibyte-buffer 'bdf-font-except-latin)
@end lisp @end lisp
A few additional steps are necessary for MS-Windows; they are listed
below.
First, make sure @emph{all} the directories with BDF font files are
mentioned in @code{bdf-directory-list}. On Unix and GNU/Linux
systems, one normally runs @kbd{make install} to install the BDF fonts
in the same directory. By contrast, Windows users typically don't run
the Intlfonts installation command, but unpack the distribution in
some directory, which leaves the BDF fonts in its subdirectories. For
example, assume that you unpacked Intlfonts in @file{C:/Intlfonts};
then you should set @code{bdf-directory-list} as follows:
@lisp
(setq bdf-directory-list
'("C:/Intlfonts/Asian"
"C:/Intlfonts/Chinese" "C:/Intlfonts/Chinese.X"
"C:/Intlfonts/Chinese.BIG" "C:/Intlfonts/Ethiopic"
"C:/Intlfonts/European" "C:/Intlfonts/European.BIG"
"C:/Intlfonts/Japanese" "C:/Intlfonts/Japanese.X"
"C:/Intlfonts/Japanese.BIG" "C:/Intlfonts/Korean.X"
"C:/Intlfonts/Misc"))
@end lisp
@cindex @code{w32-bdf-filename-alist}
@cindex @code{w32-find-bdf-fonts}
Next, you need to set up the variable @code{w32-bdf-filename-alist} to
an alist of the BDF fonts and their corresponding file names.
Assuming you have set @code{bdf-directory-list} to name all the
directories with the BDF font files, the following Lisp snippet will
set up @code{w32-bdf-filename-alist}:
@lisp
(setq w32-bdf-filename-alist
(w32-find-bdf-fonts bdf-directory-list))
@end lisp
Now, create fontsets for the BDF fonts:
@smallexample
(create-fontset-from-fontset-spec
"-*-fixed-medium-r-normal-*-16-*-*-*-c-*-fontset-bdf,
japanese-jisx0208:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1983-*,
katakana-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*,
japanese-jisx0208-1978:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1978-*,
thai-tis620:-misc-fixed-medium-r-normal--16-160-72-72-m-80-tis620.2529-1,
lao:-misc-fixed-medium-r-normal--16-160-72-72-m-80-MuleLao-1,
tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1,
ethiopic:-Admas-Ethiomx16f-Medium-R-Normal--16-150-100-100-M-160-Ethiopic-Unicode,
tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0")
@end smallexample
Many of the international bdf fonts from Intlfonts are type 0, and
therefore need to be added to font-encoding-alist:
@lisp
(setq font-encoding-alist
(append '(("MuleTibetan-0" (tibetan . 0))
("GB2312" (chinese-gb2312 . 0))
("JISX0208" (japanese-jisx0208 . 0))
("JISX0212" (japanese-jisx0212 . 0))
("VISCII" (vietnamese-viscii-lower . 0))
("KSC5601" (korean-ksc5601 . 0))
("MuleArabic-0" (arabic-digit . 0))
("MuleArabic-1" (arabic-1-column . 0))
("MuleArabic-2" (arabic-2-column . 0)))
font-encoding-alist))
@end lisp
You can now use the Emacs font menu to select the @samp{bdf: 16-dot medium} You can now use the Emacs font menu to select the @samp{bdf: 16-dot medium}
fontset, or you can select it by setting the default font in your fontset, or you can select it by setting the default font in your
@file{~/.emacs}: @file{~/.emacs}:
@ -4372,7 +4282,6 @@ fontset, or you can select it by setting the default font in your
(set-frame-font "fontset-bdf") (set-frame-font "fontset-bdf")
@end lisp @end lisp
@c ------------------------------------------------------------ @c ------------------------------------------------------------
@node Mail and news @node Mail and news
@chapter Mail and news @chapter Mail and news

View file

@ -1758,14 +1758,6 @@ alias arg=blah
function arg () @{ blah $* @} function arg () @{ blah $* @}
@end example @end example
@item @samp{for i in 1 2 3 @{ grep -q a b && *echo has it @} | wc -l} outputs result after prompt
In fact, piping to a process from a looping construct doesn't work in
general. If I change the call to @code{eshell-copy-handles} in
@code{eshell-rewrite-for-command} to use @code{eshell-protect}, it seems
to work, but the output occurs after the prompt is displayed. The whole
structured command thing is too complicated at present.
@item Pcomplete sometimes gets stuck @item Pcomplete sometimes gets stuck
You press @key{TAB}, but no completions appear, even though the You press @key{TAB}, but no completions appear, even though the

View file

@ -713,6 +713,7 @@ be passed to the program.
@node Inline Query Expansion @node Inline Query Expansion
@section Inline Query Expansion @section Inline Query Expansion
@subsection Inline Query Expansion Using a Key Binding
Inline query expansion is a powerful method to get completion from Inline query expansion is a powerful method to get completion from
your directory servers. The most common usage is for expanding names your directory servers. The most common usage is for expanding names
@ -885,6 +886,29 @@ An error is signaled. The expansion aborts.
Default is @code{select} Default is @code{select}
@end defvar @end defvar
@subsection Inline Query Expansion Using completion-at-point
In addition to providing a dedicated EUDC function for binding to a
key shortcut (@pxref{Inline Query Expansion}), EUDC also provides a
function to contribute search results to the Emacs in-buffer
completion system available via the function
@code{completion-at-point} (@pxref{Identifier
Inquiries,,,maintaining}) in @code{message-mode} buffers
(@pxref{Top,Message,, message, Message}). When using this mechanism,
queries are made in the multi-server query mode of operation
(@pxref{Multi-server Queries}).
When a buffer in @code{message-mode} is created, EUDC's inline
expansion function is automatically added to the variable
@code{completion-at-point-functions}. As a result, whenever
@code{completion-at-point} is invoked in a @code{message-mode} buffer,
EUDC will be queried for email addresses matching the words before
point. Since this will be useful only when editing specific message
header fields that require specifying one or more email addresses, an
additional check is performed whether point is actually in one of
those header fields. Thus, any matching email addresses will be
offered for completion in suitable message header fields only, and not
in other places, like for example the body of the message.
@node The Server Hotlist @node The Server Hotlist

View file

@ -29685,10 +29685,9 @@ Gnus not to use @acronym{NOV}.
As the variables for the other back ends, there are As the variables for the other back ends, there are
@code{nndiary-nov-is-evil}, @code{nndir-nov-is-evil}, @code{nndiary-nov-is-evil}, @code{nndir-nov-is-evil},
@code{nnfolder-nov-is-evil}, @code{nnimap-nov-is-evil}, @code{nnfolder-nov-is-evil}, @code{nnml-nov-is-evil}, and
@code{nnml-nov-is-evil}, and @code{nnspool-nov-is-evil}. Note that a @code{nnspool-nov-is-evil}. Note that a non-@code{nil} value for
non-@code{nil} value for @code{gnus-nov-is-evil} overrides all those @code{gnus-nov-is-evil} overrides all those variables.
variables.
@end table @end table

View file

@ -5,9 +5,9 @@
#+options: ':t toc:nil author:t email:t num:t #+options: ':t toc:nil author:t email:t num:t
#+startup: content #+startup: content
#+macro: stable-version 2.3.0 #+macro: stable-version 2.4.0
#+macro: release-date 2022-04-01 #+macro: release-date 2022-06-01
#+macro: development-version 2.4.0-dev #+macro: development-version 2.5.0-dev
#+macro: file @@texinfo:@file{@@$1@@texinfo:}@@ #+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
#+macro: space @@texinfo:@: @@ #+macro: space @@texinfo:@: @@
#+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@ #+macro: kbd @@texinfo:@kbd{@@$1@@texinfo:}@@
@ -34,6 +34,10 @@ explicitly marked as such.
Current development target is {{{development-version}}}. Current development target is {{{development-version}}}.
+ Homepage: https://protesilaos.com/emacs/modus-themes.
+ Git repository: https://git.sr.ht/~protesilaos/modus-themes.
+ Mailing list: https://lists.sr.ht/~protesilaos/modus-themes.
#+toc: headlines 8 insert TOC here, with eight headline levels #+toc: headlines 8 insert TOC here, with eight headline levels
* COPYING * COPYING
@ -165,14 +169,10 @@ The themes are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][
The ~modus-themes~ package is available from the GNU ELPA archive, which The ~modus-themes~ package is available from the GNU ELPA archive, which
is configured by default. is configured by default.
Prior to querying any package archive, make sure to have updated the Prior to querying any package archive, make sure to update the index,
index, with {{{kbd(M-x package-refresh-contents)}}}. Then all you need to do with {{{kbd(M-x package-refresh-contents)}}}. Then all you need to do
is type {{{kbd(M-x package-install)}}} and specify the ~modus-themes~. is type {{{kbd(M-x package-install)}}} and specify the ~modus-themes~.
Note that older versions of the themes used to be distributed as
standalone packages. This practice has been discontinued starting with
version 1.0.0 of this project.
Once installed, the themes are ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]. Once installed, the themes are ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
** Install on GNU/Linux ** Install on GNU/Linux
@ -211,6 +211,34 @@ guix package -i emacs-modus-themes
They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]]. They are now ready to be used: [[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][Enable and load]].
** Dealing with byte compilation errors
:properties:
:custom_id: h:e6268471-e847-4c9d-998f-49a83257b7f1
:end:
From time to time, we receive bug reports pertaining to errors with byte
compilation. These seldom have to do with faulty code in the themes: it
might be a shortcoming of =package.el=, some regression in the current
development target of Emacs, a misconfiguration in an otherwise exotic
setup, and the like.
The common solution with a stable version of Emacs is to:
1. Delete the =modus-themes= package.
2. Close the current Emacs session.
3. Install the =modus-themes= again.
For those building Emacs directly from source, the solution may involve
reverting to an earlier commit in emacs.git.
At any rate, if you encounter such an issue please report it: we will
either fix the bug on our end if it is truly ours, or help forward it to
the relevant upstream maintainer. Whatever you do, please understand
that a build failure does not mean we are necessarily doing something
wrong.
[[#h:6536c8d5-3f98-43ab-a787-b94120e735e8][Issues you can help with]].
* Enable and load * Enable and load
:properties: :properties:
:custom_id: h:3f3c3728-1b34-437d-9d0c-b110f5b161a9 :custom_id: h:3f3c3728-1b34-437d-9d0c-b110f5b161a9
@ -4053,6 +4081,44 @@ comments are gray. Regexp constructs are adapted accordingly.
(set-face-attribute 'font-lock-warning-face nil :inherit 'modus-themes-bold :foreground red-nuanced-fg))) (set-face-attribute 'font-lock-warning-face nil :inherit 'modus-themes-bold :foreground red-nuanced-fg)))
#+end_src #+end_src
** Custom hl-todo colors
:PROPERTIES:
:CUSTOM_ID: h:2ef83a21-2f0a-441e-9634-473feb940743
:END:
The =hl-todo= package provides the user option ~hl-todo-keyword-faces~:
it specifies a pair of keyword and corresponding color value. The Modus
themes configure that option in the interest of legibility. While this
works for our purposes, users may still prefer to apply their custom
values, in which case the following approach is necessary:
#+begin_src emacs-lisp
(defun my-modus-themes-hl-todo-faces ()
(setq hl-todo-keyword-faces '(("TODO" . "#ff0000")
("HACK" . "#ffff00")
("XXX" . "#00ffff")
("NOTE" . "#ff00ff"))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces)
#+end_src
Or include a ~let~ form, if needed:
#+begin_src emacs-lisp
(defun my-modus-themes-hl-todo-faces ()
(let ((red "#ff0000")
(blue "#0000ff"))
(setq hl-todo-keyword-faces `(("TODO" . ,blue)
("HACK" . ,red)
("XXX" . ,red)
("NOTE" . ,blue)))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-hl-todo-faces)
#+end_src
Normally, we do not touch user options, though this is an exception:
otherwise the defaults are not always legible.
* Face coverage * Face coverage
:properties: :properties:
:custom_id: h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19 :custom_id: h:a9c8f29d-7f72-4b54-b74b-ddefe15d6a19
@ -4098,6 +4164,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ breakpoint (provided by the built-in {{{file(gdb-mi.el)}}} library) + breakpoint (provided by the built-in {{{file(gdb-mi.el)}}} library)
+ calendar and diary + calendar and diary
+ calfw + calfw
+ calibredb
+ centaur-tabs + centaur-tabs
+ cfrs + cfrs
+ change-log and log-view (such as ~vc-print-log~, ~vc-print-root-log~) + change-log and log-view (such as ~vc-print-log~, ~vc-print-root-log~)
@ -4112,6 +4179,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ completions + completions
+ consult + consult
+ corfu + corfu
+ corfu-quick
+ counsel* + counsel*
+ counsel-css + counsel-css
+ cov + cov
@ -4146,6 +4214,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ easy-jekyll + easy-jekyll
+ ebdb + ebdb
+ ediff + ediff
+ ein (Emacs IPython Notebook)
+ eglot + eglot
+ el-search + el-search
+ eldoc-box + eldoc-box
@ -4344,6 +4413,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ tomatinho + tomatinho
+ transient (pop-up windows such as Magit's) + transient (pop-up windows such as Magit's)
+ trashed + trashed
+ tree-sitter
+ treemacs + treemacs
+ tty-menu + tty-menu
+ tuareg + tuareg
@ -4357,6 +4427,7 @@ have lots of extensions, so the "full support" may not be 100% true…
+ visible-mark + visible-mark
+ visual-regexp + visual-regexp
+ vterm + vterm
+ vundo
+ wcheck-mode + wcheck-mode
+ web-mode + web-mode
+ wgrep + wgrep
@ -4398,6 +4469,7 @@ supported by the themes.
+ dtache + dtache
+ easy-kill + easy-kill
+ edit-indirect + edit-indirect
+ egerrit
+ elfeed-summary + elfeed-summary
+ evil-owl + evil-owl
+ flyspell-correct + flyspell-correct
@ -4432,40 +4504,6 @@ supported by the themes.
This section covers information that may be of interest to users of This section covers information that may be of interest to users of
individual packages. individual packages.
** Note on avy hints
:properties:
:custom_id: h:2fdce705-6de7-44e6-ab7f-18f59af99e01
:end:
Hints can appear everywhere, in wildly varying contexts, hence, their
appearance, by necessity, is a compromise. However, there are various
options for making them stand out. First is dimming the surroundings:
#+begin_src emacs-lisp
(setq avy-background t)
#+end_src
Dimming works well when you find it difficult to spot hints, any hint.
Second is limiting the number of faces used by hints:
#+begin_src emacs-lisp
(setq avy-lead-faces
'(avy-lead-face
avy-lead-face-1
avy-lead-face-1
avy-lead-face-1
avy-lead-face-1))
#+end_src
Limiting the number of faces works well with longer hints when you find
it difficult to identify individual hints, especially with hints
touching each other. The first character of the hint will have an
intense color, the remaining ones the same neutral color.
Third is preferring commands that produce fewer candidates. Fewer hints
is less noise: ~avy-goto-char-timer~ is an excellent alternative to
~avy-goto-char~.
** Note on calendar.el weekday and weekend colors ** Note on calendar.el weekday and weekend colors
:properties: :properties:
:custom_id: h:b2db46fb-32f4-44fd-8e11-d2b261cf51ae :custom_id: h:b2db46fb-32f4-44fd-8e11-d2b261cf51ae
@ -4495,6 +4533,72 @@ weekends uniformly.
For changes to take effect, the Calendar buffer needs to be generated For changes to take effect, the Calendar buffer needs to be generated
anew. anew.
** Note on git-gutter in Doom Emacs
:PROPERTIES:
:CUSTOM_ID: h:a195e37c-e58c-4148-b254-8ba1ed8a731a
:END:
The =git-gutter= and =git-gutter-fr= packages default to drawing bitmaps
for the indicators they display (e.g. bitmap of a plus sign for added
lines). In Doom Emacs, these bitmaps are replaced with contiguous lines
which may look nicer, but require a change to the foreground of the
relevant faces to yield the desired colour combinations.
Since this is Doom-specific, we urge users to apply changes in their
local setup. Below is some sample code, based on what we cover at
length elsewhere in this manual:
[[#h:f4651d55-8c07-46aa-b52b-bed1e53463bb][Advanced customization]].
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the themes' palette]].
#+begin_src emacs-lisp
(defun my-modus-themes-custom-faces ()
(modus-themes-with-colors
(custom-set-faces
;; Replace green with blue if you use `modus-themes-deuteranopia'.
`(git-gutter-fr:added ((,class :foreground ,green-fringe-bg)))
`(git-gutter-fr:deleted ((,class :foreground ,red-fringe-bg)))
`(git-gutter-fr:modified ((,class :foreground ,yellow-fringe-bg))))))
(add-hook 'modus-themes-after-load-theme-hook #'my-modus-themes-custom-faces)
#+end_src
If the above does not work, try this instead:
#+begin_src emacs-lisp
(after! modus-themes
(modus-themes-with-colors
(custom-set-faces
;; Replace green with blue if you use `modus-themes-deuteranopia'.
`(git-gutter-fr:added ((,class :foreground ,green-fringe-bg)))
`(git-gutter-fr:deleted ((,class :foreground ,red-fringe-bg)))
`(git-gutter-fr:modified ((,class :foreground ,yellow-fringe-bg))))))
#+end_src
Replace ~green-fringe-bg~ with ~blue-fringe-bg~ if you want to optimize
for red-green color deficiency.
[[#h:3ed03a48-20d8-4ce7-b214-0eb7e4c79abe][Option for red-green color deficiency or deuteranopia]].
** Note on php-mode multiline comments
:PROPERTIES:
:CUSTOM_ID: h:d0a3157b-9c04-46e8-8742-5fb2a7ae8798
:END:
Depending on your build of Emacs and/or the environment it runs in,
multiline comments in PHP with the =php-mode= package use the
~font-lock-doc-face~ instead of ~font-lock-comment-face~.
This seems to make all comments use the appropriate face:
#+begin_src emacs-lisp
(defun my-multine-comments ()
(setq-local c-doc-face-name 'font-lock-comment-face))
(add-hook 'php-mode-hook #'my-multine-comments)
#+end_src
** Note on underlines in compilation buffers ** Note on underlines in compilation buffers
:properties: :properties:
:custom_id: h:420f5a33-c7a9-4112-9b04-eaf2cbad96bd :custom_id: h:420f5a33-c7a9-4112-9b04-eaf2cbad96bd
@ -4594,6 +4698,17 @@ elsewhere in this document. For example:
[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the themes' palette]]. [[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the themes' palette]].
To make the line thicker, set the height to be equal to the base font
size instead of the one pixel we use. This is done by specifying a rate
instead of an absolute number, as in =:height 1.0= versus =:height 1=.
For example:
#+begin_src emacs-lisp
(modus-themes-with-colors
(custom-set-faces
`(fill-column-indicator ((,class :height 1.0 :background ,bg-inactive :foreground ,bg-inactive)))))
#+end_src
** Note on highlight-parentheses.el ** Note on highlight-parentheses.el
:PROPERTIES: :PROPERTIES:
:CUSTOM_ID: h:24bab397-dcb2-421d-aa6e-ec5bd622b913 :CUSTOM_ID: h:24bab397-dcb2-421d-aa6e-ec5bd622b913
@ -5271,8 +5386,8 @@ and hints of green give us suitable shades of purple.
Due to the need of maintaining some difference in hueness between Due to the need of maintaining some difference in hueness between
adjacent colors, it is not possible to make red, green, and yellow the adjacent colors, it is not possible to make red, green, and yellow the
primary colors, because blue could not be used to control their main colors, because blue cannot be used to control their luminance and,
luminance and, thus the relevant space would shrink considerably. thus the relevant space will shrink considerably.
[[#h:5ce7ae2e-9348-4e55-b4cf-9302345b1826][Is the contrast ratio about adjacent colors?]] [[#h:5ce7ae2e-9348-4e55-b4cf-9302345b1826][Is the contrast ratio about adjacent colors?]]
@ -5508,8 +5623,8 @@ in which you can contribute to their ongoing development.
The ~modus-operandi~ and ~modus-vivendi~ themes are built into Emacs 28. The ~modus-operandi~ and ~modus-vivendi~ themes are built into Emacs 28.
The source code of the themes is [[https://gitlab.com/protesilaos/modus-themes/][available on GitLab]], for the time The source code of the themes is [[https://git.sr.ht/~protesilaos/modus-themes][available on SourceHut]]. Or check the
being. A [[https://github.com/protesilaos/modus-themes/][mirror on GitHub]] is also on offer. [[https://gitlab.com/protesilaos/modus-themes/][GitLab mirror (former main source)]] and the [[https://github.com/protesilaos/modus-themes/][GitHub mirror]].
An HTML version of this manual is provided as an extension of the An HTML version of this manual is provided as an extension of the
[[https://protesilaos.com/emacs/modus-themes/][author's personal website]] (does not rely on any non-free code). [[https://protesilaos.com/emacs/modus-themes/][author's personal website]] (does not rely on any non-free code).
@ -5520,7 +5635,10 @@ An HTML version of this manual is provided as an extension of the
:end: :end:
#+cindex: Contributing #+cindex: Contributing
A few tasks you can help with: #+findex: modus-themes-report-bug
A few tasks you can help with by sending an email to the general
[[https://lists.sr.ht/~protesilaos/modus-themes][modus-themes public mailing list]] (or use the command
~modus-themes-report-bug~).
+ Suggest refinements to packages that are covered. + Suggest refinements to packages that are covered.
+ Report packages not covered thus far. + Report packages not covered thus far.
@ -5528,7 +5646,8 @@ A few tasks you can help with:
+ Help expand the documentation of covered-but-not-styled packages. + Help expand the documentation of covered-but-not-styled packages.
+ Suggest refinements to the color palette. + Suggest refinements to the color palette.
+ Help expand this document or any other piece of documentation. + Help expand this document or any other piece of documentation.
+ Merge requests for code refinements. + Send patches for code refinements (if you need, ask me for help with
Git---we all start out as beginners).
[[#h:111773e2-f26f-4b68-8c4f-9794ca6b9633][Patches require copyright assignment to the FSF]]. [[#h:111773e2-f26f-4b68-8c4f-9794ca6b9633][Patches require copyright assignment to the FSF]].
@ -5536,6 +5655,10 @@ It is preferable that your feedback includes some screenshots, GIFs, or
short videos, as well as further instructions to reproduce a given short videos, as well as further instructions to reproduce a given
setup. Though this is not a requirement. setup. Though this is not a requirement.
#+findex: modus-themes-version
Also consider mentioning the version of the themes you are using, such
as by invoking the command ~modus-themes-version~.
Whatever you do, bear in mind the overarching objective of the Modus Whatever you do, bear in mind the overarching objective of the Modus
themes: to keep a contrast ratio that is greater or equal to 7:1 between themes: to keep a contrast ratio that is greater or equal to 7:1 between
background and foreground colors. If a compromise is ever necessary background and foreground colors. If a compromise is ever necessary
@ -5567,7 +5690,7 @@ will send you the assignment form for your past and future changes.
Please use your full legal name (in ASCII characters) as the subject Please use your full legal name (in ASCII characters) as the subject
line of the message. line of the message.
----------------------------------------------------------------------
REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES
[What is the name of the program or package you're contributing to?] [What is the name of the program or package you're contributing to?]
@ -5619,41 +5742,44 @@ The Modus themes are a collective effort. Every bit of work matters.
Johansson, Basil L.{{{space()}}} Contovounesios, Björn Lindström, Johansson, Basil L.{{{space()}}} Contovounesios, Björn Lindström,
Carlo Zancanaro, Christian Tietze, Daniel Mendler, Eli Zaretskii, Carlo Zancanaro, Christian Tietze, Daniel Mendler, Eli Zaretskii,
Fritz Grabo, Illia Ostapyshyn, Kévin Le Gouguec, Kostadin Ninev, Fritz Grabo, Illia Ostapyshyn, Kévin Le Gouguec, Kostadin Ninev,
Madhavan Krishnan, Markus Beppler, Matthew Stevenson, Mauro Aranda, Madhavan Krishnan, Manuel Giraud, Markus Beppler, Matthew Stevenson,
Nicolas De Jaeghere, Philip Kaludercic, Pierre Téchoueyres, Rudolf Mauro Aranda, Nicolas De Jaeghere, Philip Kaludercic, Pierre
Adamkovič, Stephen Gildea, Shreyas Ragavan, Stefan Kangas, Utkarsh Téchoueyres, Rudolf Adamkovič, Stephen Gildea, Shreyas Ragavan, Stefan
Singh, Vincent Murphy, Xinglu Chen, Yuanchen Xie. Kangas, Utkarsh Singh, Vincent Murphy, Xinglu Chen, Yuanchen Xie.
+ Ideas and user feedback :: Aaron Jensen, Adam Porter, Adam Spiers, + Ideas and user feedback :: Aaron Jensen, Adam Porter, Adam Spiers,
Adrian Manea, Alex Griffin, Alex Koen, Alex Peitsinis, Alexey Shmalko, Adrian Manea, Alex Griffin, Alex Koen, Alex Peitsinis, Alexey Shmalko,
Alok Singh, Anders Johansson, André Alexandre Gomes, Antonio Hernández Alok Singh, Anders Johansson, André Alexandre Gomes, Andrew Tropin,
Blas, Arif Rezai, Augusto Stoffel, Basil L.{{{space()}}} Antonio Hernández Blas, Arif Rezai, Augusto Stoffel, Basil
Contovounesios, Burgess Chang, Christian Tietze, Christopher Dimech, L.{{{space()}}} Contovounesios, Burgess Chang, Christian Tietze,
Damien Cassou, Daniel Mendler, Dario Gjorgjevski, David Edmondson, Christopher Dimech, Christopher League, Damien Cassou, Daniel Mendler,
Davor Rotim, Divan Santana, Eliraz Kedmi, Emanuele Michele Alberto Dario Gjorgjevski, David Edmondson, Davor Rotim, Divan Santana, Eliraz
Monterosso, Farasha Euker, Feng Shu, Gautier Ponsinet, Gerry Agbobada, Kedmi, Emanuele Michele Alberto Monterosso, Farasha Euker, Feng Shu,
Gianluca Recchia, Guilherme Semente, Gustavo Barros, Hörmetjan Yiltiz, Gautier Ponsinet, Gerry Agbobada, Gianluca Recchia, Gonçalo Marrafa,
Ilja Kocken, Iris Garcia, Jeremy Friesen, Jerry Zhang, Johannes Guilherme Semente, Gustavo Barros, Hörmetjan Yiltiz, Ilja Kocken, Iris
Grødem, John Haman, Jorge Morais, Joshua O'Connor, Julio Garcia, Ivan Popovych, Jeremy Friesen, Jerry Zhang, Johannes Grødem,
C. Villasante, Kenta Usami, Kevin Fleming, Kévin Le Gouguec, Kostadin John Haman, Jorge Morais, Joshua O'Connor, Julio C. Villasante, Kenta
Ninev, Len Trigg, Lennart C. Karssen, Magne Hov, Manuel Uberti, Mark Usami, Kevin Fleming, Kévin Le Gouguec, Kostadin Ninev, Len Trigg,
Bestley, Mark Burton, Markus Beppler, Mauro Aranda, Michael Lennart C. Karssen, Magne Hov, Manuel Uberti, Mark Bestley, Mark
Burton, Markus Beppler, Mauro Aranda, Maxime Tréca, Michael
Goldenberg, Morgan Smith, Morgan Willcock, Murilo Pereira, Nicky van Goldenberg, Morgan Smith, Morgan Willcock, Murilo Pereira, Nicky van
Foreest, Nicolas De Jaeghere, Paul Poloskov, Pengji Zhang, Pete Foreest, Nicolas De Jaeghere, Paul Poloskov, Pengji Zhang, Pete
Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, Robert Kazmier, Peter Wu, Philip Kaludercic, Pierre Téchoueyres, Przemysław
Hepple, Roman Rudakov, Ryan Phillips, Rytis Paškauskas, Rudolf Kryger, Robert Hepple, Roman Rudakov, Ryan Phillips, Rytis Paškauskas,
Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška, Shreyas Rudolf Adamkovič, Sam Kleinman, Samuel Culpepper, Saša Janiška,
Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron, Thomas Heartman, Shreyas Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron, Thomas
Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz Hołubowicz, Toon Heartman, Togan Muftuoglu, Tony Zorman, Trey Merkley, Tomasz
Claes, Uri Sharf, Utkarsh Singh, Vincent Foley. As well as users: Hołubowicz, Toon Claes, Uri Sharf, Utkarsh Singh, Vincent Foley. As
Ben, CsBigDataHub1, Emacs Contrib, Eugene, Fourchaux, Fredrik, well as users: Ben, CsBigDataHub1, Emacs Contrib, Eugene, Fourchaux,
Moesasji, Nick, TheBlob42, Trey, bepolymathe, bit9tream, derek-upham, Fredrik, Moesasji, Nick, TheBlob42, Trey, bepolymathe, bit9tream,
doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn, pRot0ta1p. derek-upham, doolio, fleimgruber, gitrj95, iSeeU, jixiuf, okamsn,
pRot0ta1p.
+ Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii, Glenn + Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii,
Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core Emacs), Glenn Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core
Stefan Monnier (GNU Elpa), André Alexandre Gomes, Dimakakos Dimos, Emacs), Stefan Monnier (GNU Elpa), André Alexandre Gomes, Andrew
Morgan Smith, Nicolas Goaziou (Guix), Dhavan Vaidya (Debian). Tropin, Dimakakos Dimos, Morgan Smith, Nicolas Goaziou (Guix), Dhavan
Vaidya (Debian).
+ Inspiration for certain features :: Bozhidar Batsov (zenburn-theme), + Inspiration for certain features :: Bozhidar Batsov (zenburn-theme),
Fabrice Niessen (leuven-theme). Fabrice Niessen (leuven-theme).
@ -5663,7 +5789,7 @@ Jaeghere, and Omar Antolín Camarena for their long time contributions
and insightful commentary on key aspects of the themes' design and/or and insightful commentary on key aspects of the themes' design and/or
aspects of their functionality. aspects of their functionality.
* Meta * Other notes about the project
:properties: :properties:
:custom_id: h:13752581-4378-478c-af17-165b6e76bc1b :custom_id: h:13752581-4378-478c-af17-165b6e76bc1b
:end: :end:
@ -5688,12 +5814,16 @@ of this sort):
+ [[https://protesilaos.com/codelog/2021-06-02-modus-themes-org-agenda/][Introducing the variable modus-themes-org-agenda]] (2021-06-02) + [[https://protesilaos.com/codelog/2021-06-02-modus-themes-org-agenda/][Introducing the variable modus-themes-org-agenda]] (2021-06-02)
+ [[https://protesilaos.com/codelog/2022-01-02-review-modus-themes-org-habit-colours/][Modus themes: review of the org-habit graph colours]] (2022-01-02) + [[https://protesilaos.com/codelog/2022-01-02-review-modus-themes-org-habit-colours/][Modus themes: review of the org-habit graph colours]] (2022-01-02)
+ [[https://protesilaos.com/codelog/2022-01-03-modus-themes-port-faq/][Re: VSCode or Vim ports of the Emacs modus-themes?]] (2022-01-03) + [[https://protesilaos.com/codelog/2022-01-03-modus-themes-port-faq/][Re: VSCode or Vim ports of the Emacs modus-themes?]] (2022-01-03)
+ [[https://protesilaos.com/codelog/2022-04-20-modus-themes-case-study-avy/][Modus themes: case study on Avy faces and colour combinations]] (2022-04-20)
+ [[https://protesilaos.com/codelog/2022-04-21-modus-themes-colour-theory/][Emacs: colour theory and techniques used in the Modus themes]] (2022-04-21)
And here are the canonical sources of this project's documentation: And here are the canonical sources of this project:
+ Manual :: <https://protesilaos.com/emacs/modus-themes> + Manual :: <https://protesilaos.com/emacs/modus-themes>
+ Change Log :: <https://protesilaos.com/emacs/modus-themes-changelog> + Change Log :: <https://protesilaos.com/emacs/modus-themes-changelog>
+ Screenshots :: <https://protesilaos.com/emacs/modus-themes-pictures> + Screenshots :: <https://protesilaos.com/emacs/modus-themes-pictures>
+ Git repository :: https://git.sr.ht/~protesilaos/modus-themes
+ Mailing list :: https://lists.sr.ht/~protesilaos/modus-themes
* GNU Free Documentation License * GNU Free Documentation License
:properties: :properties:

View file

@ -12442,7 +12442,7 @@ should in principle be exportable as a Beamer presentation.
When =ignoreheading= is set, Org export ignores the entry's headline When =ignoreheading= is set, Org export ignores the entry's headline
but not its content. This is useful for inserting content between but not its content. This is useful for inserting content between
frames. It is also useful for properly closing a =column= frames. It is also useful for properly closing a =column=
environment. @end itemize environment.
#+cindex: @samp{BEAMER_ACT}, property #+cindex: @samp{BEAMER_ACT}, property
#+cindex: @samp{BEAMER_OPT}, property #+cindex: @samp{BEAMER_OPT}, property

View file

@ -4478,6 +4478,11 @@ HP-UX SD depots
@cindex @file{depot} file archive suffix @cindex @file{depot} file archive suffix
@cindex file archive suffix @file{depot} @cindex file archive suffix @file{depot}
@item @samp{.epub} ---
Electronic publications
@cindex @file{epub} file archive suffix
@cindex file archive suffix @file{epub}
@item @samp{.exe} --- @item @samp{.exe} ---
Self extracting Microsoft Windows EXE files Self extracting Microsoft Windows EXE files
@cindex @file{exe} file archive suffix @cindex @file{exe} file archive suffix

View file

@ -2025,7 +2025,7 @@ They are defined here anyway to allow sharing certain methods.
@code{value} The value. Should not be accessed directly. @code{value} The value. Should not be accessed directly.
@item @item
@code{init-value} Function that is responsable for setting the object's @code{init-value} Function that is responsible for setting the object's
value. If bound, then this is called with the object as the only value. If bound, then this is called with the object as the only
argument. Usually this is not bound, in which case the object's argument. Usually this is not bound, in which case the object's
primary @code{transient-init-value} method is called instead. primary @code{transient-init-value} method is called instead.

View file

@ -1,9 +1,11 @@
Content-Type: text/enriched Content-Type: text/enriched
Text-Width: 70 Text-Width: 70
This is a list of ways to say hello in various languages. This is a list of ways to write a <x-color><param>orange red</param>"hello"</x-color> greeting using
It is not intended to be comprehensive, but to demonstrate various scripts. It is not intended to be comprehensive,
some of the character sets that Emacs supports. but to demonstrate some of the character sets and writing
systems that Emacs supports. Look for the script used to
write your language, to see if it is supported.
Non-ASCII examples: Non-ASCII examples:
@ -11,7 +13,7 @@ Non-ASCII examples:
Cześć!,</x-charset><x-charset><param>latin-iso8859-2</param> Dobrý den,</x-charset><x-charset><param>cyrillic-iso8859-5</param> Здравствуйте!,</x-charset><x-charset><param>greek-iso8859-7</param> Γειά σας,</x-charset> გამარჯობა Cześć!,</x-charset><x-charset><param>latin-iso8859-2</param> Dobrý den,</x-charset><x-charset><param>cyrillic-iso8859-5</param> Здравствуйте!,</x-charset><x-charset><param>greek-iso8859-7</param> Γειά σας,</x-charset> გამარჯობა
Africa: <x-charset><param>ethiopic</param>ሠላም</x-charset> Africa: <x-charset><param>ethiopic</param>ሠላም</x-charset>
Middle/Near East:<x-charset><param>hebrew-iso8859-8</param> שָׁלוֹם,</x-charset> السّلام عليكم Middle/Near East:<x-charset><param>hebrew-iso8859-8</param> שָׁלוֹם,</x-charset> السّلام عليكم
South Asia: નમસ્તે, नमस्ते, ನಮಸ್ಕಾರ, നമസ്കാരം, ଶୁଣିବେ, South Asia: નમસ્તે, नमस्ते, ನಮಸ್ಕಾರ, നമസ്കാരം, ନମସ୍କାର,
ආයුබෝවන්, வணக்கம், నమస్కారం,<x-charset><param>tibetan</param> བཀྲ་ཤིས་བདེ་ལེགས༎</x-charset> ආයුබෝවන්, வணக்கம், నమస్కారం,<x-charset><param>tibetan</param> བཀྲ་ཤིས་བདེ་ལེགས༎</x-charset>
South East Asia: ជំរាបសួរ,<x-charset><param>lao</param> ສະບາຍດີ,</x-charset> မင်္ဂလာပါ,<x-charset><param>thai-tis620</param> สวัสดีครับ,</x-charset><x-charset><param>vietnamese-viscii-lower</param> </x-charset><x-charset><param>vietnamese-viscii-upper</param>C</x-charset><x-charset><param>vietnamese-viscii-lower</param>hào bạn</x-charset> South East Asia: ជំរាបសួរ,<x-charset><param>lao</param> ສະບາຍດີ,</x-charset> မင်္ဂလာပါ,<x-charset><param>thai-tis620</param> สวัสดีครับ,</x-charset><x-charset><param>vietnamese-viscii-lower</param> </x-charset><x-charset><param>vietnamese-viscii-upper</param>C</x-charset><x-charset><param>vietnamese-viscii-lower</param>hào bạn</x-charset>
East Asia:<x-charset><param>chinese-gb2312</param> 你好,</x-charset><x-charset><param>chinese-big5-1</param> 早晨,</x-charset><x-charset><param>japanese-jisx0208</param> こんにちは,</x-charset><x-charset><param>korean-ksc5601</param> 안녕하세요</x-charset> East Asia:<x-charset><param>chinese-gb2312</param> 你好,</x-charset><x-charset><param>chinese-big5-1</param> 早晨,</x-charset><x-charset><param>japanese-jisx0208</param> こんにちは,</x-charset><x-charset><param>korean-ksc5601</param> 안녕하세요</x-charset>
@ -25,11 +27,14 @@ LANGUAGE (NATIVE NAME) HELLO
Amharic (አማርኛ) ሠላም Amharic (አማርኛ) ሠላም
Arabic (العربيّة) السّلام عليكم Arabic (العربيّة) السّلام عليكم
Armenian (հայերեն) Բարև ձեզ Armenian (հայերեն) Բարև ձեզ
Balinese (ᬅᬓ᭄ᬱᬭᬩᬮᬶ) ᬒᬁᬲ᭄ᬯᬲ᭄ᬢ᭄ᬬᬲ᭄ᬢᬸ
Batak (ᯘᯮᯒᯗ᯲ᯅᯗᯂ᯲) ᯂᯬᯒᯘ᯲ / ᯔᯧᯐᯬᯀᯱᯐᯬᯀᯱ
Belarusian (беларуская) Прывітанне Belarusian (беларуская) Прывітанне
Bengali (বাংলা) নমস্কার Bengali (বাংলা) নমস্কার
Brahmi (𑀩𑁆𑀭𑀸𑀳𑁆𑀫𑀻) 𑀦𑀫𑀲𑁆𑀢𑁂 Brahmi (𑀩𑁆𑀭𑀸𑀳𑁆𑀫𑀻) 𑀦𑀫𑀲𑁆𑀢𑁂
Braille ⠓⠑⠇⠇⠕ Braille ⠓⠑⠇⠇⠕
Buginese (ᨒᨚᨈᨑ) ᨖᨒᨚ
Burmese (မြန်မာ) မင်္ဂလာပါ Burmese (မြန်မာ) မင်္ဂလာပါ
C printf (<x-color><param>orange red</param>"Hello, world!\n"</x-color>); C printf (<x-color><param>orange red</param>"Hello, world!\n"</x-color>);
Cham (ꨌꩌ) ꨦꨤꩌ ꨦꨁꨰ Cham (ꨌꩌ) ꨦꨤꩌ ꨦꨁꨰ
@ -38,6 +43,7 @@ Comanche /kəˈmæntʃiː/ Haa marʉ́awe
Cree (ᓀᐦᐃᔭᐍᐏᐣ) ᑕᓂᓯ / ᐙᒋᔮ Cree (ᓀᐦᐃᔭᐍᐏᐣ) ᑕᓂᓯ / ᐙᒋᔮ
Czech (čeština) Dobrý den Czech (čeština) Dobrý den
Danish (dansk) Hej / Goddag / Halløj Danish (dansk) Hej / Goddag / Halløj
Devanagari (देवनागरी) नमस्ते / नमस्कार
Dutch (Nederlands) Hallo / Dag Dutch (Nederlands) Hallo / Dag
Efik /ˈɛfɪk/ Mɔkɔm Efik /ˈɛfɪk/ Mɔkɔm
Egyptian Hieroglyphs (𓂋𓏤𓈖𓆎𓅓‌𓏏𓊖) 𓅓𓊵𓏏𓊪, 𓇍𓇋𓂻𓍘𓇋 Egyptian Hieroglyphs (𓂋𓏤𓈖𓆎𓅓‌𓏏𓊖) 𓅓𓊵𓏏𓊪, 𓇍𓇋𓂻𓍘𓇋
@ -50,40 +56,60 @@ Finnish (suomi) Hei / Hyvää päivää
French (français) Bonjour / Salut French (français) Bonjour / Salut
Georgian (ქართული) გამარჯობა Georgian (ქართული) გამარჯობა
German (Deutsch) Guten Tag / Grüß Gott German (Deutsch) Guten Tag / Grüß Gott
Grantha (𑌗𑍍𑌰𑌨𑍍𑌥) 𑌨𑌮𑌸𑍍𑌤𑍇 / 𑌨𑌮𑌸𑍍𑌕𑌾𑌰𑌃
Greek (ελληνικά) Γειά σας Greek (ελληνικά) Γειά σας
Greek, ancient (ἑλληνική) Οὖλέ τε καὶ μέγα χαῖρε Greek, ancient (ἑλληνική) Οὖλέ τε καὶ μέγα χαῖρε
Gujarati (ગુજરાતી) નમસ્તે Gujarati (ગુજરાતી) નમસ્તે
Gurmukhi (ਗੁਰਮੁਖੀ) ਸਤ ਸ੍ਰੀ ਅਕਾਲ
Hanifi Rohingya (𐴌𐴟𐴇𐴥𐴝𐴚𐴒𐴙𐴝 𐴇𐴝𐴕𐴞𐴉𐴞 𐴓𐴠𐴑𐴤𐴝) 𐴀𐴝𐴏𐴓𐴝𐴀𐴡𐴤𐴛𐴝𐴓𐴝𐴙𐴑𐴟𐴔
Hanunoo (ᜱᜨᜳᜨᜳᜢ) ᜫᜬᜧ᜴ ᜣᜭᜯᜥ᜴ ᜰᜲᜭᜥ᜴
Hebrew (עִבְרִית) שָׁלוֹם Hebrew (עִבְרִית) שָׁלוֹם
Hindi (हिन्दी) प्रणाम / पाय लागू
Hungarian (magyar) Szép jó napot! Hungarian (magyar) Szép jó napot!
Hindi (हिंदी) नमस्ते / नमस्कार ।
Inuktitut (ᐃᓄᒃᑎᑐᑦ) ᐊᐃ Inuktitut (ᐃᓄᒃᑎᑐᑦ) ᐊᐃ
Italian (italiano) Ciao / Buon giorno Italian (italiano) Ciao / Buon giorno
Javanese (ꦧꦱꦗꦮꦶ) console.log("ꦲꦭꦺꦴ"); Javanese (ꦧꦱꦗꦮꦶ) console.log("ꦲꦭꦺꦴ");
Kaithi (𑂍𑂶𑂟𑂲) 𑂩𑂰𑂧𑂩𑂰𑂧
Kannada (ಕನ್ನಡ) ನಮಸ್ಕಾರ Kannada (ಕನ್ನಡ) ನಮಸ್ಕಾರ
Kharoṣṭhī (𐨑𐨪𐨆𐨛𐨁) 𐨣𐨨𐨲𐨪𐨆 𐨐𐨪𐨅𐨨𐨁
Khmer (ភាសាខ្មែរ) ជំរាបសួរ Khmer (ភាសាខ្មែរ) ជំរាបសួរ
Lakota (Lakȟotiyapi) Taŋyáŋ yahí! Lakota (Lakȟotiyapi) Taŋyáŋ yahí!
Lao (ພາສາລາວ) ສະບາຍດີ / ຂໍໃຫ້ໂຊກດີ Lao (ພາສາລາວ) ສະບາຍດີ / ຂໍໃຫ້ໂຊກດີ
Lepcha (ᰛᰩᰵᰛᰧᰵᰶ) ᰂᰦᰕᰥᰬ
Limbu (ᤕᤰᤌᤢᤱ ᤐᤠᤴ) ᤛᤣᤘᤠᤖᤥ
Makasar (𑻪𑻢𑻪𑻢) 𑻦𑻤𑻵𑻱
Malayalam (മലയാളം) നമസ്കാരം Malayalam (മലയാളം) നമസ്കാരം
Maldivian (ދިވެހި) އައްސަލާމު ޢަލައިކުމް / ކިހިނެހް؟ Maldivian (ދިވެހި) އައްސަލާމު ޢަލައިކުމް / ކިހިނެހް؟
Maltese (il-Malti) Bonġu / Saħħa Maltese (il-Malti) Bonġu / Saħħa
Mathematics ∀ p ∈ world • hello p □ Mathematics ∀ p ∈ world • hello p □
Meetei Mayek (ꯃꯤꯇꯩ ꯃꯌꯦꯛ) ꯈꯨꯔꯨꯝꯖꯔꯤ
Modi (𑘦𑘻𑘚𑘲) 𑘡𑘦𑘭𑘿𑘎𑘰𑘨
Mongolian (монгол хэл) Сайн байна уу? Mongolian (монгол хэл) Сайн байна уу?
Northern Thai (ᨣᩣᩴᨾᩮᩬᩥᨦ / ᨽᩣᩈᩣᩃ᩶ᩣ᩠ᨶᨶᩣ) ᩈ᩠ᩅᩢᩔ᩠ᨯᩦᨣᩕᩢ᩠ᨸ Northern Thai (ᨣᩣᩴᨾᩮᩬᩥᨦ / ᨽᩣᩈᩣᩃ᩶ᩣ᩠ᨶᨶᩣ) ᩈ᩠ᩅᩢᩔ᩠ᨯᩦᨣᩕᩢ᩠ᨸ
Norwegian (norsk) Hei / God dag Norwegian (norsk) Hei / God dag
Oriya (ଓଡ଼ିଆ) ଶୁଣିବେ Odia (ଓଡ଼ିଆ) ନମସ୍କାର
Polish (język polski) Dzień dobry! / Cześć! Polish (język polski) Dzień dobry! / Cześć!
Rejang (ꥆꤰ꥓ꤼꤽ ꤽꥍꤺꥏ) ꤸꥉꥐꤺꥉꥂꥎ
Russian (русский) Здра́вствуйте! Russian (русский) Здра́вствуйте!
Sharada (𑆯𑆳𑆫𑆢𑆳) 𑆤𑆩𑆱𑇀𑆑𑆳𑆫
Siddham (𑖭𑖰𑖟𑖿𑖠𑖽) 𑖡𑖦𑖫𑖿𑖝𑖸
Sinhala (සිංහල) ආයුබෝවන් Sinhala (සිංහල) ආයුබෝවන්
Slovak (slovenčina) Dobrý deň Slovak (slovenčina) Dobrý deň
Slovenian (slovenščina) Pozdravljeni! Slovenian (slovenščina) Pozdravljeni!
Spanish (español) ¡Hola! Spanish (español) ¡Hola!
Sundanese (ᮃᮊ᮪ᮟᮛᮞᮥᮔ᮪ᮓ) ᮞᮙ᮪ᮕᮥᮛᮞᮥᮔ᮪
Swedish (svenska) Hej / Goddag / Hallå Swedish (svenska) Hej / Goddag / Hallå
Syloti Nagri (ꠍꠤꠟꠐꠤ ꠘꠣꠉꠞꠤ) ꠀꠌ꠆ꠍꠣꠟꠣꠝꠥ ꠀꠟꠣꠁꠇꠥꠝ / ꠘꠝꠡ꠆ꠇꠣꠞ
Tamil (தமிழ்) வணக்கம் Tamil (தமிழ்) வணக்கம்
Telugu (తెలుగు) నమస్కారం Telugu (తెలుగు) నమస్కారం
Tagalog (ᜊᜌ᜔ᜊᜌᜒᜈ᜔) ᜃᜓᜋᜓᜐ᜔ᜆ
Tagbanwa (ᝦᝪᝯ) ᝫᝩᝬᝥ ᝣᝮᝧᝯ
TaiViet (ꪁꪫꪱꪣ ꪼꪕ) ꪅꪰꪙꫂ ꪨꪮꫂ ꪁꪫꪱ / ꪅꪽ ꪨꪷ ꪁꪫꪱ TaiViet (ꪁꪫꪱꪣ ꪼꪕ) ꪅꪰꪙꫂ ꪨꪮꫂ ꪁꪫꪱ / ꪅꪽ ꪨꪷ ꪁꪫꪱ
Thai (ภาษาไทย) สวัสดีครับ / สวัสดีค่ะ Thai (ภาษาไทย) สวัสดีครับ / สวัสดีค่ะ
Tibetan (བོད་སྐད་) བཀྲ་ཤིས་བདེ་ལེགས༎ Tibetan (བོད་སྐད་) བཀྲ་ཤིས་བདེ་ལེགས༎
Tigrigna (ትግርኛ) ሰላማት Tigrigna (ትግርኛ) ሰላማት
Tirhuta (𑒞𑒱𑒩𑒯𑒳𑒞𑒰) 𑒣𑓂𑒩𑒢𑒰𑒧 / 𑒮𑒲𑒞𑒰𑒩𑒰𑒧
Turkish (Türkçe) Merhaba Turkish (Türkçe) Merhaba
Ukrainian (українська) Вітаю Ukrainian (українська) Вітаю
Vietnamese (tiếng Việt) Chào bạn Vietnamese (tiếng Việt) Chào bạn

699
etc/NEWS

File diff suppressed because it is too large Load diff

View file

@ -15,6 +15,50 @@ in older Emacs versions.
You can narrow news to a specific version by calling 'view-emacs-news' You can narrow news to a specific version by calling 'view-emacs-news'
with a prefix argument or by typing 'C-u C-h C-n'. with a prefix argument or by typing 'C-u C-h C-n'.
* Installation Changes in Emacs 28.2
* Startup Changes in Emacs 28.2
* Changes in Emacs 28.2
This is a bug-fix release with no new features.
* Editing Changes in Emacs 28.2
* Changes in Specialized Modes and Packages in Emacs 28.2
** The command 'kdb-macro-redisplay' was renamed to 'kmacro-redisplay'.
This is to fix an embarrassing typo in the original name.
** 'desktop-save-mode' now saves the desktop in 'save-buffers-kill-emacs'.
Previously, the desktop was saved in 'kill-emacs' via
'kill-emacs-hook'. However, that violated the convention that
functions in 'kill-emacs-hook' cannot interact with the user, and in
particular didn't play well with ending daemon sessions of Emacs. So
we moved the saving of the desktop to 'save-buffers-kill-emacs', via
'kill-emacs-query-functions'. To make sure the desktop is saved,
terminate Emacs with 'save-buffers-kill-emacs', not with 'kill-emacs'.
(This change was done in Emacs 28.1, but we didn't announce it in NEWS
back then.)
* New Modes and Packages in Emacs 28.2
* Incompatible Lisp Changes in Emacs 28.2
* Lisp Changes in Emacs 28.2
* Changes in Emacs 28.2 on Non-Free Operating Systems
* Installation Changes in Emacs 28.1 * Installation Changes in Emacs 28.1

View file

@ -805,6 +805,22 @@ to take advantage of.
* Runtime problems related to font handling * Runtime problems related to font handling
** Some fonts are detected but not usable under Xft.
Some fonts might not be usable under Emacs even though they show up in
the font family list when Emacs is built with Xft. This is because
Emacs prevents fonts that have color glyphs (such as color Emoji) from
being used, since they typically cause Xft crashes.
On some GNU/Linux systems, fonts (such as Source Code Pro) that do not
have color glyphs are reported as color fonts, causing them to be
unavailable when using Xft. This is known to happen under Fedora
GNU/Linux 36 or later, and possibly other distributions as well.
If you encounter a such a font, you can enable it while ignoring other
fonts that actually have color glyphs by adding its family name to the
list `xft-color-font-whitelist'.
** Characters are displayed as empty boxes or with wrong font under X. ** Characters are displayed as empty boxes or with wrong font under X.
*** This may be due to your local fontconfig customization. *** This may be due to your local fontconfig customization.
@ -1874,6 +1890,33 @@ this, you can remove the X resource or put this in your init file:
(xterm-remove-modify-other-keys) (xterm-remove-modify-other-keys)
** The shift TAB key combination works as meta TAB on a Linux console.
This happens because on your keyboard layout, S-TAB produces the same
keycodes as typing ESC TAB individually. The best way to solve this
is to modify your keyboard layout to produce different codes, and tell
Emacs what these new codes mean.
The current keyboard layout will probably be a .map.gz file somewhere
under /usr/share/keymaps. Identify this file, possibly from a system
initialization file such as /etc/conf.d/keymaps. Run gunzip on it to
decompress it, and amend the entries for keycode 15 to look something
like this:
keycode 15 = Tab
alt keycode 15 = Meta_Tab
shift keycode 15 = F219
string F219 = "\033[4}\011" # Shift+<tab>
After possibly saving this file under a different name, compress it
again using gzip. Amend /etc/conf.d/keyamps, etc., if needed.
Further details can be found in the man page for loadkeys.
Then add the following line near the start of your site-start.el or
.emacs or init.el file:
(define-key input-decode-map "\e[4}\t" 'backtab)
** Emacs spontaneously displays "I-search: " at the bottom of the screen. ** Emacs spontaneously displays "I-search: " at the bottom of the screen.
This means that Control-S/Control-Q (XON/XOFF) "flow control" is being This means that Control-S/Control-Q (XON/XOFF) "flow control" is being
@ -2982,6 +3025,23 @@ GTK_IM_MODULE.
GTK does not allow programs to warp the pointer anymore. There is GTK does not allow programs to warp the pointer anymore. There is
nothing that can be done about this problem. nothing that can be done about this problem.
** Certain keys such as 'C-S-u' are not reported correctly.
Some keys with modifiers such as Shift and Control might not be
reported correctly due to incorrectly written GTK input method
modules. This is known to happen to 'C-S-u' and 'C->', which are
misreported as 'C-u' and '>'.
To disable the use of GTK input methods, evaluate:
(pgtk-use-im-context nil)
This will also cause system input methods and features such as the
Compose key to stop working.
On X Windows, users should not use Emacs configured with PGTK, since
this and many other problems do not exist on the regular X builds.
* Build-time problems * Build-time problems
** Configuration ** Configuration

View file

@ -137,7 +137,7 @@ Unfortunately this does not look as nice with a fixed-width font
as it does in a proportionally-spaced printed document; the extra as it does in a proportionally-spaced printed document; the extra
spaces that are needed on the screen can make it hard to read.</flushboth> spaces that are needed on the screen can make it hard to read.</flushboth>
<center> <center>
<bold>Center</bold> <bold>Center</bold>
@ -149,7 +149,6 @@ spaces that are needed on the screen can make it hard to read.</flushboth>
justification. justification.
</center><flushboth>Note that justification can only change at hard newlines, because </center><flushboth>Note that justification can only change at hard newlines, because
that is the unit over which filling gets done.</flushboth></indent> that is the unit over which filling gets done.</flushboth></indent>
@ -189,7 +188,14 @@ as possible.
The text/enriched standard is defined in </indent>Internet<indent> RFC 1896 The text/enriched standard is defined in </indent>Internet<indent> RFC 1896
(<<http://www.ietf.org/rfc/rfc1896.txt>).</indent> (<<http://www.ietf.org/rfc/rfc1896.txt>).
To make format annotations visible and possibly edit them, tell
Emacs to display the markup:
<fixed><indent>M-x enriched-toggle-markup RET</indent></fixed></indent>
<x-bg-color><param>blue</param><x-color><param>white</param><bold>CUSTOMIZATION</bold></x-color></x-bg-color><bold> <x-bg-color><param>blue</param><x-color><param>white</param><bold>CUSTOMIZATION</bold></x-color></x-bg-color><bold>

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

View file

@ -0,0 +1,26 @@
/* XPM */
static char * guide_xpm[] = {
"6 21 2 1",
" c None",
". c #ADA5C6",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" .",
" ."};

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

View file

@ -0,0 +1,27 @@
/* XPM */
static char * guide_xpm[] = {
"6 22 2 1",
" c None",
". c #ADA5C6",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" .",
" ",
" ."};

View file

@ -7130,7 +7130,7 @@ org.zw
// newGTLDs // newGTLDs
// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-04-30T15:14:46Z // List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-05-18T15:16:02Z
// This list is auto-generated, don't edit it manually. // This list is auto-generated, don't edit it manually.
// aaa : 2015-02-26 American Automobile Association, Inc. // aaa : 2015-02-26 American Automobile Association, Inc.
aaa aaa
@ -8851,7 +8851,7 @@ lincoln
// linde : 2014-12-04 Linde Aktiengesellschaft // linde : 2014-12-04 Linde Aktiengesellschaft
linde linde
// link : 2013-11-14 UNR Corp. // link : 2013-11-14 Nova Registry Ltd
link link
// lipsy : 2015-06-25 Lipsy Ltd // lipsy : 2015-06-25 Lipsy Ltd
@ -12281,6 +12281,10 @@ blogspot.vn
// Submitted by Niels Martignene <hello@goupile.fr> // Submitted by Niels Martignene <hello@goupile.fr>
goupile.fr goupile.fr
// Government of the Netherlands: https://www.government.nl
// Submitted by <domeinnaam@minaz.nl>
gov.nl
// Group 53, LLC : https://www.group53.com // Group 53, LLC : https://www.group53.com
// Submitted by Tyler Todd <noc@nova53.net> // Submitted by Tyler Todd <noc@nova53.net>
awsmppl.com awsmppl.com
@ -12357,7 +12361,6 @@ ltd.ng
ngo.ng ngo.ng
edu.scot edu.scot
sch.so sch.so
org.yt
// HostyHosting (hostyhosting.com) // HostyHosting (hostyhosting.com)
hostyhosting.io hostyhosting.io
@ -13389,6 +13392,12 @@ rocky.page
спб.рус спб.рус
я.рус я.рус
// Salesforce.com, Inc. https://salesforce.com/
// Submitted by Michael Biven <mbiven@salesforce.com>
builder.code.com
dev-builder.code.com
stg-builder.code.com
// Sandstorm Development Group, Inc. : https://sandcats.io/ // Sandstorm Development Group, Inc. : https://sandcats.io/
// Submitted by Asheesh Laroia <asheesh@sandstorm.io> // Submitted by Asheesh Laroia <asheesh@sandstorm.io>
sandcats.io sandcats.io
@ -13812,6 +13821,15 @@ hk.org
ltd.hk ltd.hk
inc.hk inc.hk
// UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/
// see also: whois -h whois.udr.org.yt help
// Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>
name.pm
sch.tf
biz.wf
sch.wf
org.yt
// United Gameserver GmbH : https://united-gameserver.de // United Gameserver GmbH : https://united-gameserver.de
// Submitted by Stefan Schwarz <sysadm@united-gameserver.de> // Submitted by Stefan Schwarz <sysadm@united-gameserver.de>
virtualuser.de virtualuser.de

View file

@ -1,5 +1,5 @@
% Reference Card for Org Mode % Reference Card for Org Mode
\def\orgversionnumber{9.5.3} \def\orgversionnumber{9.5.4}
\def\versionyear{2021} % latest update \def\versionyear{2021} % latest update
\input emacsver.tex \input emacsver.tex

View file

@ -1,4 +1,4 @@
;;; leuven-dark-theme.el --- Awesome Emacs color theme on dark background ;;; leuven-dark-theme.el --- Awesome Emacs color theme on dark background -*- lexical-binding: t; -*-
;; Copyright (C) 2003-2022 Free Software Foundation, Inc. ;; Copyright (C) 2003-2022 Free Software Foundation, Inc.
@ -103,7 +103,7 @@ more...")
;; Leuven generic colors. ;; Leuven generic colors.
(cancel '(:slant italic :strike-through t :foreground "#5b5660")) (cancel '(:slant italic :strike-through t :foreground "#5b5660"))
(clock-line '(:box (:line-width 1 :color "#cfa161") :foreground "#ffffff" :background "#1636ff")) ;; (clock-line '(:box (:line-width 1 :color "#cfa161") :foreground "#ffffff" :background "#1636ff"))
(code-block '(:foreground "#ffff7f" :background "#252046")) (code-block '(:foreground "#ffff7f" :background "#252046"))
(code-inline '(:foreground "#ff9bff" :background "#262031")) (code-inline '(:foreground "#ff9bff" :background "#262031"))
(column '(:height 1.0 :weight normal :slant normal :underline nil :strike-through nil :foreground "#1e52b8" :background "#252c48")) (column '(:height 1.0 :weight normal :slant normal :underline nil :strike-through nil :foreground "#1e52b8" :background "#252c48"))
@ -124,10 +124,10 @@ more...")
(grep-file-name '(:weight bold :foreground "#d8b76b")) ; Used for grep hits. (grep-file-name '(:weight bold :foreground "#d8b76b")) ; Used for grep hits.
(grep-line-number '(:weight bold :foreground "#5fca5b")) (grep-line-number '(:weight bold :foreground "#5fca5b"))
(highlight-blue '(:background "#3c312a")) (highlight-blue '(:background "#3c312a"))
(highlight-blue2 '(:background "#3e2d2f")) ;; (highlight-blue2 '(:background "#3e2d2f"))
(highlight-gray '(:background "#3e3944")) (highlight-gray '(:background "#3e3944"))
(highlight-green '(:background "#2f0e3a")) ;; (highlight-green '(:background "#2f0e3a"))
(highlight-red '(:background "#063741")) ;; (highlight-red '(:background "#063741"))
(highlight-yellow '(:background "#2d2058")) (highlight-yellow '(:background "#2d2058"))
(link '(:weight normal :underline t :foreground "#ff925a")) (link '(:weight normal :underline t :foreground "#ff925a"))
(link-no-underline '(:weight normal :foreground "#ff925a")) (link-no-underline '(:weight normal :foreground "#ff925a"))

View file

@ -400,7 +400,7 @@ jarring angry fruit salad look to reduce eye fatigue.")
'(compilation-warning-face ((t (:bold t :foreground "Orange" :weight bold)))) '(compilation-warning-face ((t (:bold t :foreground "Orange" :weight bold))))
'(completions-common-part ((t (:width normal :weight normal '(completions-common-part ((t (:width normal :weight normal
:slant normal :foreground "WhiteSmoke" :slant normal :foreground "WhiteSmoke"
:background "black" :height 81)))) :background "black" :height 0.9))))
'(completions-first-difference ((t (:bold t :weight bold)))) '(completions-first-difference ((t (:bold t :weight bold))))
'(css-selector ((t (:foreground "LightSteelBlue")))) '(css-selector ((t (:foreground "LightSteelBlue"))))

View file

@ -3,8 +3,8 @@
;; Copyright (C) 2019-2022 Free Software Foundation, Inc. ;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com> ;; Author: Protesilaos Stavrou <info@protesilaos.com>
;; URL: https://gitlab.com/protesilaos/modus-themes ;; URL: https://git.sr.ht/~protesilaos/modus-themes
;; Version: 2.3.0 ;; Version: 2.4.1
;; Package-Requires: ((emacs "27.1")) ;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility ;; Keywords: faces, theme, accessibility

View file

@ -3,9 +3,9 @@
;; Copyright (C) 2019-2022 Free Software Foundation, Inc. ;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com> ;; Author: Protesilaos Stavrou <info@protesilaos.com>
;; URL: https://gitlab.com/protesilaos/modus-themes ;; URL: https://git.sr.ht/~protesilaos/modus-themes
;; Version: 2.3.0 ;; Mailing list: https://lists.sr.ht/~protesilaos/modus-themes
;; Last-Modified: <2022-04-01 12:33:34 +0300> ;; Version: 2.4.1
;; Package-Requires: ((emacs "27.1")) ;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility ;; Keywords: faces, theme, accessibility
@ -68,306 +68,8 @@
;; modus-themes-operandi-color-overrides (alist) ;; modus-themes-operandi-color-overrides (alist)
;; modus-themes-vivendi-color-overrides (alist) ;; modus-themes-vivendi-color-overrides (alist)
;; ;;
;; Below is the list of explicitly supported packages or face groups ;; Check the manual for all supported packages (there are hundreds of
;; (there are implicitly supported packages as well, which inherit from ;; them).
;; font-lock or some basic group). You are encouraged to report any
;; missing package or change you would like to see.
;;
;; ace-window
;; alert
;; all-the-icons
;; all-the-icons-dired
;; all-the-icons-ibuffer
;; annotate
;; ansi-color
;; anzu
;; apropos
;; artbollocks-mode
;; auctex and TeX
;; auto-dim-other-buffers
;; avy
;; awesome-tray
;; bbdb
;; binder
;; bm
;; bongo
;; boon
;; bookmark
;; breakpoint (provided by built-in gdb-mi.el)
;; calendar and diary
;; calfw
;; centaur-tabs
;; cfrs
;; change-log and log-view (`vc-print-log' and `vc-print-root-log')
;; cider
;; circe
;; citar
;; color-rg
;; column-enforce-mode
;; company-mode
;; company-posframe
;; compilation-mode
;; completions
;; consult
;; corfu
;; counsel
;; counsel-css
;; cov
;; cperl-mode
;; css-mode
;; csv-mode
;; ctrlf
;; cursor-flash
;; custom (M-x customize)
;; dap-mode
;; dashboard (emacs-dashboard)
;; deadgrep
;; debbugs
;; deft
;; devdocs
;; dictionary
;; diff-hl
;; diff-mode
;; dim-autoload
;; dir-treeview
;; Dired
;; dired-async
;; dired-git
;; dired-git-info
;; dired-narrow
;; dired-subtree
;; diredfl
;; diredp (dired+)
;; display-fill-column-indicator-mode
;; doom-modeline
;; dynamic-ruler
;; easy-jekyll
;; ebdb
;; ediff
;; eglot
;; el-search
;; eldoc
;; eldoc-box
;; elfeed
;; elfeed-score
;; elpher
;; embark
;; ement (ement.el)
;; emms
;; enh-ruby-mode (enhanced-ruby-mode)
;; epa
;; equake
;; erc
;; eros
;; ert
;; eshell
;; eshell-fringe-status
;; eshell-git-prompt
;; eshell-prompt-extras (epe)
;; eshell-syntax-highlighting
;; evil (evil-mode)
;; evil-goggles
;; evil-snipe
;; evil-visual-mark-mode
;; eww
;; exwm
;; eyebrowse
;; fancy-dabbrev
;; flycheck
;; flycheck-color-mode-line
;; flycheck-indicator
;; flycheck-posframe
;; flymake
;; flyspell
;; flx
;; freeze-it
;; frog-menu
;; focus
;; fold-this
;; font-lock (generic syntax highlighting)
;; forge
;; fountain (fountain-mode)
;; geiser
;; git-commit
;; git-gutter (and variants)
;; git-rebase
;; git-timemachine
;; gnus
;; gotest
;; golden-ratio-scroll-screen
;; helm
;; helm-ls-git
;; helm-switch-shell
;; helm-xref
;; helpful
;; highlight-indentation
;; highlight-numbers
;; highlight-thing
;; hl-defined
;; hl-fill-column
;; hl-line-mode
;; hl-todo
;; hydra
;; ibuffer
;; icomplete
;; ido-mode
;; iedit
;; iflipb
;; image-dired
;; imenu-list
;; indium
;; info
;; info-colors
;; interaction-log
;; ioccur
;; isearch, occur, etc.
;; ivy
;; ivy-posframe
;; jira (org-jira)
;; journalctl-mode
;; js2-mode
;; julia
;; jupyter
;; kaocha-runner
;; keycast
;; ledger-mode
;; line numbers (`display-line-numbers-mode' and global variant)
;; lsp-mode
;; lsp-ui
;; macrostep
;; magit
;; magit-imerge
;; make-mode
;; man
;; marginalia
;; markdown-mode
;; markup-faces (`adoc-mode')
;; mct
;; mentor
;; messages
;; mini-modeline
;; minimap
;; mmm-mode
;; mode-line
;; mood-line
;; mpdel
;; mu4e
;; multiple-cursors
;; nano-modeline
;; neotree
;; notmuch
;; num3-mode
;; nxml-mode
;; orderless
;; org
;; org-journal
;; org-noter
;; org-pomodoro
;; org-recur
;; org-roam
;; org-superstar
;; org-table-sticky-header
;; org-tree-slide
;; org-treescope
;; origami
;; outline-mode
;; outline-minor-faces
;; package (M-x list-packages)
;; page-break-lines
;; pandoc-mode
;; paradox
;; paren-face
;; pass
;; pdf-tools
;; persp-mode
;; perspective
;; phi-grep
;; pomidor
;; popup
;; powerline
;; powerline-evil
;; prism (see "Note for prism.el" in the manual)
;; proced
;; prodigy
;; pulse
;; pyim
;; quick-peek
;; racket-mode
;; rainbow-blocks
;; rainbow-delimiters
;; rcirc
;; recursion-indicator
;; regexp-builder (also known as `re-builder')
;; rg
;; ripgrep
;; rmail
;; ruler-mode
;; selectrum
;; selectrum-prescient
;; semantic
;; sesman
;; shell-script-mode
;; shortdoc
;; show-paren-mode
;; shr
;; side-notes
;; sieve-mode
;; skewer-mode
;; slime (sldb)
;; sly
;; smart-mode-line
;; smartparens
;; smerge
;; spaceline
;; speedbar
;; stripes
;; suggest
;; switch-window
;; swiper
;; sx
;; symbol-overlay
;; syslog-mode
;; tab-bar-groups
;; tab-bar-mode
;; tab-line-mode
;; table (built-in table.el)
;; telega
;; telephone-line
;; terraform-mode
;; term
;; textsec
;; tomatinho
;; transient (pop-up windows like Magit's)
;; trashed
;; treemacs
;; tty-menu
;; tuareg
;; typescript
;; undo-tree
;; vc (vc-dir.el, vc-hooks.el)
;; vc-annotate (C-x v g)
;; vertico
;; vertico-quick
;; vimish-fold
;; visible-mark
;; visual-regexp
;; vterm
;; wcheck-mode
;; web-mode
;; wgrep
;; which-function-mode
;; which-key
;; whitespace-mode
;; window-divider-mode
;; winum
;; writegood-mode
;; woman
;; xah-elisp-mode
;; xref
;; xterm-color (and ansi-colors)
;; yaml-mode
;; yasnippet
;; ztree
;; ;;
;; For a complete view of the project, also refer to the following files ;; For a complete view of the project, also refer to the following files
;; (should be distributed in the same repository/directory as the ;; (should be distributed in the same repository/directory as the
@ -383,7 +85,6 @@
(eval-when-compile (eval-when-compile
(require 'cl-lib) (require 'cl-lib)
(require 'subr-x)) (require 'subr-x))
(require 'seq)
(defgroup modus-themes () (defgroup modus-themes ()
"Options for `modus-operandi', `modus-vivendi'. "Options for `modus-operandi', `modus-vivendi'.
@ -407,6 +108,36 @@ cover the blue-cyan-magenta side of the spectrum."
:prefix "modus-themes-" :prefix "modus-themes-"
:tag "Modus Themes Faces") :tag "Modus Themes Faces")
(defvar modus-themes--version "2.5.0-dev"
"Current version of the Modus themes.
The version either is the last tagged release, such as '2.4.0',
or an in-development version like '2.5.0-dev'. As we use
semantic versioning, tags of the '2.4.1' sort are not reported:
those would count as part of '2.5.0-dev'.")
;;;###autoload
(defun modus-themes-version (&optional insert)
"Print `modus-themes--version' in the echo area.
If optional INSERT argument is provided from Lisp or as a prefix
argument, insert the `modus-themes--version' at point."
(interactive "P")
(if-let ((version modus-themes--version)
((or insert current-prefix-arg)))
(insert version)
(message version)))
;;;###autoload
(defun modus-themes-report-bug ()
"Submit a bug report or issue to the Modus themes developers."
(interactive)
(reporter-submit-bug-report
"~protesilaos/modus-themes@lists.sr.ht"
(format "modus-themes (%s)\n" modus-themes--version)
;; I am just getting started with this. Let's first see what people
;; think about it.
nil nil nil nil))
;;; Variables for each theme variant ;;; Variables for each theme variant
;;;; Modus Operandi ;;;; Modus Operandi
@ -561,7 +292,8 @@ cover the blue-cyan-magenta side of the spectrum."
;; while bg-tab-inactive should be combined with fg-dim, whereas ;; while bg-tab-inactive should be combined with fg-dim, whereas
;; bg-tab-inactive-alt goes together with fg-main ;; bg-tab-inactive-alt goes together with fg-main
;; ;;
;; bg-completion-* variants are meant to be combined with fg-main ;; bg-completion-* and bg-char-* variants are meant to be combined
;; with fg-main
;; ;;
;; fg-escape-char-construct and fg-escape-char-backslash can ;; fg-escape-char-construct and fg-escape-char-backslash can
;; be combined bg-main, bg-dim, bg-alt ;; be combined bg-main, bg-dim, bg-alt
@ -595,6 +327,10 @@ cover the blue-cyan-magenta side of the spectrum."
(bg-completion . "#b7dbff") (bg-completion . "#b7dbff")
(bg-completion-subtle . "#def3ff") (bg-completion-subtle . "#def3ff")
(bg-char-0 . "#7feaff")
(bg-char-1 . "#ffaaff")
(bg-char-2 . "#dff000")
(bg-tab-active . "#f6f6f6") (bg-tab-active . "#f6f6f6")
(bg-tab-inactive . "#b7b7b7") (bg-tab-inactive . "#b7b7b7")
(bg-tab-inactive-accent . "#a9b4f6") (bg-tab-inactive-accent . "#a9b4f6")
@ -807,7 +543,8 @@ symbol and the latter as a string.")
;; while bg-tab-inactive should be combined with fg-dim, whereas ;; while bg-tab-inactive should be combined with fg-dim, whereas
;; bg-tab-inactive-alt goes together with fg-main ;; bg-tab-inactive-alt goes together with fg-main
;; ;;
;; bg-completion-* variants are meant to be combined with fg-main ;; bg-completion-* and bg-char-* variants are meant to be combined
;; with fg-main
;; ;;
;; fg-escape-char-construct and fg-escape-char-backslash can ;; fg-escape-char-construct and fg-escape-char-backslash can
;; be combined bg-main, bg-dim, bg-alt ;; be combined bg-main, bg-dim, bg-alt
@ -841,6 +578,10 @@ symbol and the latter as a string.")
(bg-completion . "#142f69") (bg-completion . "#142f69")
(bg-completion-subtle . "#0e194b") (bg-completion-subtle . "#0e194b")
(bg-char-0 . "#0050af")
(bg-char-1 . "#7f1f7f")
(bg-char-2 . "#625a00")
(bg-tab-active . "#0e0e0e") (bg-tab-active . "#0e0e0e")
(bg-tab-inactive . "#424242") (bg-tab-inactive . "#424242")
(bg-tab-inactive-accent . "#35398f") (bg-tab-inactive-accent . "#35398f")
@ -1449,9 +1190,8 @@ The actual styling of the face is done by `modus-themes-faces'."
(defface modus-themes-variable-pitch nil (defface modus-themes-variable-pitch nil
"Generic face for applying a conditional `variable-pitch'. "Generic face for applying a conditional `variable-pitch'.
This behaves in accordance with `modus-themes-mixed-fonts', This behaves in accordance with `modus-themes-mixed-fonts' and/or
`modus-themes-variable-pitch-headings' for all heading levels, `modus-themes-variable-pitch-ui'.
and `modus-themes-variable-pitch-ui'.
The actual styling of the face is done by `modus-themes-faces'." The actual styling of the face is done by `modus-themes-faces'."
:group 'modus-themes-faces) :group 'modus-themes-faces)
@ -3142,13 +2882,15 @@ In user configuration files the form may look like this:
value value
(modus-themes--warn option)))) (modus-themes--warn option))))
(defun modus-themes--alist-or-seq (properties alist-key seq-pred seq-default) (defun modus-themes--property-lookup (properties alist-key list-pred default)
"Return value from alist or sequence. "Return value from property alist or list.
Check PROPERTIES for an alist value that corresponds to Check PROPERTIES for an alist value that corresponds to
ALIST-KEY. If no alist is present, search the PROPERTIES ALIST-KEY. If no alist is present, search the PROPERTIES
sequence given SEQ-PRED, using SEQ-DEFAULT as a fallback." list given LIST-PRED, using DEFAULT as a fallback."
(if-let* ((val (or (alist-get alist-key properties) (if-let* ((val (or (alist-get alist-key properties)
(seq-find seq-pred properties seq-default))) (cl-loop for x in properties
if (funcall list-pred x) return x)
default))
((listp val))) ((listp val)))
(car val) (car val)
val)) val))
@ -3192,8 +2934,11 @@ Those are stored in `modus-themes-faces' and
(defun modus-themes--current-theme () (defun modus-themes--current-theme ()
"Return current modus theme." "Return current modus theme."
(car (seq-filter (lambda (arg) (string-match-p "^modus" (symbol-name arg))) (car
custom-enabled-themes))) (seq-filter
(lambda (theme)
(string-match-p "^modus" (symbol-name theme)))
custom-enabled-themes)))
;; Helper functions that are meant to ease the implementation of the ;; Helper functions that are meant to ease the implementation of the
;; above customization variables. ;; above customization variables.
@ -3245,11 +2990,11 @@ foreground. INTENSEFG is an alternative to the default."
(cond (cond
((and (memq 'bold properties) ((and (memq 'bold properties)
(memq 'italic properties)) (memq 'italic properties))
(list 'modus-themes-fixed-pitch 'bold-italic)) (list 'bold-italic 'modus-themes-fixed-pitch))
((memq 'italic properties) ((memq 'italic properties)
(list 'modus-themes-fixed-pitch 'italic)) (list 'italic 'modus-themes-fixed-pitch))
((memq 'bold properties) ((memq 'bold properties)
(list 'modus-themes-fixed-pitch 'bold)) (list 'bold 'modus-themes-fixed-pitch))
(t 'modus-themes-fixed-pitch)) (t 'modus-themes-fixed-pitch))
:background :background
(cond (cond
@ -3368,10 +3113,10 @@ theme's fallback text color."
(defun modus-themes--paren (normalbg intensebg) (defun modus-themes--paren (normalbg intensebg)
"Conditional use of intense colors for matching parentheses. "Conditional use of intense colors for matching parentheses.
NORMALBG should be the special palette color `bg-paren-match' or NORMALBG should be the special palette color 'bg-paren-match' or
something similar. INTENSEBG must be easier to discern next to something similar. INTENSEBG must be easier to discern next to
other backgrounds, such as the special palette color other backgrounds, such as the special palette color
`bg-paren-match-intense'." 'bg-paren-match-intense'."
(let ((properties (modus-themes--list-or-warn 'modus-themes-paren-match))) (let ((properties (modus-themes--list-or-warn 'modus-themes-paren-match)))
(list :inherit (list :inherit
(if (memq 'bold properties) (if (memq 'bold properties)
@ -3521,7 +3266,7 @@ that combines well with the background and foreground."
fg-alt) fg-alt)
(fg)) (fg))
:height :height
(modus-themes--alist-or-seq properties 'height #'floatp 'unspecified) (modus-themes--property-lookup properties 'height #'floatp 'unspecified)
:weight :weight
(or weight 'unspecified) (or weight 'unspecified)
:overline :overline
@ -3546,7 +3291,7 @@ FG is the foreground color to use."
(or weight 'unspecified) (or weight 'unspecified)
:height :height
(cond ((memq 'no-scale properties) 'unspecified) (cond ((memq 'no-scale properties) 'unspecified)
((modus-themes--alist-or-seq properties 'height #'floatp 1.15))) ((modus-themes--property-lookup properties 'height #'floatp 1.15)))
:foreground fg))) :foreground fg)))
(defun modus-themes--agenda-date (defaultfg grayscalefg &optional workaholicfg grayscaleworkaholicfg bg bold ul) (defun modus-themes--agenda-date (defaultfg grayscalefg &optional workaholicfg grayscaleworkaholicfg bg bold ul)
@ -3581,7 +3326,7 @@ weight. Optional UL applies an underline."
(t (t
defaultfg)) defaultfg))
:height :height
(modus-themes--alist-or-seq properties 'height #'floatp 'unspecified) (modus-themes--property-lookup properties 'height #'floatp 'unspecified)
:underline :underline
(if (and ul (memq 'underline-today properties)) (if (and ul (memq 'underline-today properties))
t t
@ -3637,8 +3382,8 @@ clearly distinguishes past, present, future tasks."
(defun modus-themes--agenda-habit (default traffic simple &optional default-d traffic-d simple-d) (defun modus-themes--agenda-habit (default traffic simple &optional default-d traffic-d simple-d)
"Specify background values for `modus-themes-org-agenda' habits. "Specify background values for `modus-themes-org-agenda' habits.
DEFAULT is the original foregrounc color. TRAFFIC is to be used DEFAULT is the original foregrounc color. TRAFFIC is to be used
when the `traffic-light' style is applied, while SIMPLE when the 'traffic-light' style is applied, while SIMPLE
corresponds to the \"simplified style\". corresponds to the 'simplified style'.
Optional DEFAULT-D, TRAFFIC-D, SIMPLE-D are alternatives to the Optional DEFAULT-D, TRAFFIC-D, SIMPLE-D are alternatives to the
main colors, meant for dopia when `modus-themes-deuteranopia' is main colors, meant for dopia when `modus-themes-deuteranopia' is
@ -3712,8 +3457,8 @@ Optional FG-DISTANT should be close to the main background
values. It is intended to be used as a distant-foreground values. It is intended to be used as a distant-foreground
property." property."
(let* ((properties (modus-themes--list-or-warn 'modus-themes-mode-line)) (let* ((properties (modus-themes--list-or-warn 'modus-themes-mode-line))
(padding (modus-themes--alist-or-seq properties 'padding #'natnump 1)) (padding (modus-themes--property-lookup properties 'padding #'natnump 1))
(height (modus-themes--alist-or-seq properties 'height #'floatp 'unspecified)) (height (modus-themes--property-lookup properties 'height #'floatp 'unspecified))
(padded (> padding 1)) (padded (> padding 1))
(base (cond ((memq 'accented properties) (base (cond ((memq 'accented properties)
(cons fg-accent bg-accent)) (cons fg-accent bg-accent))
@ -3778,10 +3523,14 @@ property."
;; Basically this is just for the keycast key indicator. ;; Basically this is just for the keycast key indicator.
(defun modus-themes--mode-line-padded-box (color) (defun modus-themes--mode-line-padded-box (color)
"Set padding of mode line box attribute with given COLOR." "Set padding of mode line box attribute with given COLOR."
(let ((padding (seq-find #'natnump modus-themes-mode-line 1))) (list :box (list :color color
(list :box (list :line-width padding :color color)))) :line-width
(or (cl-loop
for x in modus-themes-mode-line
if (natnump x) return x)
1))))
(defun modus-themes--diff (mainbg mainfg altbg altfg &optional deuteranbg deuteranfg bg-only-fg) (defun modus-themes--diff (mainbg mainfg altbg altfg &optional deubg deufg deualtbg deualtfg bg-only-fg)
"Color combinations for `modus-themes-diffs'. "Color combinations for `modus-themes-diffs'.
MAINBG must be one of the dedicated backgrounds for diffs while MAINBG must be one of the dedicated backgrounds for diffs while
@ -3791,13 +3540,20 @@ ALTBG needs to be a slightly accented background that is meant to
be combined with ALTFG. Both must be less intense than MAINBG be combined with ALTFG. Both must be less intense than MAINBG
and MAINFG respectively. and MAINFG respectively.
DEUTERANBG and DEUTERANFG must be combinations of colors that account DEUBG and DEUFG must be combinations of colors that account for
for red-green color defficiency (deuteranopia). red-green color defficiency (deuteranopia). They are the
equivalent of MAINBG and MAINFG.
Optional BG-ONLY-FG applies ALTFG else leaves the foreground DEUALTBG and DEUALTFG are the equivalent of ALTBG and ALTFG for
unspecified." deuteranopia.
Optional non-nil BG-ONLY-FG applies ALTFG else leaves the
foreground unspecified."
(if modus-themes-deuteranopia (if modus-themes-deuteranopia
(list :background (or deuteranbg mainbg) :foreground (or deuteranfg mainfg)) (pcase modus-themes-diffs
('desaturated (list :background (or deualtbg altbg) :foreground (or deualtfg altfg)))
('bg-only (list :background (or deualtbg altbg) :foreground (if bg-only-fg (or deualtfg altfg) 'unspecified)))
(_ (list :background (or deubg mainbg) :foreground (or deufg mainfg))))
(pcase modus-themes-diffs (pcase modus-themes-diffs
('desaturated (list :background altbg :foreground altfg)) ('desaturated (list :background altbg :foreground altfg))
('bg-only (list :background altbg :foreground (if bg-only-fg altfg 'unspecified))) ('bg-only (list :background altbg :foreground (if bg-only-fg altfg 'unspecified)))
@ -4114,7 +3870,7 @@ pressed button style, else the released button."
(weight weight) (weight weight)
('unspecified)) ('unspecified))
:height :height
(modus-themes--alist-or-seq properties 'height #'floatp 'unspecified) (modus-themes--property-lookup properties 'height #'floatp 'unspecified)
:underline :underline
(if (memq 'underline properties) (if (memq 'underline properties)
t t
@ -4379,7 +4135,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
((,class ,@(modus-themes--diff ((,class ,@(modus-themes--diff
bg-diff-focus-added fg-diff-focus-added bg-diff-focus-added fg-diff-focus-added
green-nuanced-bg fg-diff-added green-nuanced-bg fg-diff-added
bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran)))) bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran
blue-nuanced-bg fg-diff-added-deuteran))))
`(modus-themes-diff-changed `(modus-themes-diff-changed
((,class ,@(modus-themes--diff ((,class ,@(modus-themes--diff
bg-diff-focus-changed fg-diff-focus-changed bg-diff-focus-changed fg-diff-focus-changed
@ -4392,7 +4149,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
((,class ,@(modus-themes--diff ((,class ,@(modus-themes--diff
bg-diff-refine-added fg-diff-refine-added bg-diff-refine-added fg-diff-refine-added
bg-diff-focus-added fg-diff-focus-added bg-diff-focus-added fg-diff-focus-added
bg-diff-refine-added-deuteran fg-diff-refine-added-deuteran)))) bg-diff-refine-added-deuteran fg-diff-refine-added-deuteran
bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
`(modus-themes-diff-refine-changed `(modus-themes-diff-refine-changed
((,class ,@(modus-themes--diff ((,class ,@(modus-themes--diff
bg-diff-refine-changed fg-diff-refine-changed bg-diff-refine-changed fg-diff-refine-changed
@ -4405,7 +4163,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
((,class ,@(modus-themes--diff ((,class ,@(modus-themes--diff
bg-diff-focus-added fg-diff-focus-added bg-diff-focus-added fg-diff-focus-added
bg-diff-added fg-diff-added bg-diff-added fg-diff-added
bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran)))) bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran
bg-diff-added-deuteran fg-diff-added-deuteran))))
`(modus-themes-diff-focus-changed `(modus-themes-diff-focus-changed
((,class ,@(modus-themes--diff ((,class ,@(modus-themes--diff
bg-diff-focus-changed fg-diff-focus-changed bg-diff-focus-changed fg-diff-focus-changed
@ -4419,6 +4178,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
bg-diff-heading fg-diff-heading bg-diff-heading fg-diff-heading
cyan-nuanced-bg cyan-nuanced-fg cyan-nuanced-bg cyan-nuanced-fg
bg-header fg-main bg-header fg-main
bg-header fg-main
t)))) t))))
;;;;; deuteranopia-specific ;;;;; deuteranopia-specific
`(modus-themes-grue ((,class :foreground ,@(modus-themes--deuteran blue green)))) `(modus-themes-grue ((,class :foreground ,@(modus-themes--deuteran blue green))))
@ -4564,7 +4324,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
bg-region blue-intense-bg bg-region blue-intense-bg
fg-alt blue-intense) fg-alt blue-intense)
:extend t))) :extend t)))
`(modus-themes-key-binding ((,class :inherit bold :foreground ,blue-alt-other))) `(modus-themes-key-binding ((,class :inherit (bold modus-themes-fixed-pitch)
:foreground ,blue-alt-other)))
`(modus-themes-prompt ((,class ,@(modus-themes--prompt `(modus-themes-prompt ((,class ,@(modus-themes--prompt
cyan-alt-other blue-alt-other fg-alt cyan-alt-other blue-alt-other fg-alt
cyan-nuanced-bg blue-refine-bg fg-main cyan-nuanced-bg blue-refine-bg fg-main
@ -4592,7 +4353,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(elisp-shorthand-font-lock-face ((,class :inherit font-lock-variable-name-face))) `(elisp-shorthand-font-lock-face ((,class :inherit font-lock-variable-name-face)))
`(error ((,class :inherit bold :foreground ,red))) `(error ((,class :inherit bold :foreground ,red)))
`(escape-glyph ((,class :foreground ,fg-escape-char-construct))) `(escape-glyph ((,class :foreground ,fg-escape-char-construct)))
`(file-name-shadow ((,class :inherit (shadow italic)))) `(file-name-shadow ((,class :inherit shadow)))
`(header-line ((,class :inherit modus-themes-ui-variable-pitch `(header-line ((,class :inherit modus-themes-ui-variable-pitch
:background ,bg-header :foreground ,fg-header))) :background ,bg-header :foreground ,fg-header)))
`(header-line-highlight ((,class :inherit highlight))) `(header-line-highlight ((,class :inherit highlight)))
@ -4759,10 +4520,10 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; avy ;;;;; avy
`(avy-background-face ((,class :background ,bg-dim :foreground ,fg-dim :extend t))) `(avy-background-face ((,class :background ,bg-dim :foreground ,fg-dim :extend t)))
`(avy-goto-char-timer-face ((,class :inherit (modus-themes-intense-neutral bold)))) `(avy-goto-char-timer-face ((,class :inherit (modus-themes-intense-neutral bold))))
`(avy-lead-face ((,class :inherit (modus-themes-intense-blue bold modus-themes-reset-soft)))) `(avy-lead-face ((,class :inherit (bold modus-themes-reset-soft) :background ,bg-char-0)))
`(avy-lead-face-0 ((,class :inherit (modus-themes-refine-magenta bold modus-themes-reset-soft)))) `(avy-lead-face-0 ((,class :inherit (bold modus-themes-reset-soft) :background ,bg-char-1)))
`(avy-lead-face-1 ((,class :inherit (modus-themes-special-warm modus-themes-reset-soft)))) `(avy-lead-face-1 ((,class :inherit (modus-themes-special-warm modus-themes-reset-soft))))
`(avy-lead-face-2 ((,class :inherit (modus-themes-refine-green bold modus-themes-reset-soft)))) `(avy-lead-face-2 ((,class :inherit (bold modus-themes-reset-soft) :background ,bg-char-2)))
;;;;; aw (ace-window) ;;;;; aw (ace-window)
`(aw-background-face ((,class :foreground ,fg-unfocused))) `(aw-background-face ((,class :foreground ,fg-unfocused)))
`(aw-key-face ((,class :inherit modus-themes-key-binding))) `(aw-key-face ((,class :inherit modus-themes-key-binding)))
@ -4849,6 +4610,27 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(cfw:face-toolbar-button-off ((,class :inherit shadow))) `(cfw:face-toolbar-button-off ((,class :inherit shadow)))
`(cfw:face-toolbar-button-on ((,class :inherit bold :background ,blue-nuanced-bg `(cfw:face-toolbar-button-on ((,class :inherit bold :background ,blue-nuanced-bg
:foreground ,blue-alt))) :foreground ,blue-alt)))
;;;;; calibredb
`(calibredb-archive-face ((,class :foreground ,magenta-alt-faint)))
`(calibredb-author-face ((,class :foreground ,blue-faint)))
`(calibredb-comment-face ((,class :inherit shadow)))
`(calibredb-date-face ((,class :foreground ,cyan)))
`(calibredb-edit-annotation-header-title-face ((,class :inherit bold)))
`(calibredb-favorite-face ((,class :foreground ,red-alt)))
`(calibredb-file-face (( )))
`(calibredb-format-face ((,class :foreground ,cyan-faint)))
`(calibredb-highlight-face ((,class :inherit success)))
`(calibredb-id-face (( )))
`(calibredb-ids-face (( )))
`(calibredb-search-header-highlight-face ((,class :inherit modus-themes-hl-line)))
`(calibredb-search-header-library-name-face ((,class :foreground ,blue-active)))
`(calibredb-search-header-library-path-face ((,class :inherit bold)))
`(calibredb-search-header-sort-face ((,class :inherit bold :foreground ,magenta-active)))
`(calibredb-search-header-total-face ((,class :inherit bold :foreground ,cyan-active)))
`(calibredb-search-header-filter-face ((,class :inherit bold)))
`(calibredb-mark-face ((,class :inherit modus-themes-mark-sel)))
`(calibredb-size-face (( )))
`(calibredb-tag-face ((,class :foreground ,magenta-alt-faint)))
;;;;; centaur-tabs ;;;;; centaur-tabs
`(centaur-tabs-active-bar-face ((,class :background ,blue-active))) `(centaur-tabs-active-bar-face ((,class :background ,blue-active)))
`(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground ,red-active :underline t))) `(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground ,red-active :underline t)))
@ -4992,6 +4774,9 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(corfu-bar ((,class :background ,fg-alt))) `(corfu-bar ((,class :background ,fg-alt)))
`(corfu-border ((,class :background ,bg-active))) `(corfu-border ((,class :background ,bg-active)))
`(corfu-default ((,class :background ,bg-alt))) `(corfu-default ((,class :background ,bg-alt)))
;;;;; corfu-quick
`(corfu-quick1 ((,class :inherit bold :background ,bg-char-0)))
`(corfu-quick2 ((,class :inherit bold :background ,bg-char-1)))
;;;;; counsel ;;;;; counsel
`(counsel-active-mode ((,class :foreground ,magenta-alt-other))) `(counsel-active-mode ((,class :foreground ,magenta-alt-other)))
`(counsel-application-name ((,class :foreground ,red-alt-other))) `(counsel-application-name ((,class :foreground ,red-alt-other)))
@ -5323,6 +5108,13 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(ediff-odd-diff-Ancestor ((,class :inherit ediff-even-diff-Ancestor))) `(ediff-odd-diff-Ancestor ((,class :inherit ediff-even-diff-Ancestor)))
`(ediff-odd-diff-B ((,class :inherit ediff-even-diff-B))) `(ediff-odd-diff-B ((,class :inherit ediff-even-diff-B)))
`(ediff-odd-diff-C ((,class :inherit ediff-even-diff-C))) `(ediff-odd-diff-C ((,class :inherit ediff-even-diff-C)))
;;;;; ein (Emacs IPython Notebook)
`(ein:basecell-input-area-face ((,class :background ,bg-dim :extend t)))
`(ein:cell-output-area (( )))
`(ein:cell-output-area-error ((,class :background ,red-nuanced-bg :extend t)))
`(ein:cell-output-stderr ((,class :background ,red-nuanced-bg :extend t)))
`(ein:markdowncell-input-area-face (( )))
`(ein:notification-tab-normal ((,class :underline t)))
;;;;; eglot ;;;;; eglot
`(eglot-mode-line ((,class :inherit modus-themes-bold :foreground ,magenta-active))) `(eglot-mode-line ((,class :inherit modus-themes-bold :foreground ,magenta-active)))
;;;;; el-search ;;;;; el-search
@ -5637,7 +5429,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(font-lock-doc-face ((,class :inherit modus-themes-slant `(font-lock-doc-face ((,class :inherit modus-themes-slant
,@(modus-themes--syntax-string ,@(modus-themes--syntax-string
fg-docstring fg-special-cold fg-docstring fg-special-cold
fg-special-mild magenta-nuanced-fg fg-special-mild fg-special-calm
fg-special-mild magenta-nuanced-fg)))) fg-special-mild magenta-nuanced-fg))))
`(font-lock-function-name-face ((,class ,@(modus-themes--syntax-extra `(font-lock-function-name-face ((,class ,@(modus-themes--syntax-extra
magenta magenta-faint magenta magenta-faint
@ -5651,30 +5443,31 @@ by virtue of calling either of `modus-themes-load-operandi' and
yellow yellow-faint)))) yellow yellow-faint))))
`(font-lock-preprocessor-face ((,class ,@(modus-themes--syntax-extra `(font-lock-preprocessor-face ((,class ,@(modus-themes--syntax-extra
red-alt-other red-alt-other-faint red-alt-other red-alt-other-faint
blue-alt blue-alt-faint)))) cyan-alt-other cyan-alt-faint))))
`(font-lock-regexp-grouping-backslash ((,class :inherit bold `(font-lock-regexp-grouping-backslash ((,class :inherit modus-themes-bold
,@(modus-themes--syntax-string ,@(modus-themes--syntax-string
fg-escape-char-backslash yellow-alt-faint fg-escape-char-backslash yellow-alt-faint
yellow-alt magenta-alt yellow-alt magenta-alt
red-faint green-alt-other-faint)))) red-faint green-alt-other-faint))))
`(font-lock-regexp-grouping-construct ((,class :inherit bold `(font-lock-regexp-grouping-construct ((,class :inherit modus-themes-bold
,@(modus-themes--syntax-string ,@(modus-themes--syntax-string
fg-escape-char-construct red-alt-other-faint fg-escape-char-construct red-alt-other-faint
red-alt-other blue-alt-other red-alt-other blue-alt-other
blue-faint blue-alt-other-faint)))) blue-faint blue-alt-other-faint))))
`(font-lock-string-face ((,class ,@(modus-themes--syntax-string `(font-lock-string-face ((,class ,@(modus-themes--syntax-string
blue-alt blue-alt-faint blue-alt blue-alt-faint
green-alt-other red-alt green-alt-other red-alt-other
green-alt-faint red-alt-faint)))) green-alt-faint red-alt-faint))))
`(font-lock-type-face ((,class :inherit modus-themes-bold `(font-lock-type-face ((,class :inherit modus-themes-bold
,@(modus-themes--syntax-foreground ,@(modus-themes--syntax-extra
cyan-alt-other cyan-alt-faint)))) cyan-alt-other cyan-alt-faint
magenta-alt-other magenta-alt-other-faint))))
`(font-lock-variable-name-face ((,class ,@(modus-themes--syntax-extra `(font-lock-variable-name-face ((,class ,@(modus-themes--syntax-extra
cyan cyan-faint cyan cyan-faint
blue-alt-other blue-alt-other-faint)))) blue-alt blue-alt-faint))))
`(font-lock-warning-face ((,class :inherit modus-themes-bold `(font-lock-warning-face ((,class :inherit modus-themes-bold
,@(modus-themes--syntax-comment ,@(modus-themes--syntax-foreground
yellow-active red-active red-faint yellow-faint)))) yellow-active yellow-alt-faint))))
;;;;; forge ;;;;; forge
`(forge-post-author ((,class :inherit bold :foreground ,fg-main))) `(forge-post-author ((,class :inherit bold :foreground ,fg-main)))
`(forge-post-date ((,class :foreground ,fg-special-cold))) `(forge-post-date ((,class :foreground ,fg-special-cold)))
@ -5685,7 +5478,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(forge-topic-unread ((,class :inherit bold :foreground ,fg-main))) `(forge-topic-unread ((,class :inherit bold :foreground ,fg-main)))
;;;;; fountain-mode ;;;;; fountain-mode
`(fountain-character ((,class :foreground ,blue-alt-other))) `(fountain-character ((,class :foreground ,blue-alt-other)))
`(fountain-comment ((,class :inherit modus-themes-slant :foreground ,fg-alt))) `(fountain-comment ((,class :inherit font-lock-comment-face)))
`(fountain-dialog ((,class :foreground ,blue-alt))) `(fountain-dialog ((,class :foreground ,blue-alt)))
`(fountain-metadata-key ((,class :foreground ,green-alt-other))) `(fountain-metadata-key ((,class :foreground ,green-alt-other)))
`(fountain-metadata-value ((,class :foreground ,blue))) `(fountain-metadata-value ((,class :foreground ,blue)))
@ -5719,11 +5512,11 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(geiser-font-lock-xref-link ((,class :inherit button))) `(geiser-font-lock-xref-link ((,class :inherit button)))
;;;;; git-commit ;;;;; git-commit
`(git-commit-comment-action ((,class :inherit font-lock-comment-face))) `(git-commit-comment-action ((,class :inherit font-lock-comment-face)))
`(git-commit-comment-branch-local ((,class :inherit modus-themes-slant :foreground ,blue-alt))) `(git-commit-comment-branch-local ((,class :inherit font-lock-comment-face :foreground ,blue-alt)))
`(git-commit-comment-branch-remote ((,class :inherit modus-themes-slant :foreground ,magenta-alt))) `(git-commit-comment-branch-remote ((,class :inherit font-lock-comment-face :foreground ,magenta-alt)))
`(git-commit-comment-detached ((,class :inherit modus-themes-slant :foreground ,cyan-alt))) `(git-commit-comment-detached ((,class :inherit font-lock-comment-face :foreground ,cyan-alt)))
`(git-commit-comment-file ((,class :inherit modus-themes-slant :foreground ,cyan))) `(git-commit-comment-file ((,class :inherit font-lock-comment-face :foreground ,cyan)))
`(git-commit-comment-heading ((,class :inherit (bold modus-themes-slant)))) `(git-commit-comment-heading ((,class :inherit (bold font-lock-comment-face))))
`(git-commit-keyword ((,class :foreground ,magenta))) `(git-commit-keyword ((,class :foreground ,magenta)))
`(git-commit-known-pseudo-header ((,class :foreground ,cyan-alt-other))) `(git-commit-known-pseudo-header ((,class :foreground ,cyan-alt-other)))
`(git-commit-nonempty-second-line ((,class :inherit error))) `(git-commit-nonempty-second-line ((,class :inherit error)))
@ -5741,8 +5534,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(git-gutter-fr:deleted ((,class :inherit modus-themes-fringe-red))) `(git-gutter-fr:deleted ((,class :inherit modus-themes-fringe-red)))
`(git-gutter-fr:modified ((,class :inherit modus-themes-fringe-yellow))) `(git-gutter-fr:modified ((,class :inherit modus-themes-fringe-yellow)))
;;;;; git-rebase ;;;;; git-rebase
`(git-rebase-comment-hash ((,class :inherit modus-themes-slant :foreground ,cyan))) `(git-rebase-comment-hash ((,class :inherit font-lock-comment-face :foreground ,cyan)))
`(git-rebase-comment-heading ((,class :inherit (bold modus-themes-slant)))) `(git-rebase-comment-heading ((,class :inherit (bold font-lock-comment-face))))
`(git-rebase-description ((,class :foreground ,fg-main))) `(git-rebase-description ((,class :foreground ,fg-main)))
`(git-rebase-hash ((,class :foreground ,cyan-alt-other))) `(git-rebase-hash ((,class :foreground ,cyan-alt-other)))
;;;;; git-timemachine ;;;;; git-timemachine
@ -6114,7 +5907,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(kaocha-runner-warning-face ((,class :inherit warning))) `(kaocha-runner-warning-face ((,class :inherit warning)))
;;;;; keycast ;;;;; keycast
`(keycast-command ((,class :inherit bold :foreground ,blue-active))) `(keycast-command ((,class :inherit bold :foreground ,blue-active)))
`(keycast-key ((,class ,@(modus-themes--mode-line-padded-box blue-active) ;; FIXME 2022-05-03: The padding breaks `keycast-tab-bar-mode'
`(keycast-key ((,class ;; ,@(modus-themes--mode-line-padded-box blue-active)
:background ,blue-active :foreground ,bg-main))) :background ,blue-active :foreground ,bg-main)))
;;;;; ledger-mode ;;;;; ledger-mode
`(ledger-font-auto-xact-face ((,class :foreground ,magenta))) `(ledger-font-auto-xact-face ((,class :foreground ,magenta)))
@ -6128,23 +5922,26 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(ledger-font-payee-uncleared-face ((,class :foreground ,red-alt-other))) `(ledger-font-payee-uncleared-face ((,class :foreground ,red-alt-other)))
`(ledger-font-xact-highlight-face ((,class :background ,bg-hl-alt))) `(ledger-font-xact-highlight-face ((,class :background ,bg-hl-alt)))
;;;;; line numbers (display-line-numbers-mode and global variant) ;;;;; line numbers (display-line-numbers-mode and global variant)
;; Here we cannot inherit `modus-themes-fixed-pitch'. We need to
;; fall back to `default' otherwise line numbers do not scale when
;; using `text-scale-adjust'.
`(line-number `(line-number
((,class :inherit default ((,class :inherit ,(if modus-themes-mixed-fonts 'fixed-pitch 'default)
,@(modus-themes--line-numbers ,@(modus-themes--line-numbers
fg-alt bg-dim fg-alt bg-dim
fg-unfocused)))) fg-unfocused))))
`(line-number-current-line `(line-number-current-line
((,class :inherit (bold default) ((,class :inherit (bold line-number)
,@(modus-themes--line-numbers ,@(modus-themes--line-numbers
fg-main bg-active fg-main bg-active
blue-alt-other)))) blue-alt-other))))
`(line-number-major-tick `(line-number-major-tick
((,class :inherit (bold default) ((,class :inherit (bold line-number)
,@(modus-themes--line-numbers ,@(modus-themes--line-numbers
yellow-nuanced-fg yellow-nuanced-bg yellow-nuanced-fg yellow-nuanced-bg
red-alt)))) red-alt))))
`(line-number-minor-tick `(line-number-minor-tick
((,class :inherit (bold default) ((,class :inherit (bold line-number)
,@(modus-themes--line-numbers ,@(modus-themes--line-numbers
fg-alt bg-inactive fg-alt bg-inactive
fg-inactive)))) fg-inactive))))
@ -6228,7 +6025,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(magit-diff-added ((,class ,@(modus-themes--diff `(magit-diff-added ((,class ,@(modus-themes--diff
bg-diff-added fg-diff-added bg-diff-added fg-diff-added
green-nuanced-bg fg-diff-added green-nuanced-bg fg-diff-added
bg-diff-added-deuteran fg-diff-added-deuteran)))) bg-diff-added-deuteran fg-diff-added-deuteran
blue-nuanced-bg fg-diff-added-deuteran))))
`(magit-diff-added-highlight ((,class :inherit modus-themes-diff-focus-added))) `(magit-diff-added-highlight ((,class :inherit modus-themes-diff-focus-added)))
`(magit-diff-base ((,class ,@(modus-themes--diff `(magit-diff-base ((,class ,@(modus-themes--diff
bg-diff-changed fg-diff-changed bg-diff-changed fg-diff-changed
@ -6249,6 +6047,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
bg-active fg-inactive bg-active fg-inactive
bg-inactive fg-inactive bg-inactive fg-inactive
bg-inactive fg-inactive bg-inactive fg-inactive
nil nil
t)))) t))))
;; NOTE: we do not follow the pattern of inheriting from ;; NOTE: we do not follow the pattern of inheriting from
;; modus-themes-grue-* faces, as this is a special case. ;; modus-themes-grue-* faces, as this is a special case.
@ -6687,9 +6486,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
:background ,bg-alt))) :background ,bg-alt)))
`(org-column-title ((,class :inherit (bold modus-themes-fixed-pitch default) `(org-column-title ((,class :inherit (bold modus-themes-fixed-pitch default)
:underline t :background ,bg-alt))) :underline t :background ,bg-alt)))
`(org-date ((,class :inherit ,(if modus-themes-mixed-fonts `(org-date ((,class :inherit (modus-themes-link-symlink modus-themes-fixed-pitch))))
'(fixed-pitch modus-themes-link-symlink)
'modus-themes-link-symlink))))
`(org-date-selected ((,class :foreground ,blue-alt :inverse-video t))) `(org-date-selected ((,class :foreground ,blue-alt :inverse-video t)))
`(org-dispatcher-highlight ((,class :inherit (bold modus-themes-mark-alt)))) `(org-dispatcher-highlight ((,class :inherit (bold modus-themes-mark-alt))))
`(org-document-info ((,class :foreground ,fg-special-cold))) `(org-document-info ((,class :foreground ,fg-special-cold)))
@ -6906,7 +6703,7 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(popup-summary-face ((,class :background ,bg-active :foreground ,fg-inactive))) `(popup-summary-face ((,class :background ,bg-active :foreground ,fg-inactive)))
`(popup-tip-face ((,class :inherit modus-themes-refine-yellow))) `(popup-tip-face ((,class :inherit modus-themes-refine-yellow)))
;;;;; powerline ;;;;; powerline
`(powerline-active0 ((,class :background ,bg-main :foreground ,blue-faint :inverse-video t))) `(powerline-active0 ((,class :background ,blue-faint :foreground ,bg-main)))
`(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground ,blue-nuanced-fg))) `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground ,blue-nuanced-fg)))
`(powerline-active2 ((,class :background ,bg-active :foreground ,fg-active))) `(powerline-active2 ((,class :background ,bg-active :foreground ,fg-active)))
`(powerline-inactive0 ((,class :background ,bg-special-cold :foreground ,fg-special-cold))) `(powerline-inactive0 ((,class :background ,bg-special-cold :foreground ,fg-special-cold)))
@ -7355,7 +7152,9 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; transient ;;;;; transient
`(transient-active-infix ((,class :inherit modus-themes-special-mild))) `(transient-active-infix ((,class :inherit modus-themes-special-mild)))
`(transient-amaranth ((,class :inherit bold :foreground ,yellow-alt))) `(transient-amaranth ((,class :inherit bold :foreground ,yellow-alt)))
`(transient-argument ((,class :inherit bold :background ,cyan-nuanced-bg :foreground ,cyan))) ;; Placate the compiler for what is a spurious warning. We also
;; have to do this with `eldoc-highlight-function-argument'.
(list 'transient-argument `((,class :inherit bold :background ,cyan-nuanced-bg :foreground ,cyan)))
`(transient-blue ((,class :inherit bold :foreground ,blue))) `(transient-blue ((,class :inherit bold :foreground ,blue)))
`(transient-disabled-suffix ((,class :inherit modus-themes-intense-red))) `(transient-disabled-suffix ((,class :inherit modus-themes-intense-red)))
`(transient-enabled-suffix ((,class :inherit modus-themes-grue-background-subtle))) `(transient-enabled-suffix ((,class :inherit modus-themes-grue-background-subtle)))
@ -7379,6 +7178,24 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(trashed-marked ((,class :inherit modus-themes-mark-alt))) `(trashed-marked ((,class :inherit modus-themes-mark-alt)))
`(trashed-restored ((,class :inherit modus-themes-mark-sel))) `(trashed-restored ((,class :inherit modus-themes-mark-sel)))
`(trashed-symlink ((,class :inherit modus-themes-link-symlink))) `(trashed-symlink ((,class :inherit modus-themes-link-symlink)))
;;;;; tree-sitter
`(tree-sitter-hl-face:attribute ((,class :inherit font-lock-variable-name-face)))
`(tree-sitter-hl-face:constant.builtin ((,class :inherit tree-sitter-hl-face:constant)))
`(tree-sitter-hl-face:escape ((,class :inherit font-lock-regexp-grouping-backslash)))
`(tree-sitter-hl-face:function ((,class :inherit font-lock-function-name-face)))
`(tree-sitter-hl-face:function.call ((,class :inherit tree-sitter-hl-face:function)))
`(tree-sitter-hl-face:label (( )))
`(tree-sitter-hl-face:method.call (( )))
`(tree-sitter-hl-face:operator ((,class :inherit modus-themes-bold)))
`(tree-sitter-hl-face:property (( )))
`(tree-sitter-hl-face:property.definition ((,class :inherit font-lock-variable-name-face)))
`(tree-sitter-hl-face:punctuation (( )))
`(tree-sitter-hl-face:punctuation.bracket (( )))
`(tree-sitter-hl-face:punctuation.delimiter (( )))
`(tree-sitter-hl-face:punctuation.special ((,class :inherit font-lock-regexp-grouping-construct)))
`(tree-sitter-hl-face:string.special ((,class :inherit tree-sitter-hl-face:string)))
`(tree-sitter-hl-face:tag ((,class :inherit font-lock-function-name-face)))
`(tree-sitter-hl-face:type.argument (( )))
;;;;; treemacs ;;;;; treemacs
`(treemacs-directory-collapsed-face ((,class :foreground ,magenta-alt))) `(treemacs-directory-collapsed-face ((,class :foreground ,magenta-alt)))
`(treemacs-directory-face ((,class :inherit dired-directory))) `(treemacs-directory-face ((,class :inherit dired-directory)))
@ -7460,8 +7277,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
;;;;; vertico ;;;;; vertico
`(vertico-current ((,class :inherit modus-themes-completion-selected))) `(vertico-current ((,class :inherit modus-themes-completion-selected)))
;;;;; vertico-quick ;;;;; vertico-quick
`(vertico-quick1 ((,class :inherit (modus-themes-intense-blue bold)))) `(vertico-quick1 ((,class :inherit bold :background ,bg-char-0)))
`(vertico-quick2 ((,class :inherit (modus-themes-refine-magenta bold)))) `(vertico-quick2 ((,class :inherit bold :background ,bg-char-1)))
;;;;; vimish-fold ;;;;; vimish-fold
`(vimish-fold-fringe ((,class :foreground ,cyan-active))) `(vimish-fold-fringe ((,class :foreground ,cyan-active)))
`(vimish-fold-mouse-face ((,class :inherit modus-themes-intense-blue))) `(vimish-fold-mouse-face ((,class :inherit modus-themes-intense-blue)))
@ -7491,6 +7308,8 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(vterm-color-underline ((,class :foreground ,fg-special-warm :underline t))) `(vterm-color-underline ((,class :foreground ,fg-special-warm :underline t)))
`(vterm-color-white ((,class :background "gray65" :foreground "gray65"))) `(vterm-color-white ((,class :background "gray65" :foreground "gray65")))
`(vterm-color-yellow ((,class :background ,yellow :foreground ,yellow))) `(vterm-color-yellow ((,class :background ,yellow :foreground ,yellow)))
;;;;; vundo
`(vundo-highlight ((,class :inherit (bold vundo-node) :foreground ,red-intense)))
;;;;; wcheck-mode ;;;;; wcheck-mode
`(wcheck-default-face ((,class :foreground ,red :underline t))) `(wcheck-default-face ((,class :foreground ,red :underline t)))
;;;;; web-mode ;;;;; web-mode
@ -7652,6 +7471,9 @@ by virtue of calling either of `modus-themes-load-operandi' and
`(flymake-error-bitmap '(flymake-double-exclamation-mark modus-themes-fringe-red)) `(flymake-error-bitmap '(flymake-double-exclamation-mark modus-themes-fringe-red))
`(flymake-warning-bitmap '(exclamation-mark modus-themes-fringe-yellow)) `(flymake-warning-bitmap '(exclamation-mark modus-themes-fringe-yellow))
`(flymake-note-bitmap '(exclamation-mark modus-themes-fringe-cyan)) `(flymake-note-bitmap '(exclamation-mark modus-themes-fringe-cyan))
;;;; highlight-changes
`(highlight-changes-colors nil)
`(highlight-changes-face-list '(success warning error bold bold-italic))
;;;; ibuffer ;;;; ibuffer
`(ibuffer-deletion-face 'modus-themes-mark-del) `(ibuffer-deletion-face 'modus-themes-mark-del)
`(ibuffer-filter-group-name-face 'modus-themes-pseudo-header) `(ibuffer-filter-group-name-face 'modus-themes-pseudo-header)
@ -7753,9 +7575,4 @@ by virtue of calling either of `modus-themes-load-operandi' and
(add-to-list 'custom-theme-load-path dir)))) (add-to-list 'custom-theme-load-path dir))))
(provide 'modus-themes) (provide 'modus-themes)
;; Local Variables:
;; time-stamp-pattern: "Last-Modified: <%Y-%02m-%02d %02H:%02M:%02S %5z>"
;; End:
;;; modus-themes.el ends here ;;; modus-themes.el ends here

View file

@ -3,8 +3,8 @@
;; Copyright (C) 2019-2022 Free Software Foundation, Inc. ;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
;; Author: Protesilaos Stavrou <info@protesilaos.com> ;; Author: Protesilaos Stavrou <info@protesilaos.com>
;; URL: https://gitlab.com/protesilaos/modus-themes ;; URL: https://git.sr.ht/~protesilaos/modus-themes
;; Version: 2.3.0 ;; Version: 2.4.1
;; Package-Requires: ((emacs "27.1")) ;; Package-Requires: ((emacs "27.1"))
;; Keywords: faces, theme, accessibility ;; Keywords: faces, theme, accessibility

View file

@ -905,6 +905,15 @@ Dired 能够在一个缓冲区里列出一个目录下的所有文件(可以
Emacs 使用手册里还有许许多多的精彩功能等着你来了解。 Emacs 使用手册里还有许许多多的精彩功能等着你来了解。
* 安装包裹INSTALLING PACKAGES
---------------------------
Emacs 社区著作了许多持有扩展性的包裹packages其中包括对各种语言的
支持、色彩鲜艳的主题、用于集成外部程序的包裹,等等。
使用 M-x list-packages 便可浏览存在的包裹。这个命令显示的界面中可以安
装和卸载包裹以及查看包裹的简介。Emacs 使用手册中有对包裹管理更详细的
介绍。
* 总结CONCLUSION * 总结CONCLUSION
-------------------- --------------------

1267
etc/tutorials/TUTORIAL.el_GR Normal file

File diff suppressed because it is too large Load diff

View file

@ -1110,7 +1110,7 @@ mentre fai riferimento al testo di aiuto e poi usare un C-x 1.
Ecco altre utili opzioni di C-h: Ecco altre utili opzioni di C-h:
C-h x Descrive un comando. Inserisci il nome della comando. C-h x Descrive un comando. Inserisci il nome del comando.
>> Prova con C-h x previous-line <Invio>. >> Prova con C-h x previous-line <Invio>.
Questo mostrerà tutte le informazioni che Emacs possiede sulla Questo mostrerà tutte le informazioni che Emacs possiede sulla

View file

@ -26,6 +26,10 @@ Maintainer: Dale Gulledge <dsplat@rochester.rr.com>
Author: Rafael Sepúlveda <drs@gnulinux.org.mx> Author: Rafael Sepúlveda <drs@gnulinux.org.mx>
Maintainer: Rafael Sepúlveda <drs@gnulinux.org.mx> Maintainer: Rafael Sepúlveda <drs@gnulinux.org.mx>
* TUTORIAL.el_GR:
Author: Protesilaos Stavrou <info@protesilaos.com>
Maintainer: Protesilaos Stavrou <info@protesilaos.com>
* TUTORIAL.fr: * TUTORIAL.fr:
Author: Éric Jacoboni <jaco@teaser.fr> Author: Éric Jacoboni <jaco@teaser.fr>
Maintainer: Éric Jacoboni <jaco@teaser.fr> Maintainer: Éric Jacoboni <jaco@teaser.fr>

View file

@ -32,6 +32,12 @@ leimdir = ${srcdir}/../lisp/leim
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
SMALL_JA_DIC = @SMALL_JA_DIC@
JA_DIC_NO_REDUCTION_OPTION = --no-reduction
ifeq ($(SMALL_JA_DIC), yes)
JA_DIC_NO_REDUCTION_OPTION =
endif
-include ${top_builddir}/src/verbose.mk -include ${top_builddir}/src/verbose.mk
# Prevent any settings in the user environment causing problems. # Prevent any settings in the user environment causing problems.
@ -80,7 +86,7 @@ MISC= \
TIT_MISC = ${TIT_GB} ${TIT_BIG5} ${MISC} TIT_MISC = ${TIT_GB} ${TIT_BIG5} ${MISC}
all: ${leimdir}/leim-list.el ${leimdir}/ja-dic/ja-dic.el all: ${leimdir}/leim-list.el
.PHONY: all .PHONY: all
@ -129,10 +135,12 @@ ${leimdir}/leim-list.el: ${srcdir}/leim-ext.el ${TIT_MISC}
${leimdir}/ja-dic/ja-dic.el: | $(leimdir)/ja-dic ${leimdir}/ja-dic/ja-dic.el: | $(leimdir)/ja-dic
.PHONY: generate-ja-dic
generate-ja-dic: ${leimdir}/ja-dic/ja-dic.el
${leimdir}/ja-dic/ja-dic.el: $(srcdir)/SKK-DIC/SKK-JISYO.L ${leimdir}/ja-dic/ja-dic.el: $(srcdir)/SKK-DIC/SKK-JISYO.L
$(AM_V_GEN)$(RUN_EMACS) -batch -l ja-dic-cnv \ $(AM_V_GEN)$(RUN_EMACS) -batch -l ja-dic-cnv \
--eval "(setq max-specpdl-size 5000)" \ --eval "(setq max-specpdl-size 5000)" \
-f batch-skkdic-convert -dir "$(leimdir)/ja-dic" "$<" -f batch-skkdic-convert -dir "$(leimdir)/ja-dic" $(JA_DIC_NO_REDUCTION_OPTION) "$<"
${srcdir}/../lisp/language/pinyin.el: ${srcdir}/MISC-DIC/pinyin.map ${srcdir}/../lisp/language/pinyin.el: ${srcdir}/MISC-DIC/pinyin.map
$(AM_V_GEN)${RUN_EMACS} -l titdic-cnv -f pinyin-convert $< $@ $(AM_V_GEN)${RUN_EMACS} -l titdic-cnv -f pinyin-convert $< $@

View file

@ -1427,14 +1427,19 @@ main (int argc, char **argv)
if (CTAGS) if (CTAGS)
if (append_to_tagfile || update) if (append_to_tagfile || update)
{ {
char *cmd = xmalloc (2 * strlen (tagfile) + sizeof "sort -u -o..");
/* Maybe these should be used: /* Maybe these should be used:
setenv ("LC_COLLATE", "C", 1); setenv ("LC_COLLATE", "C", 1);
setenv ("LC_ALL", "C", 1); */ setenv ("LC_ALL", "C", 1); */
char *z = stpcpy (cmd, "sort -u -o "); char *cmd = xmalloc (8 * strlen (tagfile) + sizeof "sort -u -o '' ''");
z = stpcpy (z, tagfile); char *z = stpcpy (cmd, "sort -u -o '");
*z++ = ' '; char *escaped_tagfile = z;
strcpy (z, tagfile); for (; *tagfile; *z++ = *tagfile++)
if (*tagfile == '\'')
z = stpcpy (z, "'\\'");
ptrdiff_t escaped_tagfile_len = z - escaped_tagfile;
z = stpcpy (z, "' '");
z = mempcpy (z, escaped_tagfile, escaped_tagfile_len);
strcpy (z, "'");
return system (cmd); return system (cmd);
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -4161,6 +4166,9 @@ C_entries (int c_ext, /* extension of C */
if (definedef != dnone) if (definedef != dnone)
break; break;
bracelev -= 1; bracelev -= 1;
/* If we see a closing brace in column zero, and we weren't told to
ignore indentation, we assume this the final brace of a function
or struct definition, and reset bracelev to zero. */
if (!ignoreindent && lp == newlb.buffer + 1) if (!ignoreindent && lp == newlb.buffer + 1)
{ {
if (bracelev != 0) if (bracelev != 0)
@ -6396,7 +6404,8 @@ mercury_decl (char *s, size_t pos)
size_t origpos; size_t origpos;
origpos = pos; origpos = pos;
while (s + pos != NULL && (c_isalnum (s[pos]) || s[pos] == '_')) ++pos; while (c_isalnum (s[pos]) || s[pos] == '_')
pos++;
unsigned char decl_type_length = pos - origpos; unsigned char decl_type_length = pos - origpos;
char buf[decl_type_length + 1]; char buf[decl_type_length + 1];
@ -6440,9 +6449,9 @@ mercury_decl (char *s, size_t pos)
so this is the hard case. */ so this is the hard case. */
if (strcmp (buf, "solver") == 0) if (strcmp (buf, "solver") == 0)
{ {
++pos; do
while (s + pos != NULL && (c_isalnum (s[pos]) || s[pos] == '_')) pos++;
++pos; while (c_isalnum (s[pos]) || s[pos] == '_');
decl_type_length = pos - origpos; decl_type_length = pos - origpos;
char buf2[decl_type_length + 1]; char buf2[decl_type_length + 1];
@ -6492,7 +6501,6 @@ mercury_decl (char *s, size_t pos)
while (c_isalnum (s[pos]) while (c_isalnum (s[pos])
|| s[pos] == '_' || s[pos] == '_'
|| (s[pos] == '.' /* A module dot. */ || (s[pos] == '.' /* A module dot. */
&& s + pos + 1 != NULL
&& (c_isalnum (s[pos + 1]) || s[pos + 1] == '_') && (c_isalnum (s[pos + 1]) || s[pos + 1] == '_')
&& (module_dot_pos = pos))) /* Record module dot position. && (module_dot_pos = pos))) /* Record module dot position.
Erase module from name. */ Erase module from name. */
@ -6536,10 +6544,10 @@ mercury_decl (char *s, size_t pos)
} }
else if (is_mercury_quantifier && s[pos] == '[') /* :- some [T] pred/func. */ else if (is_mercury_quantifier && s[pos] == '[') /* :- some [T] pred/func. */
{ {
for (++pos; s + pos != NULL && s[pos] != ']'; ++pos) {} char *close_bracket = strchr (s + pos + 1, ']');
if (s + pos == NULL) return null_pos; if (!close_bracket)
++pos; return null_pos;
pos = skip_spaces (s + pos) - s; pos = skip_spaces (close_bracket + 1) - s;
mercury_pos_t position = mercury_decl (s, pos); mercury_pos_t position = mercury_decl (s, pos);
position.totlength += pos - origpos; position.totlength += pos - origpos;
return position; return position;
@ -7243,8 +7251,8 @@ readline_internal (linebuffer *lbp, FILE *stream, char const *filename)
{ {
/* We're at the end of linebuffer: expand it. */ /* We're at the end of linebuffer: expand it. */
xrnew (buffer, lbp->size, 2); xrnew (buffer, lbp->size, 2);
p = buffer + lbp->size;
lbp->size *= 2; lbp->size *= 2;
p += buffer - lbp->buffer;
pend = buffer + lbp->size; pend = buffer + lbp->size;
lbp->buffer = buffer; lbp->buffer = buffer;
} }
@ -7665,21 +7673,21 @@ relative_filename (char *file, char *dir)
{ {
char *fp, *dp, *afn, *res; char *fp, *dp, *afn, *res;
ptrdiff_t i; ptrdiff_t i;
char *dir_last_slash UNINIT;
/* Find the common root of file and dir (with a trailing slash). */ /* Find the common root of file and dir (with a trailing slash). */
afn = absolute_filename (file, cwd); afn = absolute_filename (file, cwd);
fp = afn; fp = afn;
dp = dir; dp = dir;
while (*fp++ == *dp++) while (*fp++ == *dp++)
continue; if (dp[-1] == '/')
fp--, dp--; /* back to the first differing char */ dir_last_slash = dp - 1;
#ifdef DOS_NT #ifdef DOS_NT
if (fp == afn && afn[0] != '/') /* cannot build a relative name */ if (fp - 1 == afn && afn[0] != '/')
return afn; return afn; /* Cannot build a relative name. */
#endif #endif
do /* look at the equal chars until '/' */ fp -= dp - dir_last_slash;
fp--, dp--; dp = dir_last_slash;
while (*fp != '/');
/* Build a sequence of "../" strings for the resulting relative file name. */ /* Build a sequence of "../" strings for the resulting relative file name. */
i = 0; i = 0;

View file

@ -1068,7 +1068,7 @@ scan_c_stream (FILE *infile)
attributes: attribute1 attribute2 ...) attributes: attribute1 attribute2 ...)
(Lisp_Object arg...) (Lisp_Object arg...)
Now only const, noinline and 'noreturn' attributes Now only `const', `noinline' and `noreturn' attributes
are used. */ are used. */
/* Advance to the end of docstring. */ /* Advance to the end of docstring. */

View file

@ -208,7 +208,6 @@ CPP = @CPP@
CPPFLAGS = @CPPFLAGS@ CPPFLAGS = @CPPFLAGS@
CRYPTOLIB = @CRYPTOLIB@ CRYPTOLIB = @CRYPTOLIB@
CXX = @CXX@ CXX = @CXX@
CXXCPP = @CXXCPP@
CXXFLAGS = @CXXFLAGS@ CXXFLAGS = @CXXFLAGS@
CYGWIN_OBJ = @CYGWIN_OBJ@ CYGWIN_OBJ = @CYGWIN_OBJ@
C_SWITCH_MACHINE = @C_SWITCH_MACHINE@ C_SWITCH_MACHINE = @C_SWITCH_MACHINE@

View file

@ -59,15 +59,6 @@ BYTE_COMPILE_EXTRA_FLAGS =
# BYTE_COMPILE_EXTRA_FLAGS = --eval '(setq byte-compile-warnings (quote (not unresolved)))' # BYTE_COMPILE_EXTRA_FLAGS = --eval '(setq byte-compile-warnings (quote (not unresolved)))'
# The example above is just for developers, it should not be used by default. # The example above is just for developers, it should not be used by default.
# Those automatically generated autoload files that need special rules
# to build; i.e. not including things created via generated-autoload-file
# (eg calc/calc-loaddefs.el).
LOADDEFS = $(lisp)/calendar/cal-loaddefs.el \
$(lisp)/calendar/diary-loaddefs.el \
$(lisp)/calendar/hol-loaddefs.el \
$(lisp)/mh-e/mh-loaddefs.el \
$(lisp)/net/tramp-loaddefs.el
# All generated autoload files. # All generated autoload files.
loaddefs = $(shell find ${srcdir} -name '*loaddefs.el' ! -name '.*') loaddefs = $(shell find ${srcdir} -name '*loaddefs.el' ! -name '.*')
# Elisp files auto-generated. # Elisp files auto-generated.
@ -84,10 +75,11 @@ compile-first: BYTE_COMPILE_FLAGS = \
# Files to compile before others during a bootstrap. This is done to # Files to compile before others during a bootstrap. This is done to
# speed up the bootstrap process. They're ordered by size, so we use # speed up the bootstrap process. They're ordered by size, so we use
# the slowest-compiler on the smallest file and move to larger files as the # the slowest-compiler on the smallest file and move to larger files
# compiler gets faster. 'autoload.elc' comes last because it is not used by # as the compiler gets faster. 'loaddefs-gen.elc'/'radix-tree.el'
# the compiler (so its compilation does not speed up subsequent compilations), # comes last because they're not used by the compiler (so its
# it's only placed here so as to speed up generation of the loaddefs.el file. # compilation does not speed up subsequent compilations), it's only
# placed here so as to speed up generation of the loaddefs.el files.
COMPILE_FIRST = \ COMPILE_FIRST = \
$(lisp)/emacs-lisp/macroexp.elc \ $(lisp)/emacs-lisp/macroexp.elc \
@ -98,11 +90,18 @@ ifeq ($(HAVE_NATIVE_COMP),yes)
COMPILE_FIRST += $(lisp)/emacs-lisp/comp.elc COMPILE_FIRST += $(lisp)/emacs-lisp/comp.elc
COMPILE_FIRST += $(lisp)/emacs-lisp/comp-cstr.elc COMPILE_FIRST += $(lisp)/emacs-lisp/comp-cstr.elc
endif endif
COMPILE_FIRST += $(lisp)/emacs-lisp/autoload.elc COMPILE_FIRST += $(lisp)/emacs-lisp/loaddefs-gen.elc
COMPILE_FIRST += $(lisp)/emacs-lisp/radix-tree.elc
# Files to compile early in compile-main. Works around bug#25556. # Files to compile early in compile-main. Works around bug#25556.
# Also compile the ja-dic file used to convert the Japanese dictionary
# to speed things up. The org files are used to convert org files to
# texi files.
MAIN_FIRST = ./emacs-lisp/eieio.el ./emacs-lisp/eieio-base.el \ MAIN_FIRST = ./emacs-lisp/eieio.el ./emacs-lisp/eieio-base.el \
./cedet/semantic/db.el ./emacs-lisp/cconv.el ./cedet/semantic/db.el ./emacs-lisp/cconv.el \
./international/ja-dic-cnv.el \
./org/ox.el ./org/ox-texinfo.el ./org/org-macro.el ./org/org-element.el \
./org/oc.el ./org/ol.el ./emacs-lisp/cl-lib.el
# Prevent any settings in the user environment causing problems. # Prevent any settings in the user environment causing problems.
unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH unexport EMACSDATA EMACSDOC EMACSLOADPATH EMACSPATH
@ -125,10 +124,12 @@ SUBDIRS_SUBDIRS = $(filter-out ${srcdir}/cedet% ${srcdir}/leim%,${SUBDIRS})
# cus-load and finder-inf are not explicitly requested by anything, so # cus-load and finder-inf are not explicitly requested by anything, so
# we add them here to make sure they get built. # we add them here to make sure they get built.
all: compile-main $(lisp)/cus-load.el $(lisp)/finder-inf.el all: compile-main $(lisp)/cus-load.el $(lisp)/finder-inf.el generate-ja-dic \
org-manuals
PHONY_EXTRAS = PHONY_EXTRAS =
.PHONY: all custom-deps finder-data autoloads update-subdirs $(PHONY_EXTRAS) .PHONY: all custom-deps finder-data autoloads update-subdirs $(PHONY_EXTRAS) \
generate-ja-dic org-manuals
# custom-deps and finder-data both used to scan _all_ the *.el files. # custom-deps and finder-data both used to scan _all_ the *.el files.
# This could lead to problems in parallel builds if automatically # This could lead to problems in parallel builds if automatically
@ -159,6 +160,14 @@ $(lisp)/finder-inf.el:
--eval '(setq generated-finder-keywords-file (unmsys--file-name "$(srcdir)/finder-inf.el"))' \ --eval '(setq generated-finder-keywords-file (unmsys--file-name "$(srcdir)/finder-inf.el"))' \
-f finder-compile-keywords-make-dist ${SUBDIRS_FINDER} -f finder-compile-keywords-make-dist ${SUBDIRS_FINDER}
# This is the OKURO-NASI compilation trigger.
generate-ja-dic: main-first
$(AM_V_at)$(MAKE) -C ../leim generate-ja-dic EMACS="$(EMACS)"
$(AM_V_at)$(MAKE) compile-targets TARGETS="./leim/ja-dic/ja-dic.elc"
org-manuals: main-first
$(AM_V_at)$(MAKE) -C ../doc/misc org.texi modus-themes.texi
## Comments on loaddefs generation: ## Comments on loaddefs generation:
# loaddefs depends on gen-lisp for two reasons: # loaddefs depends on gen-lisp for two reasons:
@ -167,6 +176,9 @@ $(lisp)/finder-inf.el:
# gets created before the final emacs is dumped. Having leim # gets created before the final emacs is dumped. Having leim
# dependencies in ../src as well would create a parallel race condition. # dependencies in ../src as well would create a parallel race condition.
# #
# FIXME: 2) is no longer correct, so perhaps we could add unidata to
# gen-lisp now?
#
# 2) Files that are marked no-update-autoloads still get recorded in loaddefs. # 2) Files that are marked no-update-autoloads still get recorded in loaddefs.
# So those files should be generated before we make autoloads, if we # So those files should be generated before we make autoloads, if we
# don't want a successive make autoloads to change the output file. # don't want a successive make autoloads to change the output file.
@ -186,19 +198,13 @@ $(lisp)/finder-inf.el:
# We make $(lisp)/loaddefs.el a dependency of .PHONY to cause Make to # We make $(lisp)/loaddefs.el a dependency of .PHONY to cause Make to
# ignore its time stamp. That's because the real dependencies of # ignore its time stamp. That's because the real dependencies of
# loaddefs.el aren't known to Make, they are implemented in # loaddefs.el aren't known to Make, they are implemented in
# batch-update-autoloads, which only updates the autoloads whose # loaddefs-generate--emacs-batch.
# sources have changed.
# Use expand-file-name rather than $abs_scrdir so that Emacs does not
# get confused when it compares file-names for equality.
autoloads .PHONY: $(lisp)/loaddefs.el autoloads .PHONY: $(lisp)/loaddefs.el
$(lisp)/loaddefs.el: gen-lisp $(LOADDEFS) $(lisp)/loaddefs.el: gen-lisp $(LOADDEFS) $(lisp)/emacs-lisp/loaddefs-gen.elc
$(AM_V_GEN)$(emacs) -l autoload \ $(AM_V_GEN)$(emacs) \
--eval '(setq autoload-ensure-writable t)' \ -l $(lisp)/emacs-lisp/loaddefs-gen.elc \
--eval '(setq autoload-builtin-package-versions t)' \ -f loaddefs-generate--emacs-batch ${SUBDIRS_ALMOST}
--eval '(setq generated-autoload-file (expand-file-name (unmsys--file-name "$@")))' \
-f batch-update-autoloads ${SUBDIRS_ALMOST}
# autoloads only runs when loaddefs.el is nonexistent, although it # autoloads only runs when loaddefs.el is nonexistent, although it
# generates a number of different files. Provide a force option to enable # generates a number of different files. Provide a force option to enable
@ -456,57 +462,6 @@ compile-one-process: $(LOADDEFS) compile-first
$(emacs) $(BYTE_COMPILE_FLAGS) \ $(emacs) $(BYTE_COMPILE_FLAGS) \
--eval "(batch-byte-recompile-directory 0)" $(lisp) --eval "(batch-byte-recompile-directory 0)" $(lisp)
# Update MH-E internal autoloads. These are not to be confused with
# the autoloads for the MH-E entry points, which are already in loaddefs.el.
MH_E_DIR = $(lisp)/mh-e
MH_E_SRC = $(sort $(wildcard ${MH_E_DIR}/mh*.el))
MH_E_SRC := $(filter-out ${MH_E_DIR}/mh-loaddefs.el,${MH_E_SRC})
.PHONY: mh-autoloads
mh-autoloads: $(MH_E_DIR)/mh-loaddefs.el
$(MH_E_DIR)/mh-loaddefs.el: $(MH_E_SRC)
$(AM_V_GEN)$(emacs) -l autoload \
--eval "(setq generate-autoload-cookie \";;;###mh-autoload\")" \
--eval "(setq generated-autoload-file (expand-file-name (unmsys--file-name \"$@\")))" \
-f batch-update-autoloads $(MH_E_DIR)
# Update TRAMP internal autoloads. Maybe we could move tramp*.el into
# an own subdirectory. OTOH, it does not hurt to keep them in
# lisp/net.
TRAMP_DIR = $(lisp)/net
TRAMP_SRC = $(sort $(wildcard ${TRAMP_DIR}/tramp*.el))
TRAMP_SRC := $(filter-out ${TRAMP_DIR}/tramp-loaddefs.el,${TRAMP_SRC})
$(TRAMP_DIR)/tramp-loaddefs.el: $(TRAMP_SRC)
$(AM_V_GEN)$(emacs) -l autoload \
--eval "(setq generate-autoload-cookie \";;;###tramp-autoload\")" \
--eval "(setq generated-autoload-file (expand-file-name (unmsys--file-name \"$@\")))" \
-f batch-update-autoloads $(TRAMP_DIR)
CAL_DIR = $(lisp)/calendar
## Those files that may contain internal calendar autoload cookies.
CAL_SRC = $(addprefix ${CAL_DIR}/,diary-lib.el holidays.el lunar.el solar.el)
CAL_SRC := $(sort ${CAL_SRC} $(wildcard ${CAL_DIR}/cal-*.el))
CAL_SRC := $(filter-out ${CAL_DIR}/cal-loaddefs.el,${CAL_SRC})
$(CAL_DIR)/cal-loaddefs.el: $(CAL_SRC)
$(AM_V_GEN)$(emacs) -l autoload \
--eval "(setq generate-autoload-cookie \";;;###cal-autoload\")" \
--eval "(setq generated-autoload-file (expand-file-name (unmsys--file-name \"$@\")))" \
-f batch-update-autoloads $(CAL_DIR)
$(CAL_DIR)/diary-loaddefs.el: $(CAL_SRC) $(CAL_DIR)/cal-loaddefs.el
$(AM_V_GEN)$(emacs) -l autoload \
--eval "(setq generate-autoload-cookie \";;;###diary-autoload\")" \
--eval "(setq generated-autoload-file (expand-file-name (unmsys--file-name \"$@\")))" \
-f batch-update-autoloads $(CAL_DIR)
$(CAL_DIR)/hol-loaddefs.el: $(CAL_SRC) $(CAL_DIR)/diary-loaddefs.el
$(AM_V_GEN)$(emacs) -l autoload \
--eval "(setq generate-autoload-cookie \";;;###holiday-autoload\")" \
--eval "(setq generated-autoload-file (expand-file-name (unmsys--file-name \"$@\")))" \
-f batch-update-autoloads $(CAL_DIR)
.PHONY: bootstrap-clean distclean maintainer-clean .PHONY: bootstrap-clean distclean maintainer-clean
bootstrap-clean: bootstrap-clean:

View file

@ -42,12 +42,12 @@
(defcustom abbrev-file-name (defcustom abbrev-file-name
(locate-user-emacs-file "abbrev_defs" ".abbrev_defs") (locate-user-emacs-file "abbrev_defs" ".abbrev_defs")
"Default name of file from which to read abbrevs." "Default name of file from which to read and where to save abbrevs."
:initialize 'custom-initialize-delay :initialize 'custom-initialize-delay
:type 'file) :type 'file)
(defcustom only-global-abbrevs nil (defcustom only-global-abbrevs nil
"Non-nil means user plans to use global abbrevs only. "Non-nil means user plans to use only global abbrevs.
This makes the commands that normally define mode-specific abbrevs This makes the commands that normally define mode-specific abbrevs
define global abbrevs instead." define global abbrevs instead."
:type 'boolean :type 'boolean
@ -59,7 +59,8 @@ define global abbrevs instead."
In Abbrev mode, inserting an abbreviation causes it to expand and In Abbrev mode, inserting an abbreviation causes it to expand and
be replaced by its expansion." be replaced by its expansion."
;; It's defined in C, this stops the d-m-m macro defining it again. ;; It's defined in C, this stops the 'define-minor-mode' macro from
;; defining it again.
:variable abbrev-mode) :variable abbrev-mode)
(put 'abbrev-mode 'safe-local-variable 'booleanp) (put 'abbrev-mode 'safe-local-variable 'booleanp)
@ -81,7 +82,8 @@ be replaced by its expansion."
(defun copy-abbrev-table (table) (defun copy-abbrev-table (table)
"Make a new abbrev-table with the same abbrevs as TABLE. "Make a new abbrev-table with the same abbrevs as TABLE.
Does not copy property lists." This function does not copy property lists of the abbrevs.
See `define-abbrev' for the documentation of abbrev properties."
(let ((new-table (make-abbrev-table))) (let ((new-table (make-abbrev-table)))
(obarray-map (obarray-map
(lambda (symbol) (lambda (symbol)
@ -93,8 +95,8 @@ Does not copy property lists."
new-table)) new-table))
(defun insert-abbrevs () (defun insert-abbrevs ()
"Insert after point a description of all defined abbrevs. "Insert the description of all defined abbrevs after point.
Mark is set after the inserted text." Set mark after the inserted text."
(interactive) (interactive)
(push-mark (push-mark
(save-excursion (save-excursion
@ -103,15 +105,15 @@ Mark is set after the inserted text."
(point)))) (point))))
(defun list-abbrevs (&optional local) (defun list-abbrevs (&optional local)
"Display a list of defined abbrevs. "Display a list of the defined abbrevs.
If LOCAL is non-nil, interactively when invoked with a If LOCAL is non-nil (interactively, when invoked with a
prefix arg, display only local, i.e. mode-specific, abbrevs. prefix arg), display only local, i.e. mode-specific, abbrevs.
Otherwise display all abbrevs." Otherwise display all the abbrevs."
(interactive "P") (interactive "P")
(display-buffer (prepare-abbrev-list-buffer local))) (display-buffer (prepare-abbrev-list-buffer local)))
(defun abbrev-table-name (table) (defun abbrev-table-name (table)
"Value is the name of abbrev table TABLE." "Return the name of the specified abbrev TABLE."
(let ((tables abbrev-table-name-list) (let ((tables abbrev-table-name-list)
found) found)
(while (and (not found) tables) (while (and (not found) tables)
@ -135,33 +137,33 @@ Otherwise display all abbrevs."
(dolist (table (nreverse empty-tables)) (dolist (table (nreverse empty-tables))
(insert-abbrev-table-description table t))) (insert-abbrev-table-description table t)))
;; Note: `list-abbrevs' can display only local abbrevs, in ;; Note: `list-abbrevs' can display only local abbrevs, in
;; which case editing could lose abbrevs of other tables. Thus ;; which case editing could lose abbrevs of other tables.
;; enter `edit-abbrevs-mode' only if LOCAL is nil. ;; Thus enter `edit-abbrevs-mode' only if LOCAL is nil.
(edit-abbrevs-mode)) (edit-abbrevs-mode))
(goto-char (point-min)) (goto-char (point-min))
(set-buffer-modified-p nil) (set-buffer-modified-p nil)
(current-buffer)))) (current-buffer))))
(defun edit-abbrevs () (defun edit-abbrevs ()
"Alter abbrev definitions by editing a list of them. "Alter abbrev definitions by editing the list of abbrevs.
Selects a buffer containing a list of abbrev definitions with This selects a buffer containing the list of abbrev definitions
point located in the abbrev table for the current buffer, and with point located in the abbrev table for the current buffer, and
turns on `edit-abbrevs-mode' in that buffer. turns on `edit-abbrevs-mode' in the buffer with the list of abbrevs.
You can edit them and type \\<edit-abbrevs-mode-map>\\[edit-abbrevs-redefine] \ You can edit the abbrevs and type \\<edit-abbrevs-mode-map>\\[edit-abbrevs-redefine] \
to redefine abbrevs to redefine abbrevs
according to your editing. according to your editing.
The abbrevs editing buffer contains a header line for each The abbrevs editing buffer contains a header line for each
abbrev table, which is the abbrev table name in parentheses. abbrev table, which is the abbrev table name in parentheses.
This is followed by one line per abbrev in that table: The header line is followed by one line per abbrev in that table:
NAME USECOUNT EXPANSION HOOK NAME USECOUNT EXPANSION HOOK
where NAME and EXPANSION are strings with quotes, where NAME and EXPANSION are strings with quotes,
USECOUNT is an integer, and HOOK is any valid function USECOUNT is an integer, and HOOK is any valid function
or may be omitted (it is usually omitted)." that may be omitted (it is usually omitted)."
(interactive) (interactive)
(let ((table-name (abbrev-table-name local-abbrev-table))) (let ((table-name (abbrev-table-name local-abbrev-table)))
(switch-to-buffer (prepare-abbrev-list-buffer)) (switch-to-buffer (prepare-abbrev-list-buffer))
@ -182,8 +184,9 @@ or may be omitted (it is usually omitted)."
"Define abbrevs according to current visible buffer contents. "Define abbrevs according to current visible buffer contents.
See documentation of `edit-abbrevs' for info on the format of the See documentation of `edit-abbrevs' for info on the format of the
text you must have in the buffer. text you must have in the buffer.
With argument, eliminate all abbrev definitions except If ARG is non-nil (interactively, when invoked with a prefix
the ones defined from the buffer now." argument), eliminate all abbrev definitions except the ones
defined by the current buffer contents."
(interactive "P") (interactive "P")
(if arg (kill-all-abbrevs)) (if arg (kill-all-abbrevs))
(save-excursion (save-excursion
@ -214,7 +217,8 @@ the ones defined from the buffer now."
"Read abbrev definitions from file written with `write-abbrev-file'. "Read abbrev definitions from file written with `write-abbrev-file'.
Optional argument FILE is the name of the file to read; Optional argument FILE is the name of the file to read;
it defaults to the value of `abbrev-file-name'. it defaults to the value of `abbrev-file-name'.
Optional second argument QUIETLY non-nil means don't display a message." Optional second argument QUIETLY non-nil means don't display a message
about loading the abbrevs."
(interactive (interactive
(list (list
(read-file-name (format-prompt "Read abbrev file" abbrev-file-name) (read-file-name (format-prompt "Read abbrev file" abbrev-file-name)
@ -223,22 +227,22 @@ Optional second argument QUIETLY non-nil means don't display a message."
(setq abbrevs-changed nil)) (setq abbrevs-changed nil))
(defun quietly-read-abbrev-file (&optional file) (defun quietly-read-abbrev-file (&optional file)
"Read abbrev definitions from file written with `write-abbrev-file'. "Quietly read abbrev definitions from file written with `write-abbrev-file'.
Optional argument FILE is the name of the file to read; Optional argument FILE is the name of the file to read;
it defaults to the value of `abbrev-file-name'. it defaults to the value of `abbrev-file-name'.
Does not display any message." Do not display any messages about loading the abbrevs."
;(interactive "fRead abbrev file: ") ;(interactive "fRead abbrev file: ")
(read-abbrev-file file t)) (read-abbrev-file file t))
(defun write-abbrev-file (&optional file verbose) (defun write-abbrev-file (&optional file verbose)
"Write all user-level abbrev definitions to a file of Lisp code. "Write all user-level abbrev definitions to a file of Lisp code.
This does not include system abbrevs; it includes only the abbrev tables This does not include system abbrevs; it includes only the abbrev tables
listed in listed in `abbrev-table-name-list'. listed in `abbrev-table-name-list'.
The file written can be loaded in another session to define the same abbrevs. The file written can be loaded in another session to define the same abbrevs.
The argument FILE is the file name to write. If omitted or nil, the file The argument FILE is the file name to write. If omitted or nil, it defaults
specified in `abbrev-file-name' is used. to the value of `abbrev-file-name'.
If VERBOSE is non-nil, display a message indicating where abbrevs If VERBOSE is non-nil, display a message indicating the file where the
have been saved." abbrevs have been saved."
(interactive (interactive
(list (list
(read-file-name "Write abbrev file: " (read-file-name "Write abbrev file: "
@ -251,10 +255,10 @@ have been saved."
(dolist (table (dolist (table
;; We sort the table in order to ease the automatic ;; We sort the table in order to ease the automatic
;; merging of different versions of the user's abbrevs ;; merging of different versions of the user's abbrevs
;; file. This is useful, for example, for when the ;; file. This is useful, for example, when the
;; user keeps their home directory in a revision ;; user keeps their home directory in a revision
;; control system, and is therefore keeping multiple ;; control system, and therefore keeps multiple
;; slightly-differing copies loosely synchronized. ;; slightly-differing loosely synchronized copies.
(sort (copy-sequence abbrev-table-name-list) (sort (copy-sequence abbrev-table-name-list)
(lambda (s1 s2) (lambda (s1 s2)
(string< (symbol-name s1) (string< (symbol-name s1)
@ -268,7 +272,7 @@ have been saved."
(write-region nil nil file nil (and (not verbose) 0))))) (write-region nil nil file nil (and (not verbose) 0)))))
(defun abbrev-edit-save-to-file (file) (defun abbrev-edit-save-to-file (file)
"Save all user-level abbrev definitions in current buffer to FILE." "Save to FILE all the user-level abbrev definitions in current buffer."
(interactive (interactive
(list (read-file-name "Save abbrevs to file: " (list (read-file-name "Save abbrevs to file: "
(file-name-directory (file-name-directory
@ -279,7 +283,7 @@ have been saved."
(write-abbrev-file file t)) (write-abbrev-file file t))
(defun abbrev-edit-save-buffer () (defun abbrev-edit-save-buffer ()
"Save all user-level abbrev definitions in current buffer. "Save all the user-level abbrev definitions in current buffer.
The saved abbrevs are written to the file specified by The saved abbrevs are written to the file specified by
`abbrev-file-name'." `abbrev-file-name'."
(interactive nil edit-abbrevs-mode) (interactive nil edit-abbrevs-mode)
@ -287,15 +291,16 @@ The saved abbrevs are written to the file specified by
(defun add-mode-abbrev (arg) (defun add-mode-abbrev (arg)
"Define mode-specific abbrev for last word(s) before point. "Define a mode-specific abbrev whose expansion is the last word before point.
Argument is how many words before point form the expansion; Prefix argument ARG says how many words before point to use for the expansion;
or zero means the region is the expansion. zero means the entire region is the expansion.
A negative argument means to undefine the specified abbrev. A negative ARG means to undefine the specified abbrev.
Reads the abbreviation in the minibuffer.
This command reads the abbreviation from the minibuffer.
See also `inverse-add-mode-abbrev', which performs the opposite task: See also `inverse-add-mode-abbrev', which performs the opposite task:
if the abbrev text is already in the buffer, use this command to if the abbreviation is already in the buffer, use that command to define
define an abbrev by specifying the expansion in the minibuffer. a mode-specific abbrev by specifying its expansion in the minibuffer.
Don't use this function in a Lisp program; use `define-abbrev' instead." Don't use this function in a Lisp program; use `define-abbrev' instead."
(interactive "p") (interactive "p")
@ -307,15 +312,16 @@ Don't use this function in a Lisp program; use `define-abbrev' instead."
"Mode" arg)) "Mode" arg))
(defun add-global-abbrev (arg) (defun add-global-abbrev (arg)
"Define global (all modes) abbrev for last word(s) before point. "Define a global (all modes) abbrev whose expansion is last word before point.
The prefix argument specifies the number of words before point that form the Prefix argument ARG says how many words before point to use for the expansion;
expansion; or zero means the region is the expansion. zero means the entire region is the expansion.
A negative argument means to undefine the specified abbrev. A negative ARG means to undefine the specified abbrev.
This command uses the minibuffer to read the abbreviation.
This command reads the abbreviation from the minibuffer.
See also `inverse-add-global-abbrev', which performs the opposite task: See also `inverse-add-global-abbrev', which performs the opposite task:
if the abbrev text is already in the buffer, use this command to if the abbreviation is already in the buffer, use that command to define
define an abbrev by specifying the expansion in the minibuffer. a global abbrev by specifying its expansion in the minibuffer.
Don't use this function in a Lisp program; use `define-abbrev' instead." Don't use this function in a Lisp program; use `define-abbrev' instead."
(interactive "p") (interactive "p")
@ -329,25 +335,30 @@ Don't use this function in a Lisp program; use `define-abbrev' instead."
(save-excursion (forward-word (- arg)) (point)))))) (save-excursion (forward-word (- arg)) (point))))))
name) name)
(setq name (setq name
(read-string (format (if exp "%s abbrev for \"%s\": " (read-string (format (if exp "%s abbrev that expands into \"%s\": "
"Undefine %s abbrev: ") "Undefine %s abbrev: ")
type exp))) type exp)))
(set-text-properties 0 (length name) nil name) (set-text-properties 0 (length name) nil name)
(if (or (null exp) (if (or (null exp)
(not (abbrev-expansion name table)) (not (abbrev-expansion name table))
(y-or-n-p (format "%s expands to \"%s\"; redefine? " (y-or-n-p (format "%s expands into \"%s\"; redefine? "
name (abbrev-expansion name table)))) name (abbrev-expansion name table))))
(define-abbrev table (downcase name) exp)))) (define-abbrev table (downcase name) exp))))
(defun inverse-add-mode-abbrev (n) (defun inverse-add-mode-abbrev (n)
"Define last word before point as a mode-specific abbrev. "Define the word before point as a mode-specific abbreviation.
With prefix argument N, defines the Nth word before point. With prefix argument N, define the Nth word before point as the
This command uses the minibuffer to read the expansion. abbreviation. Negative N means use the Nth word after point.
Expands the abbreviation after defining it.
If `only-global-abbrevs' is non-nil, this command defines a
global (mode-independent) abbrev instead of a mode-specific one.
This command reads the expansion from the minibuffer, defines the
abbrev, and then expands the abbreviation in the current buffer.
See also `add-mode-abbrev', which performs the opposite task: See also `add-mode-abbrev', which performs the opposite task:
if the expansion is already in the buffer, use this command if the expansion is already in the buffer, use that command
to define an abbrev by specifying the abbrev in the minibuffer." to define an abbrev by specifying the abbreviation in the minibuffer."
(interactive "p") (interactive "p")
(inverse-add-abbrev (inverse-add-abbrev
(if only-global-abbrevs (if only-global-abbrevs
@ -357,14 +368,16 @@ to define an abbrev by specifying the abbrev in the minibuffer."
"Mode" n)) "Mode" n))
(defun inverse-add-global-abbrev (n) (defun inverse-add-global-abbrev (n)
"Define last word before point as a global (mode-independent) abbrev. "Define the word before point as a global (mode-independent) abbreviation.
With prefix argument N, defines the Nth word before point. With prefix argument N, define the Nth word before point as the
This command uses the minibuffer to read the expansion. abbreviation. Negative N means use the Nth word after point.
Expands the abbreviation after defining it.
This command reads the expansion from the minibuffer, defines the
abbrev, and then expands the abbreviation in the current buffer.
See also `add-global-abbrev', which performs the opposite task: See also `add-global-abbrev', which performs the opposite task:
if the expansion is already in the buffer, use this command if the expansion is already in the buffer, use that command
to define an abbrev by specifying the abbrev in the minibuffer." to define an abbrev by specifying the abbreviation in the minibuffer."
(interactive "p") (interactive "p")
(inverse-add-abbrev global-abbrev-table "Global" n)) (inverse-add-abbrev global-abbrev-table "Global" n))
@ -378,10 +391,10 @@ to define an abbrev by specifying the abbrev in the minibuffer."
(setq start (point) (setq start (point)
name (buffer-substring-no-properties start end))) name (buffer-substring-no-properties start end)))
(setq exp (read-string (format "%s expansion for \"%s\": " type name) (setq exp (read-string (format "Expansion for %s abbrev \"%s\": " type name)
nil nil nil t)) nil nil nil t))
(when (or (not (abbrev-expansion name table)) (when (or (not (abbrev-expansion name table))
(y-or-n-p (format "%s expands to \"%s\"; redefine? " (y-or-n-p (format "%s expands into \"%s\"; redefine? "
name (abbrev-expansion name table)))) name (abbrev-expansion name table))))
(define-abbrev table (downcase name) exp) (define-abbrev table (downcase name) exp)
(save-excursion (save-excursion
@ -389,10 +402,11 @@ to define an abbrev by specifying the abbrev in the minibuffer."
(expand-abbrev))))) (expand-abbrev)))))
(defun abbrev-prefix-mark (&optional arg) (defun abbrev-prefix-mark (&optional arg)
"Mark current point as the beginning of an abbrev. "Mark point as the beginning of an abbreviation.
The abbrev to be expanded starts here rather than at beginning of The abbrev to be expanded starts at point rather than at the
word. This way, you can expand an abbrev with a prefix: insert beginning of a word. This way, you can expand an abbrev with
the prefix, use this command, then insert the abbrev. a prefix: insert the prefix, use this command, then insert the
abbrev.
This command inserts a hyphen after the prefix, and if the abbrev This command inserts a hyphen after the prefix, and if the abbrev
is subsequently expanded, this hyphen will be removed. is subsequently expanded, this hyphen will be removed.
@ -407,8 +421,8 @@ argument."
(insert "-")) (insert "-"))
(defun expand-region-abbrevs (start end &optional noquery) (defun expand-region-abbrevs (start end &optional noquery)
"For abbrev occurrence in the region, offer to expand it. "For each abbrev occurrence in the region, offer to expand it.
The user is asked to type \\`y' or \\`n' for each occurrence. Ask the user to type `y' or `n' for each occurrence.
A prefix argument means don't query; expand all abbrevs." A prefix argument means don't query; expand all abbrevs."
(interactive "r\nP") (interactive "r\nP")
(save-excursion (save-excursion
@ -429,18 +443,19 @@ A prefix argument means don't query; expand all abbrevs."
;;; Abbrev properties. ;;; Abbrev properties.
(defun abbrev-table-get (table prop) (defun abbrev-table-get (table prop)
"Get the PROP property of abbrev table TABLE." "Get the property PROP of abbrev table TABLE."
(let ((sym (obarray-get table ""))) (let ((sym (obarray-get table "")))
(if sym (get sym prop)))) (if sym (get sym prop))))
(defun abbrev-table-put (table prop val) (defun abbrev-table-put (table prop val)
"Set the PROP property of abbrev table TABLE to VAL." "Set the property PROP of abbrev table TABLE to VAL."
(let ((sym (obarray-put table ""))) (let ((sym (obarray-put table "")))
(set sym nil) ; Make sure it won't be confused for an abbrev. (set sym nil) ; Make sure it won't be confused for an abbrev.
(put sym prop val))) (put sym prop val)))
(defalias 'abbrev-get 'get (defalias 'abbrev-get 'get
"Get the property PROP of abbrev ABBREV "Get the property PROP of abbrev ABBREV
See `define-abbrev' for the effect of some special properties.
\(fn ABBREV PROP)") \(fn ABBREV PROP)")
@ -500,7 +515,8 @@ for any particular abbrev defined in both.")
(defvar abbrev-minor-mode-table-alist nil (defvar abbrev-minor-mode-table-alist nil
"Alist of abbrev tables to use for minor modes. "Alist of abbrev tables to use for minor modes.
Each element looks like (VARIABLE . ABBREV-TABLE); Each element looks like (VARIABLE . ABBREV-TABLE);
ABBREV-TABLE is active whenever VARIABLE's value is non-nil. ABBREV-TABLE is active whenever VARIABLE's value is non-nil;
VARIABLE is supposed to be a minor-mode variable.
ABBREV-TABLE can also be a list of abbrev tables.") ABBREV-TABLE can also be a list of abbrev tables.")
(defvar fundamental-mode-abbrev-table (defvar fundamental-mode-abbrev-table
@ -511,11 +527,11 @@ ABBREV-TABLE can also be a list of abbrev tables.")
"The abbrev table of mode-specific abbrevs for Fundamental Mode.") "The abbrev table of mode-specific abbrevs for Fundamental Mode.")
(defvar abbrevs-changed nil (defvar abbrevs-changed nil
"Set non-nil by defining or altering any word abbrevs. "Non-nil if any word abbrevs were defined or altered.
This causes `save-some-buffers' to offer to save the abbrevs.") This causes `save-some-buffers' to offer to save the abbrevs.")
(defcustom abbrev-all-caps nil (defcustom abbrev-all-caps nil
"Non-nil means expand multi-word abbrevs all caps if abbrev was so." "Non-nil means expand multi-word abbrevs in all caps if the abbrev was so."
:type 'boolean :type 'boolean
:group 'abbrev-mode) :group 'abbrev-mode)
@ -532,17 +548,17 @@ Trying to expand an abbrev in any other buffer clears `abbrev-start-location'.")
"The abbrev-symbol of the last abbrev expanded. See `abbrev-symbol'.") "The abbrev-symbol of the last abbrev expanded. See `abbrev-symbol'.")
(defvar last-abbrev-text nil (defvar last-abbrev-text nil
"The exact text of the last abbrev expanded. "The exact text of the last abbrev that was expanded.
It is nil if the abbrev has already been unexpanded.") It is nil if the abbrev has already been unexpanded.")
(defvar last-abbrev-location 0 (defvar last-abbrev-location 0
"The location of the start of the last abbrev expanded.") "The location of the start of the last abbrev that was expanded.")
;; (defvar-local local-abbrev-table fundamental-mode-abbrev-table ;; (defvar-local local-abbrev-table fundamental-mode-abbrev-table
;; "Local (mode-specific) abbrev table of current buffer.") ;; "Local (mode-specific) abbrev table of current buffer.")
(defun clear-abbrev-table (table) (defun clear-abbrev-table (table)
"Undefine all abbrevs in abbrev table TABLE, leaving it empty." "Undefine all abbrevs in abbrev table TABLE, leaving TABLE empty."
(setq abbrevs-changed t) (setq abbrevs-changed t)
(let* ((sym (obarray-get table ""))) (let* ((sym (obarray-get table "")))
(dotimes (i (length table)) (dotimes (i (length table))
@ -557,9 +573,9 @@ It is nil if the abbrev has already been unexpanded.")
;; For backward compatibility, always return nil. ;; For backward compatibility, always return nil.
nil) nil)
(defun define-abbrev (table name expansion &optional hook &rest props) (defun define-abbrev (table abbrev expansion &optional hook &rest props)
"Define an abbrev in TABLE named NAME, to expand to EXPANSION and call HOOK. "Define ABBREV in TABLE, to expand into EXPANSION and optionally call HOOK.
NAME must be a string, and should be lower-case. ABBREV must be a string, and should be lower-case.
EXPANSION should usually be a string. EXPANSION should usually be a string.
To undefine an abbrev, define it with EXPANSION = nil. To undefine an abbrev, define it with EXPANSION = nil.
If HOOK is non-nil, it should be a function of no arguments; If HOOK is non-nil, it should be a function of no arguments;
@ -583,8 +599,8 @@ PROPS is a property list. The following properties are special:
overwrite a non-system abbreviation of the same name. overwrite a non-system abbreviation of the same name.
- `:case-fixed': non-nil means that abbreviations are looked up without - `:case-fixed': non-nil means that abbreviations are looked up without
case-folding, and the expansion is not capitalized/upcased. case-folding, and the expansion is not capitalized/upcased.
- `:enable-function': a function of no argument which returns non-nil if the - `:enable-function': a function of no arguments which returns non-nil
abbrev should be used for a particular call of `expand-abbrev'. if the abbrev should be used for a particular call of `expand-abbrev'.
An obsolete but still supported calling form is: An obsolete but still supported calling form is:
@ -599,7 +615,7 @@ An obsolete but still supported calling form is:
(setq props (plist-put props :abbrev-table-modiff (setq props (plist-put props :abbrev-table-modiff
(abbrev-table-get table :abbrev-table-modiff))) (abbrev-table-get table :abbrev-table-modiff)))
(let ((system-flag (plist-get props :system)) (let ((system-flag (plist-get props :system))
(sym (obarray-put table name))) (sym (obarray-put table abbrev)))
;; Don't override a prior user-defined abbrev with a system abbrev, ;; Don't override a prior user-defined abbrev with a system abbrev,
;; unless system-flag is `force'. ;; unless system-flag is `force'.
(unless (and (not (memq system-flag '(nil force))) (unless (and (not (memq system-flag '(nil force)))
@ -619,7 +635,7 @@ An obsolete but still supported calling form is:
(if (eq 'force system-flag) (plist-put props :system t) props)) (if (eq 'force system-flag) (plist-put props :system t) props))
(abbrev-table-put table :abbrev-table-modiff (abbrev-table-put table :abbrev-table-modiff
(1+ (abbrev-table-get table :abbrev-table-modiff)))) (1+ (abbrev-table-get table :abbrev-table-modiff))))
name)) abbrev))
(defun abbrev--check-chars (abbrev global) (defun abbrev--check-chars (abbrev global)
"Check if the characters in ABBREV have word syntax in either the "Check if the characters in ABBREV have word syntax in either the
@ -639,7 +655,7 @@ current (if global is nil) or standard syntax table."
(if global "in the standard syntax" "in this mode")))))) (if global "in the standard syntax" "in this mode"))))))
(defun define-global-abbrev (abbrev expansion) (defun define-global-abbrev (abbrev expansion)
"Define ABBREV as a global abbreviation for EXPANSION. "Define ABBREV as a global abbreviation that expands into EXPANSION.
The characters in ABBREV must all be word constituents in the standard The characters in ABBREV must all be word constituents in the standard
syntax table." syntax table."
(interactive "sDefine global abbrev: \nsExpansion for %s: ") (interactive "sDefine global abbrev: \nsExpansion for %s: ")
@ -647,7 +663,7 @@ syntax table."
(define-abbrev global-abbrev-table (downcase abbrev) expansion)) (define-abbrev global-abbrev-table (downcase abbrev) expansion))
(defun define-mode-abbrev (abbrev expansion) (defun define-mode-abbrev (abbrev expansion)
"Define ABBREV as a mode-specific abbreviation for EXPANSION. "Define ABBREV as a mode-specific abbreviation that expands into EXPANSION.
The characters in ABBREV must all be word-constituents in the current mode." The characters in ABBREV must all be word-constituents in the current mode."
(interactive "sDefine mode abbrev: \nsExpansion for %s: ") (interactive "sDefine mode abbrev: \nsExpansion for %s: ")
(unless local-abbrev-table (unless local-abbrev-table
@ -656,8 +672,8 @@ The characters in ABBREV must all be word-constituents in the current mode."
(define-abbrev local-abbrev-table (downcase abbrev) expansion)) (define-abbrev local-abbrev-table (downcase abbrev) expansion))
(defun abbrev--active-tables (&optional tables) (defun abbrev--active-tables (&optional tables)
"Return the list of abbrev tables currently active. "Return the list of abbrev tables that are currently active.
TABLES if non-nil overrides the usual rules. It can hold TABLES, if non-nil, overrides the usual rules. It can hold
either a single abbrev table or a list of abbrev tables." either a single abbrev table or a list of abbrev tables."
;; We could just remove the `tables' arg and let callers use ;; We could just remove the `tables' arg and let callers use
;; (or table (abbrev--active-tables)) but then they'd have to be careful ;; (or table (abbrev--active-tables)) but then they'd have to be careful
@ -683,7 +699,7 @@ either a single abbrev table or a list of abbrev tables."
"Return the symbol representing abbrev named ABBREV in TABLE. "Return the symbol representing abbrev named ABBREV in TABLE.
This symbol's name is ABBREV, but it is not the canonical symbol of that name; This symbol's name is ABBREV, but it is not the canonical symbol of that name;
it is interned in the abbrev-table TABLE rather than the normal obarray. it is interned in the abbrev-table TABLE rather than the normal obarray.
The value is nil if that abbrev is not defined." The value is nil if such an abbrev is not defined."
(let* ((case-fold (not (abbrev-table-get table :case-fixed))) (let* ((case-fold (not (abbrev-table-get table :case-fixed)))
;; In case the table doesn't set :case-fixed but some of the ;; In case the table doesn't set :case-fixed but some of the
;; abbrevs do, we have to be careful. ;; abbrevs do, we have to be careful.
@ -700,11 +716,11 @@ The value is nil if that abbrev is not defined."
sym))) sym)))
(defun abbrev-symbol (abbrev &optional table) (defun abbrev-symbol (abbrev &optional table)
"Return the symbol representing abbrev named ABBREV. "Return the symbol representing the abbrev named ABBREV in TABLE.
This symbol's name is ABBREV, but it is not the canonical symbol of that name; This symbol's name is ABBREV, but it is not the canonical symbol of that name;
it is interned in an abbrev-table rather than the normal obarray. it is interned in an abbrev-table rather than the normal obarray.
The value is nil if that abbrev is not defined. The value is nil if such an abbrev is not defined.
Optional second arg TABLE is abbrev table to look it up in. Optional second arg TABLE is the abbrev table to look it up in.
The default is to try buffer's mode-specific abbrev table, then global table." The default is to try buffer's mode-specific abbrev table, then global table."
(let ((tables (abbrev--active-tables table)) (let ((tables (abbrev--active-tables table))
sym) sym)
@ -717,7 +733,7 @@ The default is to try buffer's mode-specific abbrev table, then global table."
(defun abbrev-expansion (abbrev &optional table) (defun abbrev-expansion (abbrev &optional table)
"Return the string that ABBREV expands into in the current buffer. "Return the string that ABBREV expands into in the current buffer.
Optionally specify an abbrev table as second arg; Optionally specify an abbrev TABLE as second arg;
then ABBREV is looked up in that table only." then ABBREV is looked up in that table only."
(symbol-value (abbrev-symbol abbrev table))) (symbol-value (abbrev-symbol abbrev table)))
@ -781,9 +797,9 @@ then ABBREV is looked up in that table only."
(defun abbrev-insert (abbrev &optional name wordstart wordend) (defun abbrev-insert (abbrev &optional name wordstart wordend)
"Insert abbrev ABBREV at point. "Insert abbrev ABBREV at point.
If non-nil, NAME is the name by which this abbrev was found. If non-nil, NAME is the name by which this abbrev was found.
If non-nil, WORDSTART is the place where to insert the abbrev. If non-nil, WORDSTART is the buffer position where to insert the abbrev.
If WORDEND is non-nil, the abbrev replaces the previous text between If WORDEND is non-nil, it is a buffer position; the abbrev replaces the
WORDSTART and WORDEND. previous text between WORDSTART and WORDEND.
Return ABBREV if the expansion should be considered as having taken place. Return ABBREV if the expansion should be considered as having taken place.
The return value can be influenced by a `no-self-insert' property; The return value can be influenced by a `no-self-insert' property;
see `define-abbrev' for details." see `define-abbrev' for details."
@ -848,7 +864,8 @@ see `define-abbrev' for details."
(defvar abbrev-expand-function #'abbrev--default-expand (defvar abbrev-expand-function #'abbrev--default-expand
"Function that `expand-abbrev' uses to perform abbrev expansion. "Function that `expand-abbrev' uses to perform abbrev expansion.
Takes no argument and should return the abbrev symbol if expansion took place.") Takes no arguments, and should return the abbrev symbol if expansion
took place.")
(defcustom abbrev-suggest nil (defcustom abbrev-suggest nil
"Non-nil means suggest using abbrevs to save typing. "Non-nil means suggest using abbrevs to save typing.
@ -907,15 +924,17 @@ Expansion is a string of one or more words."
(defun abbrev--suggest-above-threshold (expansion) (defun abbrev--suggest-above-threshold (expansion)
"Return non-nil if the abbrev in EXPANSION provides significant savings. "Return non-nil if the abbrev in EXPANSION provides significant savings.
A significant saving, here, is the difference in length between A significant saving, here, means the difference in length between
the abbrev and the abbrev expansion. EXPANSION is a cons cell the abbrev and its expansion is not below the threshold specified
where the car is the expansion and the cdr is the abbrev." by the value of `abbrev-suggest-hint-threshold'.
EXPANSION is a cons cell where the car is the expansion and the cdr is
the abbrev."
(>= (- (length (car expansion)) (>= (- (length (car expansion))
(length (cdr expansion))) (length (cdr expansion)))
abbrev-suggest-hint-threshold)) abbrev-suggest-hint-threshold))
(defvar abbrev--suggest-saved-recommendations nil (defvar abbrev--suggest-saved-recommendations nil
"Keeps a list of expansions that have abbrevs defined. "Keeps the list of expansions that have abbrevs defined.
The user can show this list by calling The user can show this list by calling
`abbrev-suggest-show-report'.") `abbrev-suggest-show-report'.")
@ -931,7 +950,7 @@ EXPANSION is a cons cell where the `car' is the expansion and the
(push expansion abbrev--suggest-saved-recommendations)) (push expansion abbrev--suggest-saved-recommendations))
(defun abbrev--suggest-shortest-abbrev (new current) (defun abbrev--suggest-shortest-abbrev (new current)
"Return the shortest abbrev of NEW and CURRENT. "Return the shortest of the two abbrevs given by NEW and CURRENT.
NEW and CURRENT are cons cells where the `car' is the expansion NEW and CURRENT are cons cells where the `car' is the expansion
and the `cdr' is the abbrev." and the `cdr' is the abbrev."
(if (not current) (if (not current)
@ -960,8 +979,8 @@ informed about the existing abbrev."
(defun abbrev--suggest-get-totals () (defun abbrev--suggest-get-totals ()
"Return a list of all expansions and how many times they were used. "Return a list of all expansions and how many times they were used.
Each expansion is a cons cell where the `car' is the expansion Each expansion in the returned list is a cons cell where the `car' is the
and the `cdr' is the number of times the expansion has been expansion text and the `cdr' is the number of times the expansion has been
typed." typed."
(let (total cell) (let (total cell)
(dolist (expansion abbrev--suggest-saved-recommendations) (dolist (expansion abbrev--suggest-saved-recommendations)
@ -1089,11 +1108,11 @@ Presumes that `standard-output' points to `current-buffer'."
(defun insert-abbrev-table-description (name &optional readable) (defun insert-abbrev-table-description (name &optional readable)
"Insert before point a full description of abbrev table named NAME. "Insert before point a full description of abbrev table named NAME.
NAME is a symbol whose value is an abbrev table. NAME is a symbol whose value is an abbrev table.
If optional 2nd arg READABLE is non-nil, a human-readable description If optional 2nd arg READABLE is non-nil, insert a human-readable
is inserted. description.
If READABLE is nil, an expression is inserted. The expression is If READABLE is nil, insert an expression. The expression is
a call to `define-abbrev-table' that when evaluated will define a call to `define-abbrev-table' that, when evaluated, will define
the abbrev table NAME exactly as it is currently defined. the abbrev table NAME exactly as it is currently defined.
Abbrevs marked as \"system abbrevs\" are ignored." Abbrevs marked as \"system abbrevs\" are ignored."
(let ((symbols (abbrev--table-symbols name readable))) (let ((symbols (abbrev--table-symbols name readable)))
@ -1140,10 +1159,10 @@ Properties with special meaning:
case-folding, and the expansion is not capitalized/upcased. case-folding, and the expansion is not capitalized/upcased.
- `:regexp' is a regular expression that specifies how to extract the - `:regexp' is a regular expression that specifies how to extract the
name of the abbrev before point. The submatch 1 is treated name of the abbrev before point. The submatch 1 is treated
as the potential name of an abbrev. If :regexp is nil, the default as the potential name of an abbrev. If `:regexp' is nil, the default
behavior uses `backward-word' and `forward-word' to extract the name behavior uses `backward-word' and `forward-word' to extract the name
of the abbrev, which can therefore only be a single word. of the abbrev, which can therefore by default only be a single word.
- `:enable-function' can be set to a function of no argument which returns - `:enable-function' can be set to a function of no arguments which returns
non-nil if and only if the abbrevs in this table should be used for this non-nil if and only if the abbrevs in this table should be used for this
instance of `expand-abbrev'." instance of `expand-abbrev'."
(declare (doc-string 3) (indent defun)) (declare (doc-string 3) (indent defun))
@ -1172,7 +1191,7 @@ Properties with special meaning:
(defun abbrev-table-menu (table &optional prompt sortfun) (defun abbrev-table-menu (table &optional prompt sortfun)
"Return a menu that shows all abbrevs in TABLE. "Return a menu that shows all abbrevs in TABLE.
Selecting an entry runs `abbrev-insert'. Selecting an entry runs `abbrev-insert' for that entry's abbrev.
PROMPT is the prompt to use for the keymap. PROMPT is the prompt to use for the keymap.
SORTFUN is passed to `sort' to change the default ordering." SORTFUN is passed to `sort' to change the default ordering."
(unless sortfun (setq sortfun 'string-lessp)) (unless sortfun (setq sortfun 'string-lessp))
@ -1197,6 +1216,28 @@ This mode is for editing abbrevs in a buffer prepared by `edit-abbrevs',
which see." which see."
:interactive nil) :interactive nil)
(defun abbrev--possibly-save (query &optional arg)
;; Query mode.
(if (eq query 'query)
(and save-abbrevs abbrevs-changed)
;; Maybe save abbrevs, and record whether we either saved them or
;; asked to.
(and save-abbrevs
abbrevs-changed
(progn
(if (or arg
(eq save-abbrevs 'silently)
(y-or-n-p (format "Save abbrevs in %s? " abbrev-file-name)))
(progn
(write-abbrev-file nil)
nil)
;; Don't keep bothering user if they say no.
(setq abbrevs-changed nil)
;; Inhibit message in `save-some-buffers'.
t)))))
(add-hook 'save-some-buffers-functions #'abbrev--possibly-save)
(provide 'abbrev) (provide 'abbrev)
;;; abbrev.el ends here ;;; abbrev.el ends here

View file

@ -234,7 +234,7 @@ This vector holds the faces used for SGR control sequence parameters 0
to 7. to 7.
This variable is obsolete. To customize the display of faces used by This variable is obsolete. To customize the display of faces used by
ansi-color, change 'ansi-color-FACE', e.g. `ansi-color-bold'. To ansi-color, change `ansi-color-FACE', e.g. `ansi-color-bold'. To
customize the actual faces used (e.g. to temporarily display SGR customize the actual faces used (e.g. to temporarily display SGR
control sequences differently), use `ansi-color-basic-faces-vector'." control sequences differently), use `ansi-color-basic-faces-vector'."
:type '(vector face face face face face face face face) :type '(vector face face face face face face face face)
@ -249,7 +249,7 @@ This vector holds the colors used for SGR control sequence parameters
30 to 37 (foreground colors) and 40 to 47 (background colors). 30 to 37 (foreground colors) and 40 to 47 (background colors).
This variable is obsolete. To customize the display of colors used by This variable is obsolete. To customize the display of colors used by
ansi-color, change 'ansi-color-COLOR', e.g. `ansi-color-red'. To ansi-color, change `ansi-color-COLOR', e.g. `ansi-color-red'. To
customize the actual faces used (e.g. to temporarily display SGR customize the actual faces used (e.g. to temporarily display SGR
control sequences differently), use `ansi-color-normal-colors-vector'." control sequences differently), use `ansi-color-normal-colors-vector'."
:type '(vector (choice color (cons color color)) :type '(vector (choice color (cons color color))

View file

@ -518,7 +518,7 @@ variables, not just user options."
(if (or current-prefix-arg apropos-do-all) (if (or current-prefix-arg apropos-do-all)
"variable" "user option")) "variable" "user option"))
current-prefix-arg)) current-prefix-arg))
(apropos-command pattern nil (apropos-command pattern (or do-all apropos-do-all)
(if (or do-all apropos-do-all) (if (or do-all apropos-do-all)
(lambda (symbol) (lambda (symbol)
(and (boundp symbol) (and (boundp symbol)
@ -874,7 +874,7 @@ Optional arg BUFFER (default: current buffer) is the buffer to check."
apropos-all-words apropos-accumulator)) apropos-all-words apropos-accumulator))
(setq var (apropos-value-internal #'local-variable-if-set-p symb (setq var (apropos-value-internal #'local-variable-if-set-p symb
#'symbol-value))) #'symbol-value)))
(when (and (fboundp 'apropos-false-hit-str) (apropos-false-hit-str var)) (when (apropos-false-hit-str var)
(setq var nil)) (setq var nil))
(when var (when var
(setq apropos-accumulator (cons (list symb (apropos-score-str var) nil var) (setq apropos-accumulator (cons (list symb (apropos-score-str var) nil var)
@ -1055,7 +1055,13 @@ non-nil."
(setq sepa (goto-char sepb))))) (setq sepa (goto-char sepb)))))
(defun apropos-documentation-check-elc-file (file) (defun apropos-documentation-check-elc-file (file)
(if (member file apropos-files-scanned) ;; .elc files have the location of the file specified as #$, but for
;; built-in files, that's a relative name (while for the rest, it's
;; absolute). So expand the name in the former case.
(unless (file-name-absolute-p file)
(setq file (expand-file-name file lisp-directory)))
(if (or (member file apropos-files-scanned)
(not (file-exists-p file)))
nil nil
(let (symbol doc beg end this-is-a-variable) (let (symbol doc beg end this-is-a-variable)
(setq apropos-files-scanned (cons file apropos-files-scanned)) (setq apropos-files-scanned (cons file apropos-files-scanned))
@ -1247,6 +1253,19 @@ as a heading."
'apropos-user-option 'apropos-user-option
'apropos-variable) 'apropos-variable)
(not nosubst)) (not nosubst))
;; Insert an excerpt of variable values.
(when (boundp symbol)
(insert " Value: ")
(let* ((print-escape-newlines t)
(value (prin1-to-string (symbol-value symbol)))
(truncated (truncate-string-to-width
value (- (window-width) 20) nil nil t)))
(insert truncated)
(unless (equal value truncated)
(buttonize-region (1- (point)) (point)
(lambda (_)
(message "Value: %s" value))))
(insert "\n")))
(apropos-print-doc 7 'apropos-group t) (apropos-print-doc 7 'apropos-group t)
(apropos-print-doc 6 'apropos-face t) (apropos-print-doc 6 'apropos-face t)
(apropos-print-doc 5 'apropos-widget t) (apropos-print-doc 5 'apropos-widget t)
@ -1262,12 +1281,13 @@ as a heading."
(let ((doc (nth i apropos-item))) (let ((doc (nth i apropos-item)))
(when (stringp doc) (when (stringp doc)
(if apropos-compact-layout (if apropos-compact-layout
(insert (propertize "\t" 'display '(space :align-to 32)) " ") (insert (propertize "\t" 'display '(space :align-to 32)))
(insert " ")) (insert " "))
(if apropos-multi-type (if apropos-multi-type
(let ((button-face (button-type-get type 'face))) (let ((button-face (button-type-get type 'face)))
(unless (consp button-face) (unless (consp button-face)
(setq button-face (list button-face))) (setq button-face (list button-face)))
(insert " ")
(insert-text-button (insert-text-button
(if apropos-compact-layout (if apropos-compact-layout
(format "<%s>" (button-type-get type 'apropos-short-label)) (format "<%s>" (button-type-get type 'apropos-short-label))

View file

@ -767,29 +767,27 @@ Return COLUMN."
;;; Array mode. ;;; Array mode.
(defvar array-mode-map (defvar-keymap array-mode-map
(let ((map (make-keymap))) :doc "Keymap used in array mode."
(define-key map "\M-ad" #'array-display-local-variables) "M-a d" #'array-display-local-variables
(define-key map "\M-am" #'array-make-template) "M-a m" #'array-make-template
(define-key map "\M-ae" #'array-expand-rows) "M-a e" #'array-expand-rows
(define-key map "\M-ar" #'array-reconfigure-rows) "M-a r" #'array-reconfigure-rows
(define-key map "\M-a=" #'array-what-position) "M-a =" #'array-what-position
(define-key map "\M-ag" #'array-goto-cell) "M-a g" #'array-goto-cell
(define-key map "\M-af" #'array-fill-rectangle) "M-a f" #'array-fill-rectangle
(define-key map "\C-n" #'array-next-row) "C-n" #'array-next-row
(define-key map "\C-p" #'array-previous-row) "C-p" #'array-previous-row
(define-key map "\C-f" #'array-forward-column) "C-f" #'array-forward-column
(define-key map "\C-b" #'array-backward-column) "C-b" #'array-backward-column
(define-key map "\M-n" #'array-copy-down) "M-n" #'array-copy-down
(define-key map "\M-p" #'array-copy-up) "M-p" #'array-copy-up
(define-key map "\M-f" #'array-copy-forward) "M-f" #'array-copy-forward
(define-key map "\M-b" #'array-copy-backward) "M-b" #'array-copy-backward
(define-key map "\M-\C-n" #'array-copy-row-down) "C-M-n" #'array-copy-row-down
(define-key map "\M-\C-p" #'array-copy-row-up) "C-M-p" #'array-copy-row-up
(define-key map "\M-\C-f" #'array-copy-column-forward) "C-M-f" #'array-copy-column-forward
(define-key map "\M-\C-b" #'array-copy-column-backward) "C-M-b" #'array-copy-column-backward)
map)
"Keymap used in array mode.")
(put 'array-mode 'mode-class 'special) (put 'array-mode 'mode-class 'special)

View file

@ -89,7 +89,7 @@ If this contains a %s, that will be replaced by the matching rule."
:type 'string :type 'string
:version "28.1") :version "28.1")
(declare-function sgml-tag "sgml-mode" (&optional str arg)) (declare-function sgml-tag "textmodes/sgml-mode" (&optional str arg))
(defcustom auto-insert-alist (defcustom auto-insert-alist
`((("\\.\\([Hh]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'" . "C / C++ header") `((("\\.\\([Hh]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'" . "C / C++ header")

View file

@ -293,6 +293,8 @@ accumulated, and tries to keep it close to zero."
(mouse-avoidance-set-mouse-position (cons (+ (car (cdr cur)) deltax) (mouse-avoidance-set-mouse-position (cons (+ (car (cdr cur)) deltax)
(+ (cdr (cdr cur)) deltay)))))) (+ (cdr (cdr cur)) deltay))))))
(defvar x-pointer-invisible) ; silence byte-compiler
(defun mouse-avoidance-random-shape () (defun mouse-avoidance-random-shape ()
"Return a random cursor shape. "Return a random cursor shape.
This assumes that any variable whose name begins with x-pointer- and This assumes that any variable whose name begins with x-pointer- and
@ -300,12 +302,14 @@ has an integer value is a valid cursor shape. You might want to
redefine this function to suit your own tastes." redefine this function to suit your own tastes."
(if (null mouse-avoidance-pointer-shapes) (if (null mouse-avoidance-pointer-shapes)
(progn (progn
(setq mouse-avoidance-pointer-shapes (dolist (i (all-completions "x-pointer-" obarray
(mapcar (lambda (x) (symbol-value (intern x))) (lambda (x)
(all-completions "x-pointer-" obarray (and (boundp x)
(lambda (x) (integerp (symbol-value x))))))
(and (boundp x) (ignore-errors
(integerp (symbol-value x))))))))) (let ((value (symbol-value (intern i))))
(when (< value x-pointer-invisible)
(push value mouse-avoidance-pointer-shapes)))))))
(seq-random-elt mouse-avoidance-pointer-shapes)) (seq-random-elt mouse-avoidance-pointer-shapes))
(defun mouse-avoidance-ignore-p () (defun mouse-avoidance-ignore-p ()
@ -317,7 +321,8 @@ redefine this function to suit your own tastes."
(not (eq (car mp) (selected-frame))) (not (eq (car mp) (selected-frame)))
;; Don't interfere with ongoing `mouse-drag-and-drop-region' ;; Don't interfere with ongoing `mouse-drag-and-drop-region'
;; (Bug#36269). ;; (Bug#36269).
(eq track-mouse 'dropping) (or (eq track-mouse 'dropping)
(eq track-mouse 'drag-source))
;; Don't do anything if last event was a mouse event. ;; Don't do anything if last event was a mouse event.
;; FIXME: this code fails in the case where the mouse was moved ;; FIXME: this code fails in the case where the mouse was moved
;; since the last key-press but without generating any event. ;; since the last key-press but without generating any event.

View file

@ -232,6 +232,40 @@ The text being displayed in the echo area is controlled by the variables
(funcall battery-status-function)) (funcall battery-status-function))
"Battery status not available"))) "Battery status not available")))
(defcustom battery-update-functions nil
"Functions run by `display-battery-mode' after updating the status.
These functions will be called with one parameter, an alist that
contains data about the current battery status. The keys in the
alist are single characters and the values are strings.
Different battery backends deliver different information, so some
of the following information may or may not be available:
v: driver-version
V: bios-version
I: bios-interface
L: line-status
B: battery-status
b: battery-status-symbol
p: load-percentage
s: seconds
m: minutes
h: hours
t: remaining-time
For instance, to play an alarm when the battery power dips below
10%, you could use a function like the following:
(defvar my-prev-battery nil)
(defun my-battery-alarm (data)
(when (and my-prev-battery
(equal (alist-get ?L data) \"off-line\")
(< (string-to-number (alist-get ?p data)) 10)
(>= (string-to-number (alist-get ?p my-prev-battery)) 10))
(play-sound-file \"~/alarm.wav\" 5))
(setq my-prev-battery data))"
:version "29.1"
:type '(repeat function))
;;;###autoload ;;;###autoload
(define-minor-mode display-battery-mode (define-minor-mode display-battery-mode
"Toggle battery status display in mode line (Display Battery mode). "Toggle battery status display in mode line (Display Battery mode).
@ -239,7 +273,11 @@ The text being displayed in the echo area is controlled by the variables
The text displayed in the mode line is controlled by The text displayed in the mode line is controlled by
`battery-mode-line-format' and `battery-status-function'. `battery-mode-line-format' and `battery-status-function'.
The mode line is be updated every `battery-update-interval' The mode line is be updated every `battery-update-interval'
seconds." seconds.
The function which updates the mode-line display will call the
functions in `battery-update-functions', which can be used to
trigger actions based on battery-related events."
:global t :global t
(setq battery-mode-line-string "") (setq battery-mode-line-string "")
(or global-mode-string (setq global-mode-string '(""))) (or global-mode-string (setq global-mode-string '("")))
@ -279,7 +317,8 @@ seconds."
((< percentage battery-load-low) ((< percentage battery-load-low)
(add-face-text-property 0 len 'battery-load-low t res))) (add-face-text-property 0 len 'battery-load-low t res)))
(put-text-property 0 len 'help-echo "Battery status information" res)) (put-text-property 0 len 'help-echo "Battery status information" res))
(setq battery-mode-line-string (or res ""))) (setq battery-mode-line-string (or res ""))
(run-hook-with-args 'battery-update-functions data))
(force-mode-line-update t)) (force-mode-line-update t))

View file

@ -990,7 +990,7 @@ if `inhibit-field-text-motion' is non-nil."
(define-key esc-map "\\" 'delete-horizontal-space) (define-key esc-map "\\" 'delete-horizontal-space)
(define-key esc-map "m" 'back-to-indentation) (define-key esc-map "m" 'back-to-indentation)
(define-key ctl-x-map "\C-o" 'delete-blank-lines) (define-key ctl-x-map "\C-o" 'delete-blank-lines)
(define-key esc-map " " 'just-one-space) (define-key esc-map " " 'cycle-spacing)
(define-key esc-map "z" 'zap-to-char) (define-key esc-map "z" 'zap-to-char)
(define-key esc-map "=" 'count-words-region) (define-key esc-map "=" 'count-words-region)
(define-key ctl-x-map "=" 'what-cursor-position) (define-key ctl-x-map "=" 'what-cursor-position)

Some files were not shown because too many files have changed in this diff Show more