diff --git a/ChangeLog b/ChangeLog index b9301731d5e..7b084d7162c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -2011-07-14 Paul Eggert +2011-07-28 Paul Eggert 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 + + * 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 * configure.in (GSETTINGS): Check for gio-2.0 >= 2.26. diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 00000000000..5fd329c78ef --- /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 . +# +# 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 091a6ffda59..d59bbf87bce 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,7 @@ +2011-07-23 Eli Zaretskii + + * display.texi (Bidirectional Display): New section. + 2011-07-16 Lars Magne Ingebrigtsen Tim Cross (tiny change) Glenn Morris diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index d8be424a69f..903232bcbda 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 6df1c507d02..5309671651b 100644 --- a/leim/ChangeLog +++ b/leim/ChangeLog @@ -1,3 +1,10 @@ +2011-07-23 Yair F + + * 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 * SKK-DIC/SKK-JISYO.L: Add proper coding tag. diff --git a/leim/quail/hebrew.el b/leim/quail/hebrew.el index 828532040ee..7c7f6c6a8b5 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 + +;; 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 b138d78a070..afa15eab24e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,82 @@ +2011-07-27 Michael Albinus + + * net/tramp-sh.el (tramp-maybe-send-script): Don't let-bind the + connection process, it could be nil. + +2011-07-27 Leo Liu + + 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 + + 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 + + * 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 + + * image.el (insert-image): Clarifying docstring. + +2011-07-24 Michael Albinus + + * 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 + + 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 + + * net/tramp.el (tramp-file-name-handler): Avoid recursive + loading. (Bug#9114) + +2011-07-21 Martin Rudalics + + * 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 + + * 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 * proced.el (proced-update): Revert yesterday's bug#1779 patch, diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el index 03456ba36f2..3ffd55db18d 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 a1cb003a8ff..f90e180b128 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,22 @@ +2011-07-24 Andrew Cohen + + * nnimap.el (nnimap-make-thread-query): Quote message-ids for gmail. + +2011-07-23 Andrew Cohen + + * 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 + + * shr.el (shr-tag-comment): Ignore HTML comments. + 2011-07-20 Andrew Cohen * 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 6e8fc63d79f..5917c9d7cef 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 385522759b6..52de48869d8 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 9840dddcb66..e6420a4d7bb 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 f8a85579b4f..8faa5071616 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 c6862622639..30362251664 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 f7f5f61fafe..9e04abb8cd5 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 "") '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 1c6f0844be0..5c497748943 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 82d878a6fa8..9b11ef58eab 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 a6fd28be21d..0236a2be296 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)) + (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 "\\\\$"))))) - ;; 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)))) + ;; 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, " : "? + (if c-has-bitfields + (cond + ;; The : and 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 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 0500d48ddbc..2277ba760ab 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: " + ;; 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 9ce23a080d6..35097242cb7 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -511,6 +511,12 @@ parameters \(point-min), \(point-max) and ." ;;; 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 1adc6c2eac0..4299c413312 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 da073ceb258..a3300077909 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 12c9da85d57..905db8dc9b6 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 b72de32ffc3..10f6e326891 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,4 +1,4 @@ -2011-07-19 Paul Eggert +2011-07-28 Paul Eggert 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 + + * 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 + + * nsmenu.m (ns_popup_dialog): Add an "ok" button if no buttons + are specified (Bug#9168). + +2011-07-25 Paul Eggert + + * 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 + + * 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 + + * xfaces.c (check_lface_attrs) [HAVE_WINDOW_SYSTEM]: Allow `nil' + for attrs[LFACE_FONTSET_INDEX]. + +2011-07-23 Paul Eggert + + * xml.c (parse_region): Remove unused local + that was recently introduced. + +2011-07-23 Eli Zaretskii + + * 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 + + * nsterm.m (initFrameFromEmacs): Set NSTitledWindowMask in styleMask + for OSX >= 10.7. + +2011-07-22 Eli Zaretskii + + 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. + + : 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 + + * 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 + + * frame.c (Fmodify_frame_parameters): In tty case, update the + default face if necessary (Bug#4238). + +2011-07-21 Chong Yidong + + * editfns.c (Fstring_to_char): No need to explain what a character + is in the docstring (Bug#6576). + +2011-07-20 Lars Magne Ingebrigtsen + + * xml.c (parse_region): Make sure we always return a tree. + +2011-07-20 HAMANO Kiyoto + + * xml.c (parse_region): If a document contains only comments, + return that, too. + +2011-07-20 Lars Magne Ingebrigtsen + + * xml.c (make_dom): Return comments, too. + 2011-07-19 Paul Eggert Port to OpenBSD. diff --git a/src/bidi.c b/src/bidi.c index 697ebb92856..a6af9e36e15 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 18fefa5e3b5..577263c5aea 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 635996ca424..19ce78dfd9c 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 3175f55041d..fc651d2c7e4 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 6a9ee7dd4f5..6931b7a3c01 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -1340,7 +1340,7 @@ - (NSRect) frame 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 @@ - (NSRect) frame 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 546247ab74a..e45dc1a902d 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -5304,6 +5304,9 @@ - (BOOL)isOpaque 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 137cbec497c..8f352561719 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 e0dc2883f33..52b125b42e6 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 0d1e4a1bb5e..eec19b9d275 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 63041c96b24..55352baae3a 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 add4d9c7664..11b3d9b5e2d 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,25 @@ +2011-07-26 Ulf Jasper + + * 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 * automated/gnus-tests.el: Add wrapper for Gnus tests. diff --git a/test/automated/icalendar-tests.el b/test/automated/icalendar-tests.el index d586230f642..04fce7383fd 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