[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r116881: Merge from emacs-24; up to r116865
From: |
Juanma Barranquero |
Subject: |
[Emacs-diffs] trunk r116881: Merge from emacs-24; up to r116865 |
Date: |
Wed, 26 Mar 2014 15:57:40 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 116881 [merge]
revision-id: address@hidden
parent: address@hidden
parent: address@hidden
committer: Juanma Barranquero <address@hidden>
branch nick: trunk
timestamp: Wed 2014-03-26 16:57:13 +0100
message:
Merge from emacs-24; up to r116865
modified:
ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1538
doc/lispref/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-6155
doc/lispref/files.texi files.texi-20091113204419-o5vbwnq5f7feedwu-6179
doc/lispref/markers.texi
markers.texi-20091113204419-o5vbwnq5f7feedwu-6198
doc/lispref/text.texi text.texi-20091113204419-o5vbwnq5f7feedwu-6215
doc/misc/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-6331
doc/misc/texinfo.tex
texinfo.tex-20091113204419-o5vbwnq5f7feedwu-6323
doc/misc/tramp.texi tramp.texi-20091113204419-o5vbwnq5f7feedwu-6324
lib/strftime.c strftime.c-20091113204419-o5vbwnq5f7feedwu-1170
lisp/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1432
lisp/align.el align.el-20091113204419-o5vbwnq5f7feedwu-1758
lisp/emacs-lisp/package.el package.el-20100617020707-ybavz666awsxwin6-2
lisp/frame.el frame.el-20091113204419-o5vbwnq5f7feedwu-275
lisp/frameset.el frameset.el-20130802043218-tfwraxv1c2zlibpw-1
lisp/net/tramp-sh.el trampsh.el-20100913133439-a1faifh29eqoi4nh-1
lisp/net/tramp.el tramp.el-20091113204419-o5vbwnq5f7feedwu-2427
lisp/progmodes/ruby-mode.el
rubymode.el-20091113204419-o5vbwnq5f7feedwu-8804
lisp/simple.el simple.el-20091113204419-o5vbwnq5f7feedwu-403
lisp/url/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-3116
lisp/url/url-handlers.el
urlhandlers.el-20091113204419-o5vbwnq5f7feedwu-2987
src/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1438
src/buffer.c buffer.c-20091113204419-o5vbwnq5f7feedwu-264
src/editfns.c editfns.c-20091113204419-o5vbwnq5f7feedwu-255
src/fileio.c fileio.c-20091113204419-o5vbwnq5f7feedwu-210
src/insdel.c insdel.c-20091113204419-o5vbwnq5f7feedwu-175
src/lisp.h lisp.h-20091113204419-o5vbwnq5f7feedwu-253
src/undo.c undo.c-20091113204419-o5vbwnq5f7feedwu-206
src/w32term.c w32term.c-20091113204419-o5vbwnq5f7feedwu-950
src/xdisp.c xdisp.c-20091113204419-o5vbwnq5f7feedwu-240
test/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-8588
test/automated/undo-tests.el undotests.el-20130108184711-brlnvjau5r1ardib-1
=== modified file 'ChangeLog'
--- a/ChangeLog 2014-03-26 01:14:44 +0000
+++ b/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,9 @@
+2014-03-26 Paul Eggert <address@hidden>
+
+ Merge from gnulib, incorporating:
+ 2014-03-26 strftime: wrap macros in "do {...} while(0)"
+ * lib/strftime.c: Update from gnulib.
+
2014-03-26 Glenn Morris <address@hidden>
* configure.ac (CLASH_DETECTION): Remove option. Every platform
=== modified file 'doc/lispref/ChangeLog'
--- a/doc/lispref/ChangeLog 2014-03-26 01:24:01 +0000
+++ b/doc/lispref/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,16 @@
+2014-03-26 Eli Zaretskii <address@hidden>
+
+ * files.texi (Kinds of Files): Improve documentation of
+ file-symlink-p. (Bug#17073) Add cross-references.
+
+2014-03-26 Barry O'Reilly <address@hidden>
+
+ * markers.texi (Moving Marker Positions): The 2014-03-02 doc
+ change mentioning undo's inability to handle relocated markers no
+ longer applies. See bug#16818.
+ * text.texi (Undo): Expand documentation of (TEXT . POS) and
+ (MARKER . ADJUSTMENT) undo elements.
+
2014-03-26 Glenn Morris <address@hidden>
* files.texi (File Locks): All systems support locking.
=== modified file 'doc/lispref/files.texi'
--- a/doc/lispref/files.texi 2014-03-26 01:24:01 +0000
+++ b/doc/lispref/files.texi 2014-03-26 15:57:13 +0000
@@ -950,22 +950,26 @@
@defun file-symlink-p filename
@cindex file symbolic links
If the file @var{filename} is a symbolic link, the
address@hidden function returns the (non-recursive) link target
-as a string. (Determining the file name that the link points to from
-the target is nontrivial.) First, this function recursively follows
-symbolic links at all levels of parent directories.
address@hidden function returns its (non-recursive) link target
+as a string. (The link target string is not necessarily the full
+absolute file name of the target; determining the full file name that
+the link points to is nontrivial, see below.) If the leading
+directories of @var{filename} include symbolic links, this function
+recursively follows them.
-If the file @var{filename} is not a symbolic link (or there is no such file),
+If the file @var{filename} is not a symbolic link, or does not exist,
@code{file-symlink-p} returns @code{nil}.
+Here are a few examples of using this function:
+
@example
@group
-(file-symlink-p "foo")
+(file-symlink-p "not-a-symlink")
@result{} nil
@end group
@group
(file-symlink-p "sym-link")
- @result{} "foo"
+ @result{} "not-a-symlink"
@end group
@group
(file-symlink-p "sym-link2")
@@ -976,6 +980,40 @@
@result{} "/pub/bin"
@end group
@end example
+
+Note that in the third example, the function returned @file{sym-link},
+but did not proceed to resolve it, although that file is itself a
+symbolic link. This is what we meant by ``non-recursive'' above---the
+process of following the symbolic links does not recurse if the link
+target is itself a link.
+
+The string that this function returns is what is recorded in the
+symbolic link; it may or may not include any leading directories.
+This function does @emph{not} expand the link target to produce a
+fully-qualified file name, and in particular does not use the leading
+directories, if any, of the @var{filename} argument if the link target
+is not an absolute file name. Here's an example:
+
address@hidden
address@hidden
+(file-symlink-p "/foo/bar/baz")
+ @result{} "some-file"
address@hidden group
address@hidden example
+
address@hidden
+Here, although @file{/foo/bar/baz} was given as a fully-qualified file
+name, the result is not, and in fact does not have any leading
+directories at all. And since @file{some-file} might itself be a
+symbolic link, you cannot simply prepend leading directories to it,
+nor even naively use @code{expand-file-name} (@pxref{File Name
+Expansion}) to produce its absolute file name.
+
+For this reason, this function is seldom useful if you need to
+determine more than just the fact that a file is or isn't a symbolic
+link. If you actually need the file name of the link target, use
address@hidden or @code{file-truename}, described in
address@hidden
@end defun
The next two functions recursively follow symbolic links at
=== modified file 'doc/lispref/markers.texi'
--- a/doc/lispref/markers.texi 2014-03-02 17:49:02 +0000
+++ b/doc/lispref/markers.texi 2014-03-25 02:47:39 +0000
@@ -344,12 +344,10 @@
@section Moving Marker Positions
This section describes how to change the position of an existing
-marker. When you do this, be sure you know how the marker is used
-outside of your program. For example, moving a marker to an unrelated
-new position can cause undo to later adjust the marker incorrectly.
-Often when you wish to relocate a marker to an unrelated position, it
-is preferable to make a new marker and set the prior one to point
-nowhere.
+marker. When you do this, be sure you know whether the marker is used
+outside of your program, and, if so, what effects will result from
+moving it---otherwise, confusing things may happen in other parts of
+Emacs.
@defun set-marker marker position &optional buffer
This function moves @var{marker} to @var{position}
=== modified file 'doc/lispref/text.texi'
--- a/doc/lispref/text.texi 2014-03-18 21:14:36 +0000
+++ b/doc/lispref/text.texi 2014-03-25 02:47:39 +0000
@@ -1270,7 +1270,8 @@
The deleted text itself is the string @var{text}. The place to
reinsert it is @code{(abs @var{position})}. If @var{position} is
positive, point was at the beginning of the deleted text, otherwise it
-was at the end.
+was at the end. Zero or more (@var{marker} . @var{adjustment})
+elements follow immediately after this element.
@item (t . @var{time-flag})
This kind of element indicates that an unmodified buffer became
@@ -1296,8 +1297,10 @@
@item (@var{marker} . @var{adjustment})
This kind of element records the fact that the marker @var{marker} was
relocated due to deletion of surrounding text, and that it moved
address@hidden character positions. Undoing this element moves
address@hidden @minus{} @var{adjustment} characters.
address@hidden character positions. If the marker's location is
+consistent with the (@var{text} . @var{position}) element preceding it
+in the undo list, then undoing this element moves @var{marker}
address@hidden @var{adjustment} characters.
@item (apply @var{funname} . @var{args})
This is an extensible undo item, which is undone by calling
=== modified file 'doc/misc/ChangeLog'
--- a/doc/misc/ChangeLog 2014-03-23 23:16:06 +0000
+++ b/doc/misc/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,11 @@
+2014-03-26 Paul Eggert <address@hidden>
+
+ * texinfo.tex: Update from gnulib.
+
+2014-03-26 Michael Albinus <address@hidden>
+
+ * tramp.texi (Frequently Asked Questions): Add fish shell settings.
+
2014-03-23 Katsumi Yamaoka <address@hidden>
* gnus.texi (Ma Gnus): Mention header attachment buttons.
=== modified file 'doc/misc/texinfo.tex'
--- a/doc/misc/texinfo.tex 2014-02-24 07:12:42 +0000
+++ b/doc/misc/texinfo.tex 2014-03-26 04:16:13 +0000
@@ -3,7 +3,7 @@
% Load plain if necessary, i.e., if running under initex.
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
%
-\def\texinfoversion{2014-02-16.16}
+\def\texinfoversion{2014-03-17.07}
%
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -3935,19 +3935,23 @@
}
% multitable-only commands.
-%
-% @headitem starts a heading row, which we typeset in bold.
-% Assignments have to be global since we are inside the implicit group
-% of an alignment entry. \everycr resets \everytab so we don't have to
+%
+% @headitem starts a heading row, which we typeset in bold. Assignments
+% have to be global since we are inside the implicit group of an
+% alignment entry. \everycr below resets \everytab so we don't have to
% undo it ourselves.
\def\headitemfont{\b}% for people to use in the template row; not changeable
\def\headitem{%
\checkenv\multitable
\crcr
+ \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
\global\everytab={\bf}% can't use \headitemfont since the parsing differs
\the\everytab % for the first item
}%
%
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
% A \tab used to include \hskip1sp. But then the space in a template
% line is not enough. That is bad. So let's go back to just `&' until
% we again encounter the problem the 1sp was intended to solve.
@@ -3978,15 +3982,15 @@
%
\everycr = {%
\noalign{%
- \global\everytab={}%
+ \global\everytab={}% Reset from possible headitem.
\global\colcount=0 % Reset the column counter.
- % Check for saved footnotes, etc.
+ %
+ % Check for saved footnotes, etc.:
\checkinserts
- % Keeps underfull box messages off when table breaks over pages.
- %\filbreak
- % Maybe so, but it also creates really weird page breaks when the
- % table breaks over pages. Wouldn't \vfil be better? Wait until the
- % problem manifests itself, so it can be fixed for real --karl.
+ %
+ % Perhaps a \nobreak, then reset:
+ \headitemcrhook
+ \global\let\headitemcrhook=\relax
}%
}%
%
=== modified file 'doc/misc/tramp.texi'
--- a/doc/misc/tramp.texi 2014-02-21 08:04:15 +0000
+++ b/doc/misc/tramp.texi 2014-03-24 08:09:42 +0000
@@ -3053,15 +3053,28 @@
If it fails, or the cursor is not moved at the end of the buffer, your
prompt is not recognized correctly.
-A special problem is the zsh, which uses left-hand side and right-hand
-side prompts in parallel. Therefore, it is necessary to disable the
-zsh line editor on the remote host. You shall add to @file{~/.zshrc}
-the following command:
+A special problem is the zsh shell, which uses left-hand side and
+right-hand side prompts in parallel. Therefore, it is necessary to
+disable the zsh line editor on the remote host. You shall add to
address@hidden/.zshrc} the following command:
@example
[ $TERM = "dumb" ] && unsetopt zle && PS1='$ '
@end example
+Similar fancy prompt settings are known from the fish shell. Here you
+must add in @file{~/.config/fish/config.fish}:
+
address@hidden
+function fish_prompt
+ if test $TERM = "dumb"
+ echo "\$ "
+ else
+ @dots{}
+ end
+end
address@hidden example
+
Furthermore it has been reported, that @value{tramp} (like sshfs,
incidentally) doesn't work with WinSSHD due to strange prompt settings.
=== modified file 'lib/strftime.c'
--- a/lib/strftime.c 2014-01-01 07:43:34 +0000
+++ b/lib/strftime.c 2014-03-26 04:16:13 +0000
@@ -681,24 +681,44 @@
switch (format_char)
{
#define DO_NUMBER(d, v) \
- digits = d; \
- number_value = v; goto do_number
+ do \
+ { \
+ digits = d; \
+ number_value = v; \
+ goto do_number; \
+ } \
+ while (0)
#define DO_SIGNED_NUMBER(d, negative, v) \
- digits = d; \
- negative_number = negative; \
- u_number_value = v; goto do_signed_number
+ do \
+ { \
+ digits = d; \
+ negative_number = negative; \
+ u_number_value = v; \
+ goto do_signed_number; \
+ } \
+ while (0)
/* The mask is not what you might think.
When the ordinal i'th bit is set, insert a colon
before the i'th digit of the time zone representation. */
#define DO_TZ_OFFSET(d, negative, mask, v) \
- digits = d; \
- negative_number = negative; \
- tz_colon_mask = mask; \
- u_number_value = v; goto do_tz_offset
+ do \
+ { \
+ digits = d; \
+ negative_number = negative; \
+ tz_colon_mask = mask; \
+ u_number_value = v; \
+ goto do_tz_offset; \
+ } \
+ while (0)
#define DO_NUMBER_SPACEPAD(d, v) \
- digits = d; \
- number_value = v; goto do_number_spacepad
+ do \
+ { \
+ digits = d; \
+ number_value = v; \
+ goto do_number_spacepad; \
+ } \
+ while (0)
case L_('%'):
if (modifier != 0)
@@ -1265,9 +1285,9 @@
}
if (modifier == L_('O'))
goto bad_format;
- else
- DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE,
- tp->tm_year + (unsigned int) TM_YEAR_BASE);
+
+ DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE,
+ tp->tm_year + (unsigned int) TM_YEAR_BASE);
case L_('y'):
if (modifier == L_('E'))
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog 2014-03-26 04:02:27 +0000
+++ b/lisp/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,78 @@
+2014-03-26 Juanma Barranquero <address@hidden>
+
+ * emacs-lisp/package.el: Fix bug#16733 (again).
+ (url-http-parse-response, url-http-end-of-headers, url-recreate-url)
+ (url-http-target-url): Remove unused declarations.
+ (package-handle-response): Remove.
+ (package--with-work-buffer): Use url-insert-file-contents and simplify.
+ (package--download-one-archive): Use current-buffer instead of
+ dynamic binding of `buffer'.
+ (describe-package-1): Do not decode readme-string.
+
+2014-03-26 Michael Albinus <address@hidden>
+
+ * net/tramp.el (tramp-methods, tramp-connection-timeout): Fix docstring.
+
+ * net/tramp-sh.el (tramp-sh-handle-vc-registered): Revert change
+ from 2014-03-07, it decreases performance unnecessarily. Let-bind
+ `remote-file-name-inhibit-cache' to nil in the second pass.
+ (tramp-find-executable): Do not call "which" on SunOS.
+ (tramp-send-command-and-check): Fix docstring.
+ (tramp-do-copy-or-rename-file-directly): In the `rename' case,
+ check whether source directory has set the sticky bit.
+
+2014-03-26 Barry O'Reilly <address@hidden>
+
+ * simple.el (primitive-undo): Only process marker adjustments
+ validated against their corresponding (TEXT . POS). Issue warning
+ for lone marker adjustments in undo history. (Bug#16818)
+ (undo-make-selective-list): Add marker adjustments to selective
+ undo list based on whether their corresponding (TEXT . POS) is in
+ the region. Remove variable adjusted-markers, which was unused
+ and only non nil during undo-make-selective-list.
+ (undo-elt-in-region): Return nil when passed a marker adjustment
+ and explain in function doc.
+
+2014-03-26 Nicolas Richard <address@hidden>
+
+ * align.el (align-region): Do not fail when end-mark is nil (bug#17088).
+
+2014-03-26 Dmitry Gutov <address@hidden>
+
+ * progmodes/ruby-mode.el (ruby-expression-expansion-re):
+ Match special global variables without curlies, too.
+ (ruby-font-lock-keywords): Simplify the matcher for special global
+ variables. Don't require a non-word character after the variable.
+ (Bug#17057)
+
+2014-03-26 Stefan Monnier <address@hidden>
+
+ * simple.el (redisplay-highlight-region-function): Increase priority of
+ overlay to make sure boundaries are visible (bug#15899).
+
+2014-03-26 Juanma Barranquero <address@hidden>
+
+ * frameset.el (frameset--initial-params): Fix typo in parameter name.
+ (frameset-restore): Compare display strings with equal.
+
+ * frame.el (make-frame): Don't quote display name in error message,
+ it is already a string.
+
+2014-03-26 Thierry Volpiatto <address@hidden>
+
+ * net/tramp.el (tramp-read-passwd): Suspend the timers while reading
+ the password.
+
+2014-03-26 Dmitry Gutov <address@hidden>
+
+ * emacs-lisp/package.el (package--add-to-archive-contents):
+ Include already installed and built-in packages in
+ `package-archive-contents'.
+ (package-install): Don't include already installed packages in the
+ options during interactive invocation. (Bug#16762)
+ (package-show-package-list): If the buffer is already displayed in
+ another window, switch to that window.
+
2014-03-26 Reto Zimmermann <address@hidden>
Sync with upstream vhdl mode v3.35.1.
@@ -1247,7 +1322,7 @@
dbus-call-method check for completion using a busy-wait loop with
gradual backoff.
-2013-10-02 Michael Albinus <address@hidden>
+2014-02-16 Michael Albinus <address@hidden>
Sync with Tramp 2.2.9.
=== modified file 'lisp/align.el'
--- a/lisp/align.el 2014-03-21 01:12:57 +0000
+++ b/lisp/align.el 2014-03-24 16:54:24 +0000
@@ -1603,7 +1603,7 @@
rule-index (1+ rule-index)))
;; This function can use a lot of temporary markers, so instead of
;; waiting for the next GC we delete them immediately (Bug#10047).
- (set-marker end-mark nil)
+ (when end-mark (set-marker end-mark nil))
(dolist (m markers)
(set-marker m nil))
=== modified file 'lisp/emacs-lisp/package.el'
--- a/lisp/emacs-lisp/package.el 2014-03-22 08:43:30 +0000
+++ b/lisp/emacs-lisp/package.el 2014-03-26 15:21:17 +0000
@@ -205,13 +205,9 @@
(defvar Info-directory-list)
(declare-function info-initialize "info" ())
-(declare-function url-http-parse-response "url-http" ())
(declare-function url-http-file-exists-p "url-http" (url))
(declare-function lm-header "lisp-mnt" (header))
(declare-function lm-commentary "lisp-mnt" (&optional file))
-(defvar url-http-end-of-headers)
-(declare-function url-recreate-url "url-parse" (urlobj))
-(defvar url-http-target-url)
(defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/"))
"An alist of archives from which to fetch.
@@ -770,38 +766,14 @@
and evaluates BODY while that buffer is current. This work
buffer is killed afterwards. Return the last value in BODY."
(declare (indent 2) (debug t))
- `(let* ((http (string-match "\\`https?:" ,location))
- (buffer
- (if http
- (url-retrieve-synchronously (concat ,location ,file))
- (generate-new-buffer "*package work buffer*"))))
- (prog1
- (with-current-buffer buffer
- (if http
- (progn (package-handle-response)
- (re-search-forward "^$" nil 'move)
- (forward-char)
- (delete-region (point-min) (point)))
- (unless (file-name-absolute-p ,location)
- (error "Archive location %s is not an absolute file name"
- ,location))
- (insert-file-contents (expand-file-name ,file ,location)))
- ,@body)
- (kill-buffer buffer))))
-
-(defun package-handle-response ()
- "Handle the response from a `url-retrieve-synchronously' call.
-Parse the HTTP response and throw if an error occurred.
-The url package seems to require extra processing for this.
-This should be called in a `save-excursion', in the download buffer.
-It will move point to somewhere in the headers."
- ;; We assume HTTP here.
- (require 'url-http)
- (let ((response (url-http-parse-response)))
- (when (or (< response 200) (>= response 300))
- (error "Error downloading %s:%s"
- (url-recreate-url url-http-target-url)
- (buffer-substring-no-properties (point) (line-end-position))))))
+ `(with-temp-buffer
+ (if (string-match-p "\\`https?:" ,location)
+ (url-insert-file-contents (concat ,location ,file))
+ (unless (file-name-absolute-p ,location)
+ (error "Archive location %s is not an absolute file name"
+ ,location))
+ (insert-file-contents (expand-file-name ,file ,location)))
+ ,@body))
(defun package--archive-file-exists-p (location file)
(let ((http (string-match "\\`https?:" location)))
@@ -1047,14 +1019,9 @@
(existing-packages (assq name package-archive-contents))
(pinned-to-archive (assoc name package-pinned-packages)))
(cond
- ;; Skip entirely if pinned to another archive or already installed.
- ((or (and pinned-to-archive
- (not (equal (cdr pinned-to-archive) archive)))
- (let ((bi (assq name package--builtin-versions)))
- (and bi (version-list-= version (cdr bi))))
- (let ((ins (cdr (assq name package-alist))))
- (and ins (version-list-= version
- (package-desc-version (car ins))))))
+ ;; Skip entirely if pinned to another archive.
+ ((and pinned-to-archive
+ (not (equal (cdr pinned-to-archive) archive)))
nil)
((not existing-packages)
(push (list name pkg-desc) package-archive-contents))
@@ -1090,8 +1057,11 @@
(package-refresh-contents))
(list (intern (completing-read
"Install package: "
- (mapcar (lambda (elt) (symbol-name (car elt)))
- package-archive-contents)
+ (delq nil
+ (mapcar (lambda (elt)
+ (unless (package-installed-p (car elt))
+ (symbol-name (car elt))))
+ package-archive-contents))
nil t)))))
(package-download-transaction
(if (package-desc-p pkg)
@@ -1272,7 +1242,7 @@
(car archive)))))
;; Read the retrieved buffer to make sure it is valid (e.g. it
;; may fetch a URL redirect page).
- (when (listp (read buffer))
+ (when (listp (read (current-buffer)))
(make-directory dir t)
(setq buffer-file-name (expand-file-name file dir))
(let ((version-control 'never)
@@ -1531,8 +1501,7 @@
(setq readme-string (buffer-string))
t))
(error nil))
- (let ((coding (detect-coding-string readme-string t)))
- (insert (decode-coding-string readme-string coding t))))
+ (insert readme-string))
((file-readable-p readme)
(insert-file-contents readme)
(goto-char (point-max))))))))
@@ -2117,11 +2086,14 @@
shown."
(interactive)
(require 'finder-inf nil t)
- (let ((buf (get-buffer-create "*Packages*")))
+ (let* ((buf (get-buffer-create "*Packages*"))
+ (win (get-buffer-window buf)))
(with-current-buffer buf
(package-menu-mode)
(package-menu--generate nil packages keywords))
- (switch-to-buffer buf)))
+ (if win
+ (select-window win)
+ (switch-to-buffer buf))))
;; package-menu--generate rebinds "q" on the fly, so we have to
;; hard-code the binding in the doc-string here.
=== modified file 'lisp/frame.el'
--- a/lisp/frame.el 2014-03-03 01:00:27 +0000
+++ b/lisp/frame.el 2014-03-23 22:11:59 +0000
@@ -668,7 +668,7 @@
(cdr (assq 'window-system parameters)))
(display
(or (window-system-for-display display)
- (error "Don't know how to interpret display \"%S\""
+ (error "Don't know how to interpret display %S"
display)))
(t window-system)))
(frame-creation-function (cdr (assq w frame-creation-function-alist)))
=== modified file 'lisp/frameset.el'
--- a/lisp/frameset.el 2014-03-21 00:03:08 +0000
+++ b/lisp/frameset.el 2014-03-26 15:57:13 +0000
@@ -940,7 +940,7 @@
Setting position and size parameters as soon as possible helps reducing
flickering; other parameters, like `minibuffer' and `border-width', can
not be changed once the frame has been created. Internal use only."
- (cl-loop for param in '(left top with height border-width minibuffer)
+ (cl-loop for param in '(left top width height border-width minibuffer)
when (assq param parameters) collect it))
(defun frameset--restore-frame (parameters window-state filters force-onscreen)
@@ -1146,8 +1146,8 @@
frame to-tty duplicate)
;; Only set target if forcing displays and the target display
is different.
(unless (or (frameset-keep-original-display-p force-display)
- (eq (frame-parameter nil 'display)
- (cdr (assq 'display frame-cfg))))
+ (equal (frame-parameter nil 'display)
+ (cdr (assq 'display frame-cfg))))
(setq frameset--target-display (cons 'display
(frame-parameter nil
'display))
to-tty (null (cdr frameset--target-display))))
=== modified file 'lisp/net/tramp-sh.el'
--- a/lisp/net/tramp-sh.el 2014-03-21 13:02:25 +0000
+++ b/lisp/net/tramp-sh.el 2014-03-25 09:49:37 +0000
@@ -2110,6 +2110,12 @@
;; We can do it directly.
((let (file-name-handler-alist)
(and (file-readable-p localname1)
+ ;; No sticky bit when renaming.
+ (or (eq op 'copy)
+ (zerop
+ (logand
+ (file-modes (file-name-directory localname1))
+ (tramp-compat-octal-to-decimal "1000"))))
(file-writable-p (file-name-directory localname2))
(or (file-directory-p localname2)
(file-writable-p localname2))))
@@ -3311,55 +3317,57 @@
(with-tramp-progress-reporter
v 3 (format "Checking `vc-registered' for %s" file)
- (unless remote-file-name-inhibit-cache
- ;; There could be new files, created by the vc backend. We
- ;; cannot reuse the old cache entries, therefore.
- (let (tramp-vc-registered-file-names
- (remote-file-name-inhibit-cache (current-time))
- (file-name-handler-alist
- `((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
-
- ;; Here we collect only file names, which need an operation.
- (ignore-errors (tramp-run-real-handler 'vc-registered (list file)))
- (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
-
- ;; Send just one command, in order to fill the cache.
- (when tramp-vc-registered-file-names
- (tramp-maybe-send-script
- v
- (format tramp-vc-registered-read-file-names
- (tramp-get-file-exists-command v)
- (format "%s -r" (tramp-get-test-command v)))
- "tramp_vc_registered_read_file_names")
-
- (dolist
- (elt
- (ignore-errors
- ;; We cannot use `tramp-send-command-and-read',
- ;; because this does not cooperate well with
- ;; heredoc documents.
- (tramp-send-command
- v
- (format
- "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
- tramp-end-of-heredoc
- (mapconcat 'tramp-shell-quote-argument
- tramp-vc-registered-file-names
- "\n")
- tramp-end-of-heredoc))
- (with-current-buffer (tramp-get-connection-buffer v)
- ;; Read the expression.
- (goto-char (point-min))
- (read (current-buffer)))))
-
- (tramp-set-file-property
- v (car elt) (cadr elt) (cadr (cdr elt)))))))
+ ;; There could be new files, created by the vc backend. We
+ ;; cannot reuse the old cache entries, therefore. In
+ ;; `tramp-get-file-property', `remote-file-name-inhibit-cache'
+ ;; could also be a timestamp as `current-time' returns. This
+ ;; means invalidate all cache entries with an older timestamp.
+ (let (tramp-vc-registered-file-names
+ (remote-file-name-inhibit-cache (current-time))
+ (file-name-handler-alist
+ `((,tramp-file-name-regexp . tramp-vc-file-name-handler))))
+
+ ;; Here we collect only file names, which need an operation.
+ (ignore-errors (tramp-run-real-handler 'vc-registered (list file)))
+ (tramp-message v 10 "\n%s" tramp-vc-registered-file-names)
+
+ ;; Send just one command, in order to fill the cache.
+ (when tramp-vc-registered-file-names
+ (tramp-maybe-send-script
+ v
+ (format tramp-vc-registered-read-file-names
+ (tramp-get-file-exists-command v)
+ (format "%s -r" (tramp-get-test-command v)))
+ "tramp_vc_registered_read_file_names")
+
+ (dolist
+ (elt
+ (ignore-errors
+ ;; We cannot use `tramp-send-command-and-read',
+ ;; because this does not cooperate well with
+ ;; heredoc documents.
+ (tramp-send-command
+ v
+ (format
+ "tramp_vc_registered_read_file_names <<'%s'\n%s\n%s\n"
+ tramp-end-of-heredoc
+ (mapconcat 'tramp-shell-quote-argument
+ tramp-vc-registered-file-names
+ "\n")
+ tramp-end-of-heredoc))
+ (with-current-buffer (tramp-get-connection-buffer v)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (read (current-buffer)))))
+
+ (tramp-set-file-property
+ v (car elt) (cadr elt) (cadr (cdr elt))))))
;; Second run. Now all `file-exists-p' or `file-readable-p'
;; calls shall be answered from the file cache. We unset
- ;; `process-file-side-effects' in order to keep the cache when
- ;; `process-file' calls appear.
- (let (process-file-side-effects)
+ ;; `process-file-side-effects' and `remote-file-name-inhibit-cache'
+ ;; in order to keep the cache.
+ (let (remote-file-name-inhibit-cache process-file-side-effects)
(ignore-errors
(tramp-run-real-handler 'vc-registered (list file))))))))
@@ -3604,8 +3612,13 @@
(let (result)
;; Check whether the executable is in $PATH. "which(1)" does not
;; report always a correct error code; therefore we check the
- ;; number of words it returns.
- (unless ignore-path
+ ;; number of words it returns. "SunOS 5.10" (and maybe "SunOS
+ ;; 5.11") have problems with this command, we disable the call
+ ;; therefore.
+ (unless (or ignore-path
+ (string-match
+ (regexp-opt '("SunOS 5.10" "SunOS 5.11"))
+ (tramp-get-connection-property vec "uname" "")))
(tramp-send-command vec (format "which \\%s | wc -w" progname))
(goto-char (point-min))
(if (looking-at "^\\s-*1$")
@@ -4677,8 +4690,9 @@
(defun tramp-send-command-and-check
(vec command &optional subshell dont-suppress-err)
"Run COMMAND and check its exit status.
-Sends `echo $?' along with the COMMAND for checking the exit status. If
-COMMAND is nil, just sends `echo $?'. Returns the exit status found.
+Sends `echo $?' along with the COMMAND for checking the exit status.
+If COMMAND is nil, just sends `echo $?'. Returns `t' if the exit
+status is 0, and `nil' otherwise.
If the optional argument SUBSHELL is non-nil, the command is
executed in a subshell, ie surrounded by parentheses. If
=== modified file 'lisp/net/tramp.el'
--- a/lisp/net/tramp.el 2014-03-21 13:02:25 +0000
+++ b/lisp/net/tramp.el 2014-03-25 08:16:49 +0000
@@ -241,7 +241,7 @@
* `tramp-copy-program'
This specifies the name of the program to use for remotely copying
the file; this might be the absolute filename of rcp or the name of
- a workalike program.
+ a workalike program. It is always applied on the local host.
* `tramp-copy-args'
This specifies the list of parameters to pass to the above mentioned
program, the hints for `tramp-login-args' also apply here.
@@ -1044,7 +1044,9 @@
(defcustom tramp-connection-timeout 60
"Defines the max time to wait for establishing a connection (in seconds).
-This can be overwritten for different connection types in `tramp-methods'."
+This can be overwritten for different connection types in `tramp-methods'.
+
+The timeout does not include the time reading a password."
:group 'tramp
:version "24.4"
:type 'integer)
@@ -4119,40 +4121,48 @@
(with-current-buffer (process-buffer proc)
(tramp-check-for-regexp proc tramp-password-prompt-regexp)
(format "%s for %s " (capitalize (match-string 1)) key))))
- auth-info auth-passwd)
- (with-parsed-tramp-file-name key nil
- (prog1
- (or
- ;; See if auth-sources contains something useful, if it's
- ;; bound. `auth-source-user-or-password' is an obsoleted
- ;; function, it has been replaced by `auth-source-search'.
- (and (boundp 'auth-sources)
- (tramp-get-connection-property v "first-password-request" nil)
- ;; Try with Tramp's current method.
- (if (fboundp 'auth-source-search)
- (setq auth-info
- (tramp-compat-funcall
- 'auth-source-search
- :max 1
- :user (or tramp-current-user t)
- :host tramp-current-host
- :port tramp-current-method)
- auth-passwd (plist-get (nth 0 auth-info) :secret)
- auth-passwd (if (functionp auth-passwd)
- (funcall auth-passwd)
- auth-passwd))
- (tramp-compat-funcall
- 'auth-source-user-or-password
- "password" tramp-current-host tramp-current-method)))
- ;; Try the password cache.
- (when (functionp 'password-read)
- (let ((password
- (tramp-compat-funcall 'password-read pw-prompt key)))
- (tramp-compat-funcall 'password-cache-add key password)
- password))
- ;; Else, get the password interactively.
- (read-passwd pw-prompt))
- (tramp-set-connection-property v "first-password-request" nil)))))
+ ;; We suspend the timers while reading the password.
+ (stimers (with-timeout-suspend))
+ auth-info auth-passwd)
+
+ (unwind-protect
+ (with-parsed-tramp-file-name key nil
+ (prog1
+ (or
+ ;; See if auth-sources contains something useful, if
+ ;; it's bound. `auth-source-user-or-password' is an
+ ;; obsoleted function, it has been replaced by
+ ;; `auth-source-search'.
+ (and (boundp 'auth-sources)
+ (tramp-get-connection-property
+ v "first-password-request" nil)
+ ;; Try with Tramp's current method.
+ (if (fboundp 'auth-source-search)
+ (setq auth-info
+ (tramp-compat-funcall
+ 'auth-source-search
+ :max 1
+ :user (or tramp-current-user t)
+ :host tramp-current-host
+ :port tramp-current-method)
+ auth-passwd (plist-get (nth 0 auth-info) :secret)
+ auth-passwd (if (functionp auth-passwd)
+ (funcall auth-passwd)
+ auth-passwd))
+ (tramp-compat-funcall
+ 'auth-source-user-or-password
+ "password" tramp-current-host tramp-current-method)))
+ ;; Try the password cache.
+ (when (functionp 'password-read)
+ (let ((password
+ (tramp-compat-funcall 'password-read pw-prompt key)))
+ (tramp-compat-funcall 'password-cache-add key password)
+ password))
+ ;; Else, get the password interactively.
+ (read-passwd pw-prompt))
+ (tramp-set-connection-property v "first-password-request" nil)))
+ ;; Reenable the timers.
+ (with-timeout-unsuspend stimers))))
;;;###tramp-autoload
(defun tramp-clear-passwd (vec)
=== modified file 'lisp/progmodes/ruby-mode.el'
--- a/lisp/progmodes/ruby-mode.el 2014-03-21 04:26:39 +0000
+++ b/lisp/progmodes/ruby-mode.el 2014-03-24 08:53:56 +0000
@@ -106,7 +106,7 @@
"Regexp to match the beginning of a heredoc.")
(defconst ruby-expression-expansion-re
-
"\\(?:[^\\]\\|\\=\\)\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\)\\)"))
+
"\\(?:[^\\]\\|\\=\\)\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\|\\$[^a-zA-Z
\n]\\)\\)"))
(defun ruby-here-doc-end-match ()
"Return a regexp to find the end of a heredoc.
@@ -2113,8 +2113,8 @@
("\\(^\\|[^:]\\)\\(:\\(address@hidden|[/%&|^`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|![~=]?\\|\\[\\]=?\\|@?\\(\\w\\|_\\)+\\([!?=]\\|\\b_*\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)"
2 font-lock-constant-face)
;; Variables.
- ("\\(\\$\\([^a-zA-Z0-9 \n]\\|[0-9]\\)\\)\\W"
- 1 font-lock-variable-name-face)
+ ("\\$[^a-zA-Z \n]"
+ 0 font-lock-variable-name-face)
("\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+"
0 font-lock-variable-name-face)
;; Constants.
=== modified file 'lisp/simple.el'
--- a/lisp/simple.el 2014-03-22 22:36:29 +0000
+++ b/lisp/simple.el 2014-03-26 15:57:13 +0000
@@ -2283,20 +2283,38 @@
(when (let ((apos (abs pos)))
(or (< apos (point-min)) (> apos (point-max))))
(error "Changes to be undone are outside visible portion of
buffer"))
- (if (< pos 0)
- (progn
- (goto-char (- pos))
- (insert string))
- (goto-char pos)
- ;; Now that we record marker adjustments
- ;; (caused by deletion) for undo,
- ;; we should always insert after markers,
- ;; so that undoing the marker adjustments
- ;; put the markers back in the right place.
- (insert string)
- (goto-char pos)))
+ (let (valid-marker-adjustments)
+ ;; Check that marker adjustments which were recorded
+ ;; with the (STRING . POS) record are still valid, ie
+ ;; the markers haven't moved. We check their validity
+ ;; before reinserting the string so as we don't need to
+ ;; mind marker insertion-type.
+ (while (and (markerp (car-safe (car list)))
+ (integerp (cdr-safe (car list))))
+ (let* ((marker-adj (pop list))
+ (m (car marker-adj)))
+ (and (eq (marker-buffer m) (current-buffer))
+ (= pos m)
+ (push marker-adj valid-marker-adjustments))))
+ ;; Insert string and adjust point
+ (if (< pos 0)
+ (progn
+ (goto-char (- pos))
+ (insert string))
+ (goto-char pos)
+ (insert string)
+ (goto-char pos))
+ ;; Adjust the valid marker adjustments
+ (dolist (adj valid-marker-adjustments)
+ (set-marker (car adj)
+ (- (car adj) (cdr adj))))))
;; (MARKER . OFFSET) means a marker MARKER was adjusted by OFFSET.
(`(,(and marker (pred markerp)) . ,(and offset (pred integerp)))
+ (warn "Encountered %S entry in undo list with no matching (TEXT .
POS) entry"
+ next)
+ ;; Even though these elements are not expected in the undo
+ ;; list, adjust them to be conservative for the 24.4
+ ;; release. (Bug#16818)
(when (marker-buffer marker)
(set-marker marker
(- marker offset)
@@ -2335,8 +2353,6 @@
(undo-make-selective-list (min beg end) (max beg end))
buffer-undo-list)))
-(defvar undo-adjusted-markers)
-
(defun undo-make-selective-list (start end)
"Return a list of undo elements for the region START to END.
The elements come from `buffer-undo-list', but we keep only
@@ -2345,7 +2361,6 @@
we stop and ignore all further elements."
(let ((undo-list-copy (undo-copy-list buffer-undo-list))
(undo-list (list nil))
- undo-adjusted-markers
some-rejected
undo-elt temp-undo-list delta)
(while undo-list-copy
@@ -2355,15 +2370,30 @@
;; This is a "was unmodified" element.
;; Keep it if we have kept everything thus far.
(not some-rejected))
+ ;; Skip over marker adjustments, instead relying on
+ ;; finding them after (TEXT . POS) elements
+ ((markerp (car-safe undo-elt))
+ nil)
(t
(undo-elt-in-region undo-elt start end)))))
(if keep-this
(progn
(setq end (+ end (cdr (undo-delta undo-elt))))
;; Don't put two nils together in the list
- (if (not (and (eq (car undo-list) nil)
- (eq undo-elt nil)))
- (setq undo-list (cons undo-elt undo-list))))
+ (when (not (and (eq (car undo-list) nil)
+ (eq undo-elt nil)))
+ (setq undo-list (cons undo-elt undo-list))
+ ;; If (TEXT . POS), "keep" its subsequent (MARKER
+ ;; . ADJUSTMENT) whose markers haven't moved.
+ (when (and (stringp (car-safe undo-elt))
+ (integerp (cdr-safe undo-elt)))
+ (let ((list-i (cdr undo-list-copy)))
+ (while (markerp (car-safe (car list-i)))
+ (let* ((adj-elt (pop list-i))
+ (m (car adj-elt)))
+ (and (eq (marker-buffer m) (current-buffer))
+ (= (cdr undo-elt) m)
+ (push adj-elt undo-list))))))))
(if (undo-elt-crosses-region undo-elt start end)
(setq undo-list-copy nil)
(setq some-rejected t)
@@ -2411,7 +2441,12 @@
(defun undo-elt-in-region (undo-elt start end)
"Determine whether UNDO-ELT falls inside the region START ... END.
-If it crosses the edge, we return nil."
+If it crosses the edge, we return nil.
+
+Generally this function is not useful for determining
+whether (MARKER . ADJUSTMENT) undo elements are in the region,
+because markers can be arbitrarily relocated. Instead, pass the
+marker adjustment's corresponding (TEXT . POS) element."
(cond ((integerp undo-elt)
(and (>= undo-elt start)
(<= undo-elt end)))
@@ -2424,17 +2459,8 @@
(and (>= (abs (cdr undo-elt)) start)
(<= (abs (cdr undo-elt)) end)))
((and (consp undo-elt) (markerp (car undo-elt)))
- ;; This is a marker-adjustment element (MARKER . ADJUSTMENT).
- ;; See if MARKER is inside the region.
- (let ((alist-elt (assq (car undo-elt) undo-adjusted-markers)))
- (unless alist-elt
- (setq alist-elt (cons (car undo-elt)
- (marker-position (car undo-elt))))
- (setq undo-adjusted-markers
- (cons alist-elt undo-adjusted-markers)))
- (and (cdr alist-elt)
- (>= (cdr alist-elt) start)
- (<= (cdr alist-elt) end))))
+ ;; (MARKER . ADJUSTMENT)
+ (<= start (car undo-elt) end))
((null (car undo-elt))
;; (nil PROPERTY VALUE BEG . END)
(let ((tail (nthcdr 3 undo-elt)))
@@ -4467,6 +4493,11 @@
(funcall redisplay-unhighlight-region-function rol)
(overlay-put nrol 'window window)
(overlay-put nrol 'face 'region)
+ ;; Normal priority so that a large region doesn't hide all the
+ ;; overlays within it, but high secondary priority so that if it
+ ;; ends/starts in the middle of a small overlay, that small overlay
+ ;; won't hide the region's boundaries.
+ (overlay-put nrol 'priority '(nil . 100))
nrol)
(unless (and (eq (overlay-buffer rol) (current-buffer))
(eq (overlay-start rol) start)
=== modified file 'lisp/url/ChangeLog'
--- a/lisp/url/ChangeLog 2014-02-13 02:19:48 +0000
+++ b/lisp/url/ChangeLog 2014-03-26 15:21:17 +0000
@@ -1,3 +1,8 @@
+2014-03-26 Juanma Barranquero <address@hidden>
+
+ * url-handlers.el (url-http-parse-response): Add autoload.
+ (url-insert-file-contents): Signal file-error in case of HTTP error.
+
2014-02-05 Glenn Morris <address@hidden>
* url-cookie.el (url-cookie-list): Doc fix.
=== modified file 'lisp/url/url-handlers.el'
--- a/lisp/url/url-handlers.el 2014-01-01 07:43:34 +0000
+++ b/lisp/url/url-handlers.el 2014-03-26 15:21:17 +0000
@@ -33,6 +33,7 @@
(autoload 'url-expand-file-name "url-expand" "Convert url to a fully specified
url, and canonicalize it.")
(autoload 'mm-dissect-buffer "mm-decode" "Dissect the current buffer and
return a list of MIME handles.")
(autoload 'url-scheme-get-property "url-methods" "Get property of a URL
SCHEME.")
+(autoload 'url-http-parse-response "url-http" "Parse just the response code.")
;; Always used after mm-dissect-buffer and defined in the same file.
(declare-function mm-save-part-to-file "mm-decode" (handle file))
@@ -293,8 +294,15 @@
;;;###autoload
(defun url-insert-file-contents (url &optional visit beg end replace)
(let ((buffer (url-retrieve-synchronously url)))
- (if (not buffer)
- (error "Opening input file: No such file or directory, %s" url))
+ (unless buffer (signal 'file-error (list url "No Data")))
+ (with-current-buffer buffer
+ (let ((response (url-http-parse-response)))
+ (if (and (>= response 200) (< response 300))
+ (goto-char (point-min))
+ (let ((desc (buffer-substring-no-properties (1+ (point))
+ (line-end-position))))
+ (kill-buffer buffer)
+ (signal 'file-error (list url desc))))))
(if visit (setq buffer-file-name url))
(save-excursion
(let* ((start (point))
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2014-03-26 10:21:55 +0000
+++ b/src/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,61 @@
+2014-03-26 Paul Eggert <address@hidden>
+
+ Fix core dump in char-equal (Bug#17011).
+ * editfns.c (Fchar_equal): Do not use MAKE_CHAR_MULTIBYTE in
+ unibyte buffers, as we can't tell whether the characters are
+ actually unibyte.
+
+ * insdel.c (adjust_markers_for_delete): Remove unused local.
+
+2014-03-26 Barry O'Reilly <address@hidden>
+
+ Have (MARKER . ADJUSTMENT) undo records always be immediately
+ after their corresponding (TEXT . POS) record in undo list.
+ (Bug#16818)
+ * lisp.h (record-delete): New arg record_markers.
+ (record_marker_adjustment): No longer needed outside undo.c.
+ * insdel.c (adjust_markers_for_delete): Move calculation of marker
+ adjustments to undo.c's record_marker_adjustments. Note that
+ fileio.c's decide_coding_unwind is another caller to
+ adjust_markers_for_delete. Because it has undo list bound to t,
+ it does not rely on adjust_markers_for_delete to record marker
+ adjustments.
+ (del_range_2): Swap call to record_delete and
+ adjust_markers_for_delete so as undo marker adjustments are
+ recorded before current deletion's adjustments, as before.
+ (adjust_after_replace):
+ (replace_range): Pass value for new record_markers arg to
+ delete_record.
+ * undo.c (record_marker_adjustment): Renamed to
+ record_marker_adjustments and made static.
+ (record_delete): Check record_markers arg and call
+ record_marker_adjustments.
+ (record_change): Pass value for new record_markers arg to
+ delete_record.
+ (record_point): at_boundary calculation no longer needs to account
+ for marker adjustments.
+
+2014-03-26 Martin Rudalics <address@hidden>
+
+ * w32term.c (x_set_window_size): Refine fix from 2014-03-14
+ (Bug#17077).
+
+2014-03-26 Glenn Morris <address@hidden>
+
+ * fileio.c (Ffile_symlink_p): Doc fix. (Bug#17073)
+
+2014-03-26 Stefan Monnier <address@hidden>
+
+ * buffer.c (struct sortvec): Add field `spriority'.
+ (compare_overlays): Use it.
+ (sort_overlays): Set it.
+
+2014-03-26 Eli Zaretskii <address@hidden>
+
+ * xdisp.c (redisplay_window): If all previous attempts to find the
+ cursor row failed, try a few alternatives before falling back to
+ the top-most row of the window. Use row_containing_pos. (Bug#17047)
+
2014-03-26 Juanma Barranquero <address@hidden>
* image.c (x_bitmap_height, x_bitmap_width) [HAVE_X_WINDOWS]:
=== modified file 'src/buffer.c'
--- a/src/buffer.c 2014-03-26 01:14:44 +0000
+++ b/src/buffer.c 2014-03-26 15:57:13 +0000
@@ -3142,6 +3142,7 @@
Lisp_Object overlay;
ptrdiff_t beg, end;
EMACS_INT priority;
+ EMACS_INT spriority; /* Secondary priority. */
};
static int
@@ -3149,19 +3150,28 @@
{
const struct sortvec *s1 = v1;
const struct sortvec *s2 = v2;
+ /* Return 1 if s1 should take precedence, -1 if v2 should take precedence,
+ and 0 if they're equal. */
if (s1->priority != s2->priority)
return s1->priority < s2->priority ? -1 : 1;
- if (s1->beg != s2->beg)
- return s1->beg < s2->beg ? -1 : 1;
- if (s1->end != s2->end)
+ /* If the priority is equal, give precedence to the one not covered by the
+ other. If neither covers the other, obey spriority. */
+ else if (s1->beg < s2->beg)
+ return (s1->end < s2->end && s1->spriority > s2->spriority ? 1 : -1);
+ else if (s1->beg > s2->beg)
+ return (s1->end > s2->end && s1->spriority < s2->spriority ? -1 : 1);
+ else if (s1->end != s2->end)
return s2->end < s1->end ? -1 : 1;
- /* Avoid the non-determinism of qsort by choosing an arbitrary ordering
- between "equal" overlays. The result can still change between
- invocations of Emacs, but it won't change in the middle of
- `find_field' (bug#6830). */
- if (!EQ (s1->overlay, s2->overlay))
+ else if (s1->spriority != s2->spriority)
+ return (s1->spriority < s2->spriority ? -1 : 1);
+ else if (EQ (s1->overlay, s2->overlay))
+ return 0;
+ else
+ /* Avoid the non-determinism of qsort by choosing an arbitrary ordering
+ between "equal" overlays. The result can still change between
+ invocations of Emacs, but it won't change in the middle of
+ `find_field' (bug#6830). */
return XLI (s1->overlay) < XLI (s2->overlay) ? -1 : 1;
- return 0;
}
/* Sort an array of overlays by priority. The array is modified in place.
@@ -3204,10 +3214,23 @@
sortvec[j].beg = OVERLAY_POSITION (OVERLAY_START (overlay));
sortvec[j].end = OVERLAY_POSITION (OVERLAY_END (overlay));
tem = Foverlay_get (overlay, Qpriority);
- if (INTEGERP (tem))
- sortvec[j].priority = XINT (tem);
- else
- sortvec[j].priority = 0;
+ if (NILP (tem))
+ {
+ sortvec[j].priority = 0;
+ sortvec[j].spriority = 0;
+ }
+ else if (INTEGERP (tem))
+ {
+ sortvec[j].priority = XINT (tem);
+ sortvec[j].spriority = 0;
+ }
+ else if (CONSP (tem))
+ {
+ Lisp_Object car = XCAR (tem);
+ Lisp_Object cdr = XCDR (tem);
+ sortvec[j].priority = INTEGERP (car) ? XINT (car) : 0;
+ sortvec[j].spriority = INTEGERP (cdr) ? XINT (cdr) : 0;
+ }
j++;
}
}
=== modified file 'src/editfns.c'
--- a/src/editfns.c 2014-01-24 16:05:12 +0000
+++ b/src/editfns.c 2014-03-26 05:35:38 +0000
@@ -4377,18 +4377,13 @@
if (NILP (BVAR (current_buffer, case_fold_search)))
return Qnil;
+ /* FIXME: When enable-multibyte-characters is nil, it's still possible
+ to manipulate multibyte chars, which means there is a bug for chars
+ in the range 128-255 as we can't tell whether they are eight-bit
+ bytes or Latin-1 chars. For now, assume the latter. See Bug#17011.
+ Also see casefiddle.c's casify_object, which has a similar problem. */
i1 = XFASTINT (c1);
- if (NILP (BVAR (current_buffer, enable_multibyte_characters))
- && ! ASCII_CHAR_P (i1))
- {
- MAKE_CHAR_MULTIBYTE (i1);
- }
i2 = XFASTINT (c2);
- if (NILP (BVAR (current_buffer, enable_multibyte_characters))
- && ! ASCII_CHAR_P (i2))
- {
- MAKE_CHAR_MULTIBYTE (i2);
- }
return (downcase (i1) == downcase (i2) ? Qt : Qnil);
}
=== modified file 'src/fileio.c'
--- a/src/fileio.c 2014-03-26 01:14:44 +0000
+++ b/src/fileio.c 2014-03-26 15:57:13 +0000
@@ -2682,8 +2682,7 @@
The value is the link target, as a string.
Otherwise it returns nil.
-This function returns t when given the name of a symlink that
-points to a nonexistent file. */)
+This function does not check whether the link target exists. */)
(Lisp_Object filename)
{
Lisp_Object handler;
=== modified file 'src/insdel.c'
--- a/src/insdel.c 2014-03-26 01:14:44 +0000
+++ b/src/insdel.c 2014-03-26 15:57:13 +0000
@@ -214,9 +214,8 @@
adjust_markers_for_delete (ptrdiff_t from, ptrdiff_t from_byte,
ptrdiff_t to, ptrdiff_t to_byte)
{
- Lisp_Object marker;
- register struct Lisp_Marker *m;
- register ptrdiff_t charpos;
+ struct Lisp_Marker *m;
+ ptrdiff_t charpos;
for (m = BUF_MARKERS (current_buffer); m; m = m->next)
{
@@ -233,34 +232,9 @@
/* Here's the case where a marker is inside text being deleted. */
else if (charpos > from)
{
- if (! m->insertion_type)
- { /* Normal markers will end up at the beginning of the
- re-inserted text after undoing a deletion, and must be
- adjusted to move them to the correct place. */
- XSETMISC (marker, m);
- record_marker_adjustment (marker, from - charpos);
- }
- else if (charpos < to)
- { /* Before-insertion markers will automatically move forward
- upon re-inserting the deleted text, so we have to arrange
- for them to move backward to the correct position. */
- XSETMISC (marker, m);
- record_marker_adjustment (marker, to - charpos);
- }
m->charpos = from;
m->bytepos = from_byte;
}
- /* Here's the case where a before-insertion marker is immediately
- before the deleted region. */
- else if (charpos == from && m->insertion_type)
- {
- /* Undoing the change uses normal insertion, which will
- incorrectly make MARKER move forward, so we arrange for it
- to then move backward to the correct place at the beginning
- of the deleted region. */
- XSETMISC (marker, m);
- record_marker_adjustment (marker, to - from);
- }
}
}
@@ -1219,7 +1193,7 @@
from + len, from_byte + len_byte, 0);
if (nchars_del > 0)
- record_delete (from, prev_text);
+ record_delete (from, prev_text, false);
record_insert (from, len);
if (len > nchars_del)
@@ -1384,7 +1358,7 @@
if (!NILP (deletion))
{
record_insert (from + SCHARS (deletion), inschars);
- record_delete (from, deletion);
+ record_delete (from, deletion, false);
}
GAP_SIZE -= outgoing_insbytes;
@@ -1716,13 +1690,14 @@
else
deletion = Qnil;
- /* Relocate all markers pointing into the new, larger gap
- to point at the end of the text before the gap.
- Do this before recording the deletion,
- so that undo handles this after reinserting the text. */
+ /* Record marker adjustments, and text deletion into undo
+ history. */
+ record_delete (from, deletion, true);
+
+ /* Relocate all markers pointing into the new, larger gap to point
+ at the end of the text before the gap. */
adjust_markers_for_delete (from, from_byte, to, to_byte);
- record_delete (from, deletion);
MODIFF++;
CHARS_MODIFF = MODIFF;
=== modified file 'src/lisp.h'
--- a/src/lisp.h 2014-03-25 14:43:26 +0000
+++ b/src/lisp.h 2014-03-26 15:57:13 +0000
@@ -4199,9 +4199,8 @@
extern Lisp_Object Qapply;
extern Lisp_Object Qinhibit_read_only;
extern void truncate_undo_list (struct buffer *);
-extern void record_marker_adjustment (Lisp_Object, ptrdiff_t);
extern void record_insert (ptrdiff_t, ptrdiff_t);
-extern void record_delete (ptrdiff_t, Lisp_Object);
+extern void record_delete (ptrdiff_t, Lisp_Object, bool);
extern void record_first_change (void);
extern void record_change (ptrdiff_t, ptrdiff_t);
extern void record_property_change (ptrdiff_t, ptrdiff_t,
=== modified file 'src/undo.c'
--- a/src/undo.c 2014-01-01 07:43:34 +0000
+++ b/src/undo.c 2014-03-25 02:47:39 +0000
@@ -75,27 +75,8 @@
Fundo_boundary ();
last_undo_buffer = current_buffer;
- if (CONSP (BVAR (current_buffer, undo_list)))
- {
- /* Set AT_BOUNDARY only when we have nothing other than
- marker adjustment before undo boundary. */
-
- Lisp_Object tail = BVAR (current_buffer, undo_list), elt;
-
- while (1)
- {
- if (NILP (tail))
- elt = Qnil;
- else
- elt = XCAR (tail);
- if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
- break;
- tail = XCDR (tail);
- }
- at_boundary = NILP (elt);
- }
- else
- at_boundary = 1;
+ at_boundary = ! CONSP (BVAR (current_buffer, undo_list))
+ || NILP (XCAR (BVAR (current_buffer, undo_list)));
if (MODIFF <= SAVE_MODIFF)
record_first_change ();
@@ -147,11 +128,61 @@
Fcons (Fcons (lbeg, lend), BVAR (current_buffer, undo_list)));
}
-/* Record that a deletion is about to take place,
- of the characters in STRING, at location BEG. */
+/* Record the fact that markers in the region of FROM, TO are about to
+ be adjusted. This is done only when a marker points within text
+ being deleted, because that's the only case where an automatic
+ marker adjustment won't be inverted automatically by undoing the
+ buffer modification. */
+
+static void
+record_marker_adjustments (ptrdiff_t from, ptrdiff_t to)
+{
+ Lisp_Object marker;
+ register struct Lisp_Marker *m;
+ register ptrdiff_t charpos, adjustment;
+
+ /* Allocate a cons cell to be the undo boundary after this command. */
+ if (NILP (pending_boundary))
+ pending_boundary = Fcons (Qnil, Qnil);
+
+ if (current_buffer != last_undo_buffer)
+ Fundo_boundary ();
+ last_undo_buffer = current_buffer;
+
+ for (m = BUF_MARKERS (current_buffer); m; m = m->next)
+ {
+ charpos = m->charpos;
+ eassert (charpos <= Z);
+
+ if (from <= charpos && charpos <= to)
+ {
+ /* insertion_type nil markers will end up at the beginning of
+ the re-inserted text after undoing a deletion, and must be
+ adjusted to move them to the correct place.
+
+ insertion_type t markers will automatically move forward
+ upon re-inserting the deleted text, so we have to arrange
+ for them to move backward to the correct position. */
+ adjustment = (m->insertion_type ? to : from) - charpos;
+
+ if (adjustment)
+ {
+ XSETMISC (marker, m);
+ bset_undo_list
+ (current_buffer,
+ Fcons (Fcons (marker, make_number (adjustment)),
+ BVAR (current_buffer, undo_list)));
+ }
+ }
+ }
+}
+
+/* Record that a deletion is about to take place, of the characters in
+ STRING, at location BEG. Optionally record adjustments for markers
+ in the region STRING occupies in the current buffer. */
void
-record_delete (ptrdiff_t beg, Lisp_Object string)
+record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers)
{
Lisp_Object sbeg;
@@ -169,36 +200,17 @@
record_point (beg);
}
+ /* primitive-undo assumes marker adjustments are recorded
+ immediately before the deletion is recorded. See bug 16818
+ discussion. */
+ if (record_markers)
+ record_marker_adjustments (beg, beg + SCHARS (string));
+
bset_undo_list
(current_buffer,
Fcons (Fcons (string, sbeg), BVAR (current_buffer, undo_list)));
}
-/* Record the fact that MARKER is about to be adjusted by ADJUSTMENT.
- This is done only when a marker points within text being deleted,
- because that's the only case where an automatic marker adjustment
- won't be inverted automatically by undoing the buffer modification. */
-
-void
-record_marker_adjustment (Lisp_Object marker, ptrdiff_t adjustment)
-{
- if (EQ (BVAR (current_buffer, undo_list), Qt))
- return;
-
- /* Allocate a cons cell to be the undo boundary after this command. */
- if (NILP (pending_boundary))
- pending_boundary = Fcons (Qnil, Qnil);
-
- if (current_buffer != last_undo_buffer)
- Fundo_boundary ();
- last_undo_buffer = current_buffer;
-
- bset_undo_list
- (current_buffer,
- Fcons (Fcons (marker, make_number (adjustment)),
- BVAR (current_buffer, undo_list)));
-}
-
/* Record that a replacement is about to take place,
for LENGTH characters at location BEG.
The replacement must not change the number of characters. */
@@ -206,7 +218,7 @@
void
record_change (ptrdiff_t beg, ptrdiff_t length)
{
- record_delete (beg, make_buffer_string (beg, beg + length, 1));
+ record_delete (beg, make_buffer_string (beg, beg + length, 1), false);
record_insert (beg, length);
}
=== modified file 'src/w32term.c'
--- a/src/w32term.c 2014-03-26 10:21:55 +0000
+++ b/src/w32term.c 2014-03-26 15:57:13 +0000
@@ -5653,30 +5653,41 @@
compute_fringe_widths (f, 0);
- if (pixelwise)
+ if (frame_resize_pixelwise)
{
- pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
- pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+ if (pixelwise)
+ {
+ pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
+ pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+ }
+ else
+ {
+ pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width);
+ pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height);
+ }
}
else
{
- pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width);
- pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height);
- }
-
- if (!frame_resize_pixelwise)
- {
/* If we don't resize frames pixelwise, round sizes to multiples
of character sizes here. Otherwise, when enforcing size hints
while processing WM_WINDOWPOSCHANGING in w32_wnd_proc, we might
clip our frame rectangle to a multiple of the frame's character
size and subsequently lose our mode line or scroll bar.
- Bug#16923 could be one possible consequence of this. */
+ Bug#16923 could be one possible consequence of this. Carefully
+ reverse-engineer what WM_WINDOWPOSCHANGING does here since
+ otherwise we might make our frame too small, see Bug#17077. */
int unit_width = FRAME_COLUMN_WIDTH (f);
int unit_height = FRAME_LINE_HEIGHT (f);
- pixelwidth = (pixelwidth / unit_width) * unit_width;
- pixelheight = (pixelheight / unit_height) * unit_height;
+ pixelwidth = (((((pixelwise ? width : (width * FRAME_COLUMN_WIDTH (f)))
+ + FRAME_TOTAL_FRINGE_WIDTH (f))
+ / unit_width) * unit_width)
+ + FRAME_SCROLL_BAR_AREA_WIDTH (f)
+ + 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
+
+ pixelheight = ((((pixelwise ? height : (height * FRAME_LINE_HEIGHT (f)))
+ / unit_height) * unit_height)
+ + 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
}
f->win_gravity = NorthWestGravity;
=== modified file 'src/xdisp.c'
--- a/src/xdisp.c 2014-03-20 14:09:37 +0000
+++ b/src/xdisp.c 2014-03-23 15:57:25 +0000
@@ -16400,12 +16400,50 @@
/* Consider the following case: Window starts at BEGV, there is
invisible, intangible text at BEGV, so that display starts at
some point START > BEGV. It can happen that we are called with
- PT somewhere between BEGV and START. Try to handle that case. */
+ PT somewhere between BEGV and START. Try to handle that case,
+ and similar ones. */
if (w->cursor.vpos < 0)
{
- struct glyph_row *row = w->current_matrix->rows;
- if (row->mode_line_p)
- ++row;
+ /* First, try locating the proper glyph row for PT. */
+ struct glyph_row *row =
+ row_containing_pos (w, PT, w->current_matrix->rows, NULL, 0);
+
+ /* Sometimes point is at the beginning of invisible text that is
+ before the 1st character displayed in the row. In that case,
+ row_containing_pos fails to find the row, because no glyphs
+ with appropriate buffer positions are present in the row.
+ Therefore, we next try to find the row which shows the 1st
+ position after the invisible text. */
+ if (!row)
+ {
+ Lisp_Object val =
+ get_char_property_and_overlay (make_number (PT), Qinvisible,
+ Qnil, NULL);
+
+ if (TEXT_PROP_MEANS_INVISIBLE (val))
+ {
+ ptrdiff_t alt_pos;
+ Lisp_Object invis_end =
+ Fnext_single_char_property_change (make_number (PT), Qinvisible,
+ Qnil, Qnil);
+
+ if (NATNUMP (invis_end))
+ alt_pos = XFASTINT (invis_end);
+ else
+ alt_pos = ZV;
+ row = row_containing_pos (w, alt_pos, w->current_matrix->rows,
+ NULL, 0);
+ }
+ }
+ /* Finally, fall back on the first row of the window after the
+ header line (if any). This is slightly better than not
+ displaying the cursor at all. */
+ if (!row)
+ {
+ row = w->current_matrix->rows;
+ if (row->mode_line_p)
+ ++row;
+ }
set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0);
}
=== modified file 'test/ChangeLog'
--- a/test/ChangeLog 2014-03-23 17:56:34 +0000
+++ b/test/ChangeLog 2014-03-26 15:57:13 +0000
@@ -1,3 +1,11 @@
+2014-03-26 Barry O'Reilly <address@hidden>
+
+ * automated/undo-tests.el (undo-test-marker-adjustment-nominal):
+ (undo-test-region-t-marker): New tests of marker adjustments.
+ (undo-test-marker-adjustment-moved):
+ (undo-test-region-mark-adjustment): New tests to demonstrate
+ bug#16818, which fail without the fix.
+
2014-03-23 Dmitry Gutov <address@hidden>
* automated/package-test.el (package-test-describe-package):
=== modified file 'test/automated/undo-tests.el'
--- a/test/automated/undo-tests.el 2014-03-02 17:37:32 +0000
+++ b/test/automated/undo-tests.el 2014-03-25 02:47:39 +0000
@@ -268,6 +268,104 @@
(should (string= (buffer-string)
"This sentence corrupted?aaa"))))
+(ert-deftest undo-test-marker-adjustment-nominal ()
+ "Test nominal behavior of marker adjustments."
+ (with-temp-buffer
+ (buffer-enable-undo)
+ (insert "abcdefg")
+ (undo-boundary)
+ (let ((m (make-marker)))
+ (set-marker m 2 (current-buffer))
+ (goto-char (point-min))
+ (delete-forward-char 3)
+ (undo-boundary)
+ (should (= (point-min) (marker-position m)))
+ (undo)
+ (undo-boundary)
+ (should (= 2 (marker-position m))))))
+
+(ert-deftest undo-test-region-t-marker ()
+ "Test undo in region containing marker with t insertion-type."
+ (with-temp-buffer
+ (buffer-enable-undo)
+ (transient-mark-mode 1)
+ (insert "abcdefg")
+ (undo-boundary)
+ (let ((m (make-marker)))
+ (set-marker-insertion-type m t)
+ (set-marker m (point-min) (current-buffer)) ; m at a
+ (goto-char (+ 2 (point-min)))
+ (push-mark (point) t t)
+ (setq mark-active t)
+ (goto-char (point-min))
+ (delete-forward-char 1) ;; delete region covering "ab"
+ (undo-boundary)
+ (should (= (point-min) (marker-position m)))
+ ;; Resurrect "ab". m's insertion type means the reinsertion
+ ;; moves it forward 2, and then the marker adjustment returns it
+ ;; to its rightful place.
+ (undo)
+ (undo-boundary)
+ (should (= (point-min) (marker-position m))))))
+
+(ert-deftest undo-test-marker-adjustment-moved ()
+ "Test marker adjustment behavior when the marker moves.
+Demonstrates bug 16818."
+ (with-temp-buffer
+ (buffer-enable-undo)
+ (insert "abcdefghijk")
+ (undo-boundary)
+ (let ((m (make-marker)))
+ (set-marker m 2 (current-buffer)) ; m at b
+ (goto-char (point-min))
+ (delete-forward-char 3) ; m at d
+ (undo-boundary)
+ (set-marker m 4) ; m at g
+ (undo)
+ (undo-boundary)
+ ;; m still at g, but shifted 3 because deletion undone
+ (should (= 7 (marker-position m))))))
+
+(ert-deftest undo-test-region-mark-adjustment ()
+ "Test that the mark's marker adjustment in undo history doesn't
+obstruct undo in region from finding the correct change group.
+Demonstrates bug 16818."
+ (with-temp-buffer
+ (buffer-enable-undo)
+ (transient-mark-mode 1)
+ (insert "First line\n")
+ (insert "Second line\n")
+ (undo-boundary)
+
+ (goto-char (point-min))
+ (insert "aaa")
+ (undo-boundary)
+
+ (undo)
+ (undo-boundary)
+
+ (goto-char (point-max))
+ (insert "bbb")
+ (undo-boundary)
+
+ (push-mark (point) t t)
+ (setq mark-active t)
+ (goto-char (- (point) 3))
+ (delete-forward-char 1)
+ (undo-boundary)
+
+ (insert "bbb")
+ (undo-boundary)
+
+ (goto-char (point-min))
+ (push-mark (point) t t)
+ (setq mark-active t)
+ (goto-char (+ (point) 3))
+ (undo)
+ (undo-boundary)
+
+ (should (string= (buffer-string) "aaaFirst line\nSecond line\nbbb"))))
+
(defun undo-test-all (&optional interactive)
"Run all tests for \\[undo]."
(interactive "p")
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r116881: Merge from emacs-24; up to r116865,
Juanma Barranquero <=