summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-07-27 17:15:43 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2011-07-27 17:15:43 -0700
commit2573a8376a387d19af355f68622512ac3e07d57a (patch)
tree1ffa01d9e12395ebbb8c3f3181d3b9ffdc8c1487
parent49b602e24ecb3fe085d45ac385e1bfda82252090 (diff)
parentdbf38e02c9ade4979418f24a99962cfef170b957 (diff)
Merge from trunk.
-rw-r--r--ChangeLog8
-rw-r--r--GNUmakefile77
-rw-r--r--doc/lispref/ChangeLog4
-rw-r--r--doc/lispref/display.texi130
-rw-r--r--leim/ChangeLog7
-rw-r--r--leim/quail/hebrew.el882
-rw-r--r--lisp/ChangeLog79
-rw-r--r--lisp/calendar/icalendar.el15
-rw-r--r--lisp/gnus/ChangeLog19
-rw-r--r--lisp/gnus/gnus-sum.el55
-rw-r--r--lisp/gnus/nnimap.el30
-rw-r--r--lisp/gnus/nnir.el11
-rw-r--r--lisp/gnus/shr.el3
-rw-r--r--lisp/image.el4
-rw-r--r--lisp/net/rcirc.el37
-rw-r--r--lisp/net/tramp-sh.el44
-rw-r--r--lisp/net/tramp.el12
-rw-r--r--lisp/progmodes/cc-engine.el229
-rw-r--r--lisp/progmodes/cc-fonts.el8
-rw-r--r--lisp/progmodes/cc-langs.el27
-rw-r--r--lisp/progmodes/cc-mode.el5
-rw-r--r--lisp/progmodes/etags.el19
-rw-r--r--lisp/window.el60
-rw-r--r--src/ChangeLog97
-rw-r--r--src/bidi.c2
-rw-r--r--src/editfns.c7
-rw-r--r--src/frame.c8
-rw-r--r--src/gnutls.c3
-rw-r--r--src/nsmenu.m10
-rw-r--r--src/nsterm.m3
-rw-r--r--src/xdisp.c194
-rw-r--r--src/xfaces.c3
-rw-r--r--src/xfns.c2
-rw-r--r--src/xml.c28
-rw-r--r--test/ChangeLog22
-rw-r--r--test/automated/icalendar-tests.el411
36 files changed, 2054 insertions, 501 deletions
diff --git a/ChangeLog b/ChangeLog
index b9301731d5..7b084d7162 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,4 @@
-2011-07-14 Paul Eggert <eggert@cs.ucla.edu>
+2011-07-28 Paul Eggert <eggert@cs.ucla.edu>
Assume freestanding C89 headers, string.h, stdlib.h.
Again, this simplifies the code, and all current platforms have these.
@@ -13,6 +13,12 @@
can add the gnulib modules for these (a 1-line change to Makefile.in).
* configure.in: Don't check for memcmp, memcpy, memmove, memset.
+2011-07-27 Paul Eggert <eggert@cs.ucla.edu>
+
+ * GNUmakefile: New file.
+ This is for convenience, so that one can run GNU make in an
+ unconfigured source tree, and get a default build.
+
2011-07-13 Jan Djärv <jan.h.d@swipnet.se>
* configure.in (GSETTINGS): Check for gio-2.0 >= 2.26.
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000000..5fd329c78e
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,77 @@
+# Build Emacs from a fresh tarball or version-control checkout.
+
+# Copyright 2011 Free Software Foundation, Inc.
+#
+# This file is part of GNU Emacs.
+#
+# GNU Emacs is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+#
+# written by Paul Eggert
+
+
+# This GNUmakefile is for GNU Make. It is for convenience, so that
+# one can run 'make' in an unconfigured source tree. In such a tree,
+# this file causes GNU Make to first create a standard configuration
+# with the default options, and then reinvokes itself on the
+# newly-built Makefile. If the source tree is already configured,
+# this file defers to the existing Makefile.
+
+# If you are using a non-GNU 'make', or if you want non-default build
+# options, or if you want to build in an out-of-source tree, please
+# run "configure" by hand. But run autogen.sh first, if the source
+# was checked out directly from the repository.
+
+
+# If a Makefile already exists, just use it.
+
+ifeq ($(wildcard Makefile),Makefile)
+include Makefile
+else
+
+# If cleaning and Makefile does not exist, don't bother creating it.
+# The source tree is already clean, or is in a weird state that
+# requires expert attention.
+
+ifeq ($(filter-out %clean,$(or $(MAKECMDGOALS),default)),)
+
+$(MAKECMDGOALS):
+ @echo >&2 'No Makefile; skipping $@.'
+
+else
+
+# No Makefile, and not cleaning.
+# If 'configure' does not exist, Emacs must have been checked
+# out directly from the repository; run ./autogen.sh.
+# Once 'configure' exists, run it.
+# Finally, run the actual 'make'.
+
+default $(filter-out configure Makefile,$(MAKECMDGOALS)): Makefile
+ $(MAKE) -f Makefile $(MAKECMDGOALS)
+# Execute in sequence, so that multiple user goals don't conflict.
+.NOTPARALLEL:
+
+configure:
+ @echo >&2 'There seems to be no "configure" file in this directory.'
+ @echo >&2 'Running ./autogen.sh || autogen/copy_autogen ...'
+ ./autogen.sh || autogen/copy_autogen
+ @echo >&2 '"configure" file built.'
+
+Makefile: configure
+ @echo >&2 'There seems to be no Makefile in this directory.'
+ @echo >&2 'Running ./configure ...'
+ ./configure
+ @echo >&2 'Makefile built.'
+
+endif
+endif
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog
index 091a6ffda5..d59bbf87bc 100644
--- a/doc/lispref/ChangeLog
+++ b/doc/lispref/ChangeLog
@@ -1,3 +1,7 @@
+2011-07-23 Eli Zaretskii <eliz@gnu.org>
+
+ * display.texi (Bidirectional Display): New section.
+
2011-07-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
Tim Cross <theophilusx@gmail.com> (tiny change)
Glenn Morris <rgm@gnu.org>
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index d8be424a69..903232bcbd 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -34,6 +34,8 @@ that Emacs presents to the user.
* Display Tables:: How to specify other conventions.
* Beeping:: Audible signal to the user.
* Window Systems:: Which window system is being used.
+* Bidirectional Display:: Display of bidirectional scripts, such as
+ Arabic and Farsi.
@end menu
@node Refresh Screen
@@ -5966,3 +5968,131 @@ This hook is used for internal purposes: setting up communication with
the window system, and creating the initial window. Users should not
interfere with it.
@end defvar
+
+@node Bidirectional Display
+@section Bidirectional Display
+@cindex bidirectional display
+@cindex right-to-left text
+
+ Emacs can display text written in scripts, such as Arabic, Farsi,
+and Hebrew, whose natural ordering of horizontal text for display is
+from right to left. However, digits and Latin text embedded in these
+scripts are still displayed left to right. It is also not uncommon to
+have small portions of text in Arabic or Hebrew embedded in otherwise
+Latin document, e.g., as comments and strings in a program source
+file. Likewise, small portions of Latin text can be embedded in an
+Arabic or Farsi document. For these reasons, text that uses these
+scripts is actually @dfn{bidirectional}: a mixture of runs of
+left-to-right and right-to-left characters.
+
+ This section describes the facilities and options provided by Emacs
+for editing and displaying bidirectional text.
+
+@cindex logical order
+@cindex visual order
+@cindex unicode bidirectional algorithm
+ Emacs stores right-to-left and bidirectional text in the so-called
+@dfn{logical} (or @dfn{reading}) order: the buffer or string position
+of the first character you read precedes that of the next character.
+Reordering of bidirectional text into the @dfn{visual} order happens
+at display time. As result, character positions no longer increase
+monotonically with their positions on display. Emacs implements the
+Unicode Bidirectional Algorithm (a.k.a.@: @acronym{UBA}) described in
+the Unicode Standard Annex #9, for reordering of bidirectional text
+for display. Reordering of bidirectional text for display in Emacs is
+a ``Full bidirectionality'' class implementation of the @acronym{UBA}.
+
+@defvar bidi-display-reordering
+ The buffer-local variable @code{bidi-display-reordering} controls
+whether text in the buffer is reordered for display. If its value is
+non-@code{nil}, Emacs reorders characters that have right-to-left
+directionality when they are displayed. The default value is
+@code{nil}. Text in overlay strings (@pxref{Overlay
+Properties,,before-string}), display strings (@pxref{Overlay
+Properties,,display}), and @code{display} text properties
+(@pxref{Display Property}) is also reordered if the buffer whose text
+includes these strings is reordered for display. Turning off
+@code{bidi-display-reordering} for a buffer turns off reordering of
+all the overlay and display strings in that buffer.
+
+ Reordering of strings that are unrelated to any buffer, such as text
+displayed on the mode line (@pxref{Mode Line Format}) or header line
+(@pxref{Header Lines}), is controlled by the default value of
+@code{bidi-display-reordering}.
+@end defvar
+
+@cindex unibyte buffers, and bidi reordering
+ Emacs does not reorder text in unibyte buffers, even if
+@code{bidi-display-reordering} is non-@code{nil} in such a buffer.
+This is because unibyte buffers contain raw bytes, not characters, and
+thus don't have bidirectional properties defined for them which are
+required for correct reordering. Therefore, to test whether text in a
+buffer will be reordered for display, it is not enough to test the
+value of @code{bidi-display-reordering} alone. The correct test is
+this:
+
+@example
+ (if (and enable-multibyte-characters
+ bidi-display-reordering)
+ ;; Buffer is being reordered for display
+ )
+@end example
+
+ In contrast to unibyte buffers, unibyte display and overlay strings
+@emph{are} reordered, if their parent buffer is reordered. This is
+because plain-@sc{ascii} strings are stored by Emacs as unibyte
+strings. If a unibyte display or overlay string includes
+non-@sc{ascii} characters, these characters are assumed to have
+left-to-right direction.
+
+@cindex display properties, and bidi reordering of text
+ Text covered by @code{display} text properties, by overlays with
+@code{display} properties whose value is a string, and by any other
+properties that replace buffer text, is treated as a single unit when
+it is reordered for display. That is, the entire chunk of text
+covered by these properties is reordered together. Moreover, the
+bidirectional properties of the characters in this chunk of text are
+ignored, and Emacs reorders them as if they were replaced with a
+single character @code{u+FFFC}, known as the @dfn{Object Replacement
+Character}. This means that placing a display property over a portion
+of text may change the way that the surrounding text is reordered for
+display. To prevent this unexpected effect, always place such
+properties on text whose directionality is identical with text that
+surrounds it.
+
+@cindex base direction of a paragraph
+ Each paragraph of bidirectional text can have its own @dfn{base
+direction}, either right-to-left or left-to-right. Text in
+left-to-right paragraphs is displayed beginning at the left margin of
+the window and is truncated or continued when it reaches the right
+margin. By contrast, display of text in right-to-left paragraphs
+begins at the right margin and is continued or truncated at the left
+margin.
+
+@defvar bidi-paragraph-direction
+ Emacs determines the base direction of each paragraph dynamically,
+based on the text at the beginning of the paragraph. The precise
+method of determining the base direction is specified by the
+@acronym{UBA}; in a nutshell, the first character in a paragraph that
+has an explicit directionality determines the base direction of the
+paragraph. However, sometimes a buffer may need to force a certain
+base direction for its paragraphs. For example, a buffer that visits
+a source code of a program should force all its paragraphs to be
+displayed left to right. The variable
+@code{bidi-paragraph-direction}, if non-@code{nil}, disables the
+dynamic determination of the base direction, and instead forces all
+paragraphs in the buffer to have the direction specified by its
+buffer-local value. The value can be either @code{right-to-left} or
+@code{left-to-right}. Any other value is interpreted as @code{nil}.
+@end defvar
+
+@defun current-bidi-paragraph-direction &optional buffer
+This function returns the paragraph direction at point in the named
+@var{buffer}. The returned value is a symbol, either
+@code{left-to-right} or @code{right-to-left}. If @var{buffer} is
+omitted or @code{nil}, it defaults to the current buffer. If the
+buffer-local value of the variable @code{bidi-paragraph-direction} is
+non-@code{nil}, the returned value will be identical to that value;
+otherwise, the returned value reflects the paragraph direction
+determined dynamically by Emacs.
+@end defun
diff --git a/leim/ChangeLog b/leim/ChangeLog
index 6df1c507d0..5309671651 100644
--- a/leim/ChangeLog
+++ b/leim/ChangeLog
@@ -1,3 +1,10 @@
+2011-07-23 Yair F <yair.f.lists@gmail.com>
+
+ * quail/hebrew.el ("hebrew"): Additional key mappings.
+ ("hebrew-new", "hebrew-lyx", "hebrew-full")
+ ("hebrew-biblical-tiro", "hebrew-biblical-sil", "yiddish-royal")
+ ("yiddish-keyman"): New input methods.
+
2011-06-12 Andreas Schwab <schwab@linux-m68k.org>
* SKK-DIC/SKK-JISYO.L: Add proper coding tag.
diff --git a/leim/quail/hebrew.el b/leim/quail/hebrew.el
index 828532040e..7c7f6c6a8b 100644
--- a/leim/quail/hebrew.el
+++ b/leim/quail/hebrew.el
@@ -1,11 +1,14 @@
-;;; hebrew.el --- Quail package for inputting Hebrew characters -*-coding: iso-2022-7bit;-*-
+;; hebrew.el --- Quail package for inputting Hebrew characters -*-coding: iso-2022-7bit;-*-
;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
;; 2008, 2009, 2010, 2011
;; National Institute of Advanced Industrial Science and Technology (AIST)
;; Registration Number H14PRO021
-;; Keywords: mule, input method, Hebrew
+;; Many input methods in this file provided
+;; by Yair Friedman <yair.f.lists@gmail.com>
+
+;; Keywords: multilingual, input method, Hebrew
;; This file is part of GNU Emacs.
@@ -29,50 +32,851 @@
(require 'quail)
(quail-define-package
- "hebrew" "Hebrew" ",Hr(B" nil "Hebrew (ISO 8859-8) input method.
+ "hebrew" "Hebrew" ",Hr(B" nil "Hebrew SI-1452 input method.
-Based on Hebrew typewriter keys.
-Hebrew letters are assigned to lowercases.
+Based on SI-1452 keyboard layout.
+Only Hebrew-related characters are considered.
+ 'q' is used to switch levels instead of Alt-Gr.
+ Maqaaf ($,1,^(B) is mapped to '/,Ht(B'.
" nil t t t t nil nil nil nil nil t)
-;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ ;~
-;; /Q 'W ,Hw(BE ,Hx(BR ,H`(BT ,Hh(BY ,He(BU ,Ho(BI ,Hm(BO ,Ht(BP [{ ]}
-;; ,Hy(BA ,Hc(BS ,Hb(BD ,Hk(BF ,Hr(BG ,Hi(BH ,Hg(BJ ,Hl(BK ,Hj(BL ,Hs(B: ," \|
-;; ,Hf(BZ ,Hq(BX ,Ha(BC ,Hd(BV ,Hp(BB ,Hn(BN ,Hv(BM ,Hz(B< ,Hu(B> .?
-;;
-
(quail-define-rules
("`" ?\;)
+ ("w" ?\')
+ ("e" ?,Hw(B) ; Qof
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,H`(B) ; Alef
+ ("y" ?,Hh(B) ; Tet
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Ho(B) ; Final Nun
+ ("o" ?,Hm(B) ; Final Mem
+ ("p" ?,Ht(B) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?,Hy(B) ; Shin
+ ("s" ?,Hc(B) ; Dalet
+ ("d" ?,Hb(B) ; Gimel
+ ("f" ?,Hk(B) ; Kaf
+ ("g" ?,Hr(B) ; Ayin
+ ("h" ?,Hi(B) ; Yod
+ ("j" ?,Hg(B) ; Het
+ ("k" ?,Hl(B) ; Lamed
+ ("l" ?,Hj(B) ; Final Kaf
+ (";" ?,Hs(B) ; Final Pe
+ ("'" ?,)
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hq(B) ; Samekh
+ ("c" ?,Ha(B) ; Bet
+ ("v" ?,Hd(B) ; He
+ ("b" ?,Hp(B) ; Nun
+ ("n" ?,Hn(B) ; Mem
+ ("m" ?,Hv(B) ; Tsadi
+ ("," ?,Hz(B) ; Tav
+ ("." ?,Hu(B) ; Final Tsadi
+ ("/" ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+ ("q`" ?$,1,P(B) ; Sheva
+ ("q1" ?$,1,Q(B) ; Hataf Segol
+ ("q2" ?$,1,R(B) ; Hataf Patah
+ ("q3" ?$,1,S(B) ; Hataf Qamats
+ ("q4" ?$,1,T(B) ; Hiriq
+ ("q5" ?$,1,U(B) ; Tsere
+ ("q6" ?$,1,V(B) ; Segol (Point)
+ ("q7" ?$,1,W(B) ; Patah
+ ("q8" ?$,1,X(B) ; Qamats
+ ("q9" ?$,1,b(B) ; Sin dot
+ ("q0" ?$,1,a(B) ; Shin dot
+ ("q-" ?$,1,Y(B) ; Holam
+ ("q=" ?$,1,\(B) ; Dagesh or Mapiq
+ ("q\\" ?$,1,[(B) ; Qubuts
+ ("qq" ?/)
+ ("qw" ?$,1-3(B) ; Geresh (Punct.)
+ ("qi" ?$,1-0(B) ; Yiddish Double Vav
+ ("qp" ?$,1,^(B) ; Maqaf
+ ("q[" ?$,1,_(B) ; Rafe
+ ("q]" ?$,1,](B) ; Meteg
+ ("qa" ?$,1tJ(B) ; New Sheqel sign
+ ("qh" ?$,1-2(B) ; Yiddish Double Yod
+ ("qj" ?$,1-1(B) ; Yiddish Vav Yod
+ ("q\"" ?$,1-4(B) ; Gershayim (Punct.)
+ ("q," ?\u200E) ; LRM
+ ("q." ?\u200F) ; RLM
+)
+
+(quail-define-package
+ "hebrew-new" "Hebrew" ",Hr(B" nil "Hebrew SI-1452 new draft input method.
+
+Based on latest draft of SI-1452 keyboard layout.
+Only Hebrew-related characters are considered.
+ '`' is used to switch levels instead of Alt-Gr.
+Geresh is mapped to '`k'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
("q" ?/)
+ ("w" ?\')
+ ("e" ?,Hw(B) ; Qof
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,H`(B) ; Alef
+ ("y" ?,Hh(B) ; Tet
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Ho(B) ; Final Nun
+ ("o" ?,Hm(B) ; Final Mem
+ ("p" ?,Ht(B) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?,Hy(B) ; Shin
+ ("s" ?,Hc(B) ; Dalet
+ ("d" ?,Hb(B) ; Gimel
+ ("f" ?,Hk(B) ; Kaf
+ ("g" ?,Hr(B) ; Ayin
+ ("h" ?,Hi(B) ; Yod
+ ("j" ?,Hg(B) ; Het
+ ("k" ?,Hl(B) ; Lamed
+ ("l" ?,Hj(B) ; Final Kaf
+ (";" ?,Hs(B) ; Final Pe
+ ("'" ?,)
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hq(B) ; Samekh
+ ("c" ?,Ha(B) ; Bet
+ ("v" ?,Hd(B) ; He
+ ("b" ?,Hp(B) ; Nun
+ ("n" ?,Hn(B) ; Mem
+ ("m" ?,Hv(B) ; Tsadi
+ ("," ?,Hz(B) ; Tav
+ ("." ?,Hu(B) ; Final Tsadi
+ ("/" ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+
+ ("``" ?\;)
+ ("`1" ?$,1,](B) ; Meteg
+;("`2" ??) ; Unassigned
+ ("`3" ?,F$(B) ; Euro Sign
+ ("`4" ?$,1tJ(B) ; New Sheqel sign
+ ("`5" ?,A0(B) ; Degree Sign
+ ("`6" ?$,1,K(B) ; Ole
+;("`7" ??) ; Unassigned
+ ("`8" ?,AW(B) ; Multiplication Sign
+ ("`9" ?\u200E) ; LRM
+ ("`0" ?\u200F) ; RLM
+ ("`-" ?$,1,^(B) ; Maqaf
+ ("`=" ?$(G!9(B) ; En Dash
+ ("`q" ?$,1,b(B) ; Sin dot
+ ("`w" ?$,1,a(B) ; Shin dot
+ ("`e" ?$,1,X(B) ; Qamats
+ ("`r" ?$,1,S(B) ; Hataf Qamats
+;("`t" ??) ; Unassigned
+ ("`y" ?$,1-0(B) ; Yiddish Double Vav
+ ("`u" ?$,1,Y(B) ; Holam
+;("`i" ??) ; Unassigned
+;("`o" ??) ; Unassigned
+ ("`p" ?$,1,W(B) ; Patah
+ ("`[" ?$,1,R(B) ; Hataf Patah
+ ("`]" ?$,1,_(B) ; Rafe
+ ("`\\" ?$,1,[(B) ; Qubuts
+ ("`a" ?$,1,P(B) ; Sheva
+ ("`s" ?$,1,\(B) ; Dagesh or Mapiq
+;("`d" ??) ; Unassigned
+;("`f" ??) ; Unassigned
+ ("`g" ?$,1-1(B) ; Yiddish Vav Yod
+ ("`h" ?$,1-2(B) ; Yiddish Double Yod
+ ("`j" ?$,1,T(B) ; Hiriq
+ ("`k" ?$,1-3(B) ; Geresh (Punct.)
+ ("`l" ?,Y4(B) ; Left Double Quotation Mark
+ ("`;" ?,Y!(B) ; Right Double Quotation Mark
+ ("`'" ?$,1-4(B) ; Gershayim (Punct.)
+;("`z" ??) ; Unassigned
+ ("`x" ?$,1,V(B) ; Segol (Point)
+ ("`c" ?$,1,Q(B) ; Hataf Segol
+;("`v" ??) ; Unassigned
+;("`b" ??) ; Unassigned
+;("`n" ??) ; Unassigned
+ ("`m" ?$,1,U(B) ; Tsere
+;("`," ??) ; Unassigned
+;("`." ??) ; Unassigned
+ ("`/" ?,Aw(B) ; Division Sign
+
+ ("``" ?$,1,c(B) ; Sof Pasuq
+ ("`!" ?$,1,1(B) ; Etnahta
+ ("`@" ?$,1,2(B) ; Segol (Accent)
+ ("`#" ?$,1,3(B) ; Shalshelet
+ ("`$" ?$,1,4(B) ; Zaqef Qatan
+ ("`%" ?$,1,5(B) ; Zaqef Gadol
+ ("`^" ?$,1,6(B) ; Tipeha
+ ("`&" ?$,1,7(B) ; Revia
+ ("`*" ?$,1,8(B) ; Zarqa
+ ("`(" ?$,1,9(B) ; Pashta
+ ("`)" ?$,1,:(B) ; Yetiv
+ ("`_" ?$,1,;(B) ; Tevir
+ ("`+" ?$,1,<(B) ; Geresh (Accent)
+ ("`Q" ?$,1,=(B) ; Geresh Muqdam
+ ("`W" ?$,1,>(B) ; Gershayim (Accent)
+ ("`E" ?$,1,g(B) ; Qamats Qatan
+ ("`R" ?$,1,?(B) ; Qarney Para
+ ("`T" ?$,1,@(B) ; Telisha Gedola
+ ("`Y" ?$,1,A(B) ; Pazer
+ ("`U" ?$,1,Z(B) ; Holam Haser for Vav
+ ("`I" ?$,1,B(B) ; Atnah Hafukh
+ ("`O" ?$,1,C(B) ; Munah
+;("`P" ??) ; Reserved
+ ("`{" ?$,1,D(B) ; Mahapakh
+ ("`}" ?$,1,E(B) ; Merkha
+ ("`|" ?$,1,F(B) ; Merkha Kefula
+;("`A" ??) ; Reserved
+;("`S" ??) ; Reserved
+ ("`D" ?$,1,G(B) ; Darga
+ ("`F" ?$,1,H(B) ; Qadma
+ ("`G" ?$,1,I(B) ; Telisha Qetana
+ ("`H" ?$,1,J(B) ; Yerah Ben Yomo
+ ("`J" ?\u200D) ; ZWJ
+ ("`K" ?$,1,L(B) ; Iluy
+ ("`L" ?,Y4(B) ; Left Double Quotation Mark (2nd)
+ ("`:" ?,Y%(B) ; Double Low-9 Quotation Mark
+ ("`\"" ?$,1,M(B) ; Dehi
+ ("`Z" ?$,1,N(B) ; Zinor
+ ("`X" ?$,1,O(B) ; Masora Circle
+ ("`C" ?\u034F) ; CGJ
+ ("`V" ?$,1,`(B) ; Paseq
+ ("`B" ?$,1,f(B) ; Nun Hafukha
+ ("`N" ?\u200C) ; ZWNJ
+;("`M" ??) ; Unassigned
+;("`<" ??) ; Unassigned
+ ("`>" ?$,1,e(B) ; Lower Dot
+ ("`?" ?$,1,d(B) ; Upper Dot
+)
+
+(quail-define-package
+ "hebrew-lyx" "Hebrew" ",Hl$,1,T(B" nil "Hebrew LyX input method.
+
+Based on LyX keyboard layout.
+Additional mappings for Rafe and Yiddish ligatures.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("_" ?$,1,^(B) ; Maqaf
+ ("q`" ?$,1,P(B) ; Sheva
+ ("w" ?\')
+ ("e" ?,Hw(B) ; Qof
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,H`(B) ; Alef
+ ("y" ?,Hh(B) ; Tet
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Ho(B) ; Final Nun
+ ("o" ?,Hm(B) ; Final Mem
+ ("p" ?,Ht(B) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?,Hy(B) ; Shin
+ ("s" ?,Hc(B) ; Dalet
+ ("d" ?,Hb(B) ; Gimel
+ ("f" ?,Hk(B) ; Kaf
+ ("g" ?,Hr(B) ; Ayin
+ ("h" ?,Hi(B) ; Yod
+ ("j" ?,Hg(B) ; Het
+ ("k" ?,Hl(B) ; Lamed
+ ("l" ?,Hj(B) ; Final Kaf
+ (";" ?,Hs(B) ; Final Pe
+ ("'" ?,)
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hq(B) ; Samekh
+ ("c" ?,Ha(B) ; Bet
+ ("v" ?,Hd(B) ; He
+ ("b" ?,Hp(B) ; Nun
+ ("n" ?,Hn(B) ; Mem
+ ("m" ?,Hv(B) ; Tsadi
+ ("," ?,Hz(B) ; Tav
+ ("." ?,Hu(B) ; Final Tsadi
+ ("/" ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("W" ?$,1-3(B) ; Geresh (Punct.)
+ ("E" ?$,1,X(B) ; Qamats
+ ("R" ?$,1,_(B) ; Rafe
+ ("T" ?\u200E) ; LRM
+ ("Y" ?\u200F) ; RLM
+ ("U" ?$,1,Y(B) ; Holam
+ ("I" ?$,1-2(B) ; Yiddish Double Yod
+ ("O" ?$,1-0(B) ; Yiddish Double Vav
+ ("P" ?$,1,W(B) ; Patah
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("A" ?$,1,P(B) ; Sheva
+ ("S" ?$,1,\(B) ; Dagesh or Mapiq
+ ("F" ?$,1-4(B) ; Gershayim (Punct.)
+ ("G" ?$,1,b(B) ; Sin dot
+ ("H" ?$,1,a(B) ; Shin dot
+ ("J" ?$,1,T(B) ; Hiriq
+ ("K" ?$,1tJ(B) ; New Sheqel sign
+ ("L" ?$,1-1(B) ; Yiddish Vav Yod
+ ("X" ?$,1,V(B) ; Segol (Point)
+ ("C" ?$,1,[(B) ; Qubuts
+ ("V" ?$,1,Q(B) ; Hataf Segol
+ ("B" ?$,1,R(B) ; Hataf Patah
+ ("N" ?$,1,S(B) ; Hataf Qamats
+ ("M" ?$,1,U(B) ; Tsere
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+)
+
+
+(quail-define-package
+ "hebrew-full" "Hebrew" ",Hr$,1,T,K(B" nil "Hebrew Full method.
+
+Provides access to all Hebrew characters suiltable to Modern Hebrew.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("-" ?$,1,^(B) ; Maqaf
("w" ?')
- ("e" ?,Hw(B)
- ("r" ?,Hx(B)
- ("t" ?,H`(B)
- ("y" ?,Hh(B)
- ("u" ?,He(B)
- ("i" ?,Ho(B)
- ("o" ?,Hm(B)
- ("p" ?,Ht(B)
- ("a" ?,Hy(B)
- ("s" ?,Hc(B)
- ("d" ?,Hb(B)
- ("f" ?,Hk(B)
- ("g" ?,Hr(B)
- ("h" ?,Hi(B)
- ("j" ?,Hg(B)
- ("k" ?,Hl(B)
- ("l" ?,Hj(B)
- (";" ?,Hs(B)
- ("z" ?,Hf(B)
- ("x" ?,Hq(B)
- ("c" ?,Ha(B)
- ("v" ?,Hd(B)
- ("b" ?,Hp(B)
- ("n" ?,Hn(B)
- ("m" ?,Hv(B)
- ("," ?,Hz(B)
- ("." ?,Hu(B)
+ ("e" ?,Hw(B) ; Qof
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,H`(B) ; Alef
+ ("y" ?,Hh(B) ; Tet
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Ho(B) ; Final Nun
+ ("o" ?,Hm(B) ; Final Mem
+ ("p" ?,Ht(B) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?,Hy(B) ; Shin
+ ("s" ?,Hc(B) ; Dalet
+ ("d" ?,Hb(B) ; Gimel
+ ("f" ?,Hk(B) ; Kaf
+ ("g" ?,Hr(B) ; Ayin
+ ("h" ?,Hi(B) ; Yod
+ ("j" ?,Hg(B) ; Het
+ ("k" ?,Hl(B) ; Lamed
+ ("l" ?,Hj(B) ; Final Kaf
+ (";" ?,Hs(B) ; Final Pe
+ ("'" ?,)
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hq(B) ; Samekh
+ ("c" ?,Ha(B) ; Bet
+ ("v" ?,Hd(B) ; He
+ ("b" ?,Hp(B) ; Nun
+ ("n" ?,Hn(B) ; Mem
+ ("m" ?,Hv(B) ; Tsadi
+ ("," ?,Hz(B) ; Tav
+ ("." ?,Hu(B) ; Final Tsadi
("/" ?.)
- ("'" ?,))
+
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("Q" ?/)
+ ("W" ?$,1-3(B) ; Geresh (Punct.)
+ ("E" ?$,1tJ(B) ; New Sheqel Sign
+ ("R" ?$,1,_(B) ; Rafe
+ ("T" ?$,1,Q(B) ; Hataf Segol
+ ("Y" ?$,1-1(B) ; Yiddish Vav Yod
+ ("U" ?$,1-0(B) ; Yiddish Double Vav
+ ("I" ?$,1,R(B) ; Hataf Patah
+ ("O" ?$,1,S(B) ; Hataf Qamats
+ ("P" ?$,1-4(B) ; Gershayim (Punct.)
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("A" ?$,1,P(B) ; Sheva
+ ("S" ?$,1,\(B) ; Dagesh or Mapiq
+ ("D" ?$,1,[(B) ; Qubuts
+ ("F" ?$,1,Y(B) ; Holam
+ ("G" ?$,1,V(B) ; Segol (Point)
+ ("H" ?$,1,U(B) ; Tsere
+ ("J" ?$,1,T(B) ; Hiriq
+ ("K" ?$,1,W(B) ; Patah
+ ("L" ?$,1,X(B) ; Qamats
+ ("Z" ?$,1,b(B) ; Sin Dot
+ ("X" ?$,1,a(B) ; Shin Dot
+ ("C" ?$,1,K(B) ; Ole
+ ("V" ?$,1-2(B) ; Yiddish Double Yod
+ ("B" ?$,1,c(B) ; Sof Pasuq
+ ("N" ?\u200E) ; LRM
+ ("M" ?\u200F) ; RLM
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+
+ ("q`" ?\u202D) ; LRO
+ ("q1" ?\u202E) ; RLO
+ ("q2" ?\u202A) ; LRE
+ ("q3" ?\u202B) ; RLE
+ ("q4" ?\u202C) ; PDF
+ ("q5" ?\u034F) ; CGJ
+ ("q6" ?$,1,L(B) ; Iluy
+ ("q8" ?$,1,M(B) ; Dehi
+ ("q9" ?$,1,g(B) ; Qamats Qatan
+ ("q0" ?$,1,=(B) ; Geresh Muqdam
+ ("q-" ?-) ; Minus
+ ("q=" ?$,1,N(B) ; Zinor
+ ("q|" ?$,1,`(B) ; Paseq
+ ("qw" ?$,1,O(B) ; Masora Circle
+ ("qe" ?$,1,d(B) ; Upper Dot
+ ("qr" ?$,1,e(B) ; Lower Dot
+ ("qy" ?$,1,?(B) ; Qarney Para
+ ("qu" ?$,1,3(B) ; Shalshelet
+ ("qi" ?$,1,>(B) ; Gershayim (Accent)
+ ("qo" ?$,1,<(B) ; Geresh (Accent)
+ ("qp" ?$,1,H(B) ; Qadma
+ ("q[" ?$,1,f(B) ; Nun Hafukha
+ ("qa" ?$,1,Z(B) ; Holam Haser for Vav
+ ("qs" ?$,1,I(B) ; Telisha Qetana
+ ("qd" ?$,1,@(B) ; Telisha Gedola
+ ("qf" ?$,1,A(B) ; Pazer
+ ("qg" ?$,1,5(B) ; Zaqef Gadol
+ ("qh" ?$,1,4(B) ; Zaqef Qatan
+ ("qj" ?$,1,9(B) ; Pashta
+ ("qk" ?$,1,D(B) ; Mahapakh
+ ("ql" ?$,1,7(B) ; Revia
+ ("q;" ?$,1,2(B) ; Segol (Accent)
+ ("q'" ?$,1,8(B) ; Zarqa
+ ("qz" ?$,1,J(B) ; Yerah Ben Yomo
+ ("qx" ?$,1,F(B) ; Merkha Kefula
+ ("qc" ?$,1,:(B) ; Yetiv
+ ("qv" ?$,1,;(B) ; Tevir
+ ("qb" ?$,1,G(B) ; Darga
+ ("qn" ?$,1,1(B) ; Etnahta
+ ("qm" ?$,1,C(B) ; Munah
+ ("q," ?$,1,6(B) ; Tipeha
+ ("q." ?$,1,E(B) ; Merkha
+ ("q/" ?$,1,](B) ; Meteg
+)
+
+
+(quail-define-package
+ "hebrew-biblical-tiro" "Hebrew" ",Hz$,1,T,Hx$,1,Y(B" nil
+"Biblical Hebrew Tiro input method.
+
+Based on Society of Biblical Literature's Tiro keyboard layout.
+Not suiltable for modern Hebrew input.
+ 'q' is used to switch levels instead of Alt-Gr.
+ Combining dot above (Called Masora dot) ($,1%G(B) is mapped to 'q1'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?$,1,c(B) ; Sof Pasuq
+ ("-" ?$,1,^(B) ; Maqaf
+ ("=" ?$(O#?(B) ; White Bullet
+ ("w" ?$,1-3(B) ; Geresh (Punct.)
+ ("e" ?,Hw(B) ; Qof
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,H`(B) ; Alef
+ ("y" ?,Hh(B) ; Tet
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Ho(B) ; Final Nun
+ ("o" ?,Hm(B) ; Final Mem
+ ("p" ?,Ht(B) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("\\" ?$,1,`(B) ; Paseq
+ ("a" ?,Hy(B) ; Shin
+ ("s" ?,Hc(B) ; Dalet
+ ("d" ?,Hb(B) ; Gimel
+ ("f" ?,Hk(B) ; Kaf
+ ("g" ?,Hr(B) ; Ayin
+ ("h" ?,Hi(B) ; Yod
+ ("j" ?,Hg(B) ; Het
+ ("k" ?,Hl(B) ; Lamed
+ ("l" ?,Hj(B) ; Final Kaf
+ (";" ?,Hs(B) ; Final Pe
+ ("'" ?$,1,:(B) ; Yetiv
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hq(B) ; Samekh
+ ("c" ?,Ha(B) ; Bet
+ ("v" ?,Hd(B) ; He
+ ("b" ?,Hp(B) ; Nun
+ ("n" ?,Hn(B) ; Mem
+ ("m" ?,Hv(B) ; Tsadi
+ ("," ?,Hz(B) ; Tav
+ ("." ?,Hu(B) ; Final Tsadi
+ ("/" ?$,1,M(B) ; Dehi
+ ("~" ?$,1,N(B) ; Zinor
+ ("!" ?$,1,I(B) ; Telisha Qetana
+ ("@" ?$,1,9(B) ; Pashta
+ ("#" ?$,1,2(B) ; Segol (Accent)
+ ("$" ?$,1,O(B) ; Masora circle
+ ("%" ?$,1,Z(B) ; Holam Haser for Vav
+ ("^" ?$,1,Y(B) ; Holam
+ ("&" ?$,1,_(B) ; Rafe
+ ("*" ?$,1,b(B) ; Sin dot
+ ("(" ?$,1,a(B) ; Shin dot
+ (")" ?$,1,=(B) ; Geresh Muqdam
+ ("_" ?$,1,@(B) ; Telisha Gedola
+ ("+" ?$,1,\(B) ; Dagesh or Mapiq
+ ("Q" ?$,1,d(B) ; Upper dot
+ ("W" ?$,1,L(B) ; Iluy
+ ("E" ?$,1,K(B) ; Ole
+ ("R" ?$,1,?(B) ; Qarney Para
+ ("T" ?$,1,3(B) ; Shalshelet
+ ("Y" ?$,1,>(B) ; Gershayim (Accent)
+ ("U" ?$,1,<(B) ; Geresh (Accent)
+ ("I" ?$,1,A(B) ; Pazer
+ ("O" ?$,1,5(B) ; Zaqef Gadol
+ ("P" ?$,1,4(B) ; Zaqef Qatan
+ ("{" ?$,1,7(B) ; Revia
+ ("}" ?$,1,8(B) ; Zarqa
+ ("|" ?$,1,H(B) ; Qadma
+ ("A" ?$,1,](B) ; Meteg
+ ("S" ?$,1,P(B) ; Sheva
+ ("D" ?$,1,[(B) ; Qubuts
+ ("F" ?$,1,T(B) ; Hiriq
+ ("G" ?$,1,Q(B) ; Hataf Segol
+ ("H" ?$,1,V(B) ; Segol (Point)
+ ("J" ?$,1,U(B) ; Tsere
+ ("K" ?$,1,S(B) ; Hataf Qamats
+ ("L" ?$,1,X(B) ; Qamats
+ (":" ?$,1,R(B) ; Hataf Patah
+ ("\"" ?$,1,W(B) ; Patah
+ ("Z" ?$,1,e(B) ; Lower dot
+ ("X" ?$,1,D(B) ; Mahapakh
+ ("C" ?$,1,J(B) ; Yerah Ben Yomo
+ ("V" ?$,1,F(B) ; Merkha Kefula
+ ("B" ?$,1,E(B) ; Merkha
+ ("N" ?$,1,G(B) ; Darga
+ ("M" ?$,1,;(B) ; Tevir
+ ("<" ?$,1,1(B) ; Etnahta
+ (">" ?$,1,6(B) ; Tipeha
+ ("?" ?$,1,C(B) ; Munah
+
+ ("q`" ?\;)
+ ("q1" ?\u0307) ; Combining dot above
+ ("q2" ?\u0336) ; Combining long stroke overlay
+ ("q3" ?\u030A) ; Combining ring above
+ ("q4" ?$,1tJ(B) ; New Sheqel Sign
+ ("q5" ?\u200D) ; ZWJ
+ ("q6" ?\u200C) ; ZWNJ
+ ("q7" ?\u034F) ; CGJ
+ ("q8" ?\u200E) ; LRM
+ ("q9" ?\u200F) ; RLM
+ ("q0" ?$,2",(B) ; Dotted Circle
+ ("q-" ?-) ; Minus
+ ("q=" ?$(O#@(B) ; Bullet
+ ("qq" ?\u0308) ; Combining Diaeresis
+ ("qw" ?$,1-4(B) ; Gershayim (Punct.)
+ ("qe" ?,F$(B) ; Euro Sign
+ ("qu" ?$,1-0(B) ; Yiddish Double Vav
+ ("q\\" ?\\)
+ ("qh" ?$,1-2(B) ; Yiddish Double Yod
+ ("qj" ?$,1-1(B) ; Yiddish Vav Yod
+ ("ql" ?$,1,g(B) ; Qamats Qatan
+ ("q'" ?,)
+ ("qc" ?$,1,B(B) ; Atnah Hafukh
+ ("qb" ?$,1,f(B) ; Nun Hafukha
+ ("q/" ?.)
+
+ ("q~" ?~)
+ ("q!" ?!)
+ ("q@" ?@)
+ ("q#" ?#)
+ ("q$" ?$)
+ ("q%" ?%)
+ ("q^" ?^)
+ ("q&" ?&)
+ ("q*" ?*)
+ ("q(" ?\)) ; mirroring
+ ("q)" ?\() ; mirroring
+ ("q_" ?_)
+ ("q+" ?+)
+ ("qQ" ?/)
+ ("qW" ?')
+ ("q{" ?}) ; mirroring
+ ("q}" ?{) ; mirroring
+ ("q|" ?|)
+ ("q:" ?:)
+ ("q\"" ?\")
+ ("q<" ?>)
+ ("q>" ?<)
+ ("q?" ??)
+)
+
+(quail-define-package
+ "hebrew-biblical-sil" "Hebrew" ",Hq$,1,T,Hl(B" nil
+"Biblical Hebrew SIL input method.
+
+Based on Society of Biblical Literature's SIL keyboard layout.
+Phonetic and not suiltable for modern Hebrew input.
+ '`' is used to switch levels instead of Alt-Gr.
+ Euro Sign (,F$(B) is mapped to 'Z'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("-" ?$,1,^(B) ; Maqaf
+ ("=" ?$,1,\(B) ; Dagesh or Mapiq
+ ("q" ?,Hw(B) ; Qof
+ ("w" ?,He(B) ; Vav
+ ("e" ?$,1,V(B) ; Segol (Point)
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,Hz(B) ; Tav
+ ("y" ?,Hi(B) ; Yod
+ ("u" ?$,1,[(B) ; Qubuts
+ ("i" ?$,1,T(B) ; Hiriq
+ ("o" ?$,1,Y(B) ; Holam
+ ("p" ?,Ht(B) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("\\" ?$,1,`(B) ; Paseq
+ ("a" ?$,1,W(B) ; Patah
+ ("s" ?,Hq(B) ; Samekh
+ ("d" ?,Hc(B) ; Dalet
+ ("f" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
+ ("g" ?,Hb(B) ; Gimel
+ ("h" ?,Hd(B) ; He
+ ("j" [ ",Hy$,1,a(B" ]) ; Shin + Shin dot
+ ("k" ?,Hk(B) ; Kaf
+ ("l" ?,Hl(B) ; Lamed
+ (";" ?$,1,P(B) ; Sheva
+ ("'" ?,F"(B) ; Right Single Quotation Mark
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hg(B) ; Het
+ ("c" ?,Hv(B) ; Tsadi
+ ("v" ?,Hh(B) ; Tet
+ ("b" ?,Ha(B) ; Bet
+ ("n" ?,Hp(B) ; Nun
+ ("m" ?,Hn(B) ; Mem
+
+ ("~" ?$,1tJ(B) ; New Sheqel Sign
+ ("@" ?$,1,8(B) ; Zarqa
+ ("#" ?$,1,H(B) ; Qadma
+ ("$" ?$,1,<(B) ; Geresh (Accent)
+ ("%" ?$,1,>(B) ; Gershayim (Accent)
+ ("&" ?$,1,L(B) ; Iluy
+ ("*" ?$,1,=(B) ; Geresh Muqdam
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("_" ?$(G!9(B) ; Em Dash
+ ("Q" ?$,1,7(B) ; Revia
+ ("E" ?$,1,U(B) ; Tsere
+ ("Y" ?$,1,?(B) ; Qarney Para
+ ("O" ?$,1,Z(B) ; Holam Haser for Vav
+ ("P" ?,Hs(B) ; Final Pe
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+
+ ("A" ?$,1,X(B) ; Qamats
+ ("S" ?,Hy(B) ; Shin
+ ("K" ?,Hj(B) ; Final Kaf
+ (":" ?$,1-4(B) ; Gershayim (Punct.)
+ ("\"" ?,Y!(B) ; Right Double Quotation Mark
+ ("Z" ?,F$(B) ; Euro Sign
+ ("C" ?,Hu(B) ; Final Tsadi
+ ("N" ?,Ho(B) ; Final Nun
+ ("M" ?,Hm(B) ; Final Mem
+ ("<" ?,Hr(B) ; Ayin
+ (">" ?,H`(B) ; Alef
+
+ ("``" ?$)
+ ("`1" ?$,1,](B) ; Meteg
+ ("`2" ?$,1,B(B) ; Atnah Hafukh
+ ("`3" ?$,1,6(B) ; Tipeha
+ ("`4" ?$,1,E(B) ; Merkha
+ ("`5" ?$,1,F(B) ; Merkha Kefula
+ ("`6" ?$,1,M(B) ; Dehi
+ ("`7" ?$,1,C(B) ; Munah
+ ("`8" ?$,1,;(B) ; Tevir
+ ("`9" ?$,1,G(B) ; Darga
+ ("`0" ?$,1,J(B) ; Yerah Ben Yomo
+ ("`-" ?$(G!7(B) ; Em Dash
+ ("`=" ?$,1,1(B) ; Etnahta
+ ("`]" ?$,1,:(B) ; Accent Yetiv
+ ("`\\" ?$,1,D(B) ; Mahapakh
+ ("`a" ?$,1,g(B) ; Qamats Qatan
+ ("`g" ? $(O#?(B) ; White Bullet
+ ("`h" ?\u0336) ; Combining Long Stroke Overlay
+ ("`;" ?\;)
+ ("`'" ?\u0323); Combining Dot Below (Lower Point??)
+ ("`m" ?\u200C) ; ZWNJ
+ ("`," ?,A;(B) ; mirroring
+ ("`." ?,A+(B) ; mirroring
+ ("`/" ?$,1-3(B) ; Geresh (Punct.)
+
+ ("`!" ?$,1,7(B) ; Revia
+ ("`@" ?$,1,N(B) ; Zinor
+ ("`#" ?$,1,9(B) ; Pashta
+ ("`$" ?$,1,@(B) ; Telisha Gedola
+ ("`%" ?$,1,I(B) ; Telisha Qetana
+ ("`&" ?$,1,A(B) ; Pazer
+ ("`*" ?$,1,5(B) ; Zaqef Gadol
+ ("`(" ?$,1,3(B) ; Shalshelet
+ ("`)" ?$,1,O(B) ; Masora Circle
+ ("`_" ?$,1,_(B) ; Rafe
+ ("`+" ?$,2",(B) ; Dotted Circle
+ ("`E" ?$,1,Q(B) ; Hataf Segol
+ ("`O" ?$,1,S(B) ; Hataf Qamats
+ ("`P" ?\u034F) ; CGJ
+ ("`{" ?$,1,4(B) ; Zaqef Qatan
+ ("`}" ?$,1,2(B) ; Segol (Accent)
+ ("`|" ?$,1,K(B) ; Ole
+ ("`A" ?$,1,R(B) ; Hataf Patah
+ ("`G" ?$(O#@(B) ; Bullet
+ ("`H" ?\u030A) ; Combining ring above
+ ("`:" ?$,1,c(B) ; Sof Pasuq
+ ("`\"" ?$,1,d(B) ; Upper Dot
+ ("`M" ?\u200D) ; ZWJ
+ ("`<" ?\u0307) ; Combining dot above
+ ("`>" ?\u0308) ; Combining Diaeresis
+)
+
+
+(quail-define-package
+ "yiddish-royal" "Hebrew" "$,1-2,Hx(B" nil "Yiddish Royal input method.
+
+Based on Royal Yiddish typewriter.
+Better for yiddish than Hebrew methods.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?~)
+ ("q" ?,Hw(B) ; Qof
+ ("w" [ ",H`$,1,X(B" ]) ; Qamats Alef (Komets Alef)
+ ("e" ?,Hx(B) ; Resh
+ ("r" ?,H`(B) ; Alef (Shtumer Alef)
+ ("t" ?,Hh(B) ; Tet
+ ("y" ?$,1-0(B) ; Yiddish Double Vav (Tsvey Vovn)
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Ho(B) ; Final Nun
+ ("o" ?,Hm(B) ; Final Mem
+ ("p" [ ",Ht$,1,_(B" ]) ; Rafe Pe (Fey)
+ ("[" [ ",Ht$,1,\(B" ]) ; Dagesh Pe (Pey)
+ ("]" ?,)
+ ("a" ?,Hy(B) ; Shin
+ ("s" ?,Hc(B) ; Dalet
+ ("d" ?,Hb(B) ; Gimel
+ ("f" ?,Hk(B) ; Kaf
+ ("g" ?,Hr(B) ; Ayin
+ ("h" ?$,1-2(B) ; Yiddish Double Yod (Tsvey Yudn)
+ ("j" ?,Hi(B) ; Yod
+ ("k" ?,Hg(B) ; Het
+ ("l" ?,Hl(B) ; Lamed
+ (";" ?,Hj(B) ; Final Kaf
+ ("'" ?,Hs(B) ; Final Pe
+ ("z" ?.)
+ ("x" ?,Hf(B) ; Zayin
+ ("c" ?,Hq(B) ; Samekh
+ ("v" ?,Ha(B) ; Bet
+ ("b" ?,Hd(B) ; He
+ ("n" ?,Hp(B) ; Nun
+ ("m" ?,Hn(B) ; Mem
+ ("," ?,Hv(B) ; Tsadi
+ ("." ?,Hz(B) ; Tav
+ ("/" ?,Hu(B) ; Final Tsadi
+
+ ("~" ?@)
+ ("!" ?,Y!(B) ; Right Double Quotation Mark
+ ("@" ?,Y%(B) ; Double Low-9 Quotation Mark
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("Q" ?,A=(B) ; Right Double Quotation Mark
+ ("W" ?,A<(B)
+ ("E" ?,A>(B) ; Yiddish Double Yod (x2)
+ ("R" [ ",H`$,1,W(B" ]) ; Patah Alef (Pasekh Alef)
+; ("T" "")
+ ("Y" ?$,1-1(B) ; Ligature Yiddish Vav Yod (vov yud)
+ ("U" [ ",He$,1,\(B" ]) ; Melupm vov
+ ("I" ?/)
+ ("O" ?\\)
+ ("P" ?,Ht(B) ; Pe
+ ("{" ??)
+ ("}" ?!)
+ ("A" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
+ ("S" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
+; ("D" "")
+ ("F" [ ",Hk$,1,\(B" ]) ; Dagesh Kaf (Kof)
+; ("G" "")
+ ("H" [ "$,1-2,W(B" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
+ ("J" [ ",Hi$,1,T(B" ]) ; Khirik Yud
+ ("K" ?}) ; mirroring
+ ("L" ?{) ; mirroring
+ ("\"" ?\;)
+ ("Z" ??)
+ ("X" ?|)
+ ("C" [ ",Ha$,1,\(B" ]) ; Dagesh Bet (Beys)
+ ("V" [ ",Ha$,1,_(B" ]) ; Rafe Bet (Veys)
+ ("B" ?\]) ; mirroring
+ ("N" ?\[) ; mirroring
+ ("M" ?>) ; mirroring
+ ("<" ?<) ; mirroring
+ (">" [ ",Hz$,1,\(B" ]) ; Dagesh Tav (Tof)
+ ("?" ?\')
+)
+
+
+(quail-define-package
+ "yiddish-keyman" "Hebrew" "$,1-2,Hw(B" nil "Yiddish Keyman input method.
+
+Based on Keyman keyboard layout.
+Better for yiddish than Hebrew methods..
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("q" ?,Y%(B) ; Double Low-9 Quotation Mark
+ ("w" ?,Hy(B) ; Shin
+ ("e" ?,Hr(B) ; Ayin
+ ("r" ?,Hx(B) ; Resh
+ ("t" ?,Hh(B) ; Tet
+ ("y" ?,Hi(B) ; Yod
+ ("u" ?,He(B) ; Vav
+ ("i" ?,Hi(B) ; Yod (x2)
+ ("o" [ ",H`$,1,X(B" ]) ; Qamats Alef (Komets Alef)
+ ("p" [ ",Ht$,1,\(B" ]) ; Dagesh Pe (Pey)
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" [ ",H`$,1,W(B" ]) ; Patah Alef (Pasekh Alef)
+ ("s" ?,Hq(B) ; Samekh
+ ("d" ?,Hc(B) ; Dalet
+ ("f" [ ",Ht$,1,_(B" ]) ; Rafe Pe (Fey)
+ ("g" ?,Hb(B) ; Gimel
+ ("h" ?,Hd(B) ; He
+ ("j" ?$,1-2(B) ; Yiddish Double Yod (Tsvey Yudn)
+ ("k" ?,Hw(B) ; Qof
+ ("l" ?,Hl(B) ; Lamed
+ ("z" ?,Hf(B) ; Zayin
+ ("x" ?,Hk(B) ; Kaf
+ ("c" ?,Hv(B) ; Tsadi
+ ("v" ?$,1-0(B) ; Yiddish Double Vav (Tsvey Vovn)
+ ("b" ?,Ha(B) ; Bet
+ ("n" ?,Hp(B) ; Nun
+ ("m" ?,Hn(B) ; Mem
+
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("Q" ?,Y!(B) ; Right Double Quotation Mark
+ ("W" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
+ ("E" ?$,1-2(B) ; Yiddish Double Yod (x2)
+; ("R" "") ;
+ ("T" [ ",Hz$,1,\(B" ]) ; Dagesh Tav (Tof)
+ ("Y" [ "$,1-2,W(B" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
+ ("U" [ ",He$,1,\(B" ]) ; Melupm vov
+ ("I" [ ",Hi$,1,T(B" ]) ; Khirik Yud
+ ("O" ?$,1-1(B) ; Ligature Yiddish Vav Yod (vov yud)
+; ("P" "")
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("A" ?,H`(B) ; Alef (Shtumer Alef)
+ ("S" ?,Hz(B) ; Tav
+ ("F" ?,Hs(B) ; Final Pe
+ ("G" ?$,1-3(B) ; Geresh (Punct.)
+ ("H" ?,Hg(B) ; Het
+ ("J" ?$,1-2(B) ; Yiddish Double Yod (x2)
+ ("K" [ ",Hk$,1,\(B" ]) ; Dagesh Kaf (Kof)
+; ("L" "")
+; ("Z" "")
+ ("X" ?,Hj(B) ; Final Kaf
+ ("C" ?,Hu(B) ; Final Tsadi
+ ("V" [ ",Ha$,1,_(B" ]) ; Rafe Bet (Veys) ) ; Bet
+; ("B" "")
+ ("N" ?,Ho(B) ; Final Nun
+ ("M" ?,Hm(B) ; Final Mem
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+)
;;; hebrew.el ends here
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index b138d78a07..afa15eab24 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,82 @@
+2011-07-27 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-maybe-send-script): Don't let-bind the
+ connection process, it could be nil.
+
+2011-07-27 Leo Liu <sdl.web@gmail.com>
+
+ Simplify url handling in rcirc-mode.
+
+ * net/rcirc.el (rcirc-browse-url-map, rcirc-browse-url-at-point)
+ (rcirc-browse-url-at-mouse): Remove.
+ * net/rcirc.el (rcirc-markup-urls): Use `make-button'.
+
+2011-07-26 Alan Mackenzie <acm@muc.de>
+
+ Fontify bitfield declarations properly.
+
+ * progmodes/cc-langs.el (c-has-bitfields): New lang variable.
+ (c-symbol-chars): Now exported as a lang variable.
+ (c-not-primitive-type-keywords): New lang variable.
+
+ * progmodes/cc-fonts.el (c-font-lock-declarations): Jump over the
+ QT keyword "more" to prevent "more slots: ...." being spuriously
+ parsed as a bitfield declaraion.
+
+ * progmodes/cc-engine.el (c-beginning-of-statement-1): Refactor
+ and enhance to handle bitfield declarations.
+ (c-punctuation-in): New function.
+ (c-forward-decl-or-cast-1): Enhance CASE 3 to handle bitfield
+ declarations properly.
+
+2011-07-26 Ulf Jasper <ulf.jasper@web.de>
+
+ * calendar/icalendar.el (icalendar--all-events): Take care of
+ multiple vcalendars in a single file.
+ (icalendar--convert-float-to-ical): checkdoc fixes.
+
+2011-07-25 Deniz Dogan <deniz@dogan.se>
+
+ * image.el (insert-image): Clarifying docstring.
+
+2011-07-24 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-barf-unless-okay): Return the value of
+ `tramp-send-command-and-check' if there is no error.
+ (tramp-send-command-and-read): Suppress *all* errors if NOERROR.
+
+2011-07-22 Alan Mackenzie <acm@muc.de>
+
+ Prevent cc-langs.elc being loaded at run time.
+
+ * progmodes/cc-mode.el: Remove two autoload forms which loaded
+ cc-langs.
+
+ * /progmodes/cc-langs.el (c-make-init-lang-vars-fun): Don't emit
+ "(require 'cc-langs)". Quote a form so it will evaluate at
+ (cc-mode's) compilation time.
+
+2011-07-22 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-file-name-handler): Avoid recursive
+ loading. (Bug#9114)
+
+2011-07-21 Martin Rudalics <rudalics@gmx.at>
+
+ * window.el (display-buffer-pop-up-window)
+ (display-buffer-pop-up-side-window)
+ (display-buffer-in-side-window): Call display-buffer-set-height
+ and display-buffer-set-width after setting the new window's
+ buffer so `fit-window-to-buffer' and friends work on the right
+ buffer.
+
+2011-07-20 Sam Steingold <sds@gnu.org>
+
+ * progmodes/etags.el (etags-file-of-tag, etags-tags-table-files)
+ (etags-tags-included-tables): Call `convert-standard-filename' on
+ the file names contained in TAGS so that windows Emacs can handle
+ TAGS files created by cygwin ctags.
+
2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
* proced.el (proced-update): Revert yesterday's bug#1779 patch,
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 03456ba36f..3ffd55db18 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -412,10 +412,15 @@ children."
(setq result subresult)))))
result))
- ; private
+;; private
(defun icalendar--all-events (icalendar)
"Return the list of all existing events in the given ICALENDAR."
- (icalendar--get-children (car icalendar) 'VEVENT))
+ (let ((result '()))
+ (mapc (lambda (elt)
+ (setq result (append (icalendar--get-children elt 'VEVENT)
+ result)))
+ (nreverse icalendar))
+ result))
(defun icalendar--split-value (value-string)
"Split VALUE-STRING at ';='."
@@ -1571,8 +1576,8 @@ entries. ENTRY-MAIN is the first line of the diary entry."
(n (nth 3 sexp))
(day (nth 4 sexp))
(summary
- (replace-regexp-in-string
- "\\(^\s+\\|\s+$\\)" ""
+ (replace-regexp-in-string
+ "\\(^\s+\\|\s+$\\)" ""
(buffer-substring (point) (point-max)))))
(when day
@@ -1590,7 +1595,7 @@ entries. ENTRY-MAIN is the first line of the diary entry."
(null (let ((date (calendar-current-date))
(entry entry-main))
(diary-float month dayname n)))
- (concat
+ (concat
"\nEXDATE;VALUE=DATE:"
(format-time-string "%Y%m%d" (current-time))))
"\nRRULE:"
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index a1cb003a8f..f90e180b12 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,22 @@
+2011-07-24 Andrew Cohen <cohen@andy.bu.edu>
+
+ * nnimap.el (nnimap-make-thread-query): Quote message-ids for gmail.
+
+2011-07-23 Andrew Cohen <cohen@andy.bu.edu>
+
+ * nnir.el (nnir-search-thread): New function to make an nnir group
+ based on a thread query.
+
+ * gnus-sum.el (gnus-refer-thread-use-nnir): New variable to control use
+ of nnir in thread referral.
+ (gnus-summary-refer-thread): Use it.
+
+ * nnimap.el (nnimap-request-thread): Use it.
+
+2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * shr.el (shr-tag-comment): Ignore HTML comments.
+
2011-07-20 Andrew Cohen <cohen@andy.bu.edu>
* nnir.el (gnus-group-make-nnir-group): Allow optional search query
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 6e8fc63d79..5917c9d7ce 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -118,6 +118,13 @@ If t, fetch all the available old headers."
:type '(choice number
(sexp :menu-tag "other" t)))
+(defcustom gnus-refer-thread-use-nnir nil
+ "*Use nnir to search an entire server when referring threads. A
+nil value will only search for thread-related articles in the
+current group."
+ :group 'gnus-thread
+ :type 'boolean)
+
(defcustom gnus-summary-make-false-root 'adopt
"*nil means that Gnus won't gather loose threads.
If the root of a thread has expired or been read in a previous
@@ -8972,11 +8979,16 @@ Return the number of articles fetched."
result))
(defun gnus-summary-refer-thread (&optional limit)
- "Fetch all articles in the current thread.
-If no backend-specific 'request-thread function is available
-fetch LIMIT (the numerical prefix) old headers. If LIMIT is nil
-fetch what's specified by the `gnus-refer-thread-limit'
-variable."
+ "Fetch all articles in the current thread. For backends that
+know how to search for threads (currently only 'nnimap) a
+non-numeric prefix arg will use nnir to search the entire
+server; without a prefix arg only the current group is
+searched. If the variable `gnus-refer-thread-use-nnir' is
+non-nil the prefix arg has the reverse meaning. If no
+backend-specific 'request-thread function is available fetch
+LIMIT (the numerical prefix) old headers. If LIMIT is
+non-numeric or nil fetch the number specified by the
+`gnus-refer-thread-limit' variable."
(interactive "P")
(gnus-warp-to-article)
(let* ((header (gnus-summary-article-header))
@@ -8984,13 +8996,16 @@ variable."
(gnus-inhibit-demon t)
(gnus-summary-ignore-duplicates t)
(gnus-read-all-available-headers t)
- (limit (if limit (prefix-numeric-value limit)
- gnus-refer-thread-limit))
+ (gnus-refer-thread-use-nnir
+ (if (and (not (null limit)) (listp limit))
+ (not gnus-refer-thread-use-nnir) gnus-refer-thread-use-nnir))
(new-headers
(if (gnus-check-backend-function
'request-thread gnus-newsgroup-name)
(gnus-request-thread header gnus-newsgroup-name)
- (let* ((last (if (numberp limit)
+ (let* ((limit (if (numberp limit) (prefix-numeric-value limit)
+ gnus-refer-thread-limit))
+ (last (if (numberp limit)
(min (+ (mail-header-number header)
limit)
gnus-newsgroup-highest)
@@ -9005,17 +9020,19 @@ variable."
(regexp-opt (append refs (list id subject)))))))
(gnus-fetch-headers (list last) (if (numberp limit)
(* 2 limit) limit) t)))))
- (dolist (header new-headers)
- (when (member (mail-header-number header) gnus-newsgroup-unselected)
- (push (mail-header-number header) gnus-newsgroup-unreads)
- (setq gnus-newsgroup-unselected
- (delete (mail-header-number header) gnus-newsgroup-unselected))))
- (setq gnus-newsgroup-headers
- (gnus-delete-duplicate-headers
- (gnus-merge
- 'list gnus-newsgroup-headers new-headers
- 'gnus-article-sort-by-number)))
- (gnus-summary-limit-include-thread id)))
+ (when (listp new-headers)
+ (dolist (header new-headers)
+ (when (member (mail-header-number header) gnus-newsgroup-unselected)
+ (push (mail-header-number header) gnus-newsgroup-unreads)
+ (setq gnus-newsgroup-unselected
+ (delete (mail-header-number header)
+ gnus-newsgroup-unselected))))
+ (setq gnus-newsgroup-headers
+ (gnus-delete-duplicate-headers
+ (gnus-merge
+ 'list gnus-newsgroup-headers new-headers
+ 'gnus-article-sort-by-number)))
+ (gnus-summary-limit-include-thread id))))
(defun gnus-summary-refer-article (message-id)
"Fetch an article specified by MESSAGE-ID."
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 385522759b..52de48869d 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -1566,15 +1566,17 @@ textual parts.")
(articles &optional limit force-new dependencies))
(deffoo nnimap-request-thread (header &optional group server)
- (when (nnimap-possibly-change-group group server)
- (let* ((cmd (nnimap-make-thread-query header))
- (result (with-current-buffer (nnimap-buffer)
- (nnimap-command "UID SEARCH %s" cmd))))
- (when result
- (gnus-fetch-headers
- (and (car result) (delete 0 (mapcar #'string-to-number
- (cdr (assoc "SEARCH" (cdr result))))))
- nil t)))))
+ (if gnus-refer-thread-use-nnir
+ (nnir-search-thread header)
+ (when (nnimap-possibly-change-group group server)
+ (let* ((cmd (nnimap-make-thread-query header))
+ (result (with-current-buffer (nnimap-buffer)
+ (nnimap-command "UID SEARCH %s" cmd))))
+ (when result
+ (gnus-fetch-headers
+ (and (car result) (delete 0 (mapcar #'string-to-number
+ (cdr (assoc "SEARCH" (cdr result))))))
+ nil t))))))
(defun nnimap-possibly-change-group (group server)
(let ((open-result t))
@@ -1945,13 +1947,13 @@ textual parts.")
(refs (split-string
(or (mail-header-references header)
"")))
- (value
- (format
- "(OR HEADER REFERENCES %s HEADER Message-Id %s)"
- id id)))
+ (value
+ (format
+ "(OR HEADER REFERENCES %S HEADER Message-Id %S)"
+ id id)))
(dolist (refid refs value)
(setq value (format
- "(OR (OR HEADER Message-Id %s HEADER REFERENCES %s) %s)"
+ "(OR (OR HEADER Message-Id %S HEADER REFERENCES %S) %s)"
refid refid value)))))
diff --git a/lisp/gnus/nnir.el b/lisp/gnus/nnir.el
index 9840dddcb6..e6420a4d7b 100644
--- a/lisp/gnus/nnir.el
+++ b/lisp/gnus/nnir.el
@@ -289,6 +289,7 @@ is `(valuefunc member)'."
(autoload 'nnimap-buffer "nnimap")
(autoload 'nnimap-command "nnimap")
(autoload 'nnimap-possibly-change-group "nnimap")
+ (autoload 'nnimap-make-thread-query "nnimap")
(autoload 'gnus-registry-action "gnus-registry")
(defvar gnus-registry-install))
@@ -1649,6 +1650,16 @@ server is of form 'backend:name'."
(nnir-open-server server)))
+(defun nnir-search-thread (header)
+ "Make an nnir group based on the thread containing the article header"
+ (let ((parm (list
+ (cons 'query
+ (nnimap-make-thread-query header))
+ (cons 'criteria "")
+ (cons 'server (gnus-method-to-server
+ (gnus-find-method-for-group
+ gnus-newsgroup-name))))))
+ (gnus-group-make-nnir-group nil parm)))
;; unused?
(defun nnir-artlist-groups (artlist)
diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el
index f8a85579b4..8faa507161 100644
--- a/lisp/gnus/shr.el
+++ b/lisp/gnus/shr.el
@@ -761,6 +761,9 @@ ones, in case fg and bg are nil."
(defun shr-tag-script (cont)
)
+(defun shr-tag-comment (cont)
+ )
+
(defun shr-tag-sup (cont)
(let ((start (point)))
(shr-generic cont)
diff --git a/lisp/image.el b/lisp/image.el
index c686262263..3036225166 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -413,8 +413,8 @@ means display it in the right marginal area."
(defun insert-image (image &optional string area slice)
"Insert IMAGE into current buffer at point.
IMAGE is displayed by inserting STRING into the current buffer
-with a `display' property whose value is the image. STRING is
-defaulted if you omit it.
+with a `display' property whose value is the image. STRING
+defaults to the empty string if you omit it.
AREA is where to display the image. AREA nil or omitted means
display it in the text area, a value of `left-margin' means
display it in the left marginal area, a value of `right-margin'
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index f7f5f61faf..9e04abb8cd 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -935,14 +935,6 @@ IRC command completion is performed only if '/' is the first input char."
map)
"Keymap for rcirc mode.")
-(defvar rcirc-browse-url-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET") 'rcirc-browse-url-at-point)
- (define-key map (kbd "<mouse-2>") 'rcirc-browse-url-at-mouse)
- (define-key map [follow-link] 'mouse-face)
- map)
- "Keymap used for browsing URLs in `rcirc-mode'.")
-
(defvar rcirc-short-buffer-name nil
"Generated abbreviation to use to indicate buffer activity.")
@@ -2351,21 +2343,6 @@ keywords when no KEYWORD is given."
(browse-url (completing-read "rcirc browse-url: "
completions nil nil initial-input 'history)
arg)))
-
-(defun rcirc-browse-url-at-point (point)
- "Send URL at point to `browse-url'."
- (interactive "d")
- (let ((beg (previous-single-property-change (1+ point) 'mouse-face))
- (end (next-single-property-change point 'mouse-face)))
- (browse-url (buffer-substring-no-properties beg end))))
-
-(defun rcirc-browse-url-at-mouse (event)
- "Send URL at mouse click to `browse-url'."
- (interactive "e")
- (let ((position (event-end event)))
- (with-current-buffer (window-buffer (posn-window position))
- (rcirc-browse-url-at-point (posn-point position)))))
-
(defun rcirc-markup-timestamp (sender response)
(goto-char (point-min))
@@ -2406,12 +2383,16 @@ keywords when no KEYWORD is given."
(while (and rcirc-url-regexp ;; nil means disable URL catching
(re-search-forward rcirc-url-regexp nil t))
(let ((start (match-beginning 0))
- (end (match-end 0)))
- (rcirc-add-face start end 'rcirc-url)
- (add-text-properties start end (list 'mouse-face 'highlight
- 'keymap rcirc-browse-url-map))
+ (end (match-end 0))
+ (url (match-string-no-properties 0)))
+ (make-button start end
+ 'face 'rcirc-url
+ 'follow-link t
+ 'rcirc-url url
+ 'action (lambda (button)
+ (browse-url (button-get button 'rcirc-url))))
;; record the url
- (push (buffer-substring-no-properties start end) rcirc-urls))))
+ (push url rcirc-urls))))
(defun rcirc-markup-keywords (sender response)
(when (and (string= response "PRIVMSG")
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 1c6f0844be..5c49774894 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -3457,8 +3457,10 @@ Fall back to normal file name handler if no Tramp handler exists."
(defun tramp-maybe-send-script (vec script name)
"Define in remote shell function NAME implemented as SCRIPT.
Only send the definition if it has not already been done."
- (let* ((p (tramp-get-connection-process vec))
- (scripts (tramp-get-connection-property p "scripts" nil)))
+ ;; We cannot let-bind (tramp-get-connection-process vec) because it
+ ;; might be nil.
+ (let ((scripts (tramp-get-connection-property
+ (tramp-get-connection-process vec) "scripts" nil)))
(unless (member name scripts)
(tramp-with-progress-reporter vec 5 (format "Sending script `%s'" name)
;; The script could contain a call of Perl. This is masked with `%s'.
@@ -3467,7 +3469,8 @@ Only send the definition if it has not already been done."
(format "%s () {\n%s\n}" name
(format script (tramp-get-remote-perl vec)))
"Script %s sending failed" name)
- (tramp-set-connection-property p "scripts" (cons name scripts))))))
+ (tramp-set-connection-property
+ (tramp-get-connection-process vec) "scripts" (cons name scripts))))))
(defun tramp-set-auto-save ()
(when (and ;; ange-ftp has its own auto-save mechanism
@@ -4505,27 +4508,30 @@ DONT-SUPPRESS-ERR is non-nil, stderr won't be sent to /dev/null."
"Run COMMAND, check exit status, throw error if exit status not okay.
Similar to `tramp-send-command-and-check' but accepts two more arguments
FMT and ARGS which are passed to `error'."
- (unless (tramp-send-command-and-check vec command)
- (apply 'tramp-error vec 'file-error fmt args)))
+ (or (tramp-send-command-and-check vec command)
+ (apply 'tramp-error vec 'file-error fmt args)))
(defun tramp-send-command-and-read (vec command &optional noerror)
"Run COMMAND and return the output, which must be a Lisp expression.
In case there is no valid Lisp expression and NOERROR is nil, it
raises an error."
- (tramp-barf-unless-okay vec command "`%s' returns with error" command)
- (with-current-buffer (tramp-get-connection-buffer vec)
- ;; Read the expression.
- (goto-char (point-min))
- (condition-case nil
- (prog1 (read (current-buffer))
- ;; Error handling.
- (when (re-search-forward "\\S-" (point-at-eol) t)
- (error nil)))
- (error (unless noerror
- (tramp-error
- vec 'file-error
- "`%s' does not return a valid Lisp expression: `%s'"
- command (buffer-string)))))))
+ (when (if noerror
+ (tramp-send-command-and-check vec command)
+ (tramp-barf-unless-okay
+ vec command "`%s' returns with error" command))
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (condition-case nil
+ (prog1 (read (current-buffer))
+ ;; Error handling.
+ (when (re-search-forward "\\S-" (point-at-eol) t)
+ (error nil)))
+ (error (unless noerror
+ (tramp-error
+ vec 'file-error
+ "`%s' does not return a valid Lisp expression: `%s'"
+ command (buffer-string))))))))
(defun tramp-convert-file-attributes (vec attr)
"Convert file-attributes ATTR generated by perl script, stat or ls.
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 82d878a6fa..9b11ef58ea 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -1876,7 +1876,17 @@ Falls back to normal file name handler if no Tramp file name handler exists."
;; Call the backend function.
(if foreign
(condition-case err
- (apply foreign operation args)
+ (let ((sf (symbol-function foreign)))
+ ;; Some packages set the default directory to a
+ ;; remote path, before respective Tramp packages
+ ;; are already loaded. This results in
+ ;; recursive loading. Therefore, we load the
+ ;; Tramp packages locally.
+ (when (and (listp sf) (eq (car sf) 'autoload))
+ (let ((default-directory
+ (tramp-compat-temporary-file-directory)))
+ (load (cadr sf) 'noerror)))
+ (apply foreign operation args))
;; Trace that somebody has interrupted the operation.
(quit
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index a6fd28be21..0236a2be29 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -709,6 +709,9 @@ comment at the start of cc-engine.el for more info."
;; content was found in the label. Note that we might still
;; regard it a label if it starts with `c-label-kwds'.
label-good-pos
+ ;; Putative positions of the components of a bitfield declaration,
+ ;; e.g. "int foo : NUM_FOO_BITS ;"
+ bitfield-type-pos bitfield-id-pos bitfield-size-pos
;; Symbol just scanned back over (e.g. 'while or 'boundary).
;; See above.
sym
@@ -765,13 +768,22 @@ comment at the start of cc-engine.el for more info."
;; Record this as the first token if not starting inside it.
(setq tok start))
- ;; The following while loop goes back one sexp (balanced parens,
- ;; etc. with contents, or symbol or suchlike) each iteration. This
- ;; movement is accomplished with a call to scan-sexps approx 130 lines
- ;; below.
+
+ ;; The following while loop goes back one sexp (balanced parens,
+ ;; etc. with contents, or symbol or suchlike) each iteration. This
+ ;; movement is accomplished with a call to c-backward-sexp approx 170
+ ;; lines below.
+ ;;
+ ;; The loop is exited only by throwing nil to the (catch 'loop ...):
+ ;; 1. On reaching the start of a macro;
+ ;; 2. On having passed a stmt boundary with the PDA stack empty;
+ ;; 3. On reaching the start of an Objective C method def;
+ ;; 4. From macro `c-bos-pop-state'; when the stack is empty;
+ ;; 5. From macro `c-bos-pop-state-and-retry' when the stack is empty.
(while
(catch 'loop ;; Throw nil to break, non-nil to continue.
(cond
+ ;; Are we in a macro, just after the opening #?
((save-excursion
(and macro-start ; Always NIL for AWK.
(progn (skip-chars-backward " \t")
@@ -792,7 +804,7 @@ comment at the start of cc-engine.el for more info."
(setq pos saved
ret 'macro
ignore-labels t))
- (throw 'loop nil))
+ (throw 'loop nil)) ; 1. Start of macro.
;; Do a round through the automaton if we've just passed a
;; statement boundary or passed a "while"-like token.
@@ -801,7 +813,7 @@ comment at the start of cc-engine.el for more info."
(setq sym (intern (match-string 1)))))
(when (and (< pos start) (null stack))
- (throw 'loop nil))
+ (throw 'loop nil)) ; 2. Statement boundary.
;; The PDA state handling.
;;
@@ -918,19 +930,14 @@ comment at the start of cc-engine.el for more info."
;; HERE IS THE SINGLE PLACE INSIDE THE PDA LOOP WHERE WE MOVE
;; BACKWARDS THROUGH THE SOURCE.
- ;; This is typically fast with the caching done by
- ;; c-(backward|forward)-sws.
(c-backward-syntactic-ws)
-
(let ((before-sws-pos (point))
- ;; Set as long as we have to continue jumping by sexps.
- ;; It's the position to use as end in the next round.
- sexp-loop-continue-pos
;; The end position of the area to search for statement
;; barriers in this round.
- (sexp-loop-end-pos pos))
+ (maybe-after-boundary-pos pos))
- ;; The following while goes back one sexp per iteration.
+ ;; Go back over exactly one logical sexp, taking proper
+ ;; account of macros and escaped EOLs.
(while
(progn
(unless (c-safe (c-backward-sexp) t)
@@ -938,81 +945,87 @@ comment at the start of cc-engine.el for more info."
;; stack won't be empty the code below will report a
;; suitable error.
(throw 'loop nil))
-
- ;; Check if the sexp movement crossed a statement or
- ;; declaration boundary. But first modify the point
- ;; so that `c-crosses-statement-barrier-p' only looks
- ;; at the non-sexp chars following the sexp.
- (save-excursion
- (when (setq
- boundary-pos
- (cond
- ((if macro-start
- nil
- (save-excursion
- (when (c-beginning-of-macro)
- ;; Set continuation position in case
- ;; `c-crosses-statement-barrier-p'
- ;; doesn't detect anything below.
- (setq sexp-loop-continue-pos (point)))))
- ;; If the sexp movement took us into a
- ;; macro then there were only some non-sexp
- ;; chars after it. Skip out of the macro
- ;; to analyze them but not the non-sexp
- ;; chars that might be inside the macro.
- (c-end-of-macro)
- (c-crosses-statement-barrier-p
- (point) sexp-loop-end-pos))
-
- ((and
- (eq (char-after) ?{)
- (not (c-looking-at-inexpr-block lim nil t)))
- ;; Passed a block sexp. That's a boundary
- ;; alright.
- (point))
-
- ((looking-at "\\s\(")
- ;; Passed some other paren. Only analyze
- ;; the non-sexp chars after it.
- (goto-char (1+ (c-down-list-backward
- before-sws-pos)))
- ;; We're at a valid token start position
- ;; (outside the `save-excursion') if
- ;; `c-crosses-statement-barrier-p' failed.
- (c-crosses-statement-barrier-p
- (point) sexp-loop-end-pos))
-
- (t
- ;; Passed a symbol sexp or line
- ;; continuation. It doesn't matter that
- ;; it's included in the analyzed region.
- (if (c-crosses-statement-barrier-p
- (point) sexp-loop-end-pos)
- t
- ;; If it was a line continuation then we
- ;; have to continue looping.
- (if (looking-at "\\\\$")
- (setq sexp-loop-continue-pos (point)))
- nil))))
-
- (setq pptok ptok
- ptok tok
- tok boundary-pos
- sym 'boundary)
- ;; Like a C "continue". Analyze the next sexp.
- (throw 'loop t)))
-
- sexp-loop-continue-pos) ; End of "go back a sexp" loop condition.
- (goto-char sexp-loop-continue-pos)
- (setq sexp-loop-end-pos sexp-loop-continue-pos
- sexp-loop-continue-pos nil))))
+ (cond
+ ;; Have we moved into a macro?
+ ((and (not macro-start)
+ (c-beginning-of-macro))
+ ;; Have we crossed a statement boundary? If not,
+ ;; keep going back until we find one or a "real" sexp.
+ (and
+ (save-excursion
+ (c-end-of-macro)
+ (not (c-crosses-statement-barrier-p
+ (point) maybe-after-boundary-pos)))
+ (setq maybe-after-boundary-pos (point))))
+ ;; Have we just gone back over an escaped NL? This
+ ;; doesn't count as a sexp.
+ ((looking-at "\\\\$")))))
+
+ ;; Have we crossed a statement boundary?
+ (setq boundary-pos
+ (cond
+ ;; Are we at a macro beginning?
+ ((and (not macro-start)
+ c-opt-cpp-prefix
+ (looking-at c-opt-cpp-prefix))
+ (save-excursion
+ (c-end-of-macro)
+ (c-crosses-statement-barrier-p
+ (point) maybe-after-boundary-pos)))
+ ;; Just gone back over a brace block?
+ ((and
+ (eq (char-after) ?{)
+ (not (c-looking-at-inexpr-block lim nil t)))
+ (save-excursion
+ (c-forward-sexp) (point)))
+ ;; Just gone back over some paren block?
+ ((looking-at "\\s\(")
+ (save-excursion
+ (goto-char (1+ (c-down-list-backward
+ before-sws-pos)))
+ (c-crosses-statement-barrier-p
+ (point) maybe-after-boundary-pos)))
+ ;; Just gone back over an ordinary symbol of some sort?
+ (t (c-crosses-statement-barrier-p
+ (point) maybe-after-boundary-pos))))
+
+ (when boundary-pos
+ (setq pptok ptok
+ ptok tok
+ tok boundary-pos
+ sym 'boundary)
+ ;; Like a C "continue". Analyze the next sexp.
+ (throw 'loop t))))
;; ObjC method def?
(when (and c-opt-method-key
(setq saved (c-in-method-def-p)))
(setq pos saved
ignore-labels t) ; Avoid the label check on exit.
- (throw 'loop nil))
+ (throw 'loop nil)) ; 3. ObjC method def.
+
+ ;; Might we have a bitfield declaration, "<type> <id> : <size>"?
+ (if c-has-bitfields
+ (cond
+ ;; The : <size> and <id> fields?
+ ((and (numberp c-maybe-labelp)
+ (not bitfield-size-pos)
+ (save-excursion
+ (goto-char (or tok start))
+ (not (looking-at c-keywords-regexp)))
+ (not (looking-at c-keywords-regexp))
+ (not (c-punctuation-in (point) c-maybe-labelp)))
+ (setq bitfield-size-pos (or tok start)
+ bitfield-id-pos (point)))
+ ;; The <type> field?
+ ((and bitfield-id-pos
+ (not bitfield-type-pos))
+ (if (and (looking-at c-symbol-key) ; Can only be an integer type. :-)
+ (not (looking-at c-not-primitive-type-keywords-regexp))
+ (not (c-punctuation-in (point) tok)))
+ (setq bitfield-type-pos (point))
+ (setq bitfield-size-pos nil
+ bitfield-id-pos nil)))))
;; Handle labels.
(unless (eq ignore-labels t)
@@ -1044,8 +1057,10 @@ comment at the start of cc-engine.el for more info."
pptok ptok
ptok tok
tok (point)
- pos tok))) ; Not nil (for the while loop).
-
+ pos tok) ; always non-nil
+ ) ; end of (catch loop ....)
+ ) ; end of sexp-at-a-time (while ....)
+
;; If the stack isn't empty there might be errors to report.
(while stack
(if (and (vectorp saved-pos) (eq (length saved-pos) 3))
@@ -1067,6 +1082,7 @@ comment at the start of cc-engine.el for more info."
(eq c-maybe-labelp t)
(not (eq ret 'beginning))
after-labels-pos
+ (not bitfield-type-pos) ; Bitfields take precedence over labels.
(or (not label-good-pos)
(<= label-good-pos pos)
(progn
@@ -1104,6 +1120,19 @@ comment at the start of cc-engine.el for more info."
(goto-char pos)
ret)))
+(defun c-punctuation-in (from to)
+ "Return non-nil if there is a non-comment non-macro punctuation character
+between FROM and TO. FROM must not be in a string or comment. The returned
+value is the position of the first such character."
+ (save-excursion
+ (goto-char from)
+ (let ((pos (point)))
+ (while (progn (skip-chars-forward c-symbol-chars to)
+ (c-forward-syntactic-ws to)
+ (> (point) pos))
+ (setq pos (point))))
+ (and (< (point) to) (point))))
+
(defun c-crosses-statement-barrier-p (from to)
"Return non-nil if buffer positions FROM to TO cross one or more
statement or declaration boundaries. The returned value is actually
@@ -6618,19 +6647,27 @@ comment at the start of cc-engine.el for more info."
(if backup-at-type
(progn
- ;; CASE 3
- (when (= (point) start)
- ;; Got a plain list of identifiers. If a colon follows it's
- ;; a valid label. Otherwise the last one probably is the
- ;; declared identifier and we should back up to the previous
- ;; type, providing it isn't a cast.
+
+ ;; CASE 3
+ (when (= (point) start)
+ ;; Got a plain list of identifiers. If a colon follows it's
+ ;; a valid label, or maybe a bitfield. Otherwise the last
+ ;; one probably is the declared identifier and we should
+ ;; back up to the previous type, providing it isn't a cast.
(if (and (eq (char-after) ?:)
(not (c-major-mode-is 'java-mode)))
- ;; If we've found a specifier keyword then it's a
- ;; declaration regardless.
- (throw 'at-decl-or-cast (eq at-decl-or-cast t))
- (setq backup-if-not-cast t)
- (throw 'at-decl-or-cast t)))
+ (cond
+ ;; If we've found a specifier keyword then it's a
+ ;; declaration regardless.
+ ((eq at-decl-or-cast t)
+ (throw 'at-decl-or-cast t))
+ ((and c-has-bitfields
+ (eq at-decl-or-cast 'ids)) ; bitfield.
+ (setq backup-if-not-cast t)
+ (throw 'at-decl-or-cast t)))
+
+ (setq backup-if-not-cast t)
+ (throw 'at-decl-or-cast t)))
;; CASE 4
(when (and got-suffix
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 0500d48ddb..2277ba760a 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -1179,6 +1179,14 @@ casts and declarations are fontified. Used on level 2 and higher."
(goto-char start-pos)))
;; Now analyze the construct.
+ ;; In QT, "more" is an irritating keyword that expands to nothing.
+ ;; We skip over it to prevent recognition of "more slots: <symbol>"
+ ;; as a bitfield declaration.
+ (when (and (c-major-mode-is 'c++-mode)
+ (looking-at
+ (concat "\\(more\\)\\([^" c-symbol-chars "]\\|$\\)")))
+ (goto-char (match-end 1))
+ (c-forward-syntactic-ws))
(setq decl-or-cast (c-forward-decl-or-cast-1
match-pos context last-cast-end))
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 9ce23a080d..35097242cb 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -511,6 +511,12 @@ parameters \(point-min), \(point-max) and <buffer size>."
;;; Lexer-level syntax (identifiers, tokens etc).
+(c-lang-defconst c-has-bitfields
+ "Whether the language has bitfield declarations."
+ t nil
+ (c c++ objc) t)
+(c-lang-defvar c-has-bitfields (c-lang-const c-has-bitfields))
+
(c-lang-defconst c-symbol-start
"Regexp that matches the start of a symbol, i.e. any identifier or
keyword. It's unspecified how far it matches. Does not contain a \\|
@@ -528,6 +534,7 @@ This is of the form that fits inside [ ] in a regexp."
;; operator chars too, but they are handled with other means instead.
t (concat c-alnum "_$")
objc (concat c-alnum "_$@"))
+(c-lang-defvar c-symbol-chars (c-lang-const c-symbol-chars))
(c-lang-defconst c-symbol-key
"Regexp matching identifiers and keywords (with submatch 0). Assumed
@@ -1927,6 +1934,21 @@ one of `c-type-list-kwds', `c-ref-list-kwds',
(c-lang-defvar c-not-decl-init-keywords
(c-lang-const c-not-decl-init-keywords))
+(c-lang-defconst c-not-primitive-type-keywords
+ "List of all keywords apart from primitive types (like \"int\")."
+ t (set-difference (c-lang-const c-keywords)
+ (c-lang-const c-primitive-type-kwds)
+ :test 'string-equal)
+ ;; The "more" for C++ is the QT keyword (as in "more slots:").
+ ;; This variable is intended for use in c-beginning-of-statement-1.
+ c++ (append (c-lang-const c-not-primitive-type-keywords) '("more")))
+
+(c-lang-defconst c-not-primitive-type-keywords-regexp
+ t (c-make-keywords-re t
+ (c-lang-const c-not-primitive-type-keywords)))
+(c-lang-defvar c-not-primitive-type-keywords-regexp
+ (c-lang-const c-not-primitive-type-keywords-regexp))
+
(c-lang-defconst c-protection-kwds
"Access protection label keywords in classes."
t nil
@@ -3092,10 +3114,9 @@ accomplish that conveniently."
;; ',mode ,c-version c-version)
;; (put ',mode 'c-has-warned-lang-consts t))
- (require 'cc-langs)
(setq source-eval t)
- (let ((init (append (cdr c-emacs-variable-inits)
- (cdr c-lang-variable-inits))))
+ (let ((init ',(append (cdr c-emacs-variable-inits)
+ (cdr c-lang-variable-inits))))
(while init
(setq current-var (caar init))
(set (caar init) (eval (cadar init)))
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 1adc6c2eac..4299c41331 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -120,11 +120,6 @@
; '
(require 'cc-fonts) ;)
-;; cc-langs isn't loaded when we're byte compiled, so add autoload
-;; directives for the interface functions.
-(autoload 'c-make-init-lang-vars-fun "cc-langs")
-(autoload 'c-init-language-vars "cc-langs" nil nil 'macro)
-
;; Other modes and packages which depend on CC Mode should do the
;; following to make sure everything is loaded and available for their
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index da073ceb25..a330007790 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1260,11 +1260,11 @@ buffer-local values of tags table format variables."
(defun etags-file-of-tag (&optional relative) ; Doc string?
(save-excursion
(re-search-backward "\f\n\\([^\n]+\\),[0-9]*\n")
- (let ((str (buffer-substring (match-beginning 1) (match-end 1))))
+ (let ((str (convert-standard-filename
+ (buffer-substring (match-beginning 1) (match-end 1)))))
(if relative
str
- (expand-file-name str
- (file-truename default-directory))))))
+ (expand-file-name str (file-truename default-directory))))))
(defun etags-tags-completion-table () ; Doc string?
@@ -1545,7 +1545,9 @@ hits the start of file."
(end-of-line)
(skip-chars-backward "^," beg)
(or (looking-at "include$")
- (setq files (cons (buffer-substring beg (1- (point))) files))))
+ (push (convert-standard-filename
+ (buffer-substring beg (1- (point))))
+ files)))
(nreverse files)))
(defun etags-tags-included-tables () ; Doc string?
@@ -1556,10 +1558,11 @@ hits the start of file."
(setq beg (point))
(end-of-line)
(skip-chars-backward "^," beg)
- (if (looking-at "include$")
- ;; Expand in the default-directory of the tags table buffer.
- (setq files (cons (expand-file-name (buffer-substring beg (1- (point))))
- files))))
+ (when (looking-at "include$")
+ ;; Expand in the default-directory of the tags table buffer.
+ (push (expand-file-name (convert-standard-filename
+ (buffer-substring beg (1- (point)))))
+ files)))
(nreverse files)))
;; Empty tags file support.
diff --git a/lisp/window.el b/lisp/window.el
index 12c9da85d5..905db8dc9b 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -5051,14 +5051,22 @@ description."
(funcall side window)))))
(when (window-live-p window)
- ;; Adjust sizes if asked for.
- (display-buffer-set-height window specifiers)
- (display-buffer-set-width window specifiers)
+ ;; In `quit-restore' parameter record that we popped up
+ ;; this window, its buffer and which window was selected.
(set-window-parameter
window 'quit-restore (list 'new-window buffer selected-window))
+ ;; For `display-buffer-window' mark window as new.
(setq display-buffer-window (cons window 'new-window))
+ ;; Install BUFFER in the new window.
(display-buffer-in-window buffer window specifiers)
+ ;; Adjust sizes if asked for (for `fit-window-to-buffer'
+ ;; and friends BUFFER must be already shown in the new
+ ;; window).
+ (display-buffer-set-height window specifiers)
+ (display-buffer-set-width window specifiers)
+ ;; Reset list of window's previous buffers to nil.
(set-window-prev-buffers window nil)
+ ;; Return the new window.
(throw 'done window))))))))
(defun display-buffer-pop-up-frame (buffer &optional graphic-only specifiers)
@@ -5113,26 +5121,33 @@ failed."
(display-buffer-split-window main-or-root on-side specifiers))
fun)
(when window
+ ;; We were able to split off a new window.
(unless main
(walk-window-subtree
(lambda (window)
;; Make all main-or-root subwindows main windows.
(set-window-parameter window 'window-side 'none))
main-or-root t))
- ;; Make sure that parent's window-side is nil.
+ ;; Reset window-side parameter of new window's parent to nil.
(set-window-parameter (window-parent window) 'window-side nil)
- ;; Initialize side.
+ ;; Initialize window-side parameter of new window to SIDE.
(set-window-parameter window 'window-side side)
- ;; Adjust sizes if asked for.
- (display-buffer-set-height window specifiers)
- (display-buffer-set-width window specifiers)
- ;; Set window parameters.
+ ;; Install window-slot parameter of new window.
+ (set-window-parameter window 'window-slot slot)
+ ;; In `quit-restore' parameter record that we popped up a new
+ ;; window.
(set-window-parameter
window 'quit-restore (list 'new-window buffer selected-window))
+ ;; For `display-buffer-window' mark window as new.
(setq display-buffer-window (cons window 'new-window))
- (set-window-parameter window 'window-slot slot)
+ ;; Install BUFFER in new window.
(display-buffer-in-window buffer window specifiers)
+ ;; Adjust sizes of new window if asked for.
+ (display-buffer-set-height window specifiers)
+ (display-buffer-set-width window specifiers)
+ ;; Reset list of new window's previous buffers to nil.
(set-window-prev-buffers window nil)
+ ;; Return the new window.
window)))
(defun display-buffer-in-side-window (buffer side &optional slot specifiers)
@@ -5160,7 +5175,7 @@ SPECIFIERS must be a list of buffer display specifiers."
window-sides-slots))
(selected-window (selected-window))
window this-window this-slot prev-window next-window
- best-window best-slot abs-slot dedicated)
+ best-window best-slot abs-slot dedicated new-window)
(unless (numberp slot)
(setq slot 0))
@@ -5233,13 +5248,16 @@ SPECIFIERS must be a list of buffer display specifiers."
(setq window (display-buffer-split-window
prev-window prev-side specifiers)))))
(progn
- (display-buffer-set-height window specifiers)
- (display-buffer-set-width window specifiers)
+ ;; In `quit-restore' parameter record that we popped up
+ ;; this window, its buffer and the old selected window.
(set-window-parameter
window 'quit-restore
(list 'new-window buffer selected-window))
+ ;; For `display-buffer-window' mark window as new.
(setq display-buffer-window (cons window 'new-window))
- window))
+ ;; Record that window is new, we need this for
+ ;; adjusting sizes below.
+ (setq new-window window)))
(and best-window
(setq window best-window)
;; Reuse best window (the window nearest to SLOT).
@@ -5262,7 +5280,17 @@ SPECIFIERS must be a list of buffer display specifiers."
(unless (window-parameter window 'window-slot)
;; Don't change exisiting slot value.
(set-window-parameter window 'window-slot slot))
- (display-buffer-in-window buffer window specifiers)))))
+ ;; Install BUFFER in the window.
+ (display-buffer-in-window buffer window specifiers)
+ (when new-window
+ ;; Adjust sizes if asked for (for `fit-window-to-buffer' and
+ ;; friends BUFFER must be already shown in the new window).
+ (display-buffer-set-height window specifiers)
+ (display-buffer-set-width window specifiers)
+ ;; Reset list of new window's previous buffers to nil.
+ (set-window-prev-buffers window nil))
+ ;; Return the window used.
+ window))))
(defun window-normalize-buffer-to-display (buffer-or-name)
"Normalize BUFFER-OR-NAME argument for buffer display functions.
@@ -6926,7 +6954,7 @@ WINDOW was scrolled."
;; `with-selected-window' should orderly restore the current buffer.
(with-selected-window window
;; We are in WINDOW's buffer now.
- (let* ( ;; Adjust MIN-HEIGHT.
+ (let* (;; Adjust MIN-HEIGHT.
(min-height
(if override
(window-min-size window nil window)
diff --git a/src/ChangeLog b/src/ChangeLog
index b72de32ffc..10f6e32689 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,4 +1,4 @@
-2011-07-19 Paul Eggert <eggert@cs.ucla.edu>
+2011-07-28 Paul Eggert <eggert@cs.ucla.edu>
Integer signedness and overflow and related fixes. (Bug#9079)
@@ -197,6 +197,101 @@
Use EMACS_INT, not EMACS_UINT, for sizes. The code works equally
well either way, and we prefer signed to unsigned.
+2011-07-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnutls.c (emacs_gnutls_read): Don't message anything if the peer
+ closes the connection while we're reading (bug#9182).
+
+2011-07-25 Jan Djärv <jan.h.d@swipnet.se>
+
+ * nsmenu.m (ns_popup_dialog): Add an "ok" button if no buttons
+ are specified (Bug#9168).
+
+2011-07-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * bidi.c (bidi_dump_cached_states): Fix printf format mismatch.
+ Found by GCC static checking and --with-wide-int on a 32-bit host.
+
+2011-07-25 Eli Zaretskii <eliz@gnu.org>
+
+ * xdisp.c (compute_display_string_pos): Fix logic of caching
+ previous display string position. Initialize cached_prev_pos to
+ -1. Fixes slow-down at the beginning of a buffer.
+
+2011-07-24 Eli Zaretskii <eliz@gnu.org>
+
+ * xfaces.c (check_lface_attrs) [HAVE_WINDOW_SYSTEM]: Allow `nil'
+ for attrs[LFACE_FONTSET_INDEX].
+
+2011-07-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ * xml.c (parse_region): Remove unused local
+ that was recently introduced.
+
+2011-07-23 Eli Zaretskii <eliz@gnu.org>
+
+ * xfns.c (unwind_create_frame) [GLYPH_DEBUG]: Adapt to changes in
+ 2008-02-22T17:42:09Z!monnier@iro.umontreal.ca.
+
+ * xdisp.c (move_it_in_display_line_to): Record the best matching
+ position for TO_CHARPOS while scanning the line, and restore it on
+ exit if none of the characters scanned was an exact match. Fixes
+ vertical-motion and pos-visible-in-window-p under bidi redisplay
+ when exact match is impossible due to invisible text, and the
+ lines are truncated.
+
+2011-07-23 Jan Djärv <jan.h.d@swipnet.se>
+
+ * nsterm.m (initFrameFromEmacs): Set NSTitledWindowMask in styleMask
+ for OSX >= 10.7.
+
+2011-07-22 Eli Zaretskii <eliz@gnu.org>
+
+ Fix a significant slow-down of cursor motion with C-n, C-p,
+ C-f/C-b, and C-v/M-v that couldn't keep up with keyboard
+ auto-repeat under bidi redisplay in fontified buffers.
+ * xdisp.c (compute_stop_pos_backwards): New function.
+ (next_element_from_buffer): Call compute_stop_pos_backwards to
+ find a suitable prev_stop when we find ourselves before
+ base_level_stop.
+ (reseat): Don't look for prev_stop, as that could mean a very long
+ run.
+ <cached_disp_pos, cached_disp_buffer, cached_disp_modiff>
+ <cached_disp_overlay_modiff>: Cache for last found display string
+ position.
+ (compute_display_string_pos): Return the cached position if asked
+ about the same buffer in the same area of character positions, and
+ the buffer wasn't changed since the time the display string
+ position was cached.
+
+2011-07-22 Eli Zaretskii <eliz@gnu.org>
+
+ * xdisp.c (rows_from_pos_range): Don't ignore glyphs whose object
+ is an integer, which is important for empty lines. (Bug#9149)
+
+2011-07-22 Chong Yidong <cyd@stupidchicken.com>
+
+ * frame.c (Fmodify_frame_parameters): In tty case, update the
+ default face if necessary (Bug#4238).
+
+2011-07-21 Chong Yidong <cyd@stupidchicken.com>
+
+ * editfns.c (Fstring_to_char): No need to explain what a character
+ is in the docstring (Bug#6576).
+
+2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * xml.c (parse_region): Make sure we always return a tree.
+
+2011-07-20 HAMANO Kiyoto <khiker.mail@gmail.com>
+
+ * xml.c (parse_region): If a document contains only comments,
+ return that, too.
+
+2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * xml.c (make_dom): Return comments, too.
+
2011-07-19 Paul Eggert <eggert@cs.ucla.edu>
Port to OpenBSD.
diff --git a/src/bidi.c b/src/bidi.c
index 697ebb9285..a6af9e36e1 100644
--- a/src/bidi.c
+++ b/src/bidi.c
@@ -2319,7 +2319,7 @@ bidi_dump_cached_states (void)
fprintf (stderr, "The cache is empty.\n");
return;
}
- fprintf (stderr, "Total of %"pD"d state%s in cache:\n",
+ fprintf (stderr, "Total of %"pI"d state%s in cache:\n",
bidi_cache_idx, bidi_cache_idx == 1 ? "" : "s");
for (i = bidi_cache[bidi_cache_idx - 1].charpos; i > 0; i /= 10)
diff --git a/src/editfns.c b/src/editfns.c
index 18fefa5e3b..577263c5ae 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -194,12 +194,7 @@ DEFUN ("byte-to-string", Fbyte_to_string, Sbyte_to_string, 1, 1, 0,
}
DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
- doc: /* Return the first character in STRING.
-A multibyte character is handled correctly.
-The value returned is a Unicode codepoint if it is below #x110000 (in
-hex). Codepoints beyond that are Emacs extensions of Unicode. In
-particular, eight-bit characters are returned as codepoints in the
-range #x3FFF80 through #x3FFFFF, inclusive. */)
+ doc: /* Return the first character in STRING. */)
(register Lisp_Object string)
{
register Lisp_Object val;
diff --git a/src/frame.c b/src/frame.c
index 635996ca42..19ce78dfd9 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -2437,11 +2437,9 @@ use is not recommended. Explicitly check for a frame-parameter instead. */)
val = values[i];
store_frame_param (f, prop, val);
- /* Changing the background color might change the background
- mode, so that we have to load new defface specs.
- Call frame-set-background-mode to do that. */
- if (EQ (prop, Qbackground_color))
- call1 (Qframe_set_background_mode, frame);
+ if (EQ (prop, Qforeground_color)
+ || EQ (prop, Qbackground_color))
+ update_face_from_frame_parameter (f, prop, val);
}
}
return Qnil;
diff --git a/src/gnutls.c b/src/gnutls.c
index 3175f55041..fc651d2c7e 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -382,6 +382,9 @@ emacs_gnutls_read (struct Lisp_Process *proc, char *buf, EMACS_INT nbyte)
rtnval = fn_gnutls_record_recv (state, buf, nbyte);
if (rtnval >= 0)
return rtnval;
+ else if (rtnval == GNUTLS_E_UNEXPECTED_PACKET_LENGTH)
+ /* The peer closed the connection. */
+ return 0;
else if (emacs_gnutls_handle_error (state, rtnval) == 0)
/* non-fatal error */
return -1;
diff --git a/src/nsmenu.m b/src/nsmenu.m
index 6a9ee7dd4f..6931b7a3c0 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -1340,7 +1340,7 @@ Lisp_Object
ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header)
{
id dialog;
- Lisp_Object window, tem;
+ Lisp_Object window, tem, title;
struct frame *f;
NSPoint p;
BOOL isQ;
@@ -1389,6 +1389,14 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header)
p.x = (int)f->left_pos + ((int)FRAME_COLUMN_WIDTH (f) * f->text_cols)/2;
p.y = (int)f->top_pos + (FRAME_LINE_HEIGHT (f) * f->text_lines)/2;
+ title = Fcar (contents);
+ CHECK_STRING (title);
+
+ if (NILP (Fcar (Fcdr (contents))))
+ /* No buttons specified, add an "Ok" button so users can pop down
+ the dialog. */
+ contents = Fcons (title, Fcons (Fcons (build_string ("Ok"), Qt), Qnil));
+
BLOCK_INPUT;
dialog = [[EmacsDialogPanel alloc] initFromContents: contents
isQuestion: isQ];
diff --git a/src/nsterm.m b/src/nsterm.m
index 546247ab74..e45dc1a902 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -5304,6 +5304,9 @@ ns_term_shutdown (int sig)
win = [[EmacsWindow alloc]
initWithContentRect: r
styleMask: (NSResizableWindowMask |
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
+ NSTitledWindowMask |
+#endif
NSMiniaturizableWindowMask |
NSClosableWindowMask)
backing: NSBackingStoreBuffered
diff --git a/src/xdisp.c b/src/xdisp.c
index 137cbec497..8f35256171 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3134,6 +3134,14 @@ next_overlay_change (EMACS_INT pos)
return endpos;
}
+/* Record one cached display string position found recently by
+ compute_display_string_pos. */
+static EMACS_INT cached_disp_pos;
+static EMACS_INT cached_prev_pos = -1;
+static struct buffer *cached_disp_buffer;
+static int cached_disp_modiff;
+static int cached_disp_overlay_modiff;
+
/* Return the character position of a display string at or after
position specified by POSITION. If no display string exists at or
after POSITION, return ZV. A display string is either an overlay
@@ -3155,6 +3163,7 @@ compute_display_string_pos (struct text_pos *position,
EMACS_INT begb = string_p ? 0 : BEGV;
EMACS_INT bufpos, charpos = CHARPOS (*position);
struct text_pos tpos;
+ struct buffer *b;
if (charpos >= eob
/* We don't support display properties whose values are strings
@@ -3164,6 +3173,37 @@ compute_display_string_pos (struct text_pos *position,
|| (string->s && !STRINGP (object)))
return eob;
+ /* Check the cached values. */
+ if (!STRINGP (object))
+ {
+ if (NILP (object))
+ b = current_buffer;
+ else
+ b = XBUFFER (object);
+ if (b == cached_disp_buffer
+ && BUF_MODIFF (b) == cached_disp_modiff
+ && BUF_OVERLAY_MODIFF (b) == cached_disp_overlay_modiff)
+ {
+ if (cached_prev_pos >= 0
+ && cached_prev_pos < charpos && charpos <= cached_disp_pos)
+ return cached_disp_pos;
+ /* Handle overstepping either end of the known interval. */
+ if (charpos > cached_disp_pos)
+ cached_prev_pos = cached_disp_pos;
+ else /* charpos <= cached_prev_pos */
+ cached_prev_pos = max (charpos - 1, 0);
+ }
+
+ /* Record new values in the cache. */
+ if (b != cached_disp_buffer)
+ {
+ cached_disp_buffer = b;
+ cached_prev_pos = max (charpos - 1, 0);
+ }
+ cached_disp_modiff = BUF_MODIFF (b);
+ cached_disp_overlay_modiff = BUF_OVERLAY_MODIFF (b);
+ }
+
/* If the character at CHARPOS is where the display string begins,
return CHARPOS. */
pos = make_number (charpos);
@@ -3179,7 +3219,11 @@ compute_display_string_pos (struct text_pos *position,
spec))
&& handle_display_spec (NULL, spec, object, Qnil, &tpos, bufpos,
frame_window_p))
- return charpos;
+ {
+ if (!STRINGP (object))
+ cached_disp_pos = charpos;
+ return charpos;
+ }
/* Look forward for the first character with a `display' property
that will replace the underlying text when displayed. */
@@ -3199,6 +3243,8 @@ compute_display_string_pos (struct text_pos *position,
|| !handle_display_spec (NULL, spec, object, Qnil, &tpos, bufpos,
frame_window_p));
+ if (!STRINGP (object))
+ cached_disp_pos = CHARPOS (tpos);
return CHARPOS (tpos);
}
@@ -5731,17 +5777,19 @@ reseat (struct it *it, struct text_pos pos, int force_p)
{
/* For bidi iteration, we need to prime prev_stop and
base_level_stop with our best estimations. */
- if (CHARPOS (pos) < it->prev_stop)
- {
- handle_stop_backwards (it, BEGV);
- if (CHARPOS (pos) < it->base_level_stop)
- it->base_level_stop = 0;
- }
- else if (CHARPOS (pos) > it->stop_charpos
- && it->stop_charpos >= BEGV)
- handle_stop_backwards (it, it->stop_charpos);
- else /* force_p */
- handle_stop (it);
+ /* Implementation note: Of course, POS is not necessarily a
+ stop position, so assigning prev_pos to it is a lie; we
+ should have called compute_stop_backwards. However, if
+ the current buffer does not include any R2L characters,
+ that call would be a waste of cycles, because the
+ iterator will never move back, and thus never cross this
+ "fake" stop position. So we delay that backward search
+ until the time we really need it, in next_element_from_buffer. */
+ if (CHARPOS (pos) != it->prev_stop)
+ it->prev_stop = CHARPOS (pos);
+ if (CHARPOS (pos) < it->base_level_stop)
+ it->base_level_stop = 0; /* meaning it's unknown */
+ handle_stop (it);
}
else
{
@@ -7008,10 +7056,10 @@ next_element_from_string (struct it *it)
embedding level, so test for that explicitly. */
&& !BIDI_AT_BASE_LEVEL (it->bidi_it))
{
- /* If we lost track of base_level_stop, we have no better place
- for handle_stop_backwards to start from than BEGV. This
- happens, e.g., when we were reseated to the previous
- screenful of text by vertical-motion. */
+ /* If we lost track of base_level_stop, we have no better
+ place for handle_stop_backwards to start from than string
+ beginning. This happens, e.g., when we were reseated to
+ the previous screenful of text by vertical-motion. */
if (it->base_level_stop <= 0
|| IT_STRING_CHARPOS (*it) < it->base_level_stop)
it->base_level_stop = 0;
@@ -7199,6 +7247,50 @@ next_element_from_stretch (struct it *it)
return 1;
}
+/* Scan backwards from IT's current position until we find a stop
+ position, or until BEGV. This is called when we find ourself
+ before both the last known prev_stop and base_level_stop while
+ reordering bidirectional text. */
+
+static void
+compute_stop_pos_backwards (struct it *it)
+{
+ const int SCAN_BACK_LIMIT = 1000;
+ struct text_pos pos;
+ struct display_pos save_current = it->current;
+ struct text_pos save_position = it->position;
+ EMACS_INT charpos = IT_CHARPOS (*it);
+ EMACS_INT where_we_are = charpos;
+ EMACS_INT save_stop_pos = it->stop_charpos;
+ EMACS_INT save_end_pos = it->end_charpos;
+
+ xassert (NILP (it->string) && !it->s);
+ xassert (it->bidi_p);
+ it->bidi_p = 0;
+ do
+ {
+ it->end_charpos = min (charpos + 1, ZV);
+ charpos = max (charpos - SCAN_BACK_LIMIT, BEGV);
+ SET_TEXT_POS (pos, charpos, BYTE_TO_CHAR (charpos));
+ reseat_1 (it, pos, 0);
+ compute_stop_pos (it);
+ /* We must advance forward, right? */
+ if (it->stop_charpos <= charpos)
+ abort ();
+ }
+ while (charpos > BEGV && it->stop_charpos >= it->end_charpos);
+
+ if (it->stop_charpos <= where_we_are)
+ it->prev_stop = it->stop_charpos;
+ else
+ it->prev_stop = BEGV;
+ it->bidi_p = 1;
+ it->current = save_current;
+ it->position = save_position;
+ it->stop_charpos = save_stop_pos;
+ it->end_charpos = save_end_pos;
+}
+
/* Scan forward from CHARPOS in the current buffer/string, until we
find a stop position > current IT's position. Then handle the stop
position before that. This is called when we bump into a stop
@@ -7218,6 +7310,7 @@ handle_stop_backwards (struct it *it, EMACS_INT charpos)
EMACS_INT next_stop;
/* Scan in strict logical order. */
+ xassert (it->bidi_p);
it->bidi_p = 0;
do
{
@@ -7237,11 +7330,11 @@ handle_stop_backwards (struct it *it, EMACS_INT charpos)
}
while (charpos <= where_we_are);
- next_stop = it->stop_charpos;
- it->stop_charpos = it->prev_stop;
it->bidi_p = 1;
it->current = save_current;
it->position = save_position;
+ next_stop = it->stop_charpos;
+ it->stop_charpos = it->prev_stop;
handle_stop (it);
it->stop_charpos = next_stop;
}
@@ -7338,14 +7431,19 @@ next_element_from_buffer (struct it *it)
embedding level, so test for that explicitly. */
&& !BIDI_AT_BASE_LEVEL (it->bidi_it))
{
- /* If we lost track of base_level_stop, we have no better place
- for handle_stop_backwards to start from than BEGV. This
- happens, e.g., when we were reseated to the previous
- screenful of text by vertical-motion. */
if (it->base_level_stop <= 0
|| IT_CHARPOS (*it) < it->base_level_stop)
- it->base_level_stop = BEGV;
- handle_stop_backwards (it, it->base_level_stop);
+ {
+ /* If we lost track of base_level_stop, we need to find
+ prev_stop by looking backwards. This happens, e.g., when
+ we were reseated to the previous screenful of text by
+ vertical-motion. */
+ it->base_level_stop = BEGV;
+ compute_stop_pos_backwards (it);
+ handle_stop_backwards (it, it->prev_stop);
+ }
+ else
+ handle_stop_backwards (it, it->base_level_stop);
return GET_NEXT_DISPLAY_ELEMENT (it);
}
else
@@ -7547,8 +7645,9 @@ move_it_in_display_line_to (struct it *it,
{
enum move_it_result result = MOVE_UNDEFINED;
struct glyph_row *saved_glyph_row;
- struct it wrap_it, atpos_it, atx_it;
+ struct it wrap_it, atpos_it, atx_it, ppos_it;
void *wrap_data = NULL, *atpos_data = NULL, *atx_data = NULL;
+ void *ppos_data = NULL;
int may_wrap = 0;
enum it_method prev_method = it->method;
EMACS_INT prev_pos = IT_CHARPOS (*it);
@@ -7567,6 +7666,19 @@ move_it_in_display_line_to (struct it *it,
atpos_it.sp = -1;
atx_it.sp = -1;
+ /* Use ppos_it under bidi reordering to save a copy of IT for the
+ position > CHARPOS that is the closest to CHARPOS. We restore
+ that position in IT when we have scanned the entire display line
+ without finding a match for CHARPOS and all the character
+ positions are greater than CHARPOS. */
+ if (it->bidi_p)
+ {
+ SAVE_IT (ppos_it, *it, ppos_data);
+ SET_TEXT_POS (ppos_it.current.pos, ZV, ZV_BYTE);
+ if ((op & MOVE_TO_POS) && IT_CHARPOS (*it) >= to_charpos)
+ SAVE_IT (ppos_it, *it, ppos_data);
+ }
+
#define BUFFER_POS_REACHED_P() \
((op & MOVE_TO_POS) != 0 \
&& BUFFERP (it->object) \
@@ -7692,6 +7804,11 @@ move_it_in_display_line_to (struct it *it,
if (IT_CHARPOS (*it) < CHARPOS (this_line_min_pos))
SET_TEXT_POS (this_line_min_pos,
IT_CHARPOS (*it), IT_BYTEPOS (*it));
+ if (it->bidi_p
+ && (op & MOVE_TO_POS)
+ && IT_CHARPOS (*it) > to_charpos
+ && IT_CHARPOS (*it) < IT_CHARPOS (ppos_it))
+ SAVE_IT (ppos_it, *it, ppos_data);
continue;
}
@@ -7902,7 +8019,11 @@ move_it_in_display_line_to (struct it *it,
if ((op & MOVE_TO_POS) != 0
&& !saw_smaller_pos
&& IT_CHARPOS (*it) > to_charpos)
- result = MOVE_POS_MATCH_OR_ZV;
+ {
+ result = MOVE_POS_MATCH_OR_ZV;
+ if (it->bidi_p && IT_CHARPOS (ppos_it) < ZV)
+ RESTORE_IT (it, &ppos_it, ppos_data);
+ }
else
result = MOVE_NEWLINE_OR_CR;
break;
@@ -7918,6 +8039,11 @@ move_it_in_display_line_to (struct it *it,
SET_TEXT_POS (this_line_min_pos, IT_CHARPOS (*it), IT_BYTEPOS (*it));
if (IT_CHARPOS (*it) < to_charpos)
saw_smaller_pos = 1;
+ if (it->bidi_p
+ && (op & MOVE_TO_POS)
+ && IT_CHARPOS (*it) >= to_charpos
+ && IT_CHARPOS (*it) < IT_CHARPOS (ppos_it))
+ SAVE_IT (ppos_it, *it, ppos_data);
/* Stop if lines are truncated and IT's current x-position is
past the right edge of the window now. */
@@ -7927,7 +8053,9 @@ move_it_in_display_line_to (struct it *it,
if (!FRAME_WINDOW_P (it->f)
|| IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
{
- if (!get_next_display_element (it)
+ int at_eob_p = 0;
+
+ if ((at_eob_p = !get_next_display_element (it))
|| BUFFER_POS_REACHED_P ()
/* If we are past TO_CHARPOS, but never saw any
character positions smaller than TO_CHARPOS,
@@ -7938,6 +8066,8 @@ move_it_in_display_line_to (struct it *it,
&& IT_CHARPOS (*it) > to_charpos))
{
result = MOVE_POS_MATCH_OR_ZV;
+ if (it->bidi_p && !at_eob_p && IT_CHARPOS (ppos_it) < ZV)
+ RESTORE_IT (it, &ppos_it, ppos_data);
break;
}
if (ITERATOR_AT_END_OF_LINE_P (it))
@@ -7951,6 +8081,8 @@ move_it_in_display_line_to (struct it *it,
&& IT_CHARPOS (*it) > to_charpos)
{
result = MOVE_POS_MATCH_OR_ZV;
+ if (it->bidi_p && IT_CHARPOS (ppos_it) < ZV)
+ RESTORE_IT (it, &ppos_it, ppos_data);
break;
}
result = MOVE_LINE_TRUNCATED;
@@ -7976,6 +8108,8 @@ move_it_in_display_line_to (struct it *it,
xfree (atx_data);
if (wrap_data)
xfree (wrap_data);
+ if (ppos_data)
+ xfree (ppos_data);
/* Restore the iterator settings altered at the beginning of this
function. */
@@ -23126,7 +23260,7 @@ produce_glyphless_glyph (struct it *it, int for_no_font, Lisp_Object acronym)
base_width = font->average_width;
/* Get a face ID for the glyph by utilizing a cache (the same way as
- doen for `escape-glyph' in get_next_display_element). */
+ done for `escape-glyph' in get_next_display_element). */
if (it->f == last_glyphless_glyph_frame
&& it->face_id == last_glyphless_glyph_face_id)
{
@@ -25029,7 +25163,7 @@ rows_from_pos_range (struct window *w,
while (g < e)
{
- if (BUFFERP (g->object)
+ if ((BUFFERP (g->object) || INTEGERP (g->object))
&& start_charpos <= g->charpos && g->charpos < end_charpos)
*start = row;
g++;
@@ -25079,7 +25213,7 @@ rows_from_pos_range (struct window *w,
while (g < e)
{
- if (BUFFERP (g->object)
+ if ((BUFFERP (g->object) || INTEGERP (g->object))
&& start_charpos <= g->charpos && g->charpos < end_charpos)
break;
g++;
diff --git a/src/xfaces.c b/src/xfaces.c
index e0dc2883f3..52b125b42e 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -1920,7 +1920,8 @@ check_lface_attrs (Lisp_Object *attrs)
|| IGNORE_DEFFACE_P (attrs[LFACE_FONT_INDEX])
|| FONTP (attrs[LFACE_FONT_INDEX]));
xassert (UNSPECIFIEDP (attrs[LFACE_FONTSET_INDEX])
- || STRINGP (attrs[LFACE_FONTSET_INDEX]));
+ || STRINGP (attrs[LFACE_FONTSET_INDEX])
+ || NILP (attrs[LFACE_FONTSET_INDEX]));
#endif
}
diff --git a/src/xfns.c b/src/xfns.c
index 0d1e4a1bb5..eec19b9d27 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -2933,7 +2933,7 @@ unwind_create_frame (Lisp_Object frame)
#if GLYPH_DEBUG
/* Check that reference counts are indeed correct. */
xassert (dpyinfo->reference_count == dpyinfo_refcount);
- xassert (dpyinfo->image_cache->refcount == image_cache_refcount);
+ xassert (dpyinfo->terminal->image_cache->refcount == image_cache_refcount);
#endif
return Qt;
}
diff --git a/src/xml.c b/src/xml.c
index 63041c96b2..55352baae3 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -71,6 +71,14 @@ make_dom (xmlNode *node)
else
return Qnil;
}
+ else if (node->type == XML_COMMENT_NODE)
+ {
+ if (node->content)
+ return list3 (intern ("comment"), Qnil,
+ build_string ((char *) node->content));
+ else
+ return Qnil;
+ }
else
return Qnil;
}
@@ -79,7 +87,6 @@ static Lisp_Object
parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url, int htmlp)
{
xmlDoc *doc;
- xmlNode *node;
Lisp_Object result = Qnil;
const char *burl = "";
EMACS_INT bytes;
@@ -117,9 +124,22 @@ parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url, int html
if (doc != NULL)
{
- node = xmlDocGetRootElement (doc);
- if (node != NULL)
- result = make_dom (node);
+ xmlNode *n = doc->children->next;
+ Lisp_Object r = Qnil;
+
+ while (n) {
+ if (!NILP (r))
+ result = Fcons (r, result);
+ r = make_dom (n);
+ n = n->next;
+ }
+
+ if (NILP (result))
+ result = r;
+ else
+ result = Fcons (intern ("top"),
+ Fcons (Qnil, Fnreverse (Fcons (r, result))));
+
xmlFreeDoc (doc);
xmlCleanupParser ();
}
diff --git a/test/ChangeLog b/test/ChangeLog
index add4d9c766..11b3d9b5e2 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,25 @@
+2011-07-26 Ulf Jasper <ulf.jasper@web.de>
+
+ * automated/icalendar-tests.el (icalendar-tests--compare-strings):
+ Removed, simply use string=.
+ (icalendar--diarytime-to-isotime)
+ (icalendar--datetime-to-diary-date)
+ (icalendar--datestring-to-isodate)
+ (icalendar--format-ical-event)
+ (icalendar--parse-summary-and-rest)
+ (icalendar-tests--do-test-import)
+ (icalendar-tests--do-test-cycle) : Changed argument order of
+ string= to EXPECTED ACTUAL.
+ (icalendar--import-format-sample)
+ (icalendar--format-ical-event)
+ (icalendar-import-non-recurring)
+ (icalendar-import-rrule)
+ (icalendar-import-duration)
+ (icalendar-import-bug-6766)
+ (icalendar-real-world): Adjusted to string= instead of
+ icalendar-tests--compare-strings.
+ (icalendar-import-multiple-vcalendars): New.
+
2011-05-11 Teodor Zlatanov <tzz@lifelogs.com>
* automated/gnus-tests.el: Add wrapper for Gnus tests.
diff --git a/test/automated/icalendar-tests.el b/test/automated/icalendar-tests.el
index d586230f64..04fce7383f 100644
--- a/test/automated/icalendar-tests.el
+++ b/test/automated/icalendar-tests.el
@@ -51,35 +51,6 @@
(replace-regexp-in-string "[ \t\n]+\\'" ""
(replace-regexp-in-string "\\`[ \t\n]+" "" string)))
-(defun icalendar-tests--compare-strings (str1 str2)
- "Compare strings STR1 and STR2.
-Return t if strings are equal, else return substring indicating first difference.
-FIXME: make this a little smarter."
- (let* ((s1 (icalendar-tests--trim str1))
- (s2 (icalendar-tests--trim str2))
- (result (compare-strings s1 0 nil s2 0 nil))
- (len (length str2)))
- (if (numberp result)
- (if (> result 0)
- (concat "..." (substring str2 (- result 1)
- (min len (+ (- result 1) 3))) "...")
- (concat "..." (substring str2 (- (+ result 1))
- (min len (+ (- (+ result 1)) 3))) "..."))
- t)))
-
-(ert-deftest icalendar-tests--compare-strings ()
- "Test icalendar-tests--compare-strings."
- (should (equal t (icalendar-tests--compare-strings " abcde" "abcde ")))
- (should
- (string= "...def..."
- (icalendar-tests--compare-strings "abcxe" "abcdefghijklmn")))
- (should (string= "...xe..."
- (icalendar-tests--compare-strings "abcde" "abcxe")))
- (should (string= "...ddd..."
- (icalendar-tests--compare-strings "abc" "abcdddddd")))
- (should (string= "......"
- (icalendar-tests--compare-strings "abcdefghij" "abc"))))
-
;; ======================================================================
;; Tests of functions
;; ======================================================================
@@ -269,85 +240,85 @@ END:VTIMEZONE
(ert-deftest icalendar--diarytime-to-isotime ()
"Test method for `icalendar--diarytime-to-isotime'."
- (should (string= (icalendar--diarytime-to-isotime "01:15" "")
- "T011500"))
- (should (string= (icalendar--diarytime-to-isotime "1:15" "")
- "T011500"))
- (should (string= (icalendar--diarytime-to-isotime "0:01" "")
- "T000100"))
- (should (string= (icalendar--diarytime-to-isotime "0100" "")
- "T010000"))
- (should (string= (icalendar--diarytime-to-isotime "0100" "am")
- "T010000"))
- (should (string= (icalendar--diarytime-to-isotime "0100" "pm")
- "T130000"))
- (should (string= (icalendar--diarytime-to-isotime "1200" "")
- "T120000"))
- (should (string= (icalendar--diarytime-to-isotime "17:17" "")
- "T171700"))
- (should (string= (icalendar--diarytime-to-isotime "1200" "am")
- "T000000"))
- (should (string= (icalendar--diarytime-to-isotime "1201" "am")
- "T000100"))
- (should (string= (icalendar--diarytime-to-isotime "1259" "am")
- "T005900"))
- (should (string= (icalendar--diarytime-to-isotime "1200" "pm")
- "T120000"))
- (should (string= (icalendar--diarytime-to-isotime "1201" "pm")
- "T120100"))
- (should (string= (icalendar--diarytime-to-isotime "1259" "pm")
- "T125900")))
+ (should (string= "T011500"
+ (icalendar--diarytime-to-isotime "01:15" "")))
+ (should (string= "T011500"
+ (icalendar--diarytime-to-isotime "1:15" "")))
+ (should (string= "T000100"
+ (icalendar--diarytime-to-isotime "0:01" "")))
+ (should (string= "T010000"
+ (icalendar--diarytime-to-isotime "0100" "")))
+ (should (string= "T010000"
+ (icalendar--diarytime-to-isotime "0100" "am")))
+ (should (string= "T130000"
+ (icalendar--diarytime-to-isotime "0100" "pm")))
+ (should (string= "T120000"
+ (icalendar--diarytime-to-isotime "1200" "")))
+ (should (string= "T171700"
+ (icalendar--diarytime-to-isotime "17:17" "")))
+ (should (string= "T000000"
+ (icalendar--diarytime-to-isotime "1200" "am")))
+ (should (string= "T000100"
+ (icalendar--diarytime-to-isotime "1201" "am")))
+ (should (string= "T005900"
+ (icalendar--diarytime-to-isotime "1259" "am")))
+ (should (string= "T120000"
+ (icalendar--diarytime-to-isotime "1200" "pm")))
+ (should (string= "T120100"
+ (icalendar--diarytime-to-isotime "1201" "pm")))
+ (should (string= "T125900"
+ (icalendar--diarytime-to-isotime "1259" "pm"))))
(ert-deftest icalendar--datetime-to-diary-date ()
"Test method for `icalendar--datetime-to-diary-date'."
(let* ((datetime '(59 59 23 31 12 2008))
(calendar-date-style 'iso))
- (should (string= (icalendar--datetime-to-diary-date datetime)
- "2008 12 31"))
+ (should (string= "2008 12 31"
+ (icalendar--datetime-to-diary-date datetime)))
(setq calendar-date-style 'european)
- (should (string= (icalendar--datetime-to-diary-date datetime)
- "31 12 2008"))
+ (should (string= "31 12 2008"
+ (icalendar--datetime-to-diary-date datetime)))
(setq calendar-date-style 'american)
- (should (string= (icalendar--datetime-to-diary-date datetime)
- "12 31 2008"))))
+ (should (string= "12 31 2008"
+ (icalendar--datetime-to-diary-date datetime)))))
(ert-deftest icalendar--datestring-to-isodate ()
"Test method for `icalendar--datestring-to-isodate'."
(let ((calendar-date-style 'iso))
;; numeric iso
- (should (string= (icalendar--datestring-to-isodate "2008 05 11")
- "20080511"))
- (should (string= (icalendar--datestring-to-isodate "2008 05 31")
- "20080531"))
- (should (string= (icalendar--datestring-to-isodate "2008 05 31" 2)
- "20080602"))
+ (should (string= "20080511"
+ (icalendar--datestring-to-isodate "2008 05 11")))
+ (should (string= "20080531"
+ (icalendar--datestring-to-isodate "2008 05 31")))
+ (should (string= "20080602"
+ (icalendar--datestring-to-isodate "2008 05 31" 2)))
;; numeric european
(setq calendar-date-style 'european)
- (should (string= (icalendar--datestring-to-isodate "11 05 2008")
- "20080511"))
- (should (string= (icalendar--datestring-to-isodate "31 05 2008")
- "20080531"))
- (should (string= (icalendar--datestring-to-isodate "31 05 2008" 2)
- "20080602"))
+ (should (string= "20080511"
+ (icalendar--datestring-to-isodate "11 05 2008")))
+ (should (string= "20080531"
+ (icalendar--datestring-to-isodate "31 05 2008")))
+ (should (string= "20080602"
+ (icalendar--datestring-to-isodate "31 05 2008" 2)))
;; numeric american
(setq calendar-date-style 'american)
- (should (string= (icalendar--datestring-to-isodate "11 05 2008")
- "20081105"))
- (should (string= (icalendar--datestring-to-isodate "12 30 2008")
- "20081230"))
- (should (string= (icalendar--datestring-to-isodate "12 30 2008" 2)
- "20090101"))
+ (should (string= "20081105"
+ (icalendar--datestring-to-isodate "11 05 2008")))
+ (should (string= "20081230"
+ (icalendar--datestring-to-isodate "12 30 2008")))
+ (should (string= "20090101"
+ (icalendar--datestring-to-isodate "12 30 2008" 2)))
;; non-numeric
(setq calendar-date-style nil) ;not necessary for conversion
- (should (string= (icalendar--datestring-to-isodate "Nov 05 2008")
- "20081105"))
- (should (string= (icalendar--datestring-to-isodate "05 Nov 2008")
- "20081105"))
- (should (string= (icalendar--datestring-to-isodate "2008 Nov 05")
- "20081105"))))
+ (should (string= "20081105"
+ (icalendar--datestring-to-isodate "Nov 05 2008")))
+ (should (string= "20081105"
+ (icalendar--datestring-to-isodate "05 Nov 2008")))
+ (should (string= "20081105"
+ (icalendar--datestring-to-isodate "2008 Nov 05")))))
(ert-deftest icalendar--first-weekday-of-year ()
"Test method for `icalendar-first-weekday-of-year'."
@@ -363,7 +334,9 @@ END:VTIMEZONE
(ert-deftest icalendar--import-format-sample ()
"Test method for `icalendar-import-format-sample'."
- (should (string= (icalendar-import-format-sample
+ (should (string= (concat "SUMMARY=`a' DESCRIPTION=`b' LOCATION=`c' "
+ "ORGANIZER=`d' STATUS=`' URL=`' CLASS=`'")
+ (icalendar-import-format-sample
(icalendar-tests--get-ical-event "BEGIN:VEVENT
DTSTAMP:20030509T043439Z
DTSTART:20030509T103000
@@ -373,9 +346,7 @@ LOCATION:c
DTEND:20030509T153000
DESCRIPTION:b
END:VEVENT
-"))
- (concat "SUMMARY=`a' DESCRIPTION=`b' LOCATION=`c' "
- "ORGANIZER=`d' STATUS=`' URL=`' CLASS=`'"))))
+")))))
(ert-deftest icalendar--format-ical-event ()
"Test `icalendar--format-ical-event'."
@@ -397,12 +368,11 @@ DTEND:20030509T153000
DESCRIPTION:des
END:VEVENT
")))
- (should (string= (icalendar--format-ical-event event)
- "SUM sum DES des LOC loc ORG org"))
+ (should (string= "SUM sum DES des LOC loc ORG org"
+ (icalendar--format-ical-event event)))
(setq icalendar-import-format (lambda (&rest ignore)
"helloworld"))
- (should (string= (icalendar--format-ical-event event)
- "helloworld"))
+ (should (string= "helloworld" (icalendar--format-ical-event event)))
(setq icalendar-import-format
(lambda (e)
(format "-%s-%s-%s-%s-%s-%s-%s-"
@@ -413,8 +383,8 @@ END:VEVENT
(icalendar--get-event-property event 'STATUS)
(icalendar--get-event-property event 'URL)
(icalendar--get-event-property event 'CLASS))))
- (should (string= (icalendar--format-ical-event event)
- "-sum-des-loc-org-nil-nil-nil-"))))
+ (should (string= "-sum-des-loc-org-nil-nil-nil-"
+ (icalendar--format-ical-event event)))))
(ert-deftest icalendar--parse-summary-and-rest ()
"Test `icalendar--parse-summary-and-rest'."
@@ -428,15 +398,15 @@ END:VEVENT
(icalendar-import-format-class " CLA %s")
(result))
(setq result (icalendar--parse-summary-and-rest "SUM sum ORG org"))
- (should (string= (cdr (assoc 'org result)) "org"))
+ (should (string= "org" (cdr (assoc 'org result))))
(setq result (icalendar--parse-summary-and-rest
"SUM sum DES des LOC loc ORG org STA sta URL url CLA cla"))
- (should (string= (cdr (assoc 'des result)) "des"))
- (should (string= (cdr (assoc 'loc result)) "loc"))
- (should (string= (cdr (assoc 'org result)) "org"))
- (should (string= (cdr (assoc 'sta result)) "sta"))
- (should (string= (cdr (assoc 'cla result)) "cla"))
+ (should (string= "des" (cdr (assoc 'des result))))
+ (should (string= "loc" (cdr (assoc 'loc result))))
+ (should (string= "org" (cdr (assoc 'org result))))
+ (should (string= "sta" (cdr (assoc 'sta result))))
+ (should (string= "cla" (cdr (assoc 'cla result))))
(setq icalendar-import-format (lambda () "Hello world"))
(setq result (icalendar--parse-summary-and-rest
@@ -738,12 +708,10 @@ Argument INPUT input icalendar string.
Argument EXPECTED-OUTPUT expected diary string."
(let ((temp-file (make-temp-file "icalendar-test-diary")))
(icalendar-import-buffer temp-file t t)
- (unwind-protect
- (save-excursion
- (find-file temp-file)
- (let ((result (buffer-substring-no-properties (point-min) (point-max))))
- (should (icalendar-tests--compare-strings result
- expected-output))))
+ (save-excursion
+ (find-file temp-file)
+ (let ((result (buffer-substring-no-properties (point-min) (point-max))))
+ (should (string= expected-output result)))
(kill-buffer (find-buffer-visiting temp-file))
(delete-file temp-file))))
@@ -753,23 +721,23 @@ Argument EXPECTED-OUTPUT expected diary string."
"SUMMARY:non-recurring
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000"
- "&2003/9/19 09:00-11:30 non-recurring"
- "&19/9/2003 09:00-11:30 non-recurring"
- "&9/19/2003 09:00-11:30 non-recurring")
+ "&2003/9/19 09:00-11:30 non-recurring\n"
+ "&19/9/2003 09:00-11:30 non-recurring\n"
+ "&9/19/2003 09:00-11:30 non-recurring\n")
(icalendar-tests--test-import
"SUMMARY:non-recurring allday
DTSTART;VALUE=DATE-TIME:20030919"
- "&2003/9/19 non-recurring allday"
- "&19/9/2003 non-recurring allday"
- "&9/19/2003 non-recurring allday")
+ "&2003/9/19 non-recurring allday\n"
+ "&19/9/2003 non-recurring allday\n"
+ "&9/19/2003 non-recurring allday\n")
(icalendar-tests--test-import
;; do not remove the trailing blank after "long"!
- "SUMMARY:long
+ "SUMMARY:long
summary
DTSTART;VALUE=DATE:20030919"
- "&2003/9/19 long summary"
- "&19/9/2003 long summary"
- "&9/19/2003 long summary")
+ "&2003/9/19 long summary\n"
+ "&19/9/2003 long summary\n"
+ "&9/19/2003 long summary\n")
(icalendar-tests--test-import
"UID:748f2da0-0d9b-11d8-97af-b4ec8686ea61
SUMMARY:Sommerferien
@@ -791,7 +759,8 @@ DTSTAMP:20031103T011641Z
"
"&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
Status: TENTATIVE
- Class: PRIVATE")
+ Class: PRIVATE
+")
(icalendar-tests--test-import
"UID
:04979712-3902-11d9-93dd-8f9f4afe08da
@@ -814,13 +783,13 @@ LAST-MODIFIED
"
"&2004/11/23 14:00-14:30 folded summary
Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE\n"
"&23/11/2004 14:00-14:30 folded summary
Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE\n"
"&11/23/2004 14:00-14:30 folded summary
Status: TENTATIVE
- Class: PRIVATE")
+ Class: PRIVATE\n")
(icalendar-tests--test-import
"UID
@@ -842,13 +811,13 @@ DTSTAMP
"
"&2004/11/23 14:45-15:45 another example
Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE\n"
"&23/11/2004 14:45-15:45 another example
Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE\n"
"&11/23/2004 14:45-15:45 another example
Status: TENTATIVE
- Class: PRIVATE"))
+ Class: PRIVATE\n"))
(ert-deftest icalendar-import-rrule ()
(icalendar-tests--test-import
@@ -857,9 +826,9 @@ DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=DAILY;
"
- "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily"
- "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily"
- "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily")
+ "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
+ "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
+ "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
;; RRULE examples
(icalendar-tests--test-import
"SUMMARY:rrule daily
@@ -867,9 +836,9 @@ DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=DAILY;INTERVAL=2
"
- "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily"
- "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily"
- "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily")
+ "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
+ "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
+ "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
(icalendar-tests--test-import
"SUMMARY:rrule daily with exceptions
DTSTART;VALUE=DATE-TIME:20030919T090000
@@ -877,36 +846,36 @@ DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=DAILY;INTERVAL=2
EXDATE:20030921,20030925
"
- "&%%(and (not (diary-date 2003 9 25)) (not (diary-date 2003 9 21)) (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily with exceptions"
- "&%%(and (not (diary-date 25 9 2003)) (not (diary-date 21 9 2003)) (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily with exceptions"
- "&%%(and (not (diary-date 9 25 2003)) (not (diary-date 9 21 2003)) (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily with exceptions")
+ "&%%(and (not (diary-date 2003 9 25)) (not (diary-date 2003 9 21)) (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily with exceptions\n"
+ "&%%(and (not (diary-date 25 9 2003)) (not (diary-date 21 9 2003)) (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily with exceptions\n"
+ "&%%(and (not (diary-date 9 25 2003)) (not (diary-date 9 21 2003)) (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily with exceptions\n")
(icalendar-tests--test-import
"SUMMARY:rrule weekly
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=WEEKLY;
"
- "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly"
- "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly"
- "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly")
+ "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
+ "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
+ "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
(icalendar-tests--test-import
"SUMMARY:rrule monthly no end
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=MONTHLY;
"
- "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end"
- "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end"
- "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end")
+ "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
+ "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
+ "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
(icalendar-tests--test-import
"SUMMARY:rrule monthly with end
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=MONTHLY;UNTIL=20050819;
"
- "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end"
- "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end"
- "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end")
+ "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
+ "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
+ "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
(icalendar-tests--test-import
"DTSTART;VALUE=DATE:20040815
DTEND;VALUE=DATE:20040816
@@ -914,81 +883,81 @@ SUMMARY:Maria Himmelfahrt
UID:CC56BEA6-49D2-11D8-8833-00039386D1C2-RID
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
"
- "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt"
- "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt"
- "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt")
+ "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt\n"
+ "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt\n"
+ "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt\n")
(icalendar-tests--test-import
"SUMMARY:rrule yearly
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=YEARLY;INTERVAL=2
"
- "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly" ;FIXME
- "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly" ;FIXME
- "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly") ;FIXME
+ "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
+ "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
+ "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
(icalendar-tests--test-import
"SUMMARY:rrule count daily short
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
"
- "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short"
- "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short"
- "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short")
+ "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
+ "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
+ "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
(icalendar-tests--test-import
"SUMMARY:rrule count daily long
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
"
- "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long"
- "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long"
- "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long")
+ "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
+ "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
+ "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
(icalendar-tests--test-import
"SUMMARY:rrule count bi-weekly 3 times
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
"
- "&%%(and (diary-cyclic 14 2003 9 19) (diary-block 2003 9 19 2003 10 31)) 09:00-11:30 rrule count bi-weekly 3 times"
- "&%%(and (diary-cyclic 14 19 9 2003) (diary-block 19 9 2003 31 10 2003)) 09:00-11:30 rrule count bi-weekly 3 times"
- "&%%(and (diary-cyclic 14 9 19 2003) (diary-block 9 19 2003 10 31 2003)) 09:00-11:30 rrule count bi-weekly 3 times")
+ "&%%(and (diary-cyclic 14 2003 9 19) (diary-block 2003 9 19 2003 10 31)) 09:00-11:30 rrule count bi-weekly 3 times\n"
+ "&%%(and (diary-cyclic 14 19 9 2003) (diary-block 19 9 2003 31 10 2003)) 09:00-11:30 rrule count bi-weekly 3 times\n"
+ "&%%(and (diary-cyclic 14 9 19 2003) (diary-block 9 19 2003 10 31 2003)) 09:00-11:30 rrule count bi-weekly 3 times\n")
(icalendar-tests--test-import
"SUMMARY:rrule count monthly
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
"
- "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly"
- "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly"
- "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly")
+ "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
+ "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
+ "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
(icalendar-tests--test-import
"SUMMARY:rrule count every second month
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
"
- "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 5 19)) 09:00-11:30 rrule count every second month" ;FIXME
- "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 5 2004)) 09:00-11:30 rrule count every second month" ;FIXME
- "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 5 19 2004)) 09:00-11:30 rrule count every second month") ;FIXME
+ "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 5 19)) 09:00-11:30 rrule count every second month\n" ;FIXME
+ "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 5 2004)) 09:00-11:30 rrule count every second month\n" ;FIXME
+ "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 5 19 2004)) 09:00-11:30 rrule count every second month\n") ;FIXME
(icalendar-tests--test-import
"SUMMARY:rrule count yearly
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
"
- "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly"
- "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly"
- "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly")
+ "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
+ "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
+ "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
(icalendar-tests--test-import
"SUMMARY:rrule count every second year
DTSTART;VALUE=DATE-TIME:20030919T090000
DTEND;VALUE=DATE-TIME:20030919T113000
RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
"
- "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2011 9 19)) 09:00-11:30 rrule count every second year" ;FIXME!!!
- "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2011)) 09:00-11:30 rrule count every second year" ;FIXME!!!
- "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2011)) 09:00-11:30 rrule count every second year") ;FIXME!!!
+ "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2011 9 19)) 09:00-11:30 rrule count every second year\n" ;FIXME!!!
+ "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2011)) 09:00-11:30 rrule count every second year\n" ;FIXME!!!
+ "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2011)) 09:00-11:30 rrule count every second year\n") ;FIXME!!!
)
(ert-deftest icalendar-import-duration ()
@@ -998,9 +967,9 @@ RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
SUMMARY:duration
DURATION:P7D
"
- "&%%(and (diary-block 2005 2 17 2005 2 23)) duration"
- "&%%(and (diary-block 17 2 2005 23 2 2005)) duration"
- "&%%(and (diary-block 2 17 2005 2 23 2005)) duration")
+ "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
+ "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
+ "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
(icalendar-tests--test-import
"UID:20041127T183329Z-18215-1001-4536-49109@andromeda
DTSTAMP:20041127T183315Z
@@ -1014,11 +983,11 @@ SEQUENCE:1
CREATED:20041127T183329
"
"&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29)) Urlaub
- Class: PUBLIC"
+ Class: PUBLIC\n"
"&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001)) Urlaub
- Class: PUBLIC"
+ Class: PUBLIC\n"
"&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001)) Urlaub
- Class: PUBLIC"))
+ Class: PUBLIC\n"))
(ert-deftest icalendar-import-bug-6766 ()
;;bug#6766 -- multiple byday values in a weekly rrule
@@ -1049,20 +1018,62 @@ UID:8814e3f9-7482-408f-996c-3bfe486a1263
Status: CONFIRMED
Class: PUBLIC
&%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
- Class: PUBLIC"
-
+ Class: PUBLIC
+"
"&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
Status: CONFIRMED
Class: PUBLIC
&%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
- Class: PUBLIC"
-
+ Class: PUBLIC
+"
"&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
Status: CONFIRMED
Class: PUBLIC
&%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
- Class: PUBLIC"))
+ Class: PUBLIC
+"))
+(ert-deftest icalendar-import-multiple-vcalendars ()
+ (icalendar-tests--test-import
+ "DTSTART;VALUE=DATE:20110723
+SUMMARY:event-1
+"
+ "&2011/7/23 event-1\n"
+ "&23/7/2011 event-1\n"
+ "&7/23/2011 event-1\n")
+
+ (icalendar-tests--test-import
+ "BEGIN:VCALENDAR
+PRODID:-//Emacs//NONSGML icalendar.el//EN
+VERSION:2.0\nBEGIN:VEVENT
+DTSTART;VALUE=DATE:20110723
+SUMMARY:event-1
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Emacs//NONSGML icalendar.el//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110724
+SUMMARY:event-2
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Emacs//NONSGML icalendar.el//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110725
+SUMMARY:event-3a
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110725
+SUMMARY:event-3b
+END:VEVENT
+END:VCALENDAR
+"
+ "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
+ "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
+ "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
;; ======================================================================
;; Cycle
@@ -1113,7 +1124,7 @@ Argument INPUT icalendar event string."
(when (re-search-forward "\nUID:.*\n" nil t)
(replace-match "\n"))
(let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
- (should (icalendar-tests--compare-strings cycled org-input)))))
+ (should (string= org-input cycled)))))
;; clean up
(kill-buffer (find-buffer-visiting temp-diary))
(save-excursion
@@ -1211,12 +1222,14 @@ END:VCALENDAR"
Desc: 10:30am - Blah
Location: Cccc
Organizer: MAILTO:aaaaaaa@aaaaaaa.com
- Status: CONFIRMED"
+ Status: CONFIRMED
+"
"&5/9/2003 10:30-15:30 On-Site Interview
Desc: 10:30am - Blah
Location: Cccc
Organizer: MAILTO:aaaaaaa@aaaaaaa.com
- Status: CONFIRMED")
+ Status: CONFIRMED
+")
;; 2003-06-18 a
(icalendar-tests--test-import
@@ -1255,12 +1268,14 @@ END:VALARM"
Desc: 753 Zeichen hier radiert
Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
Organizer: MAILTO:xxx@xxxxx.com
- Status: CONFIRMED"
+ Status: CONFIRMED
+"
"&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
Desc: 753 Zeichen hier radiert
Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
Organizer: MAILTO:xxx@xxxxx.com
- Status: CONFIRMED")
+ Status: CONFIRMED
+")
;; 2003-06-18 b -- uses timezone
(icalendar-tests--test-import
"BEGIN:VCALENDAR
@@ -1323,12 +1338,14 @@ END:VCALENDAR"
Desc: Viele Zeichen standen hier früher
Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
Organizer: MAILTO:bbb@bbbbb.com
- Status: CONFIRMED"
+ Status: CONFIRMED
+"
"&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
Desc: Viele Zeichen standen hier früher
Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
Organizer: MAILTO:bbb@bbbbb.com
- Status: CONFIRMED")
+ Status: CONFIRMED
+")
;; export 2004-10-28 block entries
(icalendar-tests--test-export
nil
@@ -1697,7 +1714,8 @@ END:VCALENDAR
Class: PRIVATE
&%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE
+"
"&11/23/2004 14:00-14:30 Jjjjj & Wwwww
Status: TENTATIVE
Class: PRIVATE
@@ -1716,7 +1734,8 @@ END:VCALENDAR
Class: PRIVATE
&%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
Status: TENTATIVE
- Class: PRIVATE")
+ Class: PRIVATE
+")
;; 2004-09-09 pg
(icalendar-tests--test-export
@@ -1771,11 +1790,13 @@ DTSTAMP
"&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
Desc: abcdef
Status: CONFIRMED
- Class: PRIVATE"
+ Class: PRIVATE
+"
"&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
Desc: abcdef
Status: CONFIRMED
- Class: PRIVATE")
+ Class: PRIVATE
+")
;; 2005-03-01 lt
(icalendar-tests--test-import
@@ -1785,8 +1806,8 @@ UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
DTSTAMP:20050118T210335Z
DURATION:P7D"
nil
- "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa"
- "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa")
+ "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n"
+ "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n")
;; 2005-03-23 lt
(icalendar-tests--test-export