Merge from emacs-24; up to 2014-04-01T20:18:12Z!eggert@cs.ucla.edu
This commit is contained in:
commit
7e31acf6b8
37 changed files with 807 additions and 223 deletions
|
@ -1,3 +1,8 @@
|
|||
2014-04-03 Ken Brown <kbrown@cornell.edu>
|
||||
|
||||
* configure.ac (EMACS_MANIFEST, UPDATE_MANIFEST): Leave these
|
||||
variables empty on Cygwin. (Bug#17176)
|
||||
|
||||
2014-04-03 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* make-dist: Further update AC_INIT regexp.
|
||||
|
|
10
configure.ac
10
configure.ac
|
@ -1835,11 +1835,6 @@ if test "${HAVE_W32}" = "yes"; then
|
|||
W32_OBJ="w32fns.o w32menu.o w32reg.o w32font.o w32term.o"
|
||||
W32_OBJ="$W32_OBJ w32xfns.o w32select.o w32uniscribe.o"
|
||||
EMACSRES="emacs.res"
|
||||
case "$canonical" in
|
||||
x86_64-*-*) EMACS_MANIFEST="emacs-x64.manifest" ;;
|
||||
*) EMACS_MANIFEST="emacs-x86.manifest" ;;
|
||||
esac
|
||||
UPDATE_MANIFEST=update-game-score.exe.manifest
|
||||
if test "${opsys}" = "cygwin"; then
|
||||
W32_LIBS="$W32_LIBS -lkernel32 -luser32 -lgdi32 -lole32 -lcomdlg32"
|
||||
W32_LIBS="$W32_LIBS -lusp10 -lcomctl32 -lwinspool"
|
||||
|
@ -1847,6 +1842,11 @@ if test "${HAVE_W32}" = "yes"; then
|
|||
# the rc file), not a linker script.
|
||||
W32_RES_LINK="-Wl,emacs.res"
|
||||
else
|
||||
case "$canonical" in
|
||||
x86_64-*-*) EMACS_MANIFEST="emacs-x64.manifest" ;;
|
||||
*) EMACS_MANIFEST="emacs-x86.manifest" ;;
|
||||
esac
|
||||
UPDATE_MANIFEST=update-game-score.exe.manifest
|
||||
W32_OBJ="$W32_OBJ w32.o w32console.o w32heap.o w32inevt.o w32proc.o"
|
||||
W32_LIBS="$W32_LIBS -lwinmm -lgdi32 -lcomdlg32"
|
||||
W32_LIBS="$W32_LIBS -lmpr -lwinspool -lole32 -lcomctl32 -lusp10"
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
2014-04-05 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* trouble.texi (Checklist): Dribble files may contain passwords.
|
||||
|
||||
2014-04-04 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* files.texi (Backup Names):
|
||||
* arevert-xtra.texi (Supporting additional buffers):
|
||||
Update for default values of some -function vars no longer being nil.
|
||||
(Supporting additional buffers):
|
||||
Update for buffer-stale-function also applying to file-buffers.
|
||||
|
||||
2014-03-28 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* custom.texi (Terminal Init): Mention term-file-aliases.
|
||||
|
|
|
@ -103,15 +103,15 @@ arguments to list only some of the files. @file{*Find*} and
|
|||
This section is intended for Elisp programmers who would like to add
|
||||
support for auto-reverting new types of buffers.
|
||||
|
||||
To support auto-reverting the buffer must first of all have a
|
||||
To support auto-reverting the buffer must first of all have a suitable
|
||||
@code{revert-buffer-function}. @xref{Definition of
|
||||
revert-buffer-function,, Reverting, elisp, the Emacs Lisp Reference Manual}.
|
||||
|
||||
In addition, it @emph{must} have a @code{buffer-stale-function}.
|
||||
In addition, it must have a suitable @code{buffer-stale-function}.
|
||||
|
||||
@c FIXME only defvar in all of doc/emacs!
|
||||
@defvar buffer-stale-function
|
||||
The value of this variable is a function to check whether a non-file
|
||||
The value of this variable is a function to check whether a
|
||||
buffer needs reverting. This should be a function with one optional
|
||||
argument @var{noconfirm}. The function should return non-@code{nil}
|
||||
if the buffer should be reverted. The buffer is current when this
|
||||
|
@ -132,7 +132,7 @@ If you just want to automatically auto-revert every
|
|||
@code{auto-revert-interval} seconds (like the Buffer Menu), use:
|
||||
|
||||
@example
|
||||
(set (make-local-variable 'buffer-stale-function)
|
||||
(setq-local buffer-stale-function
|
||||
#'(lambda (&optional noconfirm) 'fast))
|
||||
@end example
|
||||
|
||||
|
@ -149,7 +149,7 @@ also be useful if the function is consulted for purposes other than
|
|||
auto-reverting.
|
||||
@end defvar
|
||||
|
||||
Once the buffer has a @code{revert-buffer-function} and a
|
||||
Once the buffer has a suitable @code{revert-buffer-function} and
|
||||
@code{buffer-stale-function}, several problems usually remain.
|
||||
|
||||
The buffer will only auto-revert if it is marked unmodified. Hence,
|
||||
|
|
|
@ -594,8 +594,8 @@ directory. Emacs creates the directory, if necessary, to make the
|
|||
backup.
|
||||
|
||||
@vindex make-backup-file-name-function
|
||||
If you define the variable @code{make-backup-file-name-function} to
|
||||
a suitable Lisp function, that overrides the usual way Emacs
|
||||
If you set the variable @code{make-backup-file-name-function} to
|
||||
a suitable Lisp function, you can override the usual way Emacs
|
||||
constructs backup file names.
|
||||
|
||||
@node Backup Deletion
|
||||
|
|
|
@ -759,7 +759,9 @@ customizations.
|
|||
One way to record the input to Emacs precisely is to write a dribble
|
||||
file. To start the file, use the @kbd{M-x open-dribble-file
|
||||
@key{RET}} command. From then on, Emacs copies all your input to the
|
||||
specified dribble file until the Emacs process is killed.
|
||||
specified dribble file until the Emacs process is killed. Be aware
|
||||
that sensitive information (such as passwords) may end up recorded in
|
||||
the dribble file.
|
||||
|
||||
@item
|
||||
@findex open-termscript
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
2014-04-05 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* os.texi (Recording Input): Dribble files may contain passwords.
|
||||
|
||||
2014-04-04 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* backups.texi (Making Backups, Reverting):
|
||||
Update for default values of some -function vars no longer being nil.
|
||||
(Reverting): Update for buffer-stale-function
|
||||
also applying to file-buffers.
|
||||
|
||||
2014-03-31 Daniel Colascione <dancol@dancol.org>
|
||||
|
||||
* minibuf.texi (Completion in Buffers): Discuss using lazy
|
||||
|
|
|
@ -90,8 +90,7 @@ save disk space. (You would put this code in your init file.)
|
|||
@smallexample
|
||||
@group
|
||||
(add-hook 'rmail-mode-hook
|
||||
(lambda ()
|
||||
(set (make-local-variable 'make-backup-files) nil)))
|
||||
(lambda () (setq-local make-backup-files nil)))
|
||||
@end group
|
||||
@end smallexample
|
||||
@end defopt
|
||||
|
@ -150,13 +149,12 @@ ignored.
|
|||
@end defopt
|
||||
|
||||
@defopt make-backup-file-name-function
|
||||
This variable's value is a function to use for making backups instead
|
||||
of the default @code{make-backup-file-name}. A value of @code{nil}
|
||||
gives the default @code{make-backup-file-name} behavior.
|
||||
This variable's value is a function to use for making backup file names.
|
||||
The function @code{make-backup-file-name} calls it.
|
||||
@xref{Backup Names,, Naming Backup Files}.
|
||||
|
||||
This could be buffer-local to do something special for specific
|
||||
files. If you define it, you may need to change
|
||||
files. If you change it, you may need to change
|
||||
@code{backup-file-name-p} and @code{file-name-sans-versions} too.
|
||||
@end defopt
|
||||
|
||||
|
@ -727,25 +725,24 @@ buffer-local bindings for these variables:
|
|||
@defvar revert-buffer-function
|
||||
@anchor{Definition of revert-buffer-function}
|
||||
The value of this variable is the function to use to revert this
|
||||
buffer. If non-@code{nil}, it should be a function with two optional
|
||||
buffer. It should be a function with two optional
|
||||
arguments to do the work of reverting. The two optional arguments,
|
||||
@var{ignore-auto} and @var{noconfirm}, are the arguments that
|
||||
@code{revert-buffer} received. If the value is @code{nil}, reverting
|
||||
works the usual way.
|
||||
@code{revert-buffer} received.
|
||||
|
||||
Modes such as Dired mode, in which the text being edited does not
|
||||
consist of a file's contents but can be regenerated in some other
|
||||
fashion, can give this variable a buffer-local value that is a function to
|
||||
regenerate the contents.
|
||||
fashion, can give this variable a buffer-local value that is a special
|
||||
function to regenerate the contents.
|
||||
@end defvar
|
||||
|
||||
@defvar revert-buffer-insert-file-contents-function
|
||||
The value of this variable, if non-@code{nil}, specifies the function to use to
|
||||
The value of this variable specifies the function to use to
|
||||
insert the updated contents when reverting this buffer. The function
|
||||
receives two arguments: first the file name to use; second, @code{t} if
|
||||
the user has asked to read the auto-save file.
|
||||
|
||||
The reason for a mode to set this variable instead of
|
||||
The reason for a mode to change this variable instead of
|
||||
@code{revert-buffer-function} is to avoid duplicating or replacing the
|
||||
rest of what @code{revert-buffer} does: asking for confirmation,
|
||||
clearing the undo list, deciding the proper major mode, and running the
|
||||
|
@ -753,21 +750,23 @@ hooks listed below.
|
|||
@end defvar
|
||||
|
||||
@defvar before-revert-hook
|
||||
This normal hook is run by @code{revert-buffer} before
|
||||
inserting the modified contents---but only if
|
||||
@code{revert-buffer-function} is @code{nil}.
|
||||
This normal hook is run by the default @code{revert-buffer-function}
|
||||
before inserting the modified contents. A custom @code{revert-buffer-function}
|
||||
may or may not run this hook.
|
||||
@end defvar
|
||||
|
||||
@defvar after-revert-hook
|
||||
This normal hook is run by @code{revert-buffer} after inserting
|
||||
the modified contents---but only if @code{revert-buffer-function} is
|
||||
@code{nil}.
|
||||
This normal hook is run by the default @code{revert-buffer-function}
|
||||
after inserting the modified contents. A custom @code{revert-buffer-function}
|
||||
may or may not run this hook.
|
||||
@end defvar
|
||||
|
||||
@c FIXME? Move this section from arevert-xtra to here?
|
||||
@defvar buffer-stale-function
|
||||
The value of this variable, if non-@code{nil}, specifies a function
|
||||
to call to check whether a non-file buffer needs reverting
|
||||
The value of this variable specifies a function to call to check
|
||||
whether a buffer needs reverting. The default value only handles
|
||||
buffers that are visiting files, by checking their modification time.
|
||||
Buffers that are not visiting files require a custom function
|
||||
@iftex
|
||||
(@pxref{Supporting additional buffers,,, emacs-xtra, Specialized Emacs Features}).
|
||||
@end iftex
|
||||
|
|
|
@ -2001,20 +2001,11 @@ This function opens a @dfn{dribble file} named @var{filename}. When a
|
|||
dribble file is open, each input event from the keyboard or mouse (but
|
||||
not those from keyboard macros) is written in that file. A
|
||||
non-character event is expressed using its printed representation
|
||||
surrounded by @samp{<@dots{}>}.
|
||||
surrounded by @samp{<@dots{}>}. Be aware that sensitive information
|
||||
(such as passwords) may end up recorded in the dribble file.
|
||||
|
||||
You close the dribble file by calling this function with an argument
|
||||
of @code{nil}.
|
||||
|
||||
This function is normally used to record the input necessary to
|
||||
trigger an Emacs bug, for the sake of a bug report.
|
||||
|
||||
@example
|
||||
@group
|
||||
(open-dribble-file "~/dribble")
|
||||
@result{} nil
|
||||
@end group
|
||||
@end example
|
||||
@end deffn
|
||||
|
||||
See also the @code{open-termscript} function (@pxref{Terminal Output}).
|
||||
|
|
14
etc/NEWS
14
etc/NEWS
|
@ -219,6 +219,10 @@ You can change the default by customizing `blink-cursor-blinks'.
|
|||
** In keymaps where SPC scrolls forward, S-SPC now scrolls backward.
|
||||
This affects View mode, etc.
|
||||
|
||||
+++
|
||||
** The default value of `make-backup-file-name-function' is no longer nil.
|
||||
Instead it defaults to a function that does what the nil value used to.
|
||||
|
||||
** Help changes
|
||||
|
||||
+++
|
||||
|
@ -1457,9 +1461,13 @@ argument, with the same interpretation as the returned value of
|
|||
|
||||
** Revert and Autorevert changes
|
||||
|
||||
*** The default value of `revert-buffer-function' is no longer nil.
|
||||
Instead it defaults to a function that does what the nil value used to.
|
||||
The same applies for `revert-buffer-insert-file-contents-function'.
|
||||
+++
|
||||
*** The default values of `buffer-stale-function', `revert-buffer-function',
|
||||
and `revert-buffer-insert-file-contents-function' are no longer nil.
|
||||
Instead they default to functions that do what the nil value used to.
|
||||
|
||||
+++
|
||||
*** `buffer-stale-function' is now used for buffers visiting files too.
|
||||
|
||||
---
|
||||
*** If Emacs is compiled with file notification support, it uses notifications
|
||||
|
|
151
lisp/ChangeLog
151
lisp/ChangeLog
|
@ -1,3 +1,128 @@
|
|||
2014-04-07 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* elec-pair.el:
|
||||
(electric-pair--syntax-ppss): When inside comments parse from
|
||||
comment beginning.
|
||||
(electric-pair--balance-info): Fix typo in comment.
|
||||
(electric-pair--in-unterminated-string-p): Delete.
|
||||
(electric-pair--unbalanced-strings-p): New function.
|
||||
(electric-pair-string-bound-function): New var.
|
||||
(electric-pair-inhibit-if-helps-balance): Decide quote pairing
|
||||
according to `electric-pair--in-unterminated-string-p'
|
||||
|
||||
2014-04-07 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* elec-pair.el (electric-pair-inhibit-if-helps-balance): Inhibit
|
||||
quote pairing if point-max is inside an unterminated string.
|
||||
(electric-pair--looking-at-unterminated-string-p):
|
||||
Delete.
|
||||
(electric-pair--in-unterminated-string-p): New function.
|
||||
|
||||
2014-04-07 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* shell.el (shell-directory-tracker):
|
||||
Go back to just ignoring failures. (Bug#17159)
|
||||
|
||||
2014-04-06 João Távora <joaotavora@gmail.com>
|
||||
|
||||
Fix `electric-pair-delete-adjacent-pairs' in modes binding
|
||||
backspace. (bug#16981)
|
||||
* elec-pair.el (electric-pair-backward-delete-char): Delete.
|
||||
(electric-pair-backward-delete-char-untabify): Delete.
|
||||
(electric-pair-mode-map): Bind backspace to a menu item filtering
|
||||
a new `electric-pair-delete-pair' command.
|
||||
(electric-pair-delete-pair): New command.
|
||||
|
||||
2014-04-06 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* progmodes/python.el (python-electric-pair-string-delimiter): Fix
|
||||
triple-quoting electricity. (Bug#17192)
|
||||
|
||||
2014-04-06 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* elec-pair.el (electric-pair-post-self-insert-function): Don't
|
||||
skip whitespace when `electric-pair-text-pairs' and
|
||||
`electric-pair-pairs' were used. syntax to
|
||||
electric-pair--skip-whitespace. (Bug#17183)
|
||||
|
||||
2014-04-06 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* leim/quail/ipa.el (ipa-x-sampa): Fix the character produced for
|
||||
"<F>". (Bug#17199)
|
||||
|
||||
2014-04-06 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* mpc.el (mpc--status-timer-run): Disable timer if not displayed.
|
||||
(mpc--status-idle-timer-run): Use mpc--status-timer-run.
|
||||
|
||||
2014-04-05 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* help.el (view-lossage): Doc tweak.
|
||||
|
||||
2014-04-05 Matthias Dahl <ml_emacs-lists@binary-island.eu>
|
||||
|
||||
* faces.el (face-spec-recalc): Call make-face-x-resource-internal
|
||||
only when inhibit-x-resources is nil, and do that earlier in the
|
||||
function. Doc fix. (Bug#16694)
|
||||
(face-spec-choose): Accept additional optional argument, whose
|
||||
value is returned if no matching attributes are found.
|
||||
(face-spec-recalc): Use the new optional argument when calling
|
||||
face-spec-choose. (Bug#16378)
|
||||
(make-face-x-resource-internal): Do nothing when
|
||||
inhibit-x-resources is non-nil. Don't touch the default face if
|
||||
reversed video is given--as was done in previous versions of Emacs.
|
||||
(face-set-after-frame-default): Don't call
|
||||
make-face-x-resource-internal here. (Bug#16434)
|
||||
|
||||
2014-04-04 Tassilo Horn <tsdh@gnu.org>
|
||||
|
||||
* doc-view.el (doc-view-bookmark-jump):
|
||||
Use `bookmark-after-jump-hook' to jump to the right page after the
|
||||
buffer is shown in a window. (bug#16090)
|
||||
|
||||
2014-04-04 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* international/characters.el (mirroring): Fix last change:
|
||||
instead of loading uni-mirrored.el explicitly, do that implicitly
|
||||
by creating the 'mirroring' uniprop table. This avoids announcing
|
||||
the loading of uni-mirrored.el.
|
||||
|
||||
2014-04-04 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* files.el (buffer-stale--default-function)
|
||||
(buffer-stale-function, revert-buffer--default):
|
||||
* autorevert.el (auto-revert-buffers): Doc tweaks.
|
||||
|
||||
2014-04-03 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* international/characters.el: Preload uni-mirrored.el. (Bug#17169)
|
||||
|
||||
2014-04-03 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* files.el (make-backup-file-name-function)
|
||||
(make-backup-file-name, make-backup-file-name--default-function)
|
||||
(make-backup-file-name-1, find-backup-file-name)
|
||||
(revert-buffer-function, revert-buffer-insert-file-contents-function)
|
||||
(buffer-stale--default-function, buffer-stale-function)
|
||||
(before-revert-hook, after-revert-hook, revert-buffer-in-progress-p)
|
||||
(revert-buffer, revert-buffer--default)
|
||||
(revert-buffer-insert-file-contents--default-function):
|
||||
Doc fixes related to defaults no longer being nil.
|
||||
(make-backup-file-name-function): Bump :version.
|
||||
Restore nil as a valid but deprecated custom type.
|
||||
|
||||
2014-04-03 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* progmodes/perl-mode.el (perl-syntax-propertize-function): Handle $'
|
||||
used as a variable (bug#17174).
|
||||
|
||||
2014-04-02 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* progmodes/perl-mode.el (perl-indent-new-calculate):
|
||||
Handle forward-sexp failure (bug#16985).
|
||||
(perl-syntax-propertize-function): Add "foreach" and "for" statement
|
||||
modifiers introducing expressions (bug#17116).
|
||||
|
||||
2014-04-06 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* dired-aux.el (dired-file-set-difference): Use lexical-scoping.
|
||||
|
@ -488,6 +613,19 @@
|
|||
(tty-color-approximate, tty-color-by-index, tty-color-values)
|
||||
(tty-color-desc): Remove superfluous backslashes.
|
||||
|
||||
2014-03-20 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* electric.el (electric-newline-and-maybe-indent): New command.
|
||||
Bind it globally to C-j.
|
||||
(electric-indent-mode): Don't mess with the global map any more.
|
||||
Don't drop the post-self-insert-hook is some buffer is still using it
|
||||
(bug#16770).
|
||||
|
||||
* bindings.el (global-map): Remove C-j binding.
|
||||
|
||||
* emacs-lisp/nadvice.el (advice--make-docstring): Try harder to find
|
||||
the docstring of functions advised before dumping (bug#16993).
|
||||
|
||||
2014-03-21 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* cus-start.el (history-length): Bump :version.
|
||||
|
@ -516,18 +654,6 @@
|
|||
|
||||
* skeleton.el (skeleton-autowrap): Mark as obsolete. Doc fix.
|
||||
|
||||
2014-03-20 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* electric.el (electric-newline-and-maybe-indent): New command.
|
||||
Bind it globally to C-j.
|
||||
(electric-indent-mode): Don't mess with the global map any more.
|
||||
Don't drop the post-self-insert-hook is some buffer is still using it
|
||||
(bug#16770).
|
||||
* bindings.el (global-map): Remove C-j binding.
|
||||
|
||||
* emacs-lisp/nadvice.el (advice--make-docstring): Try harder to find
|
||||
the docstring of functions advised before dumping (bug#16993).
|
||||
|
||||
2014-03-19 Stefan-W. Hahn <stefan.hahn@s-hahn.de> (tiny change)
|
||||
|
||||
* ps-print.el (ps-generate-postscript-with-faces):
|
||||
|
@ -2154,7 +2280,6 @@
|
|||
* net/shr.el (shr-tag-img): Prefer the title over the alt text
|
||||
(bug#16537).
|
||||
|
||||
>>>>>>> MERGE-SOURCE
|
||||
2014-01-24 Juanma Barranquero <lekktu@gmail.com>
|
||||
|
||||
* net/eww.el (eww-download-callback):
|
||||
|
|
|
@ -672,7 +672,7 @@ Should `auto-revert-mode' be active in some buffers, those buffers
|
|||
are checked.
|
||||
|
||||
Non-file buffers that have a custom `revert-buffer-function' and
|
||||
a `buffer-stale-function' are reverted either when Auto-Revert
|
||||
`buffer-stale-function' are reverted either when Auto-Revert
|
||||
Mode is active in that buffer, or when the variable
|
||||
`global-auto-revert-non-file-buffers' is non-nil and Global
|
||||
Auto-Revert Mode is active.
|
||||
|
|
|
@ -1862,20 +1862,23 @@ See the command `doc-view-mode' for more information on this mode."
|
|||
`((page . ,(doc-view-current-page))
|
||||
(handler . doc-view-bookmark-jump))))
|
||||
|
||||
|
||||
;;;###autoload
|
||||
(defun doc-view-bookmark-jump (bmk)
|
||||
;; This implements the `handler' function interface for record type
|
||||
;; returned by `doc-view-bookmark-make-record', which see.
|
||||
(prog1 (bookmark-default-handler bmk)
|
||||
(let ((page (bookmark-prop-get bmk 'page)))
|
||||
(when (not (eq major-mode 'doc-view-mode))
|
||||
(doc-view-toggle-display))
|
||||
(with-selected-window
|
||||
(or (get-buffer-window (current-buffer) 0)
|
||||
(selected-window))
|
||||
(doc-view-goto-page page)))))
|
||||
|
||||
(let ((page (bookmark-prop-get bmk 'page))
|
||||
(show-fn-sym (make-symbol "doc-view-bookmark-after-jump-hook")))
|
||||
(fset show-fn-sym
|
||||
(lambda ()
|
||||
(remove-hook 'bookmark-after-jump-hook show-fn-sym)
|
||||
(when (not (eq major-mode 'doc-view-mode))
|
||||
(doc-view-toggle-display))
|
||||
(with-selected-window
|
||||
(or (get-buffer-window (current-buffer) 0)
|
||||
(selected-window))
|
||||
(doc-view-goto-page page))))
|
||||
(add-hook 'bookmark-after-jump-hook show-fn-sym)
|
||||
(bookmark-default-handler bmk)))
|
||||
|
||||
(provide 'doc-view)
|
||||
|
||||
|
|
|
@ -166,36 +166,6 @@ return value is considered instead."
|
|||
quotes or comments. If lookup fails here, `electric-pair-text-pairs' will
|
||||
be considered.")
|
||||
|
||||
(defun electric-pair-backward-delete-char (n &optional killflag untabify)
|
||||
"Delete characters backward, and maybe also two adjacent paired delimiters.
|
||||
|
||||
Remaining behavior is given by `backward-delete-char' or, if UNTABIFY is
|
||||
non-nil, `backward-delete-char-untabify'."
|
||||
(interactive "*p\nP")
|
||||
(let* ((prev (char-before))
|
||||
(next (char-after))
|
||||
(syntax-info (and prev
|
||||
(electric-pair-syntax-info prev)))
|
||||
(syntax (car syntax-info))
|
||||
(pair (cadr syntax-info)))
|
||||
(when (and next pair
|
||||
(if (functionp electric-pair-delete-adjacent-pairs)
|
||||
(funcall electric-pair-delete-adjacent-pairs)
|
||||
electric-pair-delete-adjacent-pairs)
|
||||
(memq syntax '(?\( ?\" ?\$))
|
||||
(eq pair next))
|
||||
(delete-char 1 killflag))
|
||||
(if untabify
|
||||
(backward-delete-char-untabify n killflag)
|
||||
(backward-delete-char n killflag))))
|
||||
|
||||
(defun electric-pair-backward-delete-char-untabify (n &optional killflag)
|
||||
"Delete characters backward, and maybe also two adjacent paired delimiters.
|
||||
|
||||
Remaining behavior is given by `backward-delete-char-untabify'."
|
||||
(interactive "*p\nP")
|
||||
(electric-pair-backward-delete-char n killflag t))
|
||||
|
||||
(defun electric-pair-conservative-inhibit (char)
|
||||
(or
|
||||
;; I find it more often preferable not to pair when the
|
||||
|
@ -503,10 +473,12 @@ happened."
|
|||
(funcall electric-pair-skip-self last-command-event)
|
||||
electric-pair-skip-self))
|
||||
(save-excursion
|
||||
(when (setq skip-whitespace-info
|
||||
(if (functionp electric-pair-skip-whitespace)
|
||||
(funcall electric-pair-skip-whitespace)
|
||||
electric-pair-skip-whitespace))
|
||||
(when (and (not (and unconditional
|
||||
(eq syntax ?\")))
|
||||
(setq skip-whitespace-info
|
||||
(if (functionp electric-pair-skip-whitespace)
|
||||
(funcall electric-pair-skip-whitespace)
|
||||
electric-pair-skip-whitespace)))
|
||||
(electric-pair--skip-whitespace))
|
||||
(eq (char-after) last-command-event))))
|
||||
;; This is too late: rather than insert&delete we'd want to only
|
||||
|
@ -546,14 +518,34 @@ happened."
|
|||
(memq (car (electric-pair-syntax-info last-command-event))
|
||||
'(?\( ?\) ?\" ?\$))))
|
||||
|
||||
(defun electric-pair-delete-pair (arg &optional killp)
|
||||
"When between adjacent paired delimiters, delete both of them.
|
||||
ARG and KILLP are passed directly to
|
||||
`backward-delete-char-untabify', which see."
|
||||
(interactive "*p\nP")
|
||||
(delete-char 1)
|
||||
(backward-delete-char-untabify arg killp))
|
||||
|
||||
(defvar electric-pair-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map [remap backward-delete-char-untabify]
|
||||
'electric-pair-backward-delete-char-untabify)
|
||||
(define-key map [remap backward-delete-char]
|
||||
'electric-pair-backward-delete-char)
|
||||
(define-key map [remap delete-backward-char]
|
||||
'electric-pair-backward-delete-char)
|
||||
(define-key map "\177"
|
||||
`(menu-item
|
||||
"" electric-pair-delete-pair
|
||||
:filter
|
||||
,(lambda (cmd)
|
||||
(let* ((prev (char-before))
|
||||
(next (char-after))
|
||||
(syntax-info (and prev
|
||||
(electric-pair-syntax-info prev)))
|
||||
(syntax (car syntax-info))
|
||||
(pair (cadr syntax-info)))
|
||||
(and next pair
|
||||
(memq syntax '(?\( ?\" ?\$))
|
||||
(eq pair next)
|
||||
(if (functionp electric-pair-delete-adjacent-pairs)
|
||||
(funcall electric-pair-delete-adjacent-pairs)
|
||||
electric-pair-delete-adjacent-pairs)
|
||||
cmd)))))
|
||||
map)
|
||||
"Keymap used by `electric-pair-mode'.")
|
||||
|
||||
|
|
|
@ -354,11 +354,16 @@ specifies an invalid attribute."
|
|||
|
||||
(defun make-face-x-resource-internal (face &optional frame)
|
||||
"Fill frame-local FACE on FRAME from X resources.
|
||||
FRAME nil or not specified means do it for all frames."
|
||||
(if (null frame)
|
||||
(dolist (frame (frame-list))
|
||||
(set-face-attributes-from-resources face frame))
|
||||
(set-face-attributes-from-resources face frame)))
|
||||
FRAME nil or not specified means do it for all frames.
|
||||
|
||||
If `inhibit-x-resources' is non-nil, this function does nothing."
|
||||
(unless inhibit-x-resources
|
||||
(dolist (frame (if (null frame) (frame-list) (list frame)))
|
||||
;; `x-create-frame' already took care of correctly handling
|
||||
;; the reverse video case-- do _not_ touch the default face
|
||||
(unless (and (eq face 'default)
|
||||
(frame-parameter frame 'reverse))
|
||||
(set-face-attributes-from-resources face frame)))))
|
||||
|
||||
|
||||
|
||||
|
@ -1532,13 +1537,15 @@ If FRAME is nil, the current FRAME is used."
|
|||
match))
|
||||
|
||||
|
||||
(defun face-spec-choose (spec &optional frame)
|
||||
"Choose the proper attributes for FRAME, out of SPEC.
|
||||
If SPEC is nil, return nil."
|
||||
(defun face-spec-choose (spec &optional frame no-match-retval)
|
||||
"Return the proper attributes for FRAME, out of SPEC.
|
||||
|
||||
If no match is found or SPEC is nil, return nil, unless NO-MATCH-RETVAL
|
||||
is given, in which case return its value instead."
|
||||
(unless frame
|
||||
(setq frame (selected-frame)))
|
||||
(let ((tail spec)
|
||||
result defaults)
|
||||
result defaults match-found)
|
||||
(while tail
|
||||
(let* ((entry (pop tail))
|
||||
(display (car entry))
|
||||
|
@ -1558,9 +1565,18 @@ If SPEC is nil, return nil."
|
|||
(setq defaults thisval)
|
||||
;; Otherwise, if it matches, use it.
|
||||
(when (face-spec-set-match-display display frame)
|
||||
(setq result thisval)
|
||||
(setq tail nil)))))
|
||||
(if defaults (append result defaults) result)))
|
||||
(setq result thisval
|
||||
tail nil
|
||||
match-found t)))))
|
||||
;; If defaults have been found, it's safe to just append those to the result
|
||||
;; list (which at this point will be either nil or contain actual specs) and
|
||||
;; return it to the caller. Since there will most definitely be something to
|
||||
;; return in this case, there's no need to know/check if a match was found.
|
||||
(if defaults
|
||||
(append result defaults)
|
||||
(if match-found
|
||||
result
|
||||
no-match-retval))))
|
||||
|
||||
|
||||
(defun face-spec-reset-face (face &optional frame)
|
||||
|
@ -1639,19 +1655,27 @@ function for its other effects."
|
|||
|
||||
(defun face-spec-recalc (face frame)
|
||||
"Reset the face attributes of FACE on FRAME according to its specs.
|
||||
This applies the defface/custom spec first, then the custom theme specs,
|
||||
then the override spec."
|
||||
After the reset, the specs are applied from the following sources in this order:
|
||||
X resources (if applicable)
|
||||
|
|
||||
(theme and user customization)
|
||||
or, if nonexistent or does not match the current frame,
|
||||
(defface default spec)
|
||||
|
|
||||
defface override spec"
|
||||
(while (get face 'face-alias)
|
||||
(setq face (get face 'face-alias)))
|
||||
(face-spec-reset-face face frame)
|
||||
(make-face-x-resource-internal face frame)
|
||||
;; If FACE is customized or themed, set the custom spec from
|
||||
;; `theme-face' records.
|
||||
(let ((theme-faces (get face 'theme-face))
|
||||
(no-match-found 0)
|
||||
spec theme-face-applied)
|
||||
(if theme-faces
|
||||
(dolist (elt (reverse theme-faces))
|
||||
(setq spec (face-spec-choose (cadr elt) frame))
|
||||
(when spec
|
||||
(setq spec (face-spec-choose (cadr elt) frame no-match-found))
|
||||
(unless (eq spec no-match-found)
|
||||
(face-spec-set-2 face frame spec)
|
||||
(setq theme-face-applied t))))
|
||||
;; If there was a spec applicable to FRAME, that overrides the
|
||||
|
@ -1661,8 +1685,7 @@ then the override spec."
|
|||
(setq spec (face-spec-choose (face-default-spec face) frame))
|
||||
(face-spec-set-2 face frame spec))
|
||||
(setq spec (face-spec-choose (get face 'face-override-spec) frame))
|
||||
(face-spec-set-2 face frame spec))
|
||||
(make-face-x-resource-internal face frame))
|
||||
(face-spec-set-2 face frame spec)))
|
||||
|
||||
(defun face-spec-set-2 (face frame spec)
|
||||
"Set the face attributes of FACE on FRAME according to SPEC."
|
||||
|
@ -2046,10 +2069,6 @@ frame parameters in PARAMETERS."
|
|||
(progn
|
||||
;; Initialize faces from face spec and custom theme.
|
||||
(face-spec-recalc face frame)
|
||||
;; X resources for the default face are applied during
|
||||
;; `x-create-frame'.
|
||||
(and (not (eq face 'default)) window-system-p
|
||||
(make-face-x-resource-internal face frame))
|
||||
;; Apply attributes specified by face-new-frame-defaults
|
||||
(internal-merge-in-global-face face frame))
|
||||
;; Don't let invalid specs prevent frame creation.
|
||||
|
|
104
lisp/files.el
104
lisp/files.el
|
@ -4207,15 +4207,22 @@ FILENAME defaults to `buffer-file-name'."
|
|||
|
||||
(defcustom make-backup-file-name-function
|
||||
#'make-backup-file-name--default-function
|
||||
"A function to use instead of the default `make-backup-file-name'.
|
||||
"A function that `make-backup-file-name' uses to create backup file names.
|
||||
The function receives a single argument, the original file name.
|
||||
|
||||
This could be buffer-local to do something special for specific
|
||||
files. If you define it, you may need to change `backup-file-name-p'
|
||||
and `file-name-sans-versions' too.
|
||||
If you change this, you may need to change `backup-file-name-p' and
|
||||
`file-name-sans-versions' too.
|
||||
|
||||
You could make this buffer-local to do something special for specific files.
|
||||
|
||||
For historical reasons, a value of nil means to use the default function.
|
||||
This should not be relied upon.
|
||||
|
||||
See also `backup-directory-alist'."
|
||||
:version "24.4" ; nil -> make-backup-file-name--default-function
|
||||
:group 'backup
|
||||
:type '(function :tag "Your function"))
|
||||
:type '(choice (const :tag "Deprecated way to get the default function" nil)
|
||||
(function :tag "Function")))
|
||||
|
||||
(defcustom backup-directory-alist nil
|
||||
"Alist of filename patterns and backup directory names.
|
||||
|
@ -4272,20 +4279,17 @@ Checks for files in `temporary-file-directory',
|
|||
|
||||
(defun make-backup-file-name (file)
|
||||
"Create the non-numeric backup file name for FILE.
|
||||
Normally this will just be the file's name with `~' appended.
|
||||
Customization hooks are provided as follows.
|
||||
|
||||
The value of `make-backup-file-name-function' should be a function which
|
||||
will be called with FILE as its argument; the resulting name is used.
|
||||
|
||||
By default, a match for FILE is sought in `backup-directory-alist'; see
|
||||
the documentation of that variable. If the directory for the backup
|
||||
doesn't exist, it is created."
|
||||
This calls the function that `make-backup-file-name-function' specifies,
|
||||
with a single argument FILE."
|
||||
(funcall (or make-backup-file-name-function
|
||||
#'make-backup-file-name--default-function)
|
||||
file))
|
||||
|
||||
(defun make-backup-file-name--default-function (file)
|
||||
"Default function for `make-backup-file-name'.
|
||||
Normally this just returns FILE's name with `~' appended.
|
||||
It searches for a match for FILE in `backup-directory-alist'.
|
||||
If the directory for the backup doesn't exist, it is created."
|
||||
(if (and (eq system-type 'ms-dos)
|
||||
(not (msdos-long-file-names)))
|
||||
(let ((fn (file-name-nondirectory file)))
|
||||
|
@ -4297,7 +4301,8 @@ doesn't exist, it is created."
|
|||
(concat (make-backup-file-name-1 file) "~")))
|
||||
|
||||
(defun make-backup-file-name-1 (file)
|
||||
"Subroutine of `make-backup-file-name' and `find-backup-file-name'."
|
||||
"Subroutine of `make-backup-file-name--default-function'.
|
||||
The function `find-backup-file-name' also uses this."
|
||||
(let ((alist backup-directory-alist)
|
||||
elt backup-directory abs-backup-directory)
|
||||
(while alist
|
||||
|
@ -4374,8 +4379,8 @@ the index in the name where the version number begins."
|
|||
Value is a list whose car is the name for the backup file
|
||||
and whose cdr is a list of old versions to consider deleting now.
|
||||
If the value is nil, don't make a backup.
|
||||
Uses `backup-directory-alist' in the same way as does
|
||||
`make-backup-file-name'."
|
||||
Uses `backup-directory-alist' in the same way as
|
||||
`make-backup-file-name--default-function' does."
|
||||
(let ((handler (find-file-name-handler fn 'find-backup-file-name)))
|
||||
;; Run a handler for this function so that ange-ftp can refuse to do it.
|
||||
(if handler
|
||||
|
@ -5312,28 +5317,41 @@ comparison."
|
|||
|
||||
(put 'revert-buffer-function 'permanent-local t)
|
||||
(defvar revert-buffer-function #'revert-buffer--default
|
||||
"Function to use to revert this buffer, or nil to do the default.
|
||||
"Function to use to revert this buffer.
|
||||
The function receives two arguments IGNORE-AUTO and NOCONFIRM,
|
||||
which are the arguments that `revert-buffer' received.
|
||||
It also has access to the `preserve-modes' argument of `revert-buffer'
|
||||
via the `revert-buffer-preserve-modes' dynamic variable.")
|
||||
via the `revert-buffer-preserve-modes' dynamic variable.
|
||||
|
||||
For historical reasons, a value of nil means to use the default function.
|
||||
This should not be relied upon.")
|
||||
|
||||
(put 'revert-buffer-insert-file-contents-function 'permanent-local t)
|
||||
(defvar revert-buffer-insert-file-contents-function
|
||||
#'revert-buffer-insert-file-contents--default-function
|
||||
"Function to use to insert contents when reverting this buffer.
|
||||
Gets two args, first the nominal file name to use,
|
||||
and second, t if reading the auto-save file.
|
||||
The function receives two arguments: the first the nominal file name to use;
|
||||
the second is t if reading the auto-save file.
|
||||
|
||||
The function you specify is responsible for updating (or preserving) point.")
|
||||
The function is responsible for updating (or preserving) point.
|
||||
|
||||
For historical reasons, a value of nil means to use the default function.
|
||||
This should not be relied upon.")
|
||||
|
||||
(defun buffer-stale--default-function (&optional _noconfirm)
|
||||
"Default function to use for `buffer-stale-function'.
|
||||
This function ignores its argument.
|
||||
This returns non-nil if the current buffer is visiting a readable file
|
||||
whose modification time does not match that of the buffer.
|
||||
|
||||
This function only handles buffers that are visiting files.
|
||||
Non-file buffers need a custom function"
|
||||
(and buffer-file-name
|
||||
(file-readable-p buffer-file-name)
|
||||
(not (verify-visited-file-modtime (current-buffer)))))
|
||||
|
||||
(defvar buffer-stale-function #'buffer-stale--default-function
|
||||
"Function to check whether a non-file buffer needs reverting.
|
||||
"Function to check whether a buffer needs reverting.
|
||||
This should be a function with one optional argument NOCONFIRM.
|
||||
Auto Revert Mode passes t for NOCONFIRM. The function should return
|
||||
non-nil if the buffer should be reverted. A return value of
|
||||
|
@ -5346,13 +5364,16 @@ non-nil if the buffer is going to be reverted without asking the
|
|||
user. In such situations, one has to be careful with potentially
|
||||
time consuming operations.
|
||||
|
||||
For historical reasons, a value of nil means to use the default function.
|
||||
This should not be relied upon.
|
||||
|
||||
For more information on how this variable is used by Auto Revert mode,
|
||||
see Info node `(emacs)Supporting additional buffers'.")
|
||||
|
||||
(defvar before-revert-hook nil
|
||||
"Normal hook for `revert-buffer' to run before reverting.
|
||||
If `revert-buffer-function' is used to override the normal revert
|
||||
mechanism, this hook is not used.")
|
||||
The function `revert-buffer--default' runs this.
|
||||
A customized `revert-buffer-function' need not run this hook.")
|
||||
|
||||
(defvar after-revert-hook nil
|
||||
"Normal hook for `revert-buffer' to run after reverting.
|
||||
|
@ -5360,12 +5381,11 @@ Note that the hook value that it runs is the value that was in effect
|
|||
before reverting; that makes a difference if you have buffer-local
|
||||
hook functions.
|
||||
|
||||
If `revert-buffer-function' is used to override the normal revert
|
||||
mechanism, this hook is not used.")
|
||||
The function `revert-buffer--default' runs this.
|
||||
A customized `revert-buffer-function' need not run this hook.")
|
||||
|
||||
(defvar revert-buffer-in-progress-p nil
|
||||
"Non-nil if a `revert-buffer' operation is in progress, nil otherwise.
|
||||
This is true even if a `revert-buffer-function' is being used.")
|
||||
"Non-nil if a `revert-buffer' operation is in progress, nil otherwise.")
|
||||
|
||||
(defvar revert-buffer-internal-hook)
|
||||
|
||||
|
@ -5402,12 +5422,10 @@ the files modes. Normally we reinitialize them using `normal-mode'.
|
|||
|
||||
This function binds `revert-buffer-in-progress-p' non-nil while it operates.
|
||||
|
||||
If the value of `revert-buffer-function' is non-nil, it is called to
|
||||
do all the work for this command. Otherwise, the hooks
|
||||
`before-revert-hook' and `after-revert-hook' are run at the beginning
|
||||
and the end, and if `revert-buffer-insert-file-contents-function' is
|
||||
non-nil, it is called instead of rereading visited file contents."
|
||||
|
||||
This function calls the function that `revert-buffer-function' specifies
|
||||
to do the work, with arguments IGNORE-AUTO and NOCONFIRM.
|
||||
The default function runs the hooks `before-revert-hook' and
|
||||
`after-revert-hook'."
|
||||
;; I admit it's odd to reverse the sense of the prefix argument, but
|
||||
;; there is a lot of code out there which assumes that the first
|
||||
;; argument should be t to avoid consulting the auto-save file, and
|
||||
|
@ -5419,7 +5437,19 @@ non-nil, it is called instead of rereading visited file contents."
|
|||
(revert-buffer-preserve-modes preserve-modes))
|
||||
(funcall (or revert-buffer-function #'revert-buffer--default)
|
||||
ignore-auto noconfirm)))
|
||||
|
||||
(defun revert-buffer--default (ignore-auto noconfirm)
|
||||
"Default function for `revert-buffer'.
|
||||
The arguments IGNORE-AUTO and NOCONFIRM are as described for `revert-buffer'.
|
||||
Runs the hooks `before-revert-hook' and `after-revert-hook' at the
|
||||
start and end.
|
||||
|
||||
Calls `revert-buffer-insert-file-contents-function' to reread the
|
||||
contents of the visited file, with two arguments: the first is the file
|
||||
name, the second is non-nil if reading an auto-save file.
|
||||
|
||||
This function only handles buffers that are visiting files.
|
||||
Non-file buffers need a custom function."
|
||||
(with-current-buffer (or (buffer-base-buffer (current-buffer))
|
||||
(current-buffer))
|
||||
(let* ((auto-save-p (and (not ignore-auto)
|
||||
|
@ -5473,6 +5503,10 @@ non-nil, it is called instead of rereading visited file contents."
|
|||
t)))))
|
||||
|
||||
(defun revert-buffer-insert-file-contents--default-function (file-name auto-save-p)
|
||||
"Default function for `revert-buffer-insert-file-contents-function'.
|
||||
The function `revert-buffer--default' calls this.
|
||||
FILE-NAME is the name of the file. AUTO-SAVE-P is non-nil if this is
|
||||
an auto-save file."
|
||||
(cond
|
||||
((not (file-exists-p file-name))
|
||||
(error (if buffer-file-number
|
||||
|
|
|
@ -446,7 +446,7 @@ is specified by the variable `message-log-max'."
|
|||
(defun view-lossage ()
|
||||
"Display last 300 input keystrokes.
|
||||
|
||||
To record all your input on a file, use `open-dribble-file'."
|
||||
To record all your input, use `open-dribble-file'."
|
||||
(interactive)
|
||||
(help-setup-xref (list #'view-lossage)
|
||||
(called-interactively-p 'interactive))
|
||||
|
|
|
@ -495,6 +495,13 @@ with L, LRE, or LRO Unicode bidi character type.")
|
|||
(modify-category-entry key ?L))))
|
||||
table)))
|
||||
|
||||
;; Load uni-mirrored.el if available, so that it gets dumped into
|
||||
;; Emacs. This allows to start Emacs with force-load-messages in
|
||||
;; ~/.emacs, and avoid infinite recursion in bidi_initialize, which
|
||||
;; needs to load uni-mirrored.el in order to display the "Loading"
|
||||
;; messages.
|
||||
(unicode-property-table-internal 'mirroring)
|
||||
|
||||
;; Latin
|
||||
|
||||
(modify-category-entry '(#x80 . #x024F) ?l)
|
||||
|
|
|
@ -475,7 +475,7 @@ displays them, incorrectly, as separate from the modified glyphs.")
|
|||
("_d" "̪") ;; Dental U+032A
|
||||
("_e" "̴") ;; Velarized or pharyngeal U+0334
|
||||
|
||||
("<F>" "↙") ;; Global fall; SOUTH EAST ARROW; may be a bit smaller than
|
||||
("<F>" "↘") ;; Global fall; SOUTH EAST ARROW; may be a bit smaller than
|
||||
;; intended.
|
||||
("_F" "̂") ;; Falling tone U+0302
|
||||
("_G" "ˠ") ;; Velarized U+02E0
|
||||
|
|
14
lisp/mpc.el
14
lisp/mpc.el
|
@ -491,9 +491,13 @@ to call FUN for any change whatsoever.")
|
|||
(cancel-timer mpc--status-timer)
|
||||
(setq mpc--status-timer nil)))
|
||||
(defun mpc--status-timer-run ()
|
||||
(with-demoted-errors "MPC: %s"
|
||||
(with-demoted-errors "MPC: %S"
|
||||
(when (process-get (mpc-proc) 'ready)
|
||||
(with-local-quit (mpc-status-refresh)))))
|
||||
(let* ((buf (mpc-proc-buffer (mpc-proc) 'status))
|
||||
(win (get-buffer-window buf t)))
|
||||
(if (not win)
|
||||
(mpc--status-timer-stop)
|
||||
(with-local-quit (mpc-status-refresh)))))))
|
||||
|
||||
(defvar mpc--status-idle-timer nil)
|
||||
(defun mpc--status-idle-timer-start ()
|
||||
|
@ -518,10 +522,8 @@ to call FUN for any change whatsoever.")
|
|||
;; client starts playback, we may get a chance to notice it.
|
||||
(run-with-idle-timer 10 t 'mpc--status-idle-timer-run))))
|
||||
(defun mpc--status-idle-timer-run ()
|
||||
(when (process-get (mpc-proc) 'ready)
|
||||
(with-demoted-errors "MPC: %s"
|
||||
(with-local-quit (mpc-status-refresh))))
|
||||
(mpc--status-timer-start))
|
||||
(mpc--status-timer-start)
|
||||
(mpc--status-timer-run))
|
||||
|
||||
(defun mpc--status-timers-refresh ()
|
||||
"Start/stop the timers according to whether a song is playing."
|
||||
|
|
|
@ -250,7 +250,11 @@
|
|||
;; Catch ${ so that ${var} doesn't screw up indentation.
|
||||
;; This also catches $' to handle 'foo$', although it should really
|
||||
;; check that it occurs inside a '..' string.
|
||||
("\\(\\$\\)[{']" (1 ". p"))
|
||||
("\\(\\$\\)[{']" (1 (unless (and (eq ?\' (char-after (match-end 1)))
|
||||
(save-excursion
|
||||
(not (nth 3 (syntax-ppss
|
||||
(match-beginning 0))))))
|
||||
(string-to-syntax ". p"))))
|
||||
;; Handle funny names like $DB'stop.
|
||||
("\\$ ?{?^?[_[:alpha:]][_[:alnum:]]*\\('\\)[_[:alpha:]]" (1 "_"))
|
||||
;; format statements
|
||||
|
@ -276,7 +280,7 @@
|
|||
;; perl-font-lock-special-syntactic-constructs.
|
||||
((concat "\\(?:\\(?:^\\|[^$@&%[:word:]]\\)"
|
||||
(regexp-opt '("split" "if" "unless" "until" "while" "split"
|
||||
"grep" "map" "not" "or" "and"))
|
||||
"grep" "map" "not" "or" "and" "for" "foreach"))
|
||||
"\\|[?:.,;=!~({[]\\|\\(^\\)\\)[ \t\n]*\\(/\\)")
|
||||
(2 (ignore
|
||||
(if (and (match-end 1) ; / at BOL.
|
||||
|
@ -854,11 +858,12 @@ changed by, or (parse-state) if line starts in a quoted string."
|
|||
(and (= (char-syntax (following-char)) ?\))
|
||||
(save-excursion
|
||||
(forward-char 1)
|
||||
(forward-sexp -1)
|
||||
(perl-indent-new-calculate
|
||||
;; Recalculate the parsing-start, since we may have jumped
|
||||
;; dangerously close (typically in the case of nested functions).
|
||||
'virtual nil (save-excursion (perl-beginning-of-function)))))
|
||||
(when (condition-case nil (progn (forward-sexp -1) t)
|
||||
(scan-error nil))
|
||||
(perl-indent-new-calculate
|
||||
;; Recalculate the parsing-start, since we may have jumped
|
||||
;; dangerously close (typically in the case of nested functions).
|
||||
'virtual nil (save-excursion (perl-beginning-of-function))))))
|
||||
(and (and (= (following-char) ?{)
|
||||
(save-excursion (forward-char) (perl-hanging-paren-p)))
|
||||
(+ (or default (perl-calculate-indent parse-start))
|
||||
|
|
|
@ -3651,8 +3651,9 @@ returned as is."
|
|||
(let ((count 0))
|
||||
(while (eq (char-before (- (point) count)) last-command-event)
|
||||
(cl-incf count))
|
||||
(= count 3)))
|
||||
(save-excursion (insert (make-string 3 last-command-event)))))
|
||||
(= count 3))
|
||||
(eq (char-after) last-command-event))
|
||||
(save-excursion (insert (make-string 2 last-command-event)))))
|
||||
|
||||
(defvar electric-indent-inhibit)
|
||||
|
||||
|
|
|
@ -792,8 +792,11 @@ and `shell-pushd-dunique' control the behavior of the relevant command.
|
|||
Environment variables are expanded, see function `substitute-in-file-name'."
|
||||
(if shell-dirtrackp
|
||||
;; We fail gracefully if we think the command will fail in the shell.
|
||||
(with-demoted-errors "Couldn't cd: %s"
|
||||
(let ((start (progn (string-match
|
||||
;;; (with-demoted-errors "Directory tracker failure: %s"
|
||||
;; This fails so often that it seems better to just ignore errors (?).
|
||||
;; Eg even: foo=/tmp; cd $foo is beyond us (bug#17159).
|
||||
(ignore-errors
|
||||
(let ((start (progn (string-match
|
||||
(concat "^" shell-command-separator-regexp)
|
||||
str) ; skip whitespace
|
||||
(match-end 0)))
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2014-04-03 Ken Brown <kbrown@cornell.edu>
|
||||
|
||||
* emacs.rc: Don't use manifest on Cygwin. (Bug#17176)
|
||||
|
||||
2014-02-17 Juanma Barranquero <lekktu@gmail.com>
|
||||
|
||||
* Makefile.in (install): Create destination directory before copying
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
Emacs ICON icons/emacs.ico
|
||||
32649 CURSOR icons/hand.cur
|
||||
#if defined (WIN64) || defined (__x86_64__)
|
||||
#ifndef __CYGWIN__
|
||||
#ifdef WIN64
|
||||
1 24 "emacs-x64.manifest"
|
||||
#else
|
||||
1 24 "emacs-x86.manifest"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef VS_VERSION_INFO
|
||||
#define VS_VERSION_INFO 1
|
||||
|
|
|
@ -1,3 +1,37 @@
|
|||
2014-04-07 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* lisp.h (struct Lisp_Symbol): New bitfield `pinned'.
|
||||
|
||||
* alloc.c: Keep track of symbols referenced from pure space (bug#17168).
|
||||
(symbol_block_pinned): New var.
|
||||
(Fmake_symbol): Initialize `pinned'.
|
||||
(purecopy): New function, extracted from Fpurecopy. Mark symbols as
|
||||
pinned and signal an error for un-purifiable objects.
|
||||
(pure_cons): Use it.
|
||||
(Fpurecopy): Use it, except for objects that can't be purified.
|
||||
(mark_pinned_symbols): New function.
|
||||
(Fgarbage_collect): Use it.
|
||||
(gc_sweep): Remove hack made unnecessary.
|
||||
|
||||
2014-04-05 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* keyboard.c (Fopen_dribble_file): Doc tweak.
|
||||
|
||||
2014-04-04 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
Backport from trunk.
|
||||
* nsterm.m (updateFrameSize:): If waiting for the tool bar and tool
|
||||
bar is zero height, just return (Bug#16976).
|
||||
(initFrameFromEmacs:): Initialize wait_for_tool_bar.
|
||||
* nsterm.h (EmacsView): Add wait_for_tool_bar.
|
||||
* nsmenu.m (update_frame_tool_bar): Return early if view or toolbar
|
||||
is nil. If waiting for toolbar to complete, force a redraw.
|
||||
(free_frame_tool_bar): Set wait_for_tool_bar = NO (Bug#16976).
|
||||
|
||||
2014-04-03 Ken Brown <kbrown@cornell.edu>
|
||||
|
||||
* Makefile.in (EMACS_MANIFEST): Update comment. (Bug#17176)
|
||||
|
||||
2014-04-07 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* alloc.c: Simplify by removing use of HAVE_EXECINFO_H.
|
||||
|
@ -4490,7 +4524,7 @@
|
|||
* frame.c (delete_frame): Block/unblock input to overcome race
|
||||
condition (Bug#15475).
|
||||
|
||||
2013-09-29 Andreas Politz <politza@hochschule-trier.de> (tiny change)
|
||||
2013-09-29 Andreas Politz <politza@hochschule-trier.de>
|
||||
|
||||
* frame.c (delete_frame): Record selected frame only after
|
||||
calling Qdelete_frame_functions (Bug#15477).
|
||||
|
|
|
@ -259,7 +259,7 @@ W32_LIBS=@W32_LIBS@
|
|||
|
||||
## emacs.res if HAVE_W32
|
||||
EMACSRES = @EMACSRES@
|
||||
## emacs-*.manifest if HAVE_W32
|
||||
## emacs-*.manifest if WINDOWSNT
|
||||
EMACS_MANIFEST = @EMACS_MANIFEST@
|
||||
## If HAVE_W32, compiler arguments for including
|
||||
## the resource file in the binary.
|
||||
|
|
82
src/alloc.c
82
src/alloc.c
|
@ -3357,6 +3357,13 @@ struct symbol_block
|
|||
|
||||
static struct symbol_block *symbol_block;
|
||||
static int symbol_block_index = SYMBOL_BLOCK_SIZE;
|
||||
/* Pointer to the first symbol_block that contains pinned symbols.
|
||||
Tests for 24.4 showed that at dump-time, Emacs contains about 15K symbols,
|
||||
10K of which are pinned (and all but 250 of them are interned in obarray),
|
||||
whereas a "typical session" has in the order of 30K symbols.
|
||||
`symbol_block_pinned' lets mark_pinned_symbols scan only 15K symbols rather
|
||||
than 30K to find the 10K symbols we need to mark. */
|
||||
static struct symbol_block *symbol_block_pinned;
|
||||
|
||||
/* List of free symbols. */
|
||||
|
||||
|
@ -3409,10 +3416,11 @@ Its value is void, and its function definition and property list are nil. */)
|
|||
SET_SYMBOL_VAL (p, Qunbound);
|
||||
set_symbol_function (val, Qnil);
|
||||
set_symbol_next (val, NULL);
|
||||
p->gcmarkbit = 0;
|
||||
p->gcmarkbit = false;
|
||||
p->interned = SYMBOL_UNINTERNED;
|
||||
p->constant = 0;
|
||||
p->declared_special = 0;
|
||||
p->declared_special = false;
|
||||
p->pinned = false;
|
||||
consing_since_gc += sizeof (struct Lisp_Symbol);
|
||||
symbols_consed++;
|
||||
total_free_symbols--;
|
||||
|
@ -5214,6 +5222,8 @@ make_pure_c_string (const char *data, ptrdiff_t nchars)
|
|||
return string;
|
||||
}
|
||||
|
||||
static Lisp_Object purecopy (Lisp_Object obj);
|
||||
|
||||
/* Return a cons allocated from pure space. Give it pure copies
|
||||
of CAR as car and CDR as cdr. */
|
||||
|
||||
|
@ -5223,8 +5233,8 @@ pure_cons (Lisp_Object car, Lisp_Object cdr)
|
|||
Lisp_Object new;
|
||||
struct Lisp_Cons *p = pure_alloc (sizeof *p, Lisp_Cons);
|
||||
XSETCONS (new, p);
|
||||
XSETCAR (new, Fpurecopy (car));
|
||||
XSETCDR (new, Fpurecopy (cdr));
|
||||
XSETCAR (new, purecopy (car));
|
||||
XSETCDR (new, purecopy (cdr));
|
||||
return new;
|
||||
}
|
||||
|
||||
|
@ -5265,9 +5275,19 @@ Does not copy symbols. Copies strings without text properties. */)
|
|||
{
|
||||
if (NILP (Vpurify_flag))
|
||||
return obj;
|
||||
|
||||
if (PURE_POINTER_P (XPNTR (obj)))
|
||||
else if (MARKERP (obj) || OVERLAYP (obj)
|
||||
|| HASH_TABLE_P (obj) || SYMBOLP (obj))
|
||||
/* Can't purify those. */
|
||||
return obj;
|
||||
else
|
||||
return purecopy (obj);
|
||||
}
|
||||
|
||||
static Lisp_Object
|
||||
purecopy (Lisp_Object obj)
|
||||
{
|
||||
if (PURE_POINTER_P (XPNTR (obj)) || INTEGERP (obj) || SUBRP (obj))
|
||||
return obj; /* Already pure. */
|
||||
|
||||
if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
|
||||
{
|
||||
|
@ -5295,7 +5315,7 @@ Does not copy symbols. Copies strings without text properties. */)
|
|||
size &= PSEUDOVECTOR_SIZE_MASK;
|
||||
vec = XVECTOR (make_pure_vector (size));
|
||||
for (i = 0; i < size; i++)
|
||||
vec->contents[i] = Fpurecopy (AREF (obj, i));
|
||||
vec->contents[i] = purecopy (AREF (obj, i));
|
||||
if (COMPILEDP (obj))
|
||||
{
|
||||
XSETPVECTYPE (vec, PVEC_COMPILED);
|
||||
|
@ -5304,11 +5324,23 @@ Does not copy symbols. Copies strings without text properties. */)
|
|||
else
|
||||
XSETVECTOR (obj, vec);
|
||||
}
|
||||
else if (MARKERP (obj))
|
||||
error ("Attempt to copy a marker to pure storage");
|
||||
else if (SYMBOLP (obj))
|
||||
{
|
||||
if (!XSYMBOL (obj)->pinned)
|
||||
{ /* We can't purify them, but they appear in many pure objects.
|
||||
Mark them as `pinned' so we know to mark them at every GC cycle. */
|
||||
XSYMBOL (obj)->pinned = true;
|
||||
symbol_block_pinned = symbol_block;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
else
|
||||
/* Not purified, don't hash-cons. */
|
||||
return obj;
|
||||
{
|
||||
Lisp_Object args[2];
|
||||
args[0] = build_pure_c_string ("Don't know how to purify: %S");
|
||||
args[1] = obj;
|
||||
Fsignal (Qerror, (Fcons (Fformat (2, args), Qnil)));
|
||||
}
|
||||
|
||||
if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
|
||||
Fputhash (obj, obj, Vpurify_flag);
|
||||
|
@ -5471,6 +5503,24 @@ compact_undo_list (Lisp_Object list)
|
|||
return list;
|
||||
}
|
||||
|
||||
static void
|
||||
mark_pinned_symbols (void)
|
||||
{
|
||||
struct symbol_block *sblk;
|
||||
int lim = (symbol_block_pinned == symbol_block
|
||||
? symbol_block_index : SYMBOL_BLOCK_SIZE);
|
||||
|
||||
for (sblk = symbol_block_pinned; sblk; sblk = sblk->next)
|
||||
{
|
||||
union aligned_Lisp_Symbol *sym = sblk->symbols, *end = sym + lim;
|
||||
for (; sym < end; ++sym)
|
||||
if (sym->s.pinned)
|
||||
mark_object (make_lisp_ptr (&sym->s, Lisp_Symbol));
|
||||
|
||||
lim = SYMBOL_BLOCK_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
|
||||
doc: /* Reclaim storage for Lisp objects no longer needed.
|
||||
Garbage collection happens automatically if you cons more than
|
||||
|
@ -5573,6 +5623,7 @@ See Info node `(elisp)Garbage Collection'. */)
|
|||
for (i = 0; i < staticidx; i++)
|
||||
mark_object (*staticvec[i]);
|
||||
|
||||
mark_pinned_symbols ();
|
||||
mark_specpdl ();
|
||||
mark_terminals ();
|
||||
mark_kboards ();
|
||||
|
@ -6574,12 +6625,7 @@ sweep_symbols (void)
|
|||
|
||||
for (; sym < end; ++sym)
|
||||
{
|
||||
/* Check if the symbol was created during loadup. In such a case
|
||||
it might be pointed to by pure bytecode which we don't trace,
|
||||
so we conservatively assume that it is live. */
|
||||
bool pure_p = PURE_POINTER_P (XSTRING (sym->s.name));
|
||||
|
||||
if (!sym->s.gcmarkbit && !pure_p)
|
||||
if (!sym->s.gcmarkbit)
|
||||
{
|
||||
if (sym->s.redirect == SYMBOL_LOCALIZED)
|
||||
xfree (SYMBOL_BLV (&sym->s));
|
||||
|
@ -6593,8 +6639,6 @@ sweep_symbols (void)
|
|||
else
|
||||
{
|
||||
++num_used;
|
||||
if (!pure_p)
|
||||
eassert (!STRING_MARKED_P (XSTRING (sym->s.name)));
|
||||
sym->s.gcmarkbit = 0;
|
||||
}
|
||||
}
|
||||
|
|
190
src/bidi.c
190
src/bidi.c
|
@ -22,9 +22,16 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
A sequential implementation of the Unicode Bidirectional algorithm,
|
||||
(UBA) as per UAX#9, a part of the Unicode Standard.
|
||||
|
||||
Unlike the reference and most other implementations, this one is
|
||||
designed to be called once for every character in the buffer or
|
||||
string.
|
||||
Unlike the Reference Implementation and most other implementations,
|
||||
this one is designed to be called once for every character in the
|
||||
buffer or string. That way, we can leave intact the design of the
|
||||
Emacs display engine, whereby an iterator object is used to
|
||||
traverse buffer or string text character by character, and generate
|
||||
the necessary data for displaying each character in 'struct glyph'
|
||||
objects. (See xdisp.c for the details of that iteration.) The
|
||||
functions on this file replace the original linear iteration in the
|
||||
logical order of the text with a non-linear iteration in the visual
|
||||
order, i.e. in the order characters should be shown on display.
|
||||
|
||||
The main entry point is bidi_move_to_visually_next. Each time it
|
||||
is called, it finds the next character in the visual order, and
|
||||
|
@ -52,7 +59,182 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
A note about references to UAX#9 rules: if the reference says
|
||||
something like "X9/Retaining", it means that you need to refer to
|
||||
rule X9 and to its modifications described in the "Implementation
|
||||
Notes" section of UAX#9, under "Retaining Format Codes". */
|
||||
Notes" section of UAX#9, under "Retaining Format Codes".
|
||||
|
||||
Here's the overview of the design of the reordering engine
|
||||
implemented by this file.
|
||||
|
||||
Basic implementation structure
|
||||
------------------------------
|
||||
|
||||
The sequential processing steps described by UAX#9 are implemented
|
||||
as recursive levels of processing, all of which examine the next
|
||||
character in the logical order. This hierarchy of processing looks
|
||||
as follows, from the innermost (deepest) to the outermost level,
|
||||
omitting some subroutines used by each level:
|
||||
|
||||
bidi_fetch_char -- fetch next character
|
||||
bidi_resolve_explicit -- resolve explicit levels and directions
|
||||
bidi_resolve_weak -- resolve weak types
|
||||
bidi_resolve_neutral -- resolve neutral types
|
||||
bidi_level_of_next_char -- resolve implicit levels
|
||||
|
||||
Each level calls the level below it, and works on the result
|
||||
returned by the lower level, including all of its sub-levels.
|
||||
|
||||
Unlike all the levels below it, bidi_level_of_next_char can return
|
||||
the information about either the next or previous character in the
|
||||
logical order, depending on the current direction of scanning the
|
||||
buffer or string. For the next character, it calls all the levels
|
||||
below it; for the previous character, it uses the cache, described
|
||||
below.
|
||||
|
||||
Thus, the result of calling bidi_level_of_next_char is the resolved
|
||||
level of the next or the previous character in the logical order.
|
||||
Based on this information, the function bidi_move_to_visually_next
|
||||
finds the next character in the visual order and updates the
|
||||
direction in which the buffer is scanned, either forward or
|
||||
backward, to find the next character to be displayed. (Text is
|
||||
scanned backwards when it needs to be reversed for display, i.e. if
|
||||
the visual order is the inverse of the logical order.) This
|
||||
implements the last, reordering steps of the UBA, by successively
|
||||
calling bidi_level_of_next_char until the character of the required
|
||||
embedding level is found; the scan direction is dynamically updated
|
||||
as a side effect. See the commentary before the 'while' loop in
|
||||
bidi_move_to_visually_next, for the details.
|
||||
|
||||
Fetching characters
|
||||
-------------------
|
||||
|
||||
In a nutshell, fetching the next character boils down to calling
|
||||
STRING_CHAR_AND_LENGTH, passing it the address of a buffer or
|
||||
string position. See bidi_fetch_char. However, if the next
|
||||
character is "covered" by a display property of some kind,
|
||||
bidi_fetch_char returns the u+FFFC "object replacement character"
|
||||
that represents the entire run of text covered by the display
|
||||
property. (The ch_len and nchars members of 'struct bidi_it'
|
||||
reflect the length in bytes and characters of that text.) This is
|
||||
so we reorder text on both sides of the display property as
|
||||
appropriate for an image or embedded string. Similarly, text
|
||||
covered by a display spec of the form '(space ...)', is replaced
|
||||
with the u+2029 paragraph separator character, so such display
|
||||
specs produce the same effect as a TAB under UBA. Both these
|
||||
special characters are not actually displayed -- the display
|
||||
property is displayed instead -- but just used to compute the
|
||||
embedding level of the surrounding text so as to produce the
|
||||
required effect.
|
||||
|
||||
Bidi iterator states
|
||||
--------------------
|
||||
|
||||
The UBA is highly context dependent in some of its parts,
|
||||
i.e. results of processing a character can generally depend on
|
||||
characters very far away. The UAX#9 description of the UBA
|
||||
prescribes a stateful processing of each character, whereby the
|
||||
results of this processing depend on various state variables, such
|
||||
as the current embedding level, level stack, and directional
|
||||
override status. In addition, the UAX#9 description includes many
|
||||
passages like this (from rule W2 in this case):
|
||||
|
||||
Search backward from each instance of a European number until the
|
||||
first strong type (R, L, AL, or sos) is found. If an AL is found,
|
||||
change the type of the European number to Arabic number.
|
||||
|
||||
To support this, we use a bidi iterator object, 'struct bidi_it',
|
||||
which is a sub-structure of 'struct it' used by xdisp.c (see
|
||||
dispextern.h for the definition of both of these structures). The
|
||||
bidi iterator holds the entire state of the iteration required by
|
||||
the UBA, and is updated as the text is traversed. In particular,
|
||||
the embedding level of the current character being resolved is
|
||||
recorded in the iterator state. To avoid costly searches backward
|
||||
in support of rules like W2 above, the necessary character types
|
||||
are also recorded in the iterator state as they are found during
|
||||
the forward scan, and then used when such rules need to be applied.
|
||||
(Forward scans cannot be avoided in this way; they need to be
|
||||
performed at least once, and the results recorded in the iterator
|
||||
state, to be reused until the forward scan oversteps the recorded
|
||||
position.)
|
||||
|
||||
In this manner, the iterator state acts as a mini-cache of
|
||||
contextual information required for resolving the level of the
|
||||
current character by various UBA rules.
|
||||
|
||||
Caching of bidi iterator states
|
||||
-------------------------------
|
||||
|
||||
As described above, the reordering engine uses the information
|
||||
recorded in the bidi iterator state in order to resolve the
|
||||
embedding level of the current character. When the reordering
|
||||
engine needs to process the next character in the logical order, it
|
||||
fetches it and applies to it all the UBA levels, updating the
|
||||
iterator state as it goes. But when the buffer or string is
|
||||
scanned backwards, i.e. in the reverse order of buffer/string
|
||||
positions, the scanned characters were already processed during the
|
||||
preceding forward scan (see bidi_find_other_level_edge). To avoid
|
||||
costly re-processing of characters that were already processed
|
||||
during the forward scan, the iterator states computed while
|
||||
scanning forward are cached.
|
||||
|
||||
The cache is just a linear array of 'struct bidi_it' objects, which
|
||||
is dynamically allocated and reallocated as needed, since the size
|
||||
of the cache depends on the text being processed. We only need the
|
||||
cache while processing embedded levels higher than the base
|
||||
paragraph embedding level, because these higher levels require
|
||||
changes in scan direction. Therefore, as soon as we are back to
|
||||
the base embedding level, we can free the cache; see the calls to
|
||||
bidi_cache_reset and bidi_cache_shrink, for the conditions to do
|
||||
this.
|
||||
|
||||
The cache maintains the index of the next unused cache slot -- this
|
||||
is where the next iterator state will be cached. The function
|
||||
bidi_cache_iterator_state saves an instance of the state in the
|
||||
cache and increments the unused slot index. The companion function
|
||||
bidi_cache_find looks up a cached state that corresponds to a given
|
||||
buffer/string position. All of the cached states must correspond
|
||||
1:1 to the buffer or string region whose processing they reflect;
|
||||
bidi.c will abort if it finds cache slots that violate this 1:1
|
||||
correspondence.
|
||||
|
||||
When the parent iterator 'struct it' is pushed (see push_it in
|
||||
xdisp.c) to pause the current iteration and start iterating over a
|
||||
different object (e.g., a 'display' string that covers some buffer
|
||||
text), the bidi iterator cache needs to be "pushed" as well, so
|
||||
that a new empty cache could be used while iterating over the new
|
||||
object. Later, when the new object is exhausted, and xdisp.c calls
|
||||
pop_it, we need to "pop" the bidi cache as well and return to the
|
||||
original cache. See bidi_push_it and bidi_pop_it for how this is
|
||||
done.
|
||||
|
||||
Some functions of the display engine save copies of 'struct it' in
|
||||
local variables, and restore them later. For examples, see
|
||||
pos_visible_p and move_it_in_display_line_to in xdisp.c, and
|
||||
window_scroll_pixel_based in window.c. When this happens, we need
|
||||
to save and restore the bidi cache as well, because conceptually
|
||||
the cache is part of the 'struct it' state, and needs to be in
|
||||
perfect sync with the portion of the buffer/string that is being
|
||||
processed. This saving and restoring of the cache state is handled
|
||||
by bidi_shelve_cache and bidi_unshelve_cache, and the helper macros
|
||||
SAVE_IT and RESTORE_IT defined on xdisp.c.
|
||||
|
||||
Note that, because reordering is implemented below the level in
|
||||
xdisp.c that breaks glyphs into screen lines, we are violating
|
||||
paragraph 3.4 of UAX#9. which mandates that line breaking shall be
|
||||
done before reordering each screen line separately. However,
|
||||
following UAX#9 to the letter in this matter goes against the basic
|
||||
design of the Emacs display engine, and so we choose here this
|
||||
minor deviation from the UBA letter in preference to redesign of
|
||||
the display engine. The effect of this is only seen in continued
|
||||
lines that are broken into screen lines in the middle of a run
|
||||
whose direction is opposite to the paragraph's base direction.
|
||||
|
||||
Important design and implementation note: when the code needs to
|
||||
scan far ahead, be sure to avoid such scans as much as possible
|
||||
when the buffer/string doesn't contain any RTL characters. Users
|
||||
of left-to-right scripts will never forgive you if you introduce
|
||||
some slow-down due to bidi in situations that don't involve any
|
||||
bidirectional text. See the large comment near the beginning of
|
||||
bidi_resolve_neutral, for one situation where such shortcut was
|
||||
necessary. */
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
|
|
|
@ -847,8 +847,8 @@ struct buffer
|
|||
struct region_cache *width_run_cache;
|
||||
struct region_cache *bidi_paragraph_cache;
|
||||
|
||||
/* Non-zero means don't use redisplay optimizations for
|
||||
displaying this buffer. */
|
||||
/* Non-zero means disable redisplay optimizations when rebuilding the glyph
|
||||
matrices (but not when redrawing). */
|
||||
bool_bf prevent_redisplay_optimizations_p : 1;
|
||||
|
||||
/* Non-zero whenever the narrowing is changed in this buffer. */
|
||||
|
|
|
@ -375,7 +375,8 @@ struct frame
|
|||
set this directly, use SET_FRAME_ICONIFIED instead. */
|
||||
bool_bf iconified : 1;
|
||||
|
||||
/* True if this frame should be redrawn. */
|
||||
/* True if this frame should be fully redisplayed. Disables all
|
||||
optimizations while rebuilding matrices and redrawing. */
|
||||
bool_bf garbaged : 1;
|
||||
|
||||
/* False means, if this frame has just one window,
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
/* Keyboard and mouse input; editor command loop.
|
||||
|
||||
Copyright (C) 1985-1989, 1993-1997, 1999-2014 Free Software Foundation,
|
||||
Inc.
|
||||
Copyright (C) 1985-1989, 1993-1997, 1999-2014 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Emacs.
|
||||
|
||||
|
@ -2379,7 +2378,7 @@ read_decoded_event_from_main_queue (struct timespec *end_time,
|
|||
-2 means do neither.
|
||||
1 means do both. */
|
||||
|
||||
/* The arguments MAP is for menu prompting. MAP is a keymap.
|
||||
/* The argument MAP is a keymap for menu prompting.
|
||||
|
||||
PREV_EVENT is the previous input event, or nil if we are reading
|
||||
the first event of a key sequence (or not reading a key sequence).
|
||||
|
@ -10068,7 +10067,10 @@ DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
|
|||
"FOpen dribble file: ",
|
||||
doc: /* Start writing all keyboard characters to a dribble file called FILE.
|
||||
If FILE is nil, close any open dribble file.
|
||||
The file will be closed when Emacs exits. */)
|
||||
The file will be closed when Emacs exits.
|
||||
|
||||
Be aware that this records ALL characters you type!
|
||||
This may include sensitive information such as passwords. */)
|
||||
(Lisp_Object file)
|
||||
{
|
||||
if (dribble)
|
||||
|
|
|
@ -1572,6 +1572,9 @@ struct Lisp_Symbol
|
|||
special (with `defvar' etc), and shouldn't be lexically bound. */
|
||||
bool_bf declared_special : 1;
|
||||
|
||||
/* True if pointed to from purespace and hence can't be GC'd. */
|
||||
bool_bf pinned : 1;
|
||||
|
||||
/* The symbol's name, as a Lisp string. */
|
||||
Lisp_Object name;
|
||||
|
||||
|
|
|
@ -1,3 +1,28 @@
|
|||
2014-04-07 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* automated/electric-tests.el (define-electric-pair-test): Don't
|
||||
overtest..
|
||||
(inhibit-in-mismatched-string-inside-ruby-comments): New test.
|
||||
(inhibit-in-mismatched-string-inside-c-comments): New test.
|
||||
|
||||
2014-04-07 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* automated/electric-tests.el (inhibit-if-strings-mismatched):
|
||||
New test, change from `inhibit-only-of-next-is-mismatched'.
|
||||
|
||||
2014-04-06 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* automated/python-tests.el (python-triple-quote-pairing): New test.
|
||||
(python-syntax-after-python-backspace): New test.
|
||||
|
||||
2014-04-06 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* automated/electric-tests.el (electric-pair-define-test-form):
|
||||
More readable test docstrings.
|
||||
(whitespace-skipping-for-quotes-not-ouside)
|
||||
(whitespace-skipping-for-quotes-only-inside)
|
||||
(whitespace-skipping-for-quotes-in-text-mode): New tests.
|
||||
|
||||
2014-04-04 João Távora <joaotavora@gmail.com>
|
||||
|
||||
* automated/electric-tests.el (define-electric-pair-test): Don't
|
||||
|
|
|
@ -114,8 +114,8 @@
|
|||
mode
|
||||
extra-desc))
|
||||
()
|
||||
,(format "With \"%s\", try input %c at point %d. \
|
||||
Should %s \"%s\" and point at %d"
|
||||
,(format "With |%s|, try input %c at point %d. \
|
||||
Should %s |%s| and point at %d"
|
||||
fixture
|
||||
char
|
||||
(1+ pos)
|
||||
|
@ -383,6 +383,31 @@ baz\"\""
|
|||
:test-in-code nil
|
||||
:test-in-comments t)
|
||||
|
||||
(define-electric-pair-test whitespace-skipping-for-quotes-not-ouside
|
||||
" \" \"" "\"-----" :expected-string "\"\" \" \""
|
||||
:expected-point 2
|
||||
:bindings '((electric-pair-skip-whitespace . chomp))
|
||||
:test-in-strings nil
|
||||
:test-in-code t
|
||||
:test-in-comments nil)
|
||||
|
||||
(define-electric-pair-test whitespace-skipping-for-quotes-only-inside
|
||||
" \" \"" "---\"--" :expected-string " \"\""
|
||||
:expected-point 5
|
||||
:bindings '((electric-pair-skip-whitespace . chomp))
|
||||
:test-in-strings nil
|
||||
:test-in-code t
|
||||
:test-in-comments nil)
|
||||
|
||||
(define-electric-pair-test whitespace-skipping-quotes-not-without-proper-syntax
|
||||
" \" \"" "---\"--" :expected-string " \"\"\" \""
|
||||
:expected-point 5
|
||||
:modes '(text-mode)
|
||||
:bindings '((electric-pair-skip-whitespace . chomp))
|
||||
:test-in-strings nil
|
||||
:test-in-code t
|
||||
:test-in-comments nil)
|
||||
|
||||
|
||||
;;; Pairing arbitrary characters
|
||||
;;;
|
||||
|
|
|
@ -134,6 +134,16 @@ aliqua."
|
|||
|
||||
;;; Font-lock and syntax
|
||||
|
||||
(ert-deftest python-syntax-after-python-backspace ()
|
||||
;; `python-indent-dedent-line-backspace' garbles syntax
|
||||
:expected-result :failed
|
||||
(python-tests-with-temp-buffer
|
||||
"\"\"\""
|
||||
(goto-char (point-max))
|
||||
(python-indent-dedent-line-backspace 1)
|
||||
(should (string= (buffer-string) "\"\""))
|
||||
(should (null (nth 3 (syntax-ppss))))))
|
||||
|
||||
|
||||
;;; Indentation
|
||||
|
||||
|
@ -2696,6 +2706,9 @@ def foo(a, b, c):
|
|||
(equal (symbol-value (car ccons)) (cdr ccons)))))
|
||||
(kill-buffer buffer)))
|
||||
|
||||
|
||||
;;; Electricity
|
||||
|
||||
(ert-deftest python-util-forward-comment-1 ()
|
||||
(python-tests-with-temp-buffer
|
||||
(concat
|
||||
|
@ -2708,6 +2721,32 @@ def foo(a, b, c):
|
|||
(python-util-forward-comment -1)
|
||||
(should (= (point) (point-min)))))
|
||||
|
||||
(ert-deftest python-triple-quote-pairing ()
|
||||
(python-tests-with-temp-buffer
|
||||
"\"\"\n"
|
||||
(goto-char (1- (point-max)))
|
||||
(let ((last-command-event ?\"))
|
||||
(call-interactively 'self-insert-command))
|
||||
(should (string= (buffer-string)
|
||||
"\"\"\"\"\"\"\n"))
|
||||
(should (= (point) 4)))
|
||||
(python-tests-with-temp-buffer
|
||||
"\n"
|
||||
(let ((last-command-event ?\"))
|
||||
(dotimes (i 3)
|
||||
(call-interactively 'self-insert-command)))
|
||||
(should (string= (buffer-string)
|
||||
"\"\"\"\"\"\"\n"))
|
||||
(should (= (point) 4)))
|
||||
(python-tests-with-temp-buffer
|
||||
"\"\n\"\"\n"
|
||||
(goto-char (1- (point-max)))
|
||||
(let ((last-command-event ?\"))
|
||||
(call-interactively 'self-insert-command))
|
||||
(should (= (point) (1- (point-max))))
|
||||
(should (string= (buffer-string)
|
||||
"\"\n\"\"\"\n"))))
|
||||
|
||||
|
||||
(provide 'python-tests)
|
||||
|
||||
|
|
|
@ -16,5 +16,9 @@
|
|||
bar
|
||||
EOF2
|
||||
|
||||
print $'; # This should not start a string!
|
||||
|
||||
print "hello" for /./;
|
||||
|
||||
$fileType_filesButNot # bug#12373?
|
||||
= join( '|', map { quotemeta($_).'$' } @{$fileType->{filesButNot}} );
|
||||
|
|
Loading…
Add table
Reference in a new issue