Merge from trunk.

This commit is contained in:
Paul Eggert 2011-07-27 17:15:43 -07:00
commit 2573a8376a
36 changed files with 2053 additions and 500 deletions

View file

@ -1,4 +1,4 @@
2011-07-14 Paul Eggert <eggert@cs.ucla.edu>
2011-07-28 Paul Eggert <eggert@cs.ucla.edu>
Assume freestanding C89 headers, string.h, stdlib.h.
Again, this simplifies the code, and all current platforms have these.
@ -13,6 +13,12 @@
can add the gnulib modules for these (a 1-line change to Makefile.in).
* configure.in: Don't check for memcmp, memcpy, memmove, memset.
2011-07-27 Paul Eggert <eggert@cs.ucla.edu>
* GNUmakefile: New file.
This is for convenience, so that one can run GNU make in an
unconfigured source tree, and get a default build.
2011-07-13 Jan Djärv <jan.h.d@swipnet.se>
* configure.in (GSETTINGS): Check for gio-2.0 >= 2.26.

77
GNUmakefile Normal file
View file

@ -0,0 +1,77 @@
# Build Emacs from a fresh tarball or version-control checkout.
# Copyright 2011 Free Software Foundation, Inc.
#
# This file is part of GNU Emacs.
#
# GNU Emacs is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GNU Emacs is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
#
# written by Paul Eggert
# This GNUmakefile is for GNU Make. It is for convenience, so that
# one can run 'make' in an unconfigured source tree. In such a tree,
# this file causes GNU Make to first create a standard configuration
# with the default options, and then reinvokes itself on the
# newly-built Makefile. If the source tree is already configured,
# this file defers to the existing Makefile.
# If you are using a non-GNU 'make', or if you want non-default build
# options, or if you want to build in an out-of-source tree, please
# run "configure" by hand. But run autogen.sh first, if the source
# was checked out directly from the repository.
# If a Makefile already exists, just use it.
ifeq ($(wildcard Makefile),Makefile)
include Makefile
else
# If cleaning and Makefile does not exist, don't bother creating it.
# The source tree is already clean, or is in a weird state that
# requires expert attention.
ifeq ($(filter-out %clean,$(or $(MAKECMDGOALS),default)),)
$(MAKECMDGOALS):
@echo >&2 'No Makefile; skipping $@.'
else
# No Makefile, and not cleaning.
# If 'configure' does not exist, Emacs must have been checked
# out directly from the repository; run ./autogen.sh.
# Once 'configure' exists, run it.
# Finally, run the actual 'make'.
default $(filter-out configure Makefile,$(MAKECMDGOALS)): Makefile
$(MAKE) -f Makefile $(MAKECMDGOALS)
# Execute in sequence, so that multiple user goals don't conflict.
.NOTPARALLEL:
configure:
@echo >&2 'There seems to be no "configure" file in this directory.'
@echo >&2 'Running ./autogen.sh || autogen/copy_autogen ...'
./autogen.sh || autogen/copy_autogen
@echo >&2 '"configure" file built.'
Makefile: configure
@echo >&2 'There seems to be no Makefile in this directory.'
@echo >&2 'Running ./configure ...'
./configure
@echo >&2 'Makefile built.'
endif
endif

View file

@ -1,3 +1,7 @@
2011-07-23 Eli Zaretskii <eliz@gnu.org>
* display.texi (Bidirectional Display): New section.
2011-07-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
Tim Cross <theophilusx@gmail.com> (tiny change)
Glenn Morris <rgm@gnu.org>

View file

@ -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

View file

@ -1,3 +1,10 @@
2011-07-23 Yair F <yair.f.lists@gmail.com>
* quail/hebrew.el ("hebrew"): Additional key mappings.
("hebrew-new", "hebrew-lyx", "hebrew-full")
("hebrew-biblical-tiro", "hebrew-biblical-sil", "yiddish-royal")
("yiddish-keyman"): New input methods.
2011-06-12 Andreas Schwab <schwab@linux-m68k.org>
* SKK-DIC/SKK-JISYO.L: Add proper coding tag.

View file

@ -1,11 +1,14 @@
;;; hebrew.el --- Quail package for inputting Hebrew characters -*-coding: iso-2022-7bit;-*-
;; hebrew.el --- Quail package for inputting Hebrew characters -*-coding: iso-2022-7bit;-*-
;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
;; 2008, 2009, 2010, 2011
;; National Institute of Advanced Industrial Science and Technology (AIST)
;; Registration Number H14PRO021
;; Keywords: mule, input method, Hebrew
;; Many input methods in this file provided
;; by Yair Friedman <yair.f.lists@gmail.com>
;; Keywords: multilingual, input method, Hebrew
;; This file is part of GNU Emacs.
@ -29,50 +32,851 @@
(require 'quail)
(quail-define-package
"hebrew" "Hebrew" ",Hr(B" nil "Hebrew (ISO 8859-8) input method.
"hebrew" "Hebrew" ",Hr(B" nil "Hebrew SI-1452 input method.
Based on Hebrew typewriter keys.
Hebrew letters are assigned to lowercases.
Based on SI-1452 keyboard layout.
Only Hebrew-related characters are considered.
'q' is used to switch levels instead of Alt-Gr.
Maqaaf ($,1,^(B) is mapped to '/,Ht(B'.
" nil t t t t nil nil nil nil nil t)
;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ ;~
;; /Q 'W ,Hw(BE ,Hx(BR ,H`(BT ,Hh(BY ,He(BU ,Ho(BI ,Hm(BO ,Ht(BP [{ ]}
;; ,Hy(BA ,Hc(BS ,Hb(BD ,Hk(BF ,Hr(BG ,Hi(BH ,Hg(BJ ,Hl(BK ,Hj(BL ,Hs(B: ," \|
;; ,Hf(BZ ,Hq(BX ,Ha(BC ,Hd(BV ,Hp(BB ,Hn(BN ,Hv(BM ,Hz(B< ,Hu(B> .?
;;
(quail-define-rules
("`" ?\;)
("w" ?\')
("e" ?,Hw(B) ; Qof
("r" ?,Hx(B) ; Resh
("t" ?,H`(B) ; Alef
("y" ?,Hh(B) ; Tet
("u" ?,He(B) ; Vav
("i" ?,Ho(B) ; Final Nun
("o" ?,Hm(B) ; Final Mem
("p" ?,Ht(B) ; Pe
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("a" ?,Hy(B) ; Shin
("s" ?,Hc(B) ; Dalet
("d" ?,Hb(B) ; Gimel
("f" ?,Hk(B) ; Kaf
("g" ?,Hr(B) ; Ayin
("h" ?,Hi(B) ; Yod
("j" ?,Hg(B) ; Het
("k" ?,Hl(B) ; Lamed
("l" ?,Hj(B) ; Final Kaf
(";" ?,Hs(B) ; Final Pe
("'" ?,)
("z" ?,Hf(B) ; Zayin
("x" ?,Hq(B) ; Samekh
("c" ?,Ha(B) ; Bet
("v" ?,Hd(B) ; He
("b" ?,Hp(B) ; Nun
("n" ?,Hn(B) ; Mem
("m" ?,Hv(B) ; Tsadi
("," ?,Hz(B) ; Tav
("." ?,Hu(B) ; Final Tsadi
("/" ?.) ; Stop
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("{" ?}) ; mirroring
("}" ?{) ; mirroring
("<" ?>) ; mirroring
(">" ?<) ; mirroring
("q`" ?$,1,P(B) ; Sheva
("q1" ?$,1,Q(B) ; Hataf Segol
("q2" ?$,1,R(B) ; Hataf Patah
("q3" ?$,1,S(B) ; Hataf Qamats
("q4" ?$,1,T(B) ; Hiriq
("q5" ?$,1,U(B) ; Tsere
("q6" ?$,1,V(B) ; Segol (Point)
("q7" ?$,1,W(B) ; Patah
("q8" ?$,1,X(B) ; Qamats
("q9" ?$,1,b(B) ; Sin dot
("q0" ?$,1,a(B) ; Shin dot
("q-" ?$,1,Y(B) ; Holam
("q=" ?$,1,\(B) ; Dagesh or Mapiq
("q\\" ?$,1,[(B) ; Qubuts
("qq" ?/)
("qw" ?$,1-3(B) ; Geresh (Punct.)
("qi" ?$,1-0(B) ; Yiddish Double Vav
("qp" ?$,1,^(B) ; Maqaf
("q[" ?$,1,_(B) ; Rafe
("q]" ?$,1,](B) ; Meteg
("qa" ?$,1tJ(B) ; New Sheqel sign
("qh" ?$,1-2(B) ; Yiddish Double Yod
("qj" ?$,1-1(B) ; Yiddish Vav Yod
("q\"" ?$,1-4(B) ; Gershayim (Punct.)
("q," ?\u200E) ; LRM
("q." ?\u200F) ; RLM
)
(quail-define-package
"hebrew-new" "Hebrew" ",Hr(B" nil "Hebrew SI-1452 new draft input method.
Based on latest draft of SI-1452 keyboard layout.
Only Hebrew-related characters are considered.
'`' is used to switch levels instead of Alt-Gr.
Geresh is mapped to '`k'.
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("q" ?/)
("w" ?\')
("e" ?,Hw(B) ; Qof
("r" ?,Hx(B) ; Resh
("t" ?,H`(B) ; Alef
("y" ?,Hh(B) ; Tet
("u" ?,He(B) ; Vav
("i" ?,Ho(B) ; Final Nun
("o" ?,Hm(B) ; Final Mem
("p" ?,Ht(B) ; Pe
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("a" ?,Hy(B) ; Shin
("s" ?,Hc(B) ; Dalet
("d" ?,Hb(B) ; Gimel
("f" ?,Hk(B) ; Kaf
("g" ?,Hr(B) ; Ayin
("h" ?,Hi(B) ; Yod
("j" ?,Hg(B) ; Het
("k" ?,Hl(B) ; Lamed
("l" ?,Hj(B) ; Final Kaf
(";" ?,Hs(B) ; Final Pe
("'" ?,)
("z" ?,Hf(B) ; Zayin
("x" ?,Hq(B) ; Samekh
("c" ?,Ha(B) ; Bet
("v" ?,Hd(B) ; He
("b" ?,Hp(B) ; Nun
("n" ?,Hn(B) ; Mem
("m" ?,Hv(B) ; Tsadi
("," ?,Hz(B) ; Tav
("." ?,Hu(B) ; Final Tsadi
("/" ?.) ; Stop
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("{" ?}) ; mirroring
("}" ?{) ; mirroring
("<" ?>) ; mirroring
(">" ?<) ; mirroring
("``" ?\;)
("`1" ?$,1,](B) ; Meteg
;("`2" ??) ; Unassigned
("`3" ?,F$(B) ; Euro Sign
("`4" ?$,1tJ(B) ; New Sheqel sign
("`5" ?,A0(B) ; Degree Sign
("`6" ?$,1,K(B) ; Ole
;("`7" ??) ; Unassigned
("`8" ?,AW(B) ; Multiplication Sign
("`9" ?\u200E) ; LRM
("`0" ?\u200F) ; RLM
("`-" ?$,1,^(B) ; Maqaf
("`=" ?$(G!9(B) ; En Dash
("`q" ?$,1,b(B) ; Sin dot
("`w" ?$,1,a(B) ; Shin dot
("`e" ?$,1,X(B) ; Qamats
("`r" ?$,1,S(B) ; Hataf Qamats
;("`t" ??) ; Unassigned
("`y" ?$,1-0(B) ; Yiddish Double Vav
("`u" ?$,1,Y(B) ; Holam
;("`i" ??) ; Unassigned
;("`o" ??) ; Unassigned
("`p" ?$,1,W(B) ; Patah
("`[" ?$,1,R(B) ; Hataf Patah
("`]" ?$,1,_(B) ; Rafe
("`\\" ?$,1,[(B) ; Qubuts
("`a" ?$,1,P(B) ; Sheva
("`s" ?$,1,\(B) ; Dagesh or Mapiq
;("`d" ??) ; Unassigned
;("`f" ??) ; Unassigned
("`g" ?$,1-1(B) ; Yiddish Vav Yod
("`h" ?$,1-2(B) ; Yiddish Double Yod
("`j" ?$,1,T(B) ; Hiriq
("`k" ?$,1-3(B) ; Geresh (Punct.)
("`l" ?,Y4(B) ; Left Double Quotation Mark
("`;" ?,Y!(B) ; Right Double Quotation Mark
("`'" ?$,1-4(B) ; Gershayim (Punct.)
;("`z" ??) ; Unassigned
("`x" ?$,1,V(B) ; Segol (Point)
("`c" ?$,1,Q(B) ; Hataf Segol
;("`v" ??) ; Unassigned
;("`b" ??) ; Unassigned
;("`n" ??) ; Unassigned
("`m" ?$,1,U(B) ; Tsere
;("`," ??) ; Unassigned
;("`." ??) ; Unassigned
("`/" ?,Aw(B) ; Division Sign
("``" ?$,1,c(B) ; Sof Pasuq
("`!" ?$,1,1(B) ; Etnahta
("`@" ?$,1,2(B) ; Segol (Accent)
("`#" ?$,1,3(B) ; Shalshelet
("`$" ?$,1,4(B) ; Zaqef Qatan
("`%" ?$,1,5(B) ; Zaqef Gadol
("`^" ?$,1,6(B) ; Tipeha
("`&" ?$,1,7(B) ; Revia
("`*" ?$,1,8(B) ; Zarqa
("`(" ?$,1,9(B) ; Pashta
("`)" ?$,1,:(B) ; Yetiv
("`_" ?$,1,;(B) ; Tevir
("`+" ?$,1,<(B) ; Geresh (Accent)
("`Q" ?$,1,=(B) ; Geresh Muqdam
("`W" ?$,1,>(B) ; Gershayim (Accent)
("`E" ?$,1,g(B) ; Qamats Qatan
("`R" ?$,1,?(B) ; Qarney Para
("`T" ?$,1,@(B) ; Telisha Gedola
("`Y" ?$,1,A(B) ; Pazer
("`U" ?$,1,Z(B) ; Holam Haser for Vav
("`I" ?$,1,B(B) ; Atnah Hafukh
("`O" ?$,1,C(B) ; Munah
;("`P" ??) ; Reserved
("`{" ?$,1,D(B) ; Mahapakh
("`}" ?$,1,E(B) ; Merkha
("`|" ?$,1,F(B) ; Merkha Kefula
;("`A" ??) ; Reserved
;("`S" ??) ; Reserved
("`D" ?$,1,G(B) ; Darga
("`F" ?$,1,H(B) ; Qadma
("`G" ?$,1,I(B) ; Telisha Qetana
("`H" ?$,1,J(B) ; Yerah Ben Yomo
("`J" ?\u200D) ; ZWJ
("`K" ?$,1,L(B) ; Iluy
("`L" ?,Y4(B) ; Left Double Quotation Mark (2nd)
("`:" ?,Y%(B) ; Double Low-9 Quotation Mark
("`\"" ?$,1,M(B) ; Dehi
("`Z" ?$,1,N(B) ; Zinor
("`X" ?$,1,O(B) ; Masora Circle
("`C" ?\u034F) ; CGJ
("`V" ?$,1,`(B) ; Paseq
("`B" ?$,1,f(B) ; Nun Hafukha
("`N" ?\u200C) ; ZWNJ
;("`M" ??) ; Unassigned
;("`<" ??) ; Unassigned
("`>" ?$,1,e(B) ; Lower Dot
("`?" ?$,1,d(B) ; Upper Dot
)
(quail-define-package
"hebrew-lyx" "Hebrew" ",Hl$,1,T(B" nil "Hebrew LyX input method.
Based on LyX keyboard layout.
Additional mappings for Rafe and Yiddish ligatures.
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("`" ?\;)
("_" ?$,1,^(B) ; Maqaf
("q`" ?$,1,P(B) ; Sheva
("w" ?\')
("e" ?,Hw(B) ; Qof
("r" ?,Hx(B) ; Resh
("t" ?,H`(B) ; Alef
("y" ?,Hh(B) ; Tet
("u" ?,He(B) ; Vav
("i" ?,Ho(B) ; Final Nun
("o" ?,Hm(B) ; Final Mem
("p" ?,Ht(B) ; Pe
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("a" ?,Hy(B) ; Shin
("s" ?,Hc(B) ; Dalet
("d" ?,Hb(B) ; Gimel
("f" ?,Hk(B) ; Kaf
("g" ?,Hr(B) ; Ayin
("h" ?,Hi(B) ; Yod
("j" ?,Hg(B) ; Het
("k" ?,Hl(B) ; Lamed
("l" ?,Hj(B) ; Final Kaf
(";" ?,Hs(B) ; Final Pe
("'" ?,)
("z" ?,Hf(B) ; Zayin
("x" ?,Hq(B) ; Samekh
("c" ?,Ha(B) ; Bet
("v" ?,Hd(B) ; He
("b" ?,Hp(B) ; Nun
("n" ?,Hn(B) ; Mem
("m" ?,Hv(B) ; Tsadi
("," ?,Hz(B) ; Tav
("." ?,Hu(B) ; Final Tsadi
("/" ?.) ; Stop
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("W" ?$,1-3(B) ; Geresh (Punct.)
("E" ?$,1,X(B) ; Qamats
("R" ?$,1,_(B) ; Rafe
("T" ?\u200E) ; LRM
("Y" ?\u200F) ; RLM
("U" ?$,1,Y(B) ; Holam
("I" ?$,1-2(B) ; Yiddish Double Yod
("O" ?$,1-0(B) ; Yiddish Double Vav
("P" ?$,1,W(B) ; Patah
("{" ?}) ; mirroring
("}" ?{) ; mirroring
("A" ?$,1,P(B) ; Sheva
("S" ?$,1,\(B) ; Dagesh or Mapiq
("F" ?$,1-4(B) ; Gershayim (Punct.)
("G" ?$,1,b(B) ; Sin dot
("H" ?$,1,a(B) ; Shin dot
("J" ?$,1,T(B) ; Hiriq
("K" ?$,1tJ(B) ; New Sheqel sign
("L" ?$,1-1(B) ; Yiddish Vav Yod
("X" ?$,1,V(B) ; Segol (Point)
("C" ?$,1,[(B) ; Qubuts
("V" ?$,1,Q(B) ; Hataf Segol
("B" ?$,1,R(B) ; Hataf Patah
("N" ?$,1,S(B) ; Hataf Qamats
("M" ?$,1,U(B) ; Tsere
("<" ?>) ; mirroring
(">" ?<) ; mirroring
)
(quail-define-package
"hebrew-full" "Hebrew" ",Hr$,1,T,K(B" nil "Hebrew Full method.
Provides access to all Hebrew characters suiltable to Modern Hebrew.
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("`" ?\;)
("-" ?$,1,^(B) ; Maqaf
("w" ?')
("e" ?,Hw(B)
("r" ?,Hx(B)
("t" ?,H`(B)
("y" ?,Hh(B)
("u" ?,He(B)
("i" ?,Ho(B)
("o" ?,Hm(B)
("p" ?,Ht(B)
("a" ?,Hy(B)
("s" ?,Hc(B)
("d" ?,Hb(B)
("f" ?,Hk(B)
("g" ?,Hr(B)
("h" ?,Hi(B)
("j" ?,Hg(B)
("k" ?,Hl(B)
("l" ?,Hj(B)
(";" ?,Hs(B)
("z" ?,Hf(B)
("x" ?,Hq(B)
("c" ?,Ha(B)
("v" ?,Hd(B)
("b" ?,Hp(B)
("n" ?,Hn(B)
("m" ?,Hv(B)
("," ?,Hz(B)
("." ?,Hu(B)
("e" ?,Hw(B) ; Qof
("r" ?,Hx(B) ; Resh
("t" ?,H`(B) ; Alef
("y" ?,Hh(B) ; Tet
("u" ?,He(B) ; Vav
("i" ?,Ho(B) ; Final Nun
("o" ?,Hm(B) ; Final Mem
("p" ?,Ht(B) ; Pe
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("a" ?,Hy(B) ; Shin
("s" ?,Hc(B) ; Dalet
("d" ?,Hb(B) ; Gimel
("f" ?,Hk(B) ; Kaf
("g" ?,Hr(B) ; Ayin
("h" ?,Hi(B) ; Yod
("j" ?,Hg(B) ; Het
("k" ?,Hl(B) ; Lamed
("l" ?,Hj(B) ; Final Kaf
(";" ?,Hs(B) ; Final Pe
("'" ?,)
("z" ?,Hf(B) ; Zayin
("x" ?,Hq(B) ; Samekh
("c" ?,Ha(B) ; Bet
("v" ?,Hd(B) ; He
("b" ?,Hp(B) ; Nun
("n" ?,Hn(B) ; Mem
("m" ?,Hv(B) ; Tsadi
("," ?,Hz(B) ; Tav
("." ?,Hu(B) ; Final Tsadi
("/" ?.)
("'" ?,))
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("Q" ?/)
("W" ?$,1-3(B) ; Geresh (Punct.)
("E" ?$,1tJ(B) ; New Sheqel Sign
("R" ?$,1,_(B) ; Rafe
("T" ?$,1,Q(B) ; Hataf Segol
("Y" ?$,1-1(B) ; Yiddish Vav Yod
("U" ?$,1-0(B) ; Yiddish Double Vav
("I" ?$,1,R(B) ; Hataf Patah
("O" ?$,1,S(B) ; Hataf Qamats
("P" ?$,1-4(B) ; Gershayim (Punct.)
("{" ?}) ; mirroring
("}" ?{) ; mirroring
("A" ?$,1,P(B) ; Sheva
("S" ?$,1,\(B) ; Dagesh or Mapiq
("D" ?$,1,[(B) ; Qubuts
("F" ?$,1,Y(B) ; Holam
("G" ?$,1,V(B) ; Segol (Point)
("H" ?$,1,U(B) ; Tsere
("J" ?$,1,T(B) ; Hiriq
("K" ?$,1,W(B) ; Patah
("L" ?$,1,X(B) ; Qamats
("Z" ?$,1,b(B) ; Sin Dot
("X" ?$,1,a(B) ; Shin Dot
("C" ?$,1,K(B) ; Ole
("V" ?$,1-2(B) ; Yiddish Double Yod
("B" ?$,1,c(B) ; Sof Pasuq
("N" ?\u200E) ; LRM
("M" ?\u200F) ; RLM
("<" ?>) ; mirroring
(">" ?<) ; mirroring
("q`" ?\u202D) ; LRO
("q1" ?\u202E) ; RLO
("q2" ?\u202A) ; LRE
("q3" ?\u202B) ; RLE
("q4" ?\u202C) ; PDF
("q5" ?\u034F) ; CGJ
("q6" ?$,1,L(B) ; Iluy
("q8" ?$,1,M(B) ; Dehi
("q9" ?$,1,g(B) ; Qamats Qatan
("q0" ?$,1,=(B) ; Geresh Muqdam
("q-" ?-) ; Minus
("q=" ?$,1,N(B) ; Zinor
("q|" ?$,1,`(B) ; Paseq
("qw" ?$,1,O(B) ; Masora Circle
("qe" ?$,1,d(B) ; Upper Dot
("qr" ?$,1,e(B) ; Lower Dot
("qy" ?$,1,?(B) ; Qarney Para
("qu" ?$,1,3(B) ; Shalshelet
("qi" ?$,1,>(B) ; Gershayim (Accent)
("qo" ?$,1,<(B) ; Geresh (Accent)
("qp" ?$,1,H(B) ; Qadma
("q[" ?$,1,f(B) ; Nun Hafukha
("qa" ?$,1,Z(B) ; Holam Haser for Vav
("qs" ?$,1,I(B) ; Telisha Qetana
("qd" ?$,1,@(B) ; Telisha Gedola
("qf" ?$,1,A(B) ; Pazer
("qg" ?$,1,5(B) ; Zaqef Gadol
("qh" ?$,1,4(B) ; Zaqef Qatan
("qj" ?$,1,9(B) ; Pashta
("qk" ?$,1,D(B) ; Mahapakh
("ql" ?$,1,7(B) ; Revia
("q;" ?$,1,2(B) ; Segol (Accent)
("q'" ?$,1,8(B) ; Zarqa
("qz" ?$,1,J(B) ; Yerah Ben Yomo
("qx" ?$,1,F(B) ; Merkha Kefula
("qc" ?$,1,:(B) ; Yetiv
("qv" ?$,1,;(B) ; Tevir
("qb" ?$,1,G(B) ; Darga
("qn" ?$,1,1(B) ; Etnahta
("qm" ?$,1,C(B) ; Munah
("q," ?$,1,6(B) ; Tipeha
("q." ?$,1,E(B) ; Merkha
("q/" ?$,1,](B) ; Meteg
)
(quail-define-package
"hebrew-biblical-tiro" "Hebrew" ",Hz$,1,T,Hx$,1,Y(B" nil
"Biblical Hebrew Tiro input method.
Based on Society of Biblical Literature's Tiro keyboard layout.
Not suiltable for modern Hebrew input.
'q' is used to switch levels instead of Alt-Gr.
Combining dot above (Called Masora dot) ($,1%G(B) is mapped to 'q1'.
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("`" ?$,1,c(B) ; Sof Pasuq
("-" ?$,1,^(B) ; Maqaf
("=" ?$(O#?(B) ; White Bullet
("w" ?$,1-3(B) ; Geresh (Punct.)
("e" ?,Hw(B) ; Qof
("r" ?,Hx(B) ; Resh
("t" ?,H`(B) ; Alef
("y" ?,Hh(B) ; Tet
("u" ?,He(B) ; Vav
("i" ?,Ho(B) ; Final Nun
("o" ?,Hm(B) ; Final Mem
("p" ?,Ht(B) ; Pe
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("\\" ?$,1,`(B) ; Paseq
("a" ?,Hy(B) ; Shin
("s" ?,Hc(B) ; Dalet
("d" ?,Hb(B) ; Gimel
("f" ?,Hk(B) ; Kaf
("g" ?,Hr(B) ; Ayin
("h" ?,Hi(B) ; Yod
("j" ?,Hg(B) ; Het
("k" ?,Hl(B) ; Lamed
("l" ?,Hj(B) ; Final Kaf
(";" ?,Hs(B) ; Final Pe
("'" ?$,1,:(B) ; Yetiv
("z" ?,Hf(B) ; Zayin
("x" ?,Hq(B) ; Samekh
("c" ?,Ha(B) ; Bet
("v" ?,Hd(B) ; He
("b" ?,Hp(B) ; Nun
("n" ?,Hn(B) ; Mem
("m" ?,Hv(B) ; Tsadi
("," ?,Hz(B) ; Tav
("." ?,Hu(B) ; Final Tsadi
("/" ?$,1,M(B) ; Dehi
("~" ?$,1,N(B) ; Zinor
("!" ?$,1,I(B) ; Telisha Qetana
("@" ?$,1,9(B) ; Pashta
("#" ?$,1,2(B) ; Segol (Accent)
("$" ?$,1,O(B) ; Masora circle
("%" ?$,1,Z(B) ; Holam Haser for Vav
("^" ?$,1,Y(B) ; Holam
("&" ?$,1,_(B) ; Rafe
("*" ?$,1,b(B) ; Sin dot
("(" ?$,1,a(B) ; Shin dot
(")" ?$,1,=(B) ; Geresh Muqdam
("_" ?$,1,@(B) ; Telisha Gedola
("+" ?$,1,\(B) ; Dagesh or Mapiq
("Q" ?$,1,d(B) ; Upper dot
("W" ?$,1,L(B) ; Iluy
("E" ?$,1,K(B) ; Ole
("R" ?$,1,?(B) ; Qarney Para
("T" ?$,1,3(B) ; Shalshelet
("Y" ?$,1,>(B) ; Gershayim (Accent)
("U" ?$,1,<(B) ; Geresh (Accent)
("I" ?$,1,A(B) ; Pazer
("O" ?$,1,5(B) ; Zaqef Gadol
("P" ?$,1,4(B) ; Zaqef Qatan
("{" ?$,1,7(B) ; Revia
("}" ?$,1,8(B) ; Zarqa
("|" ?$,1,H(B) ; Qadma
("A" ?$,1,](B) ; Meteg
("S" ?$,1,P(B) ; Sheva
("D" ?$,1,[(B) ; Qubuts
("F" ?$,1,T(B) ; Hiriq
("G" ?$,1,Q(B) ; Hataf Segol
("H" ?$,1,V(B) ; Segol (Point)
("J" ?$,1,U(B) ; Tsere
("K" ?$,1,S(B) ; Hataf Qamats
("L" ?$,1,X(B) ; Qamats
(":" ?$,1,R(B) ; Hataf Patah
("\"" ?$,1,W(B) ; Patah
("Z" ?$,1,e(B) ; Lower dot
("X" ?$,1,D(B) ; Mahapakh
("C" ?$,1,J(B) ; Yerah Ben Yomo
("V" ?$,1,F(B) ; Merkha Kefula
("B" ?$,1,E(B) ; Merkha
("N" ?$,1,G(B) ; Darga
("M" ?$,1,;(B) ; Tevir
("<" ?$,1,1(B) ; Etnahta
(">" ?$,1,6(B) ; Tipeha
("?" ?$,1,C(B) ; Munah
("q`" ?\;)
("q1" ?\u0307) ; Combining dot above
("q2" ?\u0336) ; Combining long stroke overlay
("q3" ?\u030A) ; Combining ring above
("q4" ?$,1tJ(B) ; New Sheqel Sign
("q5" ?\u200D) ; ZWJ
("q6" ?\u200C) ; ZWNJ
("q7" ?\u034F) ; CGJ
("q8" ?\u200E) ; LRM
("q9" ?\u200F) ; RLM
("q0" ?$,2",(B) ; Dotted Circle
("q-" ?-) ; Minus
("q=" ?$(O#@(B) ; Bullet
("qq" ?\u0308) ; Combining Diaeresis
("qw" ?$,1-4(B) ; Gershayim (Punct.)
("qe" ?,F$(B) ; Euro Sign
("qu" ?$,1-0(B) ; Yiddish Double Vav
("q\\" ?\\)
("qh" ?$,1-2(B) ; Yiddish Double Yod
("qj" ?$,1-1(B) ; Yiddish Vav Yod
("ql" ?$,1,g(B) ; Qamats Qatan
("q'" ?,)
("qc" ?$,1,B(B) ; Atnah Hafukh
("qb" ?$,1,f(B) ; Nun Hafukha
("q/" ?.)
("q~" ?~)
("q!" ?!)
("q@" ?@)
("q#" ?#)
("q$" ?$)
("q%" ?%)
("q^" ?^)
("q&" ?&)
("q*" ?*)
("q(" ?\)) ; mirroring
("q)" ?\() ; mirroring
("q_" ?_)
("q+" ?+)
("qQ" ?/)
("qW" ?')
("q{" ?}) ; mirroring
("q}" ?{) ; mirroring
("q|" ?|)
("q:" ?:)
("q\"" ?\")
("q<" ?>)
("q>" ?<)
("q?" ??)
)
(quail-define-package
"hebrew-biblical-sil" "Hebrew" ",Hq$,1,T,Hl(B" nil
"Biblical Hebrew SIL input method.
Based on Society of Biblical Literature's SIL keyboard layout.
Phonetic and not suiltable for modern Hebrew input.
'`' is used to switch levels instead of Alt-Gr.
Euro Sign (,F$(B) is mapped to 'Z'.
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("-" ?$,1,^(B) ; Maqaf
("=" ?$,1,\(B) ; Dagesh or Mapiq
("q" ?,Hw(B) ; Qof
("w" ?,He(B) ; Vav
("e" ?$,1,V(B) ; Segol (Point)
("r" ?,Hx(B) ; Resh
("t" ?,Hz(B) ; Tav
("y" ?,Hi(B) ; Yod
("u" ?$,1,[(B) ; Qubuts
("i" ?$,1,T(B) ; Hiriq
("o" ?$,1,Y(B) ; Holam
("p" ?,Ht(B) ; Pe
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("\\" ?$,1,`(B) ; Paseq
("a" ?$,1,W(B) ; Patah
("s" ?,Hq(B) ; Samekh
("d" ?,Hc(B) ; Dalet
("f" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
("g" ?,Hb(B) ; Gimel
("h" ?,Hd(B) ; He
("j" [ ",Hy$,1,a(B" ]) ; Shin + Shin dot
("k" ?,Hk(B) ; Kaf
("l" ?,Hl(B) ; Lamed
(";" ?$,1,P(B) ; Sheva
("'" ?,F"(B) ; Right Single Quotation Mark
("z" ?,Hf(B) ; Zayin
("x" ?,Hg(B) ; Het
("c" ?,Hv(B) ; Tsadi
("v" ?,Hh(B) ; Tet
("b" ?,Ha(B) ; Bet
("n" ?,Hp(B) ; Nun
("m" ?,Hn(B) ; Mem
("~" ?$,1tJ(B) ; New Sheqel Sign
("@" ?$,1,8(B) ; Zarqa
("#" ?$,1,H(B) ; Qadma
("$" ?$,1,<(B) ; Geresh (Accent)
("%" ?$,1,>(B) ; Gershayim (Accent)
("&" ?$,1,L(B) ; Iluy
("*" ?$,1,=(B) ; Geresh Muqdam
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("_" ?$(G!9(B) ; Em Dash
("Q" ?$,1,7(B) ; Revia
("E" ?$,1,U(B) ; Tsere
("Y" ?$,1,?(B) ; Qarney Para
("O" ?$,1,Z(B) ; Holam Haser for Vav
("P" ?,Hs(B) ; Final Pe
("{" ?}) ; mirroring
("}" ?{) ; mirroring
("A" ?$,1,X(B) ; Qamats
("S" ?,Hy(B) ; Shin
("K" ?,Hj(B) ; Final Kaf
(":" ?$,1-4(B) ; Gershayim (Punct.)
("\"" ?,Y!(B) ; Right Double Quotation Mark
("Z" ?,F$(B) ; Euro Sign
("C" ?,Hu(B) ; Final Tsadi
("N" ?,Ho(B) ; Final Nun
("M" ?,Hm(B) ; Final Mem
("<" ?,Hr(B) ; Ayin
(">" ?,H`(B) ; Alef
("``" ?$)
("`1" ?$,1,](B) ; Meteg
("`2" ?$,1,B(B) ; Atnah Hafukh
("`3" ?$,1,6(B) ; Tipeha
("`4" ?$,1,E(B) ; Merkha
("`5" ?$,1,F(B) ; Merkha Kefula
("`6" ?$,1,M(B) ; Dehi
("`7" ?$,1,C(B) ; Munah
("`8" ?$,1,;(B) ; Tevir
("`9" ?$,1,G(B) ; Darga
("`0" ?$,1,J(B) ; Yerah Ben Yomo
("`-" ?$(G!7(B) ; Em Dash
("`=" ?$,1,1(B) ; Etnahta
("`]" ?$,1,:(B) ; Accent Yetiv
("`\\" ?$,1,D(B) ; Mahapakh
("`a" ?$,1,g(B) ; Qamats Qatan
("`g" ? $(O#?(B) ; White Bullet
("`h" ?\u0336) ; Combining Long Stroke Overlay
("`;" ?\;)
("`'" ?\u0323); Combining Dot Below (Lower Point??)
("`m" ?\u200C) ; ZWNJ
("`," ?,A;(B) ; mirroring
("`." ?,A+(B) ; mirroring
("`/" ?$,1-3(B) ; Geresh (Punct.)
("`!" ?$,1,7(B) ; Revia
("`@" ?$,1,N(B) ; Zinor
("`#" ?$,1,9(B) ; Pashta
("`$" ?$,1,@(B) ; Telisha Gedola
("`%" ?$,1,I(B) ; Telisha Qetana
("`&" ?$,1,A(B) ; Pazer
("`*" ?$,1,5(B) ; Zaqef Gadol
("`(" ?$,1,3(B) ; Shalshelet
("`)" ?$,1,O(B) ; Masora Circle
("`_" ?$,1,_(B) ; Rafe
("`+" ?$,2",(B) ; Dotted Circle
("`E" ?$,1,Q(B) ; Hataf Segol
("`O" ?$,1,S(B) ; Hataf Qamats
("`P" ?\u034F) ; CGJ
("`{" ?$,1,4(B) ; Zaqef Qatan
("`}" ?$,1,2(B) ; Segol (Accent)
("`|" ?$,1,K(B) ; Ole
("`A" ?$,1,R(B) ; Hataf Patah
("`G" ?$(O#@(B) ; Bullet
("`H" ?\u030A) ; Combining ring above
("`:" ?$,1,c(B) ; Sof Pasuq
("`\"" ?$,1,d(B) ; Upper Dot
("`M" ?\u200D) ; ZWJ
("`<" ?\u0307) ; Combining dot above
("`>" ?\u0308) ; Combining Diaeresis
)
(quail-define-package
"yiddish-royal" "Hebrew" "$,1-2,Hx(B" nil "Yiddish Royal input method.
Based on Royal Yiddish typewriter.
Better for yiddish than Hebrew methods.
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("`" ?~)
("q" ?,Hw(B) ; Qof
("w" [ ",H`$,1,X(B" ]) ; Qamats Alef (Komets Alef)
("e" ?,Hx(B) ; Resh
("r" ?,H`(B) ; Alef (Shtumer Alef)
("t" ?,Hh(B) ; Tet
("y" ?$,1-0(B) ; Yiddish Double Vav (Tsvey Vovn)
("u" ?,He(B) ; Vav
("i" ?,Ho(B) ; Final Nun
("o" ?,Hm(B) ; Final Mem
("p" [ ",Ht$,1,_(B" ]) ; Rafe Pe (Fey)
("[" [ ",Ht$,1,\(B" ]) ; Dagesh Pe (Pey)
("]" ?,)
("a" ?,Hy(B) ; Shin
("s" ?,Hc(B) ; Dalet
("d" ?,Hb(B) ; Gimel
("f" ?,Hk(B) ; Kaf
("g" ?,Hr(B) ; Ayin
("h" ?$,1-2(B) ; Yiddish Double Yod (Tsvey Yudn)
("j" ?,Hi(B) ; Yod
("k" ?,Hg(B) ; Het
("l" ?,Hl(B) ; Lamed
(";" ?,Hj(B) ; Final Kaf
("'" ?,Hs(B) ; Final Pe
("z" ?.)
("x" ?,Hf(B) ; Zayin
("c" ?,Hq(B) ; Samekh
("v" ?,Ha(B) ; Bet
("b" ?,Hd(B) ; He
("n" ?,Hp(B) ; Nun
("m" ?,Hn(B) ; Mem
("," ?,Hv(B) ; Tsadi
("." ?,Hz(B) ; Tav
("/" ?,Hu(B) ; Final Tsadi
("~" ?@)
("!" ?,Y!(B) ; Right Double Quotation Mark
("@" ?,Y%(B) ; Double Low-9 Quotation Mark
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("Q" ?,A=(B) ; Right Double Quotation Mark
("W" ?,A<(B)
("E" ?,A>(B) ; Yiddish Double Yod (x2)
("R" [ ",H`$,1,W(B" ]) ; Patah Alef (Pasekh Alef)
; ("T" "")
("Y" ?$,1-1(B) ; Ligature Yiddish Vav Yod (vov yud)
("U" [ ",He$,1,\(B" ]) ; Melupm vov
("I" ?/)
("O" ?\\)
("P" ?,Ht(B) ; Pe
("{" ??)
("}" ?!)
("A" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
("S" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
; ("D" "")
("F" [ ",Hk$,1,\(B" ]) ; Dagesh Kaf (Kof)
; ("G" "")
("H" [ "$,1-2,W(B" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
("J" [ ",Hi$,1,T(B" ]) ; Khirik Yud
("K" ?}) ; mirroring
("L" ?{) ; mirroring
("\"" ?\;)
("Z" ??)
("X" ?|)
("C" [ ",Ha$,1,\(B" ]) ; Dagesh Bet (Beys)
("V" [ ",Ha$,1,_(B" ]) ; Rafe Bet (Veys)
("B" ?\]) ; mirroring
("N" ?\[) ; mirroring
("M" ?>) ; mirroring
("<" ?<) ; mirroring
(">" [ ",Hz$,1,\(B" ]) ; Dagesh Tav (Tof)
("?" ?\')
)
(quail-define-package
"yiddish-keyman" "Hebrew" "$,1-2,Hw(B" nil "Yiddish Keyman input method.
Based on Keyman keyboard layout.
Better for yiddish than Hebrew methods..
" nil t t t t nil nil nil nil nil t)
(quail-define-rules
("`" ?\;)
("q" ?,Y%(B) ; Double Low-9 Quotation Mark
("w" ?,Hy(B) ; Shin
("e" ?,Hr(B) ; Ayin
("r" ?,Hx(B) ; Resh
("t" ?,Hh(B) ; Tet
("y" ?,Hi(B) ; Yod
("u" ?,He(B) ; Vav
("i" ?,Hi(B) ; Yod (x2)
("o" [ ",H`$,1,X(B" ]) ; Qamats Alef (Komets Alef)
("p" [ ",Ht$,1,\(B" ]) ; Dagesh Pe (Pey)
("[" ?\]) ; mirroring
("]" ?\[) ; mirroring
("a" [ ",H`$,1,W(B" ]) ; Patah Alef (Pasekh Alef)
("s" ?,Hq(B) ; Samekh
("d" ?,Hc(B) ; Dalet
("f" [ ",Ht$,1,_(B" ]) ; Rafe Pe (Fey)
("g" ?,Hb(B) ; Gimel
("h" ?,Hd(B) ; He
("j" ?$,1-2(B) ; Yiddish Double Yod (Tsvey Yudn)
("k" ?,Hw(B) ; Qof
("l" ?,Hl(B) ; Lamed
("z" ?,Hf(B) ; Zayin
("x" ?,Hk(B) ; Kaf
("c" ?,Hv(B) ; Tsadi
("v" ?$,1-0(B) ; Yiddish Double Vav (Tsvey Vovn)
("b" ?,Ha(B) ; Bet
("n" ?,Hp(B) ; Nun
("m" ?,Hn(B) ; Mem
("(" ?\)) ; mirroring
(")" ?\() ; mirroring
("Q" ?,Y!(B) ; Right Double Quotation Mark
("W" [ ",Hy$,1,b(B" ]) ; Shin + Sin dot
("E" ?$,1-2(B) ; Yiddish Double Yod (x2)
; ("R" "") ;
("T" [ ",Hz$,1,\(B" ]) ; Dagesh Tav (Tof)
("Y" [ "$,1-2,W(B" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
("U" [ ",He$,1,\(B" ]) ; Melupm vov
("I" [ ",Hi$,1,T(B" ]) ; Khirik Yud
("O" ?$,1-1(B) ; Ligature Yiddish Vav Yod (vov yud)
; ("P" "")
("{" ?}) ; mirroring
("}" ?{) ; mirroring
("A" ?,H`(B) ; Alef (Shtumer Alef)
("S" ?,Hz(B) ; Tav
("F" ?,Hs(B) ; Final Pe
("G" ?$,1-3(B) ; Geresh (Punct.)
("H" ?,Hg(B) ; Het
("J" ?$,1-2(B) ; Yiddish Double Yod (x2)
("K" [ ",Hk$,1,\(B" ]) ; Dagesh Kaf (Kof)
; ("L" "")
; ("Z" "")
("X" ?,Hj(B) ; Final Kaf
("C" ?,Hu(B) ; Final Tsadi
("V" [ ",Ha$,1,_(B" ]) ; Rafe Bet (Veys) ) ; Bet
; ("B" "")
("N" ?,Ho(B) ; Final Nun
("M" ?,Hm(B) ; Final Mem
("<" ?>) ; mirroring
(">" ?<) ; mirroring
)
;;; hebrew.el ends here

View file

@ -1,3 +1,82 @@
2011-07-27 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-maybe-send-script): Don't let-bind the
connection process, it could be nil.
2011-07-27 Leo Liu <sdl.web@gmail.com>
Simplify url handling in rcirc-mode.
* net/rcirc.el (rcirc-browse-url-map, rcirc-browse-url-at-point)
(rcirc-browse-url-at-mouse): Remove.
* net/rcirc.el (rcirc-markup-urls): Use `make-button'.
2011-07-26 Alan Mackenzie <acm@muc.de>
Fontify bitfield declarations properly.
* progmodes/cc-langs.el (c-has-bitfields): New lang variable.
(c-symbol-chars): Now exported as a lang variable.
(c-not-primitive-type-keywords): New lang variable.
* progmodes/cc-fonts.el (c-font-lock-declarations): Jump over the
QT keyword "more" to prevent "more slots: ...." being spuriously
parsed as a bitfield declaraion.
* progmodes/cc-engine.el (c-beginning-of-statement-1): Refactor
and enhance to handle bitfield declarations.
(c-punctuation-in): New function.
(c-forward-decl-or-cast-1): Enhance CASE 3 to handle bitfield
declarations properly.
2011-07-26 Ulf Jasper <ulf.jasper@web.de>
* calendar/icalendar.el (icalendar--all-events): Take care of
multiple vcalendars in a single file.
(icalendar--convert-float-to-ical): checkdoc fixes.
2011-07-25 Deniz Dogan <deniz@dogan.se>
* image.el (insert-image): Clarifying docstring.
2011-07-24 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-barf-unless-okay): Return the value of
`tramp-send-command-and-check' if there is no error.
(tramp-send-command-and-read): Suppress *all* errors if NOERROR.
2011-07-22 Alan Mackenzie <acm@muc.de>
Prevent cc-langs.elc being loaded at run time.
* progmodes/cc-mode.el: Remove two autoload forms which loaded
cc-langs.
* /progmodes/cc-langs.el (c-make-init-lang-vars-fun): Don't emit
"(require 'cc-langs)". Quote a form so it will evaluate at
(cc-mode's) compilation time.
2011-07-22 Michael Albinus <michael.albinus@gmx.de>
* net/tramp.el (tramp-file-name-handler): Avoid recursive
loading. (Bug#9114)
2011-07-21 Martin Rudalics <rudalics@gmx.at>
* window.el (display-buffer-pop-up-window)
(display-buffer-pop-up-side-window)
(display-buffer-in-side-window): Call display-buffer-set-height
and display-buffer-set-width after setting the new window's
buffer so `fit-window-to-buffer' and friends work on the right
buffer.
2011-07-20 Sam Steingold <sds@gnu.org>
* progmodes/etags.el (etags-file-of-tag, etags-tags-table-files)
(etags-tags-included-tables): Call `convert-standard-filename' on
the file names contained in TAGS so that windows Emacs can handle
TAGS files created by cygwin ctags.
2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
* proced.el (proced-update): Revert yesterday's bug#1779 patch,

View file

@ -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:"

View file

@ -1,3 +1,22 @@
2011-07-24 Andrew Cohen <cohen@andy.bu.edu>
* nnimap.el (nnimap-make-thread-query): Quote message-ids for gmail.
2011-07-23 Andrew Cohen <cohen@andy.bu.edu>
* nnir.el (nnir-search-thread): New function to make an nnir group
based on a thread query.
* gnus-sum.el (gnus-refer-thread-use-nnir): New variable to control use
of nnir in thread referral.
(gnus-summary-refer-thread): Use it.
* nnimap.el (nnimap-request-thread): Use it.
2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
* shr.el (shr-tag-comment): Ignore HTML comments.
2011-07-20 Andrew Cohen <cohen@andy.bu.edu>
* nnir.el (gnus-group-make-nnir-group): Allow optional search query

View file

@ -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."

View file

@ -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)))))

View file

@ -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)

View file

@ -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)

View file

@ -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'

View file

@ -935,14 +935,6 @@ IRC command completion is performed only if '/' is the first input char."
map)
"Keymap for rcirc mode.")
(defvar rcirc-browse-url-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "RET") 'rcirc-browse-url-at-point)
(define-key map (kbd "<mouse-2>") 'rcirc-browse-url-at-mouse)
(define-key map [follow-link] 'mouse-face)
map)
"Keymap used for browsing URLs in `rcirc-mode'.")
(defvar rcirc-short-buffer-name nil
"Generated abbreviation to use to indicate buffer activity.")
@ -2351,21 +2343,6 @@ keywords when no KEYWORD is given."
(browse-url (completing-read "rcirc browse-url: "
completions nil nil initial-input 'history)
arg)))
(defun rcirc-browse-url-at-point (point)
"Send URL at point to `browse-url'."
(interactive "d")
(let ((beg (previous-single-property-change (1+ point) 'mouse-face))
(end (next-single-property-change point 'mouse-face)))
(browse-url (buffer-substring-no-properties beg end))))
(defun rcirc-browse-url-at-mouse (event)
"Send URL at mouse click to `browse-url'."
(interactive "e")
(let ((position (event-end event)))
(with-current-buffer (window-buffer (posn-window position))
(rcirc-browse-url-at-point (posn-point position)))))
(defun rcirc-markup-timestamp (sender response)
(goto-char (point-min))
@ -2406,12 +2383,16 @@ keywords when no KEYWORD is given."
(while (and rcirc-url-regexp ;; nil means disable URL catching
(re-search-forward rcirc-url-regexp nil t))
(let ((start (match-beginning 0))
(end (match-end 0)))
(rcirc-add-face start end 'rcirc-url)
(add-text-properties start end (list 'mouse-face 'highlight
'keymap rcirc-browse-url-map))
(end (match-end 0))
(url (match-string-no-properties 0)))
(make-button start end
'face 'rcirc-url
'follow-link t
'rcirc-url url
'action (lambda (button)
(browse-url (button-get button 'rcirc-url))))
;; record the url
(push (buffer-substring-no-properties start end) rcirc-urls))))
(push url rcirc-urls))))
(defun rcirc-markup-keywords (sender response)
(when (and (string= response "PRIVMSG")

View file

@ -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.

View file

@ -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

View file

@ -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, "<type> <id> : <size>"?
(if c-has-bitfields
(cond
;; The : <size> and <id> fields?
((and (numberp c-maybe-labelp)
(not bitfield-size-pos)
(save-excursion
(goto-char (or tok start))
(not (looking-at c-keywords-regexp)))
(not (looking-at c-keywords-regexp))
(not (c-punctuation-in (point) c-maybe-labelp)))
(setq bitfield-size-pos (or tok start)
bitfield-id-pos (point)))
;; The <type> field?
((and bitfield-id-pos
(not bitfield-type-pos))
(if (and (looking-at c-symbol-key) ; Can only be an integer type. :-)
(not (looking-at c-not-primitive-type-keywords-regexp))
(not (c-punctuation-in (point) tok)))
(setq bitfield-type-pos (point))
(setq bitfield-size-pos nil
bitfield-id-pos nil)))))
;; Handle labels.
(unless (eq ignore-labels t)
@ -1044,8 +1057,10 @@ comment at the start of cc-engine.el for more info."
pptok ptok
ptok tok
tok (point)
pos tok))) ; Not nil (for the while loop).
pos tok) ; always non-nil
) ; end of (catch loop ....)
) ; end of sexp-at-a-time (while ....)
;; If the stack isn't empty there might be errors to report.
(while stack
(if (and (vectorp saved-pos) (eq (length saved-pos) 3))
@ -1067,6 +1082,7 @@ comment at the start of cc-engine.el for more info."
(eq c-maybe-labelp t)
(not (eq ret 'beginning))
after-labels-pos
(not bitfield-type-pos) ; Bitfields take precedence over labels.
(or (not label-good-pos)
(<= label-good-pos pos)
(progn
@ -1104,6 +1120,19 @@ comment at the start of cc-engine.el for more info."
(goto-char pos)
ret)))
(defun c-punctuation-in (from to)
"Return non-nil if there is a non-comment non-macro punctuation character
between FROM and TO. FROM must not be in a string or comment. The returned
value is the position of the first such character."
(save-excursion
(goto-char from)
(let ((pos (point)))
(while (progn (skip-chars-forward c-symbol-chars to)
(c-forward-syntactic-ws to)
(> (point) pos))
(setq pos (point))))
(and (< (point) to) (point))))
(defun c-crosses-statement-barrier-p (from to)
"Return non-nil if buffer positions FROM to TO cross one or more
statement or declaration boundaries. The returned value is actually
@ -6618,19 +6647,27 @@ comment at the start of cc-engine.el for more info."
(if backup-at-type
(progn
;; CASE 3
(when (= (point) start)
;; Got a plain list of identifiers. If a colon follows it's
;; a valid label. Otherwise the last one probably is the
;; declared identifier and we should back up to the previous
;; type, providing it isn't a cast.
;; CASE 3
(when (= (point) start)
;; Got a plain list of identifiers. If a colon follows it's
;; a valid label, or maybe a bitfield. Otherwise the last
;; one probably is the declared identifier and we should
;; back up to the previous type, providing it isn't a cast.
(if (and (eq (char-after) ?:)
(not (c-major-mode-is 'java-mode)))
;; If we've found a specifier keyword then it's a
;; declaration regardless.
(throw 'at-decl-or-cast (eq at-decl-or-cast t))
(setq backup-if-not-cast t)
(throw 'at-decl-or-cast t)))
(cond
;; If we've found a specifier keyword then it's a
;; declaration regardless.
((eq at-decl-or-cast t)
(throw 'at-decl-or-cast t))
((and c-has-bitfields
(eq at-decl-or-cast 'ids)) ; bitfield.
(setq backup-if-not-cast t)
(throw 'at-decl-or-cast t)))
(setq backup-if-not-cast t)
(throw 'at-decl-or-cast t)))
;; CASE 4
(when (and got-suffix

View file

@ -1179,6 +1179,14 @@ casts and declarations are fontified. Used on level 2 and higher."
(goto-char start-pos)))
;; Now analyze the construct.
;; In QT, "more" is an irritating keyword that expands to nothing.
;; We skip over it to prevent recognition of "more slots: <symbol>"
;; as a bitfield declaration.
(when (and (c-major-mode-is 'c++-mode)
(looking-at
(concat "\\(more\\)\\([^" c-symbol-chars "]\\|$\\)")))
(goto-char (match-end 1))
(c-forward-syntactic-ws))
(setq decl-or-cast (c-forward-decl-or-cast-1
match-pos context last-cast-end))

View file

@ -511,6 +511,12 @@ parameters \(point-min), \(point-max) and <buffer size>."
;;; Lexer-level syntax (identifiers, tokens etc).
(c-lang-defconst c-has-bitfields
"Whether the language has bitfield declarations."
t nil
(c c++ objc) t)
(c-lang-defvar c-has-bitfields (c-lang-const c-has-bitfields))
(c-lang-defconst c-symbol-start
"Regexp that matches the start of a symbol, i.e. any identifier or
keyword. It's unspecified how far it matches. Does not contain a \\|
@ -528,6 +534,7 @@ This is of the form that fits inside [ ] in a regexp."
;; operator chars too, but they are handled with other means instead.
t (concat c-alnum "_$")
objc (concat c-alnum "_$@"))
(c-lang-defvar c-symbol-chars (c-lang-const c-symbol-chars))
(c-lang-defconst c-symbol-key
"Regexp matching identifiers and keywords (with submatch 0). Assumed
@ -1927,6 +1934,21 @@ one of `c-type-list-kwds', `c-ref-list-kwds',
(c-lang-defvar c-not-decl-init-keywords
(c-lang-const c-not-decl-init-keywords))
(c-lang-defconst c-not-primitive-type-keywords
"List of all keywords apart from primitive types (like \"int\")."
t (set-difference (c-lang-const c-keywords)
(c-lang-const c-primitive-type-kwds)
:test 'string-equal)
;; The "more" for C++ is the QT keyword (as in "more slots:").
;; This variable is intended for use in c-beginning-of-statement-1.
c++ (append (c-lang-const c-not-primitive-type-keywords) '("more")))
(c-lang-defconst c-not-primitive-type-keywords-regexp
t (c-make-keywords-re t
(c-lang-const c-not-primitive-type-keywords)))
(c-lang-defvar c-not-primitive-type-keywords-regexp
(c-lang-const c-not-primitive-type-keywords-regexp))
(c-lang-defconst c-protection-kwds
"Access protection label keywords in classes."
t nil
@ -3092,10 +3114,9 @@ accomplish that conveniently."
;; ',mode ,c-version c-version)
;; (put ',mode 'c-has-warned-lang-consts t))
(require 'cc-langs)
(setq source-eval t)
(let ((init (append (cdr c-emacs-variable-inits)
(cdr c-lang-variable-inits))))
(let ((init ',(append (cdr c-emacs-variable-inits)
(cdr c-lang-variable-inits))))
(while init
(setq current-var (caar init))
(set (caar init) (eval (cadar init)))

View file

@ -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

View file

@ -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.

View file

@ -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)

View file

@ -1,4 +1,4 @@
2011-07-19 Paul Eggert <eggert@cs.ucla.edu>
2011-07-28 Paul Eggert <eggert@cs.ucla.edu>
Integer signedness and overflow and related fixes. (Bug#9079)
@ -197,6 +197,101 @@
Use EMACS_INT, not EMACS_UINT, for sizes. The code works equally
well either way, and we prefer signed to unsigned.
2011-07-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnutls.c (emacs_gnutls_read): Don't message anything if the peer
closes the connection while we're reading (bug#9182).
2011-07-25 Jan Djärv <jan.h.d@swipnet.se>
* nsmenu.m (ns_popup_dialog): Add an "ok" button if no buttons
are specified (Bug#9168).
2011-07-25 Paul Eggert <eggert@cs.ucla.edu>
* bidi.c (bidi_dump_cached_states): Fix printf format mismatch.
Found by GCC static checking and --with-wide-int on a 32-bit host.
2011-07-25 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (compute_display_string_pos): Fix logic of caching
previous display string position. Initialize cached_prev_pos to
-1. Fixes slow-down at the beginning of a buffer.
2011-07-24 Eli Zaretskii <eliz@gnu.org>
* xfaces.c (check_lface_attrs) [HAVE_WINDOW_SYSTEM]: Allow `nil'
for attrs[LFACE_FONTSET_INDEX].
2011-07-23 Paul Eggert <eggert@cs.ucla.edu>
* xml.c (parse_region): Remove unused local
that was recently introduced.
2011-07-23 Eli Zaretskii <eliz@gnu.org>
* xfns.c (unwind_create_frame) [GLYPH_DEBUG]: Adapt to changes in
2008-02-22T17:42:09Z!monnier@iro.umontreal.ca.
* xdisp.c (move_it_in_display_line_to): Record the best matching
position for TO_CHARPOS while scanning the line, and restore it on
exit if none of the characters scanned was an exact match. Fixes
vertical-motion and pos-visible-in-window-p under bidi redisplay
when exact match is impossible due to invisible text, and the
lines are truncated.
2011-07-23 Jan Djärv <jan.h.d@swipnet.se>
* nsterm.m (initFrameFromEmacs): Set NSTitledWindowMask in styleMask
for OSX >= 10.7.
2011-07-22 Eli Zaretskii <eliz@gnu.org>
Fix a significant slow-down of cursor motion with C-n, C-p,
C-f/C-b, and C-v/M-v that couldn't keep up with keyboard
auto-repeat under bidi redisplay in fontified buffers.
* xdisp.c (compute_stop_pos_backwards): New function.
(next_element_from_buffer): Call compute_stop_pos_backwards to
find a suitable prev_stop when we find ourselves before
base_level_stop.
(reseat): Don't look for prev_stop, as that could mean a very long
run.
<cached_disp_pos, cached_disp_buffer, cached_disp_modiff>
<cached_disp_overlay_modiff>: Cache for last found display string
position.
(compute_display_string_pos): Return the cached position if asked
about the same buffer in the same area of character positions, and
the buffer wasn't changed since the time the display string
position was cached.
2011-07-22 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (rows_from_pos_range): Don't ignore glyphs whose object
is an integer, which is important for empty lines. (Bug#9149)
2011-07-22 Chong Yidong <cyd@stupidchicken.com>
* frame.c (Fmodify_frame_parameters): In tty case, update the
default face if necessary (Bug#4238).
2011-07-21 Chong Yidong <cyd@stupidchicken.com>
* editfns.c (Fstring_to_char): No need to explain what a character
is in the docstring (Bug#6576).
2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
* xml.c (parse_region): Make sure we always return a tree.
2011-07-20 HAMANO Kiyoto <khiker.mail@gmail.com>
* xml.c (parse_region): If a document contains only comments,
return that, too.
2011-07-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
* xml.c (make_dom): Return comments, too.
2011-07-19 Paul Eggert <eggert@cs.ucla.edu>
Port to OpenBSD.

View file

@ -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)

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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];

View file

@ -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

View file

@ -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++;

View file

@ -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
}

View file

@ -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;
}

View file

@ -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 ();
}

View file

@ -1,3 +1,25 @@
2011-07-26 Ulf Jasper <ulf.jasper@web.de>
* automated/icalendar-tests.el (icalendar-tests--compare-strings):
Removed, simply use string=.
(icalendar--diarytime-to-isotime)
(icalendar--datetime-to-diary-date)
(icalendar--datestring-to-isodate)
(icalendar--format-ical-event)
(icalendar--parse-summary-and-rest)
(icalendar-tests--do-test-import)
(icalendar-tests--do-test-cycle) : Changed argument order of
string= to EXPECTED ACTUAL.
(icalendar--import-format-sample)
(icalendar--format-ical-event)
(icalendar-import-non-recurring)
(icalendar-import-rrule)
(icalendar-import-duration)
(icalendar-import-bug-6766)
(icalendar-real-world): Adjusted to string= instead of
icalendar-tests--compare-strings.
(icalendar-import-multiple-vcalendars): New.
2011-05-11 Teodor Zlatanov <tzz@lifelogs.com>
* automated/gnus-tests.el: Add wrapper for Gnus tests.

View file

@ -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