summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--admin/ChangeLog5
-rw-r--r--admin/notes/elpa4
-rw-r--r--configure.ac14
-rw-r--r--doc/lispref/ChangeLog5
-rw-r--r--doc/lispref/positions.texi6
-rw-r--r--doc/misc/ChangeLog9
-rw-r--r--doc/misc/autotype.texi7
-rw-r--r--doc/misc/dbus.texi4
-rw-r--r--lisp/ChangeLog95
-rw-r--r--lisp/delsel.el1
-rw-r--r--lisp/dired.el5
-rw-r--r--lisp/emacs-lisp/smie.el25
-rw-r--r--lisp/mouse.el12
-rw-r--r--lisp/net/dbus.el10
-rw-r--r--lisp/progmodes/python.el16
-rw-r--r--lisp/progmodes/ruby-mode.el2
-rw-r--r--lisp/progmodes/sh-script.el13
-rw-r--r--lisp/simple.el9
-rw-r--r--lisp/skeleton.el7
-rw-r--r--lisp/term/w32-win.el17
-rw-r--r--lisp/term/xterm.el4
-rw-r--r--lisp/textmodes/texinfo.el15
-rw-r--r--lisp/window.el2
-rw-r--r--lisp/xt-mouse.el33
-rw-r--r--src/ChangeLog39
-rw-r--r--src/dispextern.h3
-rw-r--r--src/fileio.c5
-rw-r--r--src/font.c3
-rw-r--r--src/image.c47
-rw-r--r--src/indent.c27
-rw-r--r--src/keyboard.c23
-rw-r--r--src/xdisp.c7
-rw-r--r--test/ChangeLog4
-rw-r--r--test/automated/python-tests.el9
-rwxr-xr-xtest/indent/shell.sh18
36 files changed, 401 insertions, 114 deletions
diff --git a/ChangeLog b/ChangeLog
index 412b840a55e..32fde8b0c4c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2014-06-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ * configure.ac: Warn about --enable-link-time-optimization's issues
+ in --help message (Bug#17806).
+
+ Port to GCC 4.9.0 with link time optimization (Bug#17806).
+ * configure.ac (CFLAGS): With link time optimization,
+ use -ffat-lto-objects if supported; otherwise Emacs won't
+ build with GCC 4.9.0.
+
2014-06-20 Paul Eggert <eggert@cs.ucla.edu>
Diagnose failures due to colons in directory names (Bug#17278).
diff --git a/admin/ChangeLog b/admin/ChangeLog
index 02d8dc08eac..dc128325523 100644
--- a/admin/ChangeLog
+++ b/admin/ChangeLog
@@ -1,3 +1,8 @@
+2014-06-21 Stephen Berman <Stephen.Berman@gmx.net>
+
+ * notes/elpa: Use "git" instead of "bzr" in the name of machine to
+ clone the repository from.
+
2014-06-13 Glenn Morris <rgm@gnu.org>
* unidata/Makefile.in (${DSTDIR}/charprop.el):
diff --git a/admin/notes/elpa b/admin/notes/elpa
index 469a0ca8bd1..39226044a91 100644
--- a/admin/notes/elpa
+++ b/admin/notes/elpa
@@ -3,9 +3,9 @@ NOTES ON THE EMACS PACKAGE ARCHIVE
The GNU Emacs package archive, at elpa.gnu.org, is managed using a Git
repository named "elpa", hosted on Savannah. To check it out:
- git clone git://bzr.sv.gnu.org/emacs/elpa
+ git clone git://git.sv.gnu.org/emacs/elpa
cd elpa
- git remote set-url --push origin git+ssh://bzr.sv.gnu.org/srv/git/emacs/elpa
+ git remote set-url --push origin git+ssh://git.sv.gnu.org/srv/git/emacs/elpa
[create task branch for edits, etc.]
Changes to this branch propagate to elpa.gnu.org via a "deployment" script run
diff --git a/configure.ac b/configure.ac
index c4ca395d6d1..b253d2465fa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -931,8 +931,11 @@ edit_cflags="
AC_ARG_ENABLE(link-time-optimization,
[AS_HELP_STRING([--enable-link-time-optimization],
[build emacs with link-time optimization.
- This is supported for gcc since 4.5.0 and clang.
- Note that clang support is experimental - see INSTALL])],
+ This requires GCC 4.5.0 or later, or clang.
+ (Note that clang support is experimental - see INSTALL.)
+ It also makes Emacs harder to debug, and when we tried it
+ with GCC 4.9.0 x86-64 it made Emacs slower, so it's not
+ recommended for typical use.])],
if test "${enableval}" != "no"; then
ac_lto_supported=no
if test $emacs_cv_clang = yes; then
@@ -970,6 +973,13 @@ if test "${enableval}" != "no"; then
# command, so plugin name is appended to ARFLAGS.
ARFLAGS="cru --plugin $GOLD_PLUGIN"
RANLIB="$RANLIB --plugin $GOLD_PLUGIN"
+ else
+ dnl The following is needed for GCC 4.9.0. The GCC 4.9.0 release notes
+ dnl suggest that instead of -ffat-lto-objects we should use gcc-ar and
+ dnl gcc-ranlib in place of ar and ranlib, but gcc-ar makes /usr/bin/ar
+ dnl dump core on Fedora 20, so play it safe for now.
+ gl_COMPILER_OPTION_IF([-ffat-lto-objects],
+ [CFLAGS="$CFLAGS -ffat-lto-objects"])
fi
fi
fi)
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog
index 4089068c906..3b7ca9c7288 100644
--- a/doc/lispref/ChangeLog
+++ b/doc/lispref/ChangeLog
@@ -1,3 +1,8 @@
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * positions.texi (Screen Lines): Clarify how columns are counted
+ by vertical-motion.
+
2014-06-15 Glenn Morris <rgm@gnu.org>
* Makefile.in (bootstrap-clean): New.
diff --git a/doc/lispref/positions.texi b/doc/lispref/positions.texi
index 5a77b37e7e1..e32f0ef0b34 100644
--- a/doc/lispref/positions.texi
+++ b/doc/lispref/positions.texi
@@ -500,7 +500,11 @@ is negative, it moves up instead.
The @var{count} argument can be a cons cell, @code{(@var{cols}
. @var{lines})}, instead of an integer. Then the function moves by
@var{lines} screen lines, and puts point @var{cols} columns from the
-start of that screen line.
+visual start of that screen line. Note that @var{cols} are counted
+from the @emph{visual} start of the line; if the window is scrolled
+horizontally (@pxref{Horizontal Scrolling}), the column on which point
+will end is in addition to the number of columns by which the text is
+scrolled.
The return value is the number of screen lines over which point was
moved. The value may be less in absolute value than @var{count} if
diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog
index a6ddb15496d..a1a99e5fd06 100644
--- a/doc/misc/ChangeLog
+++ b/doc/misc/ChangeLog
@@ -1,3 +1,12 @@
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * autotype.texi (Skeleton Language): Document the feature of \n
+ when at eol.
+
+2014-06-21 Michael Albinus <michael.albinus@gmx.de>
+
+ * dbus.texi (Type Conversion): Formatting edits in example.
+
2014-06-15 Michael Albinus <michael.albinus@gmx.de>
Sync with Tramp 2.2.10.
diff --git a/doc/misc/autotype.texi b/doc/misc/autotype.texi
index 04f74cc44cb..e0fce74bd3f 100644
--- a/doc/misc/autotype.texi
+++ b/doc/misc/autotype.texi
@@ -232,8 +232,11 @@ Insert string or character. Literal strings and characters are passed through
@code{skeleton-transformation} when that is non-@code{nil}.
@item @code{?\n}
@c ??? something seems very wrong here.
-Insert a newline and align under current line. Use newline character
-@code{?\n} to prevent alignment.
+Insert a newline and align under current line, but not if this is the
+last element of a skeleton and the newline would be inserted at end of
+line. Use newline character @code{?\n} to prevent alignment. Use
+@code{"\n"} as the last string element of a skeleton to insert a
+newline after the skeleton unconditionally.
@item @code{_}
Interesting point. When wrapping skeletons around successive regions, they are
put at these places. Point is left at first @code{_} where nothing is wrapped.
diff --git a/doc/misc/dbus.texi b/doc/misc/dbus.texi
index e7f822498b6..0c19cb963e7 100644
--- a/doc/misc/dbus.texi
+++ b/doc/misc/dbus.texi
@@ -1060,11 +1060,11 @@ elements of this array. Example:
"" ;; No icon.
"Notification summary" ;; Summary.
(format ;; Body.
- "This is a test notification, raised from %s" (emacs-version))
+ "This is a test notification, raised from\n%S" (emacs-version))
'(:array) ;; No actions (empty array of strings).
'(:array :signature "@{sv@}") ;; No hints
;; (empty array of dictionary entries).
- :int32 -1) ;; Default timeout.
+ :int32 -1) ;; Default timeout.
@result{} 3
@end lisp
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index d8146a96312..95c3566dd5b 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,98 @@
+2014-06-21 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ Fix completion retrieval parsing (bug#17209).
+ * progmodes/python.el (python-mode):
+ (python-util-strip-string): New function.
+ (python-shell-completion-get-completions): Use it.
+
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * skeleton.el (skeleton-insert): Fix last change.
+
+2014-06-21 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ Enhancements for outline integration (bug#17796).
+ * progmodes/python.el (python-mode): Properly set
+ outline-heading-end-regexp so that comments after colons for
+ defuns are supported.
+
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * skeleton.el (skeleton-insert): Doc fix.
+
+2014-06-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/smie.el (smie-config--guess): Fix typo.
+ (smie-config-guess): Use smie-config-local so the rules are obeyed
+ (bug#17818).
+
+ * mouse.el (mouse-drag-line): Don't re-add to unread-comment-events,
+ since it's already done inside the loop (bug#17819).
+
+2014-06-21 Martin Rudalics <rudalics@gmx.at>
+
+ * mouse.el (mouse-drag-line): Re-remove code initially removed
+ on 2013-03-09 and inadvertently reintroduced on 2013-11-30
+ (Bug#17819).
+
+2014-06-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/sh-script.el (sh-smie-sh-rules): For { after &&, don't
+ align with the surrounding parent (bug#17721).
+
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * textmodes/texinfo.el (texinfo-mode): Set skeleton-end-newline
+ locally to nil.
+ (texinfo-insert-block, texinfo-insert-@end)
+ (texinfo-insert-@example, texinfo-insert-@quotation): Adjust to
+ local setting of skeleton-end-newline by adding an explicit \n to
+ the skeletons where appropriate. (Bug#17801)
+
+2014-06-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/smie.el (smie--hanging-eolp-function): New var.
+ (smie-indent--hanging-p): Use it.
+ * progmodes/sh-script.el (sh-set-shell): Set it (bug#17621).
+
+2014-06-21 Leo Liu <sdl.web@gmail.com>
+
+ * simple.el (read-quoted-char): Don't let help chars pop up help
+ buffer. (Bug#16617)
+
+2014-06-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/sh-script.el (sh-smie-sh-rules): Use same rule for && as
+ for | (bug#17621).
+
+ * xt-mouse.el (xterm-mouse--read-event-sequence-1000):
+ Drop unknown events instead of burping.
+
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * term/w32-win.el (dynamic-library-alist): Support giflib 5.1.0
+ and later. (Bug#17790)
+
+2014-06-21 Juri Linkov <juri@jurta.org>
+
+ * dired.el (dired-mark-pop-up): Let-bind display-buffer-mark-dedicated
+ to `soft'. (Bug#17554)
+
+2014-06-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * delsel.el (electric-newline-and-maybe-indent): Mark it as well
+ (bug#17737).
+
+2014-06-21 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-font-lock-keywords): Don't fontify
+ `!' in `!~' with `font-lock-negation-char-face'. (Bug#17732)
+
+2014-06-21 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/dbus.el (dbus-call-method): Push only non D-Bus events into
+ `unread-command-events'.
+
2014-06-19 William Xu <william.xwl@gmail.com>
* progmodes/hideif.el (hif-string-to-number): Don't return float for
diff --git a/lisp/delsel.el b/lisp/delsel.el
index ab71e606444..1ada02705fe 100644
--- a/lisp/delsel.el
+++ b/lisp/delsel.el
@@ -188,6 +188,7 @@ See `delete-selection-helper'."
(put 'reindent-then-newline-and-indent 'delete-selection t)
(put 'newline-and-indent 'delete-selection t)
(put 'newline 'delete-selection t)
+(put 'electric-newline-and-maybe-indent 'delete-selection t)
(put 'open-line 'delete-selection 'kill)
;; This is very useful for canceling a selection in the minibuffer without
diff --git a/lisp/dired.el b/lisp/dired.el
index fc90b7a98e0..a241fb3b339 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -3099,7 +3099,10 @@ argument or confirmation)."
;; If FILES defaulted to the current line's file.
(= (length files) 1))
(apply function args)
- (let ((buffer (get-buffer-create (or buffer-or-name " *Marked Files*"))))
+ (let ((buffer (get-buffer-create (or buffer-or-name " *Marked Files*")))
+ ;; Mark *Marked Files* window as softly-dedicated, to prevent
+ ;; other buffers e.g. *Completions* from reusing it (bug#17554).
+ (display-buffer-mark-dedicated 'soft))
(with-current-buffer buffer
(with-current-buffer-window
buffer
diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el
index 3e40d37aacf..1819daa3df0 100644
--- a/lisp/emacs-lisp/smie.el
+++ b/lisp/emacs-lisp/smie.el
@@ -1155,6 +1155,15 @@ NUMBER offset by NUMBER, relative to a base token
The functions whose name starts with \"smie-rule-\" are helper functions
designed specifically for use in this function.")
+(defvar smie--hanging-eolp-function
+ ;; FIXME: This is a quick hack for 24.4. Don't document it and replace with
+ ;; a well-defined function with a cleaner interface instead!
+ (lambda ()
+ (skip-chars-forward " \t")
+ (or (eolp)
+ (and ;; (looking-at comment-start-skip) ;(bug#16041).
+ (forward-comment (point-max))))))
+
(defalias 'smie-rule-hanging-p 'smie-indent--hanging-p)
(defun smie-indent--hanging-p ()
"Return non-nil if the current token is \"hanging\".
@@ -1168,10 +1177,7 @@ the beginning of a line."
(not (eobp))
;; Could be an open-paren.
(forward-char 1))
- (skip-chars-forward " \t")
- (or (eolp)
- (and ;; (looking-at comment-start-skip) ;(bug#16041).
- (forward-comment (point-max))))
+ (funcall smie--hanging-eolp-function)
(point))))))
(defalias 'smie-rule-bolp 'smie-indent--bolp)
@@ -2132,7 +2138,7 @@ position corresponding to each rule."
nil
(push (cons (+ offset (nth 2 sig)) sig) rules)
;; Adjust the rest of the data.
- (pcase-dolist ((and cotrace `(,count ,toffset ,trace))
+ (pcase-dolist ((and cotrace `(,count ,toffset . ,trace))
cotraces)
(setf (nth 1 cotrace) (- toffset offset))
(dolist (sig trace)
@@ -2161,15 +2167,14 @@ To save the result for future sessions, use `smie-config-save'."
(cond
((null config) (message "Nothing to change"))
((null smie-config--buffer-local)
- (message "Local rules set")
- (setq smie-config--buffer-local config))
+ (smie-config-local config)
+ (message "Local rules set"))
((y-or-n-p "Replace existing local config? ")
(message "Local rules replaced")
- (setq smie-config--buffer-local config))
+ (smie-config-local config))
((y-or-n-p "Merge with existing local config? ")
(message "Local rules adjusted")
- (setq smie-config--buffer-local
- (append config smie-config--buffer-local)))
+ (smie-config-local (append config smie-config--buffer-local)))
(t
(message "Rules guessed: %S" config)))))
diff --git a/lisp/mouse.el b/lisp/mouse.el
index ca9ea5dadca..f5a09f45a07 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -390,8 +390,6 @@ must be one of the symbols `header', `mode', or `vertical'."
(window (posn-window start))
(frame (window-frame window))
(minibuffer-window (minibuffer-window frame))
- (on-link (and mouse-1-click-follows-link
- (mouse-on-link-p start)))
(side (and (eq line 'vertical)
(or (cdr (assq 'vertical-scroll-bars
(frame-parameters frame)))
@@ -487,15 +485,7 @@ must be one of the symbols `header', `mode', or `vertical'."
(unless (zerop growth)
(setq dragged t)
(adjust-window-trailing-edge
- window (if (eq line 'mode) growth (- growth)) nil t))))))
- ;; Process the terminating event.
- (when (and (mouse-event-p event) on-link (not dragged)
- (mouse--remap-link-click-p start-event event))
- ;; If mouse-2 has never been done by the user, it doesn't have
- ;; the necessary property to be interpreted correctly.
- (put 'mouse-2 'event-kind 'mouse-click)
- (setcar event 'mouse-2)
- (push event unread-command-events))))
+ window (if (eq line 'mode) growth (- growth)) nil t))))))))
(defun mouse-drag-mode-line (start-event)
"Change the height of a window by dragging on the mode line."
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
index 7f230a9d2ab..66170dafef8 100644
--- a/lisp/net/dbus.el
+++ b/lisp/net/dbus.el
@@ -318,10 +318,12 @@ object is returned instead of a list containing this single Lisp object.
(while (eq (car result) :pending)
(let ((event (let ((inhibit-redisplay t) unread-command-events)
(read-event nil nil check-interval))))
- (when event
- (setf unread-command-events
- (nconc unread-command-events
- (cons event nil))))
+ (when event
+ (if (ignore-errors (dbus-check-event event))
+ (setf result (gethash key dbus-return-values-table))
+ (setf unread-command-events
+ (nconc unread-command-events
+ (cons event nil)))))
(when (< check-interval 1)
(setf check-interval (* check-interval 1.05))))))
(when (eq (car result) :error)
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 91a85526420..743981b3714 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -2461,8 +2461,10 @@ LINE is used to detect the context on how to complete given INPUT."
(and completion-code
(> (length input) 0)
(with-current-buffer (process-buffer process)
- (let ((completions (python-shell-send-string-no-output
- (format completion-code input) process)))
+ (let ((completions
+ (python-util-strip-string
+ (python-shell-send-string-no-output
+ (format completion-code input) process))))
(and (> (length completions) 2)
(split-string completions
"^'\\|^\"\\|;\\|'$\\|\"$" t)))))))
@@ -3648,6 +3650,14 @@ returned as is."
n (1- n)))
(reverse acc))))
+(defun python-util-strip-string (string)
+ "Strip STRING whitespace and newlines from end and beginning."
+ (replace-regexp-in-string
+ (rx (or (: string-start (* (any whitespace ?\r ?\n)))
+ (: (* (any whitespace ?\r ?\n)) string-end)))
+ ""
+ string))
+
(defun python-electric-pair-string-delimiter ()
(when (and electric-pair-mode
@@ -3736,7 +3746,7 @@ returned as is."
(set (make-local-variable 'outline-regexp)
(python-rx (* space) block-start))
- (set (make-local-variable 'outline-heading-end-regexp) ":\\s-*\n")
+ (set (make-local-variable 'outline-heading-end-regexp) ":[^\n]*\n")
(set (make-local-variable 'outline-level)
#'(lambda ()
"`outline-level' function for Python mode."
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 74edf7a680f..3c20279600e 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -2152,7 +2152,7 @@ See `font-lock-syntax-table'.")
(ruby-match-expression-expansion
2 font-lock-variable-name-face t)
;; Negation char.
- ("\\(?:^\\|[^[:alnum:]_]\\)\\(!+\\)[^=]"
+ ("\\(?:^\\|[^[:alnum:]_]\\)\\(!+\\)[^=~]"
1 font-lock-negation-char-face)
;; Character literals.
;; FIXME: Support longer escape sequences.
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index b4148ef5621..c3032b4f195 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -1975,7 +1975,11 @@ May return nil if the line should not be treated as continued."
(<= indent initial))
`(column . ,(+ initial sh-indentation)))))
(`(:before . ,(or `"(" `"{" `"["))
- (if (smie-rule-hanging-p) (smie-rule-parent)))
+ (when (smie-rule-hanging-p)
+ (if (not (smie-rule-prev-p "&&" "||" "|"))
+ (smie-rule-parent)
+ (smie-backward-sexp 'halfexp)
+ `(column . ,(smie-indent-virtual)))))
;; FIXME: Maybe this handling of ;; should be made into
;; a smie-rule-terminator function that takes the substitute ";" as arg.
(`(:before . ,(or `";;" `";&" `";;&"))
@@ -1993,7 +1997,7 @@ May return nil if the line should not be treated as continued."
(smie-rule-bolp))))
(current-column)
(smie-indent-calculate)))))
- (`(:after . "|") (if (smie-rule-parent-p "|") nil 4))
+ (`(:after . ,(or `"|" `"&&" `"||")) (if (smie-rule-parent-p token) nil 4))
;; Attempt at backward compatibility with the old config variables.
(`(:before . "fi") (sh-var-value 'sh-indent-for-fi))
(`(:before . "done") (sh-var-value 'sh-indent-for-done))
@@ -2300,6 +2304,11 @@ Calls the value of `sh-set-shell-hook' if set."
(let ((mksym (lambda (name)
(intern (format "sh-smie-%s-%s"
sh-indent-supported-here name)))))
+ (add-function :around (local 'smie--hanging-eolp-function)
+ (lambda (orig)
+ (if (looking-at "[ \t]*\\\\\n")
+ (goto-char (match-end 0))
+ (funcall orig))))
(smie-setup (symbol-value (funcall mksym "grammar"))
(funcall mksym "rules")
:forward-token (funcall mksym "forward-token")
diff --git a/lisp/simple.el b/lisp/simple.el
index 031aac3a49c..63bfbb51419 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -658,11 +658,16 @@ any other terminator is used itself as input.
The optional argument PROMPT specifies a string to use to prompt the user.
The variable `read-quoted-char-radix' controls which radix to use
for numeric input."
- (let ((message-log-max nil) done (first t) (code 0) translated)
+ (let ((message-log-max nil)
+ (help-events (delq nil (mapcar (lambda (c) (unless (characterp c) c))
+ help-event-list)))
+ done (first t) (code 0) translated)
(while (not done)
(let ((inhibit-quit first)
- ;; Don't let C-h get the help message--only help function keys.
+ ;; Don't let C-h or other help chars get the help
+ ;; message--only help function keys. See bug#16617.
(help-char nil)
+ (help-event-list help-events)
(help-form
"Type the special character you want to use,
or the octal character code.
diff --git a/lisp/skeleton.el b/lisp/skeleton.el
index f85dc8ef068..28792ac558e 100644
--- a/lisp/skeleton.el
+++ b/lisp/skeleton.el
@@ -197,7 +197,8 @@ not needed, a prompt-string or an expression for complex read functions.
If ELEMENT is a string or a character it gets inserted (see also
`skeleton-transformation-function'). Other possibilities are:
- \\n go to next line and indent according to mode
+ \\n if not the last element of the skeleton, or not at eol,
+ go to next line and indent according to mode
_ interesting point, interregion here
- interesting point, no interregion interaction, overrides
interesting point set by _
@@ -212,6 +213,10 @@ If ELEMENT is a string or a character it gets inserted (see also
After termination, point will be positioned at the last occurrence of -
or at the first occurrence of _ or at the end of the inserted text.
+Note that \\n as the last element of the skeleton only inserts a
+newline if not at eol. If you want to unconditionally insert a newline
+at the end of the skeleton, use \"\\n\" instead.
+
Further elements can be defined via `skeleton-further-elements'.
ELEMENT may itself be a SKELETON with an INTERACTOR. The user is prompted
repeatedly for different inputs. The SKELETON is processed as often as
diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el
index e2cabe5397d..e103562ba7a 100644
--- a/lisp/term/w32-win.el
+++ b/lisp/term/w32-win.el
@@ -251,13 +251,16 @@ This returns an error if any Emacs frames are X frames, or always under W32."
;; libraries according to the version of giflib we were
;; compiled against. (If we were compiled without GIF support,
;; libgif-version's value is -1.)
- (if (>= libgif-version 50000)
- ;; Yes, giflib 5.x uses 6 as the major version of the API,
- ;; thus "libgif-6.dll" below (giflib 4.x used 5 as the
- ;; major API version).
- ;; giflib5.dll is from the lua-files project.
- '(gif "libgif-6.dll" "giflib5.dll")
- '(gif "libgif-5.dll" "giflib4.dll" "libungif4.dll" "libungif.dll"))
+ (if (>= libgif-version 50100)
+ ;; Yes, giflib 5.0 uses 6 as the major version of the API,
+ ;; and giflib 5.1 uses 7, thus "libgif-7.dll" and
+ ;; "libgif-6.dll" below (giflib 4.x used 5 as the major API
+ ;; version). giflib5.dll is from the lua-files project,
+ ;; and gif.dll is from luapower.
+ '(gif "libgif-7.dll")
+ (if (>= libgif-version 50000)
+ '(gif "libgif-6.dll" "giflib5.dll" "gif.dll")
+ '(gif "libgif-5.dll" "giflib4.dll" "libungif4.dll" "libungif.dll")))
'(svg "librsvg-2-2.dll")
'(gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
'(glib "libglib-2.0-0.dll")
diff --git a/lisp/term/xterm.el b/lisp/term/xterm.el
index 20d4d415254..1d085017214 100644
--- a/lisp/term/xterm.el
+++ b/lisp/term/xterm.el
@@ -606,8 +606,8 @@ The relevant features are:
;; Gnome terminal 2.32.1 reports 1;2802;0
(setq version 200))
(when (equal (match-string 1 str) "83")
- ;; OSX's Terminal.app (version 2.3 (309), which returns 83;40003;0)
- ;; seems to also lack support for some of these (bug#17607).
+ ;; `screen' (which returns 83;40003;0) seems to also lack support for
+ ;; some of these (bug#17607).
(setq version 240))
;; If version is 242 or higher, assume the xterm supports
;; reporting the background color (TODO: maybe earlier
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index e1e2656275c..6f441d67b3c 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -44,6 +44,8 @@
(defvar outline-heading-alist)
+(defvar skeleton-end-newline)
+
(defgroup texinfo nil
"Texinfo Mode."
:link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces)
@@ -626,6 +628,11 @@ value of `texinfo-mode-hook'."
(setq-local tex-first-line-header-regexp "^\\\\input")
(setq-local tex-trailer "@bye\n")
+ ;; Prevent skeleton.el from adding a newline to each inserted
+ ;; skeleton. Those which do want a newline do that explicitly in
+ ;; their define-skeleton form.
+ (setq-local skeleton-end-newline nil)
+
;; Prevent filling certain lines, in addition to ones specified by
;; the user.
(setq-local auto-fill-inhibit-regexp
@@ -653,7 +660,7 @@ Puts point on a blank line between them."
(if (or (string-match "\\`def" str)
(member str '("table" "ftable" "vtable")))
'(nil " " -))
- \n _ \n "@end " str \n)
+ \n _ \n "@end " str \n \n)
(defun texinfo-inside-macro-p (macro &optional bound)
"Non-nil if inside a macro matching the regexp MACRO."
@@ -732,7 +739,7 @@ With prefix argument or inside @code or @example, inserts a plain \"."
(backward-word 1)
(texinfo-last-unended-begin)
(or (match-string 1) '-)))
- \n "@end " str \n)
+ \n "@end " str \n \n)
(define-skeleton texinfo-insert-braces
"Make a pair of braces and be poised to type inside of them.
@@ -771,7 +778,7 @@ The default is not to surround any existing words with the braces."
(define-skeleton texinfo-insert-@example
"Insert the string `@example' in a Texinfo buffer."
nil
- \n "@example" \n)
+ \n "@example" \n \n)
(define-skeleton texinfo-insert-@file
"Insert a `@file{...}' command in a Texinfo buffer.
@@ -816,7 +823,7 @@ Leave point after `@node'."
(define-skeleton texinfo-insert-@quotation
"Insert the string `@quotation' in a Texinfo buffer."
- \n "@quotation" \n)
+ \n "@quotation" \n _ \n)
(define-skeleton texinfo-insert-@samp
"Insert a `@samp{...}' command in a Texinfo buffer.
diff --git a/lisp/window.el b/lisp/window.el
index e9f4fd0b1d2..28dd6a8ab26 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -5966,7 +5966,7 @@ live."
;; FIXME: By the way, there could be more levels of dedication:
;; - `barely' dedicated doesn't prevent reuse of the window, only records that
;; the window hasn't been used for something else yet.
-;; - `softly' dedicated only allows reuse when asked explicitly.
+;; - `soft' (`softly') dedicated only allows reuse when asked explicitly.
;; - `strongly' never allows reuse.
(defvar display-buffer-mark-dedicated nil
"If non-nil, `display-buffer' marks the windows it creates as dedicated.
diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el
index 54fd1a44d5b..f9e89880dae 100644
--- a/lisp/xt-mouse.el
+++ b/lisp/xt-mouse.el
@@ -145,26 +145,25 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)."
(defun xterm-mouse--read-event-sequence-1000 ()
(let* ((code (- (read-event) 32))
(type
- (intern
- ;; For buttons > 3, the release-event looks differently
- ;; (see xc/programs/xterm/button.c, function EditorButton),
- ;; and come in a release-event only, no down-event.
- (cond ((>= code 64)
- (format "mouse-%d" (- code 60)))
- ((memq code '(8 9 10))
- (format "M-down-mouse-%d" (- code 7)))
- ((memq code '(3 11))
- (let ((down (car (terminal-parameter
- nil 'xterm-mouse-last-down))))
- (when (and down (string-match "[0-9]" (symbol-name down)))
- (format (if (eq code 3) "mouse-%s" "M-mouse-%s")
- (match-string 0 (symbol-name down))))))
- ((memq code '(0 1 2))
- (format "down-mouse-%d" (+ 1 code))))))
+ ;; For buttons > 3, the release-event looks differently
+ ;; (see xc/programs/xterm/button.c, function EditorButton),
+ ;; and come in a release-event only, no down-event.
+ (cond ((>= code 64)
+ (format "mouse-%d" (- code 60)))
+ ((memq code '(8 9 10))
+ (format "M-down-mouse-%d" (- code 7)))
+ ((memq code '(3 11))
+ (let ((down (car (terminal-parameter
+ nil 'xterm-mouse-last-down))))
+ (when (and down (string-match "[0-9]" (symbol-name down)))
+ (format (if (eq code 3) "mouse-%s" "M-mouse-%s")
+ (match-string 0 (symbol-name down))))))
+ ((memq code '(0 1 2))
+ (format "down-mouse-%d" (+ 1 code)))))
(x (- (read-event) 33))
(y (- (read-event) 33)))
(and type (wholenump x) (wholenump y)
- (list type x y))))
+ (list (intern type) x y))))
;; XTerm's 1006-mode terminal mouse click reporting has the form
;; <BUTTON> ; <X> ; <Y> <M or m>, where the button and ordinates are
diff --git a/src/ChangeLog b/src/ChangeLog
index 94f4444d38c..c845568ddcf 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,42 @@
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * indent.c (Fvertical_motion): Doc fix.
+ Move to the goal column, if any, with a single call to
+ move_it_in_display_line, not in two calls. Doing this with two
+ calls causes move_it_in_display_line apply the line-prefix
+ handling twice instead of just once. (Bug#17823)
+
+2014-06-21 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port to OS X ACLs (Bug#17810).
+ * fileio.c (Ffile_acl): Port to OS X, where acl_get_file (...,
+ ACL_TYPE_ACCESS) doesn't work.
+
+2014-06-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * keyboard.c (read_key_sequence): Don't invoke Vprefix_help_command
+ before checking key-translation-map (bug#17659).
+
+2014-06-21 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * font.c (font_make_object): Avoid dangling pointer which may
+ crash GC (Bug#17771).
+
+2014-06-21 Eli Zaretskii <eliz@gnu.org>
+
+ * image.c [5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)]: Declare the
+ prototype of DGifCloseFile as appropriate for older and newer
+ versions of giflib.
+ (gif_close): New function, encapsulates the differences in the
+ calling sequence of DGifCloseFile before v5.1.0 and after it.
+ (gif_load): Call gif_close instead of DGifCloseFile. Divulge the
+ error string where appropriate. (Bug#17790)
+
+ * xdisp.c (Fmove_point_visually): Instead of testing for keyboard
+ macro execution, make sure point didn't move since last complete
+ redisplay, as the condition for using the glyph matrix
+ information. (Bug#17777)
+
2014-06-19 Dmitry Antipov <dmantipov@yandex.ru>
Minor cleanup of fonset code.
diff --git a/src/dispextern.h b/src/dispextern.h
index e710f8e35d7..5396aeb6c8e 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -2591,7 +2591,8 @@ struct it
int vpos;
/* Horizontal matrix position reached in move_it_in_display_line.
- Only set there, not in display_line. */
+ Only set there, not in display_line, and only when the X
+ coordinate is past first_visible_x. */
int hpos;
/* Left fringe bitmap number (enum fringe_bitmap_type). */
diff --git a/src/fileio.c b/src/fileio.c
index 6fe11303ded..c7736661207 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3013,6 +3013,9 @@ was unable to determine the ACL entries. */)
acl_t acl;
Lisp_Object acl_string;
char *str;
+# ifndef HAVE_ACL_TYPE_EXTENDED
+ acl_type_t ACL_TYPE_EXTENDED = ACL_TYPE_ACCESS;
+# endif
#endif
absname = expand_and_dir_to_file (filename,
@@ -3027,7 +3030,7 @@ was unable to determine the ACL entries. */)
#ifdef HAVE_ACL_SET_FILE
absname = ENCODE_FILE (absname);
- acl = acl_get_file (SSDATA (absname), ACL_TYPE_ACCESS);
+ acl = acl_get_file (SSDATA (absname), ACL_TYPE_EXTENDED);
if (acl == NULL)
return Qnil;
diff --git a/src/font.c b/src/font.c
index 9e472fb3e3b..251d43ba8b2 100644
--- a/src/font.c
+++ b/src/font.c
@@ -207,6 +207,9 @@ font_make_object (int size, Lisp_Object entity, int pixelsize)
= (struct font *) allocate_pseudovector (size, FONT_OBJECT_MAX, PVEC_FONT);
int i;
+ /* GC can happen before the driver is set up,
+ so avoid dangling pointer here (Bug#17771). */
+ font->driver = NULL;
XSETFONT (font_object, font);
if (! NILP (entity))
diff --git a/src/image.c b/src/image.c
index 3220a45a282..f8c2402bfc4 100644
--- a/src/image.c
+++ b/src/image.c
@@ -7250,7 +7250,11 @@ gif_image_p (Lisp_Object object)
#ifdef WINDOWSNT
/* GIF library details. */
+#if 5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)
+DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *, int *));
+#else
DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *));
+#endif
DEF_IMGLIB_FN (int, DGifSlurp, (GifFileType *));
#if GIFLIB_MAJOR < 5
DEF_IMGLIB_FN (GifFileType *, DGifOpen, (void *, InputFunc));
@@ -7320,6 +7324,22 @@ gif_read_from_memory (GifFileType *file, GifByteType *buf, int len)
return len;
}
+static int
+gif_close (GifFileType *gif, int *err)
+{
+ int retval;
+
+#if 5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)
+ retval = fn_DGifCloseFile (gif, err);
+#else
+ retval = fn_DGifCloseFile (gif);
+#if GIFLIB_MAJOR >= 5
+ if (err)
+ *err = gif->Error;
+#endif
+#endif
+ return retval;
+}
/* Load GIF image IMG for use on frame F. Value is true if
successful. */
@@ -7344,9 +7364,7 @@ gif_load (struct frame *f, struct image *img)
Lisp_Object specified_data = image_spec_value (img->spec, QCdata, NULL);
unsigned long bgcolor = 0;
EMACS_INT idx;
-#if GIFLIB_MAJOR >= 5
int gif_err;
-#endif
if (NILP (specified_data))
{
@@ -7414,7 +7432,7 @@ gif_load (struct frame *f, struct image *img)
if (!check_image_size (f, gif->SWidth, gif->SHeight))
{
image_error ("Invalid image size (see `max-image-size')", Qnil, Qnil);
- fn_DGifCloseFile (gif);
+ gif_close (gif, NULL);
return 0;
}
@@ -7423,7 +7441,7 @@ gif_load (struct frame *f, struct image *img)
if (rc == GIF_ERROR || gif->ImageCount <= 0)
{
image_error ("Error reading `%s'", img->spec, Qnil);
- fn_DGifCloseFile (gif);
+ gif_close (gif, NULL);
return 0;
}
@@ -7435,7 +7453,7 @@ gif_load (struct frame *f, struct image *img)
{
image_error ("Invalid image number `%s' in image `%s'",
image_number, img->spec);
- fn_DGifCloseFile (gif);
+ gif_close (gif, NULL);
return 0;
}
}
@@ -7453,7 +7471,7 @@ gif_load (struct frame *f, struct image *img)
if (!check_image_size (f, width, height))
{
image_error ("Invalid image size (see `max-image-size')", Qnil, Qnil);
- fn_DGifCloseFile (gif);
+ gif_close (gif, NULL);
return 0;
}
@@ -7471,7 +7489,7 @@ gif_load (struct frame *f, struct image *img)
&& 0 <= subimg_left && subimg_left <= width - subimg_width))
{
image_error ("Subimage does not fit in image", Qnil, Qnil);
- fn_DGifCloseFile (gif);
+ gif_close (gif, NULL);
return 0;
}
}
@@ -7479,7 +7497,7 @@ gif_load (struct frame *f, struct image *img)
/* Create the X image and pixmap. */
if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0))
{
- fn_DGifCloseFile (gif);
+ gif_close (gif, NULL);
return 0;
}
@@ -7650,7 +7668,18 @@ gif_load (struct frame *f, struct image *img)
Fcons (make_number (gif->ImageCount),
img->lisp_data));
- fn_DGifCloseFile (gif);
+ if (gif_close (gif, &gif_err) == GIF_ERROR)
+ {
+#if 5 <= GIFLIB_MAJOR
+ char *error_text = fn_GifErrorString (gif_err);
+
+ if (error_text)
+ image_error ("Error closing `%s': %s",
+ img->spec, build_string (error_text));
+#else
+ image_error ("Error closing `%s'", img->spec, Qnil);
+#endif
+ }
/* Maybe fill in the background field while we have ximg handy. */
if (NILP (image_spec_value (img->spec, QCbackground, NULL)))
diff --git a/src/indent.c b/src/indent.c
index dc862518924..711792f75cd 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -1944,9 +1944,12 @@ The optional second argument WINDOW specifies the window to use for
parameters such as width, horizontal scrolling, and so on.
The default is to use the selected window's parameters.
-LINES can optionally take the form (COLS . LINES), in which case
-the motion will not stop at the start of a screen line but on
-its column COLS (if such exists on that line, that is).
+LINES can optionally take the form (COLS . LINES), in which case the
+motion will not stop at the start of a screen line but COLS column
+from the visual start of the line (if such exists on that line, that
+is). If the line is scrolled horizontally, COLS is interpreted
+visually, i.e., as addition to the columns of text beyond the left
+edge of the window.
`vertical-motion' always uses the current buffer,
regardless of which buffer is displayed in WINDOW.
@@ -2126,20 +2129,14 @@ whether or not it is currently displayed in some window. */)
}
}
- /* Move to the goal column, if one was specified. */
+ /* Move to the goal column, if one was specified. If the window
+ was originally hscrolled, the goal column is interpreted as
+ an addition to the hscroll amount. */
if (!NILP (lcols))
{
- /* If the window was originally hscrolled, move forward by
- the hscrolled amount first. */
- if (first_x > 0)
- {
- move_it_in_display_line (&it, ZV, first_x, MOVE_TO_X);
- it.current_x = 0;
- }
- move_it_in_display_line
- (&it, ZV,
- (int)(cols * FRAME_COLUMN_WIDTH (XFRAME (w->frame)) + 0.5),
- MOVE_TO_X);
+ int to_x = (int)(cols * FRAME_COLUMN_WIDTH (XFRAME (w->frame)) + 0.5);
+
+ move_it_in_display_line (&it, ZV, first_x + to_x, MOVE_TO_X);
}
SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it));
diff --git a/src/keyboard.c b/src/keyboard.c
index 3e5e405d66e..1da300b77cc 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2181,7 +2181,7 @@ show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object,
-/* Input of single characters from keyboard */
+/* Input of single characters from keyboard. */
static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, bool *used_mouse_menu,
struct timespec *end_time);
@@ -9382,16 +9382,6 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
first_unbound = min (t, first_unbound);
head = EVENT_HEAD (key);
- if (help_char_p (head) && t > 0)
- {
- read_key_sequence_cmd = Vprefix_help_command;
- keybuf[t++] = key;
- last_nonmenu_event = key;
- /* The Microsoft C compiler can't handle the goto that
- would go here. */
- dummyflag = 1;
- break;
- }
if (SYMBOLP (head))
{
@@ -9649,6 +9639,17 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
goto replay_sequence;
}
+
+ if (NILP (current_binding)
+ && help_char_p (EVENT_HEAD (key)) && t > 1)
+ {
+ read_key_sequence_cmd = Vprefix_help_command;
+ /* The Microsoft C compiler can't handle the goto that
+ would go here. */
+ dummyflag = 1;
+ break;
+ }
+
/* If KEY is not defined in any of the keymaps,
and cannot be part of a function key or translation,
and is a shifted function key,
diff --git a/src/xdisp.c b/src/xdisp.c
index 70e4d1b5e59..8711487780c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -15790,7 +15790,7 @@ set_vertical_scroll_bar (struct window *w)
redisplay itself, when it decides that the previous window start
point is fine and should be kept. Search for "goto force_start"
below to see the details. Like the values of window-start
- specified outside of redisply, these internally deduced values
+ specified outside of redisplay, these internally-deduced values
are tested for feasibility, and ignored if found to be
unfeasible.
@@ -20741,12 +20741,15 @@ Value is the new character position of point. */)
recorded in the glyphs, at least as long as the goal is on the
screen. */
if (w->window_end_valid
- && NILP (Vexecuting_kbd_macro)
&& !windows_or_buffers_changed
&& b
&& !b->clip_changed
&& !b->prevent_redisplay_optimizations_p
&& !window_outdated (w)
+ /* We rely below on the cursor coordinates to be up to date, but
+ we cannot trust them if some command moved point since the
+ last complete redisplay. */
+ && w->last_point == BUF_PT (b)
&& w->cursor.vpos >= 0
&& w->cursor.vpos < w->current_matrix->nrows
&& (row = MATRIX_ROW (w->current_matrix, w->cursor.vpos))->enabled_p)
diff --git a/test/ChangeLog b/test/ChangeLog
index 716e42ed95d..b90f47631bc 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,7 @@
+2014-06-21 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ * automated/python-tests.el (python-util-strip-string-1): New test.
+
2014-06-15 Michael Albinus <michael.albinus@gmx.de>
Sync with Tramp 2.2.10.
diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el
index de963a670bc..f580e946b8f 100644
--- a/test/automated/python-tests.el
+++ b/test/automated/python-tests.el
@@ -2706,6 +2706,15 @@ def foo(a, b, c):
(equal (symbol-value (car ccons)) (cdr ccons)))))
(kill-buffer buffer)))
+(ert-deftest python-util-strip-string-1 ()
+ (should (string= (python-util-strip-string "\t\r\n str") "str"))
+ (should (string= (python-util-strip-string "str \n\r") "str"))
+ (should (string= (python-util-strip-string "\t\r\n str \n\r ") "str"))
+ (should
+ (string= (python-util-strip-string "\n str \nin \tg \n\r") "str \nin \tg"))
+ (should (string= (python-util-strip-string "\n \t \n\r ") ""))
+ (should (string= (python-util-strip-string "") "")))
+
;;; Electricity
diff --git a/test/indent/shell.sh b/test/indent/shell.sh
index fdf736e06be..8e831bb8f11 100755
--- a/test/indent/shell.sh
+++ b/test/indent/shell.sh
@@ -23,6 +23,24 @@ case $X in
;;
esac
+{ # bug#17621
+ foo1 &&
+ foo2 &&
+ bar
+
+ foo1 && \
+ foo2 && \
+ bar
+}
+
+for foo in bar; do # bug#17721
+ [ -e $foo ] && {
+ echo t
+ } && {
+ echo r
+ }
+done
+
echo -n $(( 5 << 2 ))
# This should not be treated as a heredoc (bug#12770).
2