Merged in changes from CVS trunk.

Patches applied:

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-290
   Update from CVS


git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-161
This commit is contained in:
Karoly Lorentey 2004-05-11 09:11:36 +00:00
commit ab4b17bed7
33 changed files with 1337 additions and 276 deletions

View file

@ -1,3 +1,17 @@
2004-05-08 Thien-Thi Nguyen <ttn@gnu.org>
* cvtmail.c: Throughout, replace 0 destined for `exit' arg
with `EXIT_SUCCESS'. Likewise, replace 1 with `EXIT_FAILURE'.
(main): Use `EXIT_SUCCESS' or `EXIT_FAILURE' for return value.
* ebrowse.c, emacsclient.c, fakemail.c, hexl.c,
make-docfile.c, movemail.c, profile.c, sorted-doc.c,
test-distrib.c, update-game-score.c, yow.c: Likewise.
2004-05-08 Thien-Thi Nguyen <ttn@gnu.org>
* Makefile.in (emacsclient${EXEEXT}): Use makefile var `version'.
2004-05-07 Thien-Thi Nguyen <ttn@gnu.org>
* b2m.c (GOOD, BAD): Delete macros. Throughout,

View file

@ -1,5 +1,5 @@
# Makefile for lib-src subdirectory in GNU Emacs.
# Copyright (C) 1985, 1987, 1988, 1993, 1994, 2002, 2003
# Copyright (C) 1985, 1987, 1988, 1993, 1994, 2002, 2003, 2004
# Free Software Foundation, Inc.
# This file is part of GNU Emacs.
@ -447,7 +447,7 @@ yow${EXEEXT}: ${srcdir}/yow.c ../src/epaths.h
emacsclient${EXEEXT}: ${srcdir}/emacsclient.c ../src/config.h $(GETOPTDEPS)
$(CC) ${ALL_CFLAGS} ${srcdir}/emacsclient.c $(GETOPTOBJS) \
-DVERSION=`sed -n -e '/(defconst emacs-version/ s/^[^"]*\("[^"]*"\).*/\1/p' ${srcdir}/../lisp/version.el` \
-DVERSION="\"${version}\"" \
$(LOADLIBES) -o emacsclient
hexl${EXEEXT}: ${srcdir}/hexl.c ../src/config.h

View file

@ -119,7 +119,7 @@ main (argc, argv)
}
fclose (mddf);
fclose (mfilef);
return 0;
return EXIT_SUCCESS;
}
void
@ -148,7 +148,7 @@ fatal (s1, s2)
char *s1, *s2;
{
error (s1, s2);
exit (1);
exit (EXIT_FAILURE);
}
void
@ -157,7 +157,7 @@ sysfail (s)
{
fprintf (stderr, "cvtmail: ");
perror (s);
exit (1);
exit (EXIT_FAILURE);
}
char *
@ -183,3 +183,5 @@ xrealloc (ptr, size)
/* arch-tag: b93c25a9-9012-44f1-b78b-9cc7aed44a7a
(do not change this comment) */
/* cvtmail.c ends here */

View file

@ -564,7 +564,7 @@ xmalloc (nbytes)
if (p == NULL)
{
yyerror ("out of memory", NULL);
exit (1);
exit (EXIT_FAILURE);
}
return p;
}
@ -581,7 +581,7 @@ xrealloc (p, sz)
if (p == NULL)
{
yyerror ("out of memory", NULL);
exit (1);
exit (EXIT_FAILURE);
}
return p;
}
@ -3671,7 +3671,7 @@ usage (error)
int error;
{
puts (USAGE);
exit (error ? 1 : 0);
exit (error ? EXIT_FAILURE : EXIT_SUCCESS);
}
@ -3688,7 +3688,7 @@ version ()
printf ("ebrowse %s\n", VERSION);
puts ("Copyright (C) 1992-1999, 2000, 2001 Free Software Foundation, Inc.");
puts ("This program is distributed under the same terms as Emacs.");
exit (0);
exit (EXIT_SUCCESS);
}
@ -3925,7 +3925,7 @@ main (argc, argv)
if (yyout == NULL)
{
yyerror ("cannot open output file `%s'", out_filename);
exit (1);
exit (EXIT_FAILURE);
}
}
@ -3970,11 +3970,10 @@ main (argc, argv)
if (yyout != stdout)
fclose (yyout);
return 0;
return EXIT_SUCCESS;
}
/* ebrowse.c ends here. */
/* arch-tag: fc03b4bc-91a9-4c3d-b3b9-12a77fa86dd8
(do not change this comment) */
/* ebrowse.c ends here */

View file

@ -48,9 +48,6 @@ Boston, MA 02111-1307, USA. */
char *getenv (), *getwd ();
char *getcwd ();
/* This is defined with -D from the compilation command,
which extracts it from ../lisp/version.el. */
#ifndef VERSION
#define VERSION "unspecified"
#endif
@ -157,7 +154,7 @@ decode_options (argc, argv)
case 'V':
printf ("emacsclient %s\n", VERSION);
exit (0);
exit (EXIT_SUCCESS);
break;
case 't':
@ -176,7 +173,7 @@ decode_options (argc, argv)
default:
fprintf (stderr, "Try `%s --help' for more information\n", progname);
exit (1);
exit (EXIT_FAILURE);
break;
}
}
@ -209,7 +206,7 @@ The following OPTIONS are accepted:\n\
Editor to fallback to if the server is not running\n\
\n\
Report bugs to bug-gnu-emacs@gnu.org.\n", progname);
exit (0);
exit (EXIT_SUCCESS);
}
/* Like malloc but get fatal error if memory is exhausted. */
@ -222,7 +219,7 @@ xmalloc (size)
if (result == NULL)
{
perror ("malloc");
exit (1);
exit (EXIT_FAILURE);
}
return result;
}
@ -236,7 +233,7 @@ xstrdup (const char *s)
if (result == NULL)
{
perror ("strdup");
exit (1);
exit (EXIT_FAILURE);
}
return result;
}
@ -336,7 +333,7 @@ fail (void)
}
else
{
exit (1);
exit (EXIT_FAILURE);
}
}
@ -520,7 +517,7 @@ main (argc, argv)
{
fprintf (stderr, "%s: file name or argument required\n", progname);
fprintf (stderr, "Try `%s --help' for more information\n", progname);
exit (1);
exit (EXIT_FAILURE);
}
/*
@ -598,7 +595,7 @@ main (argc, argv)
{
fprintf (stderr, "%s: socket-name %s too long",
argv[0], socket_name);
exit (1);
exit (EXIT_FAILURE);
}
sock_status = socket_status (server.sun_path);
@ -819,9 +816,7 @@ To start the server in Emacs, type \"M-x server-start\".\n",
/* Maybe wait for an answer. */
if (nowait)
{
return 0;
}
return EXIT_SUCCESS;
if (!eval && !tty)
{
@ -883,7 +878,7 @@ To start the server in Emacs, type \"M-x server-start\".\n",
fflush (stdout);
fsync (1);
return 0;
return EXIT_SUCCESS;
}
#endif /* HAVE_SOCKETS */
@ -905,3 +900,5 @@ strerror (errnum)
/* arch-tag: f39bb9c4-73eb-477e-896d-50832e2ca9a7
(do not change this comment) */
/* emacsclient.c ends here */

View file

@ -169,7 +169,7 @@ fatal (s1, s2)
char *s1, *s2;
{
error (s1, s2);
exit (1);
exit (EXIT_FAILURE);
}
/* Like malloc but get fatal error if memory is exhausted. */
@ -410,7 +410,7 @@ close_the_streams ()
no_problems = (no_problems &&
((*rem->action) (rem->handle) == 0));
the_streams = ((stream_list) NULL);
return (no_problems ? 0 : 1);
return (no_problems ? EXIT_SUCCESS : EXIT_FAILURE);
}
void
@ -667,7 +667,7 @@ read_header ()
if (next_line == ((line_list *) NULL))
{
/* Not a valid header */
exit (1);
exit (EXIT_FAILURE);
}
*next_line = new_list ();
(*next_line)->string = alloc_string (length);
@ -753,3 +753,5 @@ main (argc, argv)
/* arch-tag: acb0afa6-315a-4c5b-b9e3-def5725c8783
(do not change this comment) */
/* fakemail.c ends here */

View file

@ -270,15 +270,17 @@ main (argc, argv)
fclose (fp);
} while (*argv != NULL);
return 0;
return EXIT_SUCCESS;
}
void
usage ()
{
fprintf (stderr, "usage: %s [-de] [-iso]\n", progname);
exit (1);
exit (EXIT_FAILURE);
}
/* arch-tag: 20e04fb7-926e-4e48-be86-64fe869ecdaa
(do not change this comment) */
/* hexl.c ends here */

View file

@ -104,7 +104,7 @@ fatal (s1, s2)
char *s1, *s2;
{
error (s1, s2);
exit (1);
exit (EXIT_FAILURE);
}
/* Like malloc but get fatal error if memory is exhausted. */
@ -1210,3 +1210,5 @@ scan_lisp_file (filename, mode)
/* arch-tag: f7203aaf-991a-4238-acb5-601db56f2894
(do not change this comment) */
/* make-docfile.c ends here */

View file

@ -216,7 +216,7 @@ main (argc, argv)
preserve_mail++;
break;
default:
exit(1);
exit (EXIT_FAILURE);
}
}
@ -234,7 +234,7 @@ main (argc, argv)
#else
fprintf (stderr, "Usage: movemail [-p] inbox destfile%s\n", "");
#endif
exit (1);
exit (EXIT_FAILURE);
}
inname = argv[optind];
@ -536,12 +536,12 @@ main (argc, argv)
if (spool_name)
mailunlock ();
#endif
exit (0);
exit (EXIT_SUCCESS);
}
wait (&status);
if (!WIFEXITED (status))
exit (1);
exit (EXIT_FAILURE);
else if (WRETCODE (status) != 0)
exit (WRETCODE (status));
@ -554,7 +554,7 @@ main (argc, argv)
#endif /* ! DISABLE_DIRECT_ACCESS */
return 0;
return EXIT_SUCCESS;
}
#ifdef MAIL_USE_MAILLOCK
@ -607,7 +607,7 @@ fatal (s1, s2)
if (delete_lockname)
unlink (delete_lockname);
error (s1, s2, 0);
exit (1);
exit (EXIT_FAILURE);
}
/* Print error message. `s1' is printf control string, `s2' and `s3'
@ -709,6 +709,8 @@ char Errmsg[200]; /* POP errors, at least, can exceed
* If the mailbox is in the form "po:username:hostname", then it is
* modified by this function -- the second colon is replaced by a
* null.
*
* Return a value suitable for passing to `exit'.
*/
int
@ -736,19 +738,19 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
if (! server)
{
error ("Error connecting to POP server: %s", pop_error, 0);
return (1);
return EXIT_FAILURE;
}
if (pop_stat (server, &nmsgs, &nbytes))
{
error ("Error getting message count from POP server: %s", pop_error, 0);
return (1);
return EXIT_FAILURE;
}
if (!nmsgs)
{
pop_close (server);
return (0);
return EXIT_SUCCESS;
}
mbfi = open (outfile, O_WRONLY | O_CREAT | O_EXCL, 0666);
@ -756,7 +758,7 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
{
pop_close (server);
error ("Error in open: %s, %s", strerror (errno), outfile);
return (1);
return EXIT_FAILURE;
}
fchown (mbfi, getuid (), -1);
@ -766,7 +768,7 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
error ("Error in fdopen: %s", strerror (errno), 0);
close (mbfi);
unlink (outfile);
return (1);
return EXIT_FAILURE;
}
if (reverse_order)
@ -789,7 +791,7 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
{
error (Errmsg, 0, 0);
close (mbfi);
return (1);
return EXIT_FAILURE;
}
mbx_delimit_end (mbf);
fflush (mbf);
@ -798,7 +800,7 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
error ("Error in fflush: %s", strerror (errno), 0);
pop_close (server);
close (mbfi);
return (1);
return EXIT_FAILURE;
}
}
@ -812,14 +814,14 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
if (fsync (mbfi) < 0)
{
error ("Error in fsync: %s", strerror (errno), 0);
return (1);
return EXIT_FAILURE;
}
#endif
if (close (mbfi) == -1)
{
error ("Error in close: %s", strerror (errno), 0);
return (1);
return EXIT_FAILURE;
}
if (! preserve)
@ -829,17 +831,17 @@ popmail (mailbox, outfile, preserve, password, reverse_order)
{
error ("Error from POP server: %s", pop_error, 0);
pop_close (server);
return (1);
return EXIT_FAILURE;
}
}
if (pop_quit (server))
{
error ("Error from POP server: %s", pop_error, 0);
return (1);
return EXIT_FAILURE;
}
return (0);
return EXIT_SUCCESS;
}
int
@ -957,3 +959,5 @@ strerror (errnum)
/* arch-tag: 1c323112-41fe-4fe5-8de9-494de631f73f
(do not change this comment) */
/* movemail.c ends here */

View file

@ -55,7 +55,7 @@ char *
get_time ()
{
if (watch_not_started)
exit (1); /* call reset_watch first ! */
exit (EXIT_FAILURE); /* call reset_watch first ! */
EMACS_GET_TIME (TV2);
EMACS_SUB_TIME (TV2, TV2, TV1);
sprintf (time_string, "%lu.%06lu", (unsigned long)EMACS_SECS (TV2), (unsigned long)EMACS_USECS (TV2));
@ -94,14 +94,16 @@ main ()
puts (get_time ());
break;
case 'q':
exit (0);
exit (EXIT_SUCCESS);
}
/* Anything remaining on the line is ignored. */
while (c != '\n' && c != EOF)
c = getchar ();
}
exit (1);
exit (EXIT_FAILURE);
}
/* arch-tag: 8db68f7e-2322-4944-a315-dba349bdbf39
(do not change this comment) */
/* profile.c ends here */

View file

@ -75,7 +75,7 @@ fatal (s1, s2)
char *s1, *s2;
{
error (s1, s2);
exit (1);
exit (EXIT_FAILURE);
}
/* Like malloc but get fatal error if memory is exhausted. */
@ -279,8 +279,10 @@ main ()
printf ("@bye\n");
}
return 0;
return EXIT_SUCCESS;
}
/* arch-tag: ce28f204-1e70-4b34-8210-3d54a5662071
(do not change this comment) */
/* sorted-doc.c ends here */

View file

@ -100,11 +100,10 @@ have been corrupted in the files of Emacs, and it will not work.\n",
exit (2);
}
close (fd);
#ifdef VMS
exit (1); /* On VMS, success is 1. */
#endif
return (0);
return EXIT_SUCCESS;
}
/* arch-tag: 3a89005d-df98-4c32-aa9f-33570e16a26a
(do not change this comment) */
/* test-distrib.c ends here */

View file

@ -111,7 +111,7 @@ lose (msg)
const char *msg;
{
fprintf (stderr, "%s\n", msg);
exit (1);
exit (EXIT_FAILURE);
}
void lose_syserr P_ ((const char *msg)) NO_RETURN;
@ -138,7 +138,7 @@ lose_syserr (msg)
const char *msg;
{
fprintf (stderr, "%s: %s\n", msg, strerror (errno));
exit (1);
exit (EXIT_FAILURE);
}
char *
@ -199,7 +199,7 @@ main (argc, argv)
switch (c)
{
case 'h':
usage (0);
usage (EXIT_SUCCESS);
break;
case 'd':
user_prefix = optarg;
@ -213,11 +213,11 @@ main (argc, argv)
max = MAX_SCORES;
break;
default:
usage (1);
usage (EXIT_FAILURE);
}
if (optind+3 != argc)
usage (1);
usage (EXIT_FAILURE);
running_suid = (getuid () != geteuid ());
@ -266,7 +266,7 @@ main (argc, argv)
lose_syserr ("Failed to write scores file");
}
unlock_file (scorefile, lockstate);
exit (0);
exit (EXIT_SUCCESS);
}
int
@ -531,3 +531,5 @@ unlock_file (filename, state)
/* arch-tag: 2bf5c52e-4beb-463a-954e-c58b9c64736b
(do not change this comment) */
/* update-game-score.c ends here */

View file

@ -73,7 +73,7 @@ main (argc, argv)
if ((fp = fopen(file, "r")) == NULL) {
fprintf(stderr, "yow: ");
perror(file);
exit(1);
exit(EXIT_FAILURE);
}
/* initialize random seed */
@ -82,7 +82,7 @@ main (argc, argv)
setup_yow(fp);
yow(fp);
fclose(fp);
return 0;
return EXIT_SUCCESS;
}
static long len = -1;
@ -113,7 +113,7 @@ setup_yow(fp)
if (fseek(fp, 0L, 2) == -1) {
perror("yow");
exit(1);
exit(EXIT_FAILURE);
}
len = ftell(fp) - header_len;
}
@ -132,7 +132,7 @@ yow (fp)
offset = rand() % len + header_len;
if (fseek(fp, offset, 0) == -1) {
perror("yow");
exit(1);
exit(EXIT_FAILURE);
}
/* Read until SEP, read next line, print it.
@ -180,3 +180,5 @@ yow (fp)
/* arch-tag: e40fc0df-bafb-4001-af24-5c883d1c685e
(do not change this comment) */
/* yow.c ends here */

View file

@ -1,3 +1,57 @@
2004-05-08 Andreas Schwab <schwab@suse.de>
* international/subst-ksc.el: Fix references to utf-translate-cjk
into utf-translate-cjk-mode.
* international/subst-big5.el: Likewise.
* international/subst-gb2312.el: Likewise.
* international/subst-jis.el: Likewise.
* international/utf-16.el: Likewise.
* international/utf-8.el: Likewise.
2004-05-08 John Wiegley <johnw@newartisans.com>
* iswitchb.el (iswitchb-use-virtual-buffers): Added support for
"virtual buffers" (off by default), which makes it possible to
switch to the "virtual" buffers of recently visited files. When a
buffer name search fails, and this option is on, iswitchb will
look at the list of recently visited files, and permit matching
against those names. When the user hits RET on a match, it will
revisit that file.
(iswitchb-read-buffer): Added two optional arguments, which makes
isearchb.el possible.
(iswitchb-completions, iswitchb-set-matches, iswitchb-prev-match,
iswitchb-next-match): Added support for virtual buffers.
* isearchb.el: This module extends iswitchb to provide "as you
type" buffer selection.
* textmodes/flyspell.el (flyspell-highlight-incorrect-region):
Ignore the read-only property when flyspell highlighting is on.
Not ignoring it leads to a series of confusing errors.
(flyspell-highlight-duplicate-region): Ignore read-only, as above,
but also make sure to call flyspell-incorrect-hook.
(flyspell-maybe-correct-transposition): Perform transposition test
by bit twiddling a string, rather than using a temp buffer.
(flyspell-maybe-correct-doubling): Use a string rather than a temp
buffer. This is also the original version of the code, which
could not be checked in before due to a previous lack of
assignment papers. This version has seen heavy usage on my system
for several years now.
* calendar/cal-bahai.el: New file, which adds support for the
Baha'i calendar to Emacs. This calendar is based on a solar year
of 19 months of 19 days, with 4 intercalary days. Each year
begins on March 21, with the calendar starting in 1844.
* calendar/cal-menu.el, calendar/calendar.el,
calendar/diary-lib.el, calendar/holidays.el: Added support for
using cal-bahai.el.
* eshell/em-glob.el (eshell-glob-initialize): Move initialization
of `eshell-glob-chars-regexp' into `eshell-glob-regexp', so that
function can be used outside of eshell buffers.
(eshell-glob-regexp): Initialize `eshell-glob-chars-regexp' here.
2004-05-08 Juanma Barranquero <lektu@terra.es>
* help-fns.el (help-do-arg-highlight): Temporarily set ?\- to be a

507
lisp/calendar/cal-bahai.el Normal file
View file

@ -0,0 +1,507 @@
;;; cal-bahai.el --- calendar functions for the Baha'i calendar.
;; Copyright (C) 2001 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
;; Keywords: calendar
;; Human-Keywords: Baha'i calendar, Baha'i, Bahai, calendar, diary
;; 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 2, 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; see the file COPYING. If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;;; Commentary:
;; This collection of functions implements the features of calendar.el
;; and diary.el that deal with the Baha'i calendar.
;; The Baha'i (http://www.bahai.org) calendar system is based on a
;; solar cycle of 19 months with 19 days each. The four remaining
;; "intercalary" days are called the Ayyam-i-Ha (days of Ha), and are
;; placed between the 18th and 19th months. They are meant as a time
;; of festivals preceding the 19th month, which is the month of
;; fasting. In Gregorian leap years, there are 5 of these days (Ha
;; has the numerical value of 5 in the arabic abjad, or
;; letter-to-number, reckoning).
;; Each month is named after an attribute of God, as are the 19 days
;; -- which have the same names as the months. There is also a name
;; for each year in every 19 year cycle. These cycles are called
;; Vahids. A cycle of 19 Vahids (361 years) is called a Kullu-Shay,
;; which means "all things".
;; The calendar was named the "Badi calendar" by its author, the Bab.
;; It uses a week of seven days, corresponding to the Gregorian week,
;; each of which has its own name, again patterned after the
;; attributes of God.
;; Note: The days of Ayyam-i-Ha are encoded as zero and negative
;; offsets from the first day of the final month. So, (19 -3 157) is
;; the first day of Ayyam-i-Ha, in the year 157 BE.
;;; Code:
(require 'cal-julian)
(defvar bahai-calendar-month-name-array
["Baha" "Jalal" "Jamal" "`Azamat" "Nur" "Rahmat" "Kalimat" "Kamal"
"Asma" "`Izzat" "Mashiyyat" "`Ilm" "Qudrat" "Qawl" "Masa'il"
"Sharaf" "Sultan" "Mulk" "`Ala"])
(defvar calendar-bahai-epoch (calendar-absolute-from-gregorian '(3 21 1844))
"Absolute date of start of Baha'i calendar = March 19, 622 A.D. (Julian).")
(defun bahai-calendar-leap-year-p (year)
"True if YEAR is a leap year on the Baha'i calendar."
(calendar-leap-year-p (+ year 1844)))
(defvar bahai-calendar-leap-base
(+ (/ 1844 4) (- (/ 1844 100)) (/ 1844 400)))
(defun calendar-absolute-from-bahai (date)
"Compute absolute date from Baha'i date DATE.
The absolute date is the number of days elapsed since the (imaginary)
Gregorian date Sunday, December 31, 1 BC."
(let* ((month (extract-calendar-month date))
(day (extract-calendar-day date))
(year (extract-calendar-year date))
(prior-years (+ (1- year) 1844))
(leap-days (- (+ (/ prior-years 4) ; Leap days in prior years.
(- (/ prior-years 100))
(/ prior-years 400))
bahai-calendar-leap-base)))
(+ (1- calendar-bahai-epoch) ; Days before epoch
(* 365 (1- year)) ; Days in prior years.
leap-days
(calendar-sum m 1 (< m month) 19)
(if (= month 19) 4 0)
day))) ; Days so far this month.
(defun calendar-bahai-from-absolute (date)
"Baha'i year corresponding to the absolute DATE."
(if (< date calendar-bahai-epoch)
(list 0 0 0) ;; pre-Baha'i date
(let* ((greg (calendar-gregorian-from-absolute date))
(year (+ (- (extract-calendar-year greg) 1844)
(if (or (> (extract-calendar-month greg) 3)
(and (= (extract-calendar-month greg) 3)
(>= (extract-calendar-day greg) 21)))
1 0)))
(month ;; Search forward from Baha.
(1+ (calendar-sum m 1
(> date
(calendar-absolute-from-bahai
(list m 19 year)))
1)))
(day ;; Calculate the day by subtraction.
(- date
(1- (calendar-absolute-from-bahai (list month 1 year))))))
(list month day year))))
(defun calendar-bahai-date-string (&optional date)
"String of Baha'i date of Gregorian DATE.
Defaults to today's date if DATE is not given."
(let* ((bahai-date (calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(or date (calendar-current-date)))))
(y (extract-calendar-year bahai-date))
(m (extract-calendar-month bahai-date))
(d (extract-calendar-day bahai-date)))
(let ((monthname
(if (and (= m 19)
(<= d 0))
"Ayyam-i-Ha"
(aref bahai-calendar-month-name-array (1- m))))
(day (int-to-string
(if (<= d 0)
(if (bahai-calendar-leap-year-p y)
(+ d 5)
(+ d 4))
d)))
(dayname nil)
(month (int-to-string m))
(year (int-to-string y)))
(mapconcat 'eval calendar-date-display-form ""))))
(defun calendar-print-bahai-date ()
"Show the Baha'i calendar equivalent of the selected date."
(interactive)
(message "Baha'i date: %s"
(calendar-bahai-date-string (calendar-cursor-to-date t))))
(defun calendar-goto-bahai-date (date &optional noecho)
"Move cursor to Baha'i date DATE.
Echo Baha'i date unless NOECHO is t."
(interactive (bahai-prompt-for-date))
(calendar-goto-date (calendar-gregorian-from-absolute
(calendar-absolute-from-bahai date)))
(or noecho (calendar-print-bahai-date)))
(defun bahai-prompt-for-date ()
"Ask for a Baha'i date."
(let* ((today (calendar-current-date))
(year (calendar-read
"Baha'i calendar year (not 0): "
'(lambda (x) (/= x 0))
(int-to-string
(extract-calendar-year
(calendar-bahai-from-absolute
(calendar-absolute-from-gregorian today))))))
(completion-ignore-case t)
(month (cdr (assoc
(completing-read
"Baha'i calendar month name: "
(mapcar 'list
(append bahai-calendar-month-name-array nil))
nil t)
(calendar-make-alist bahai-calendar-month-name-array
1))))
(day (calendar-read "Baha'i calendar day (1-19): "
'(lambda (x) (and (< 0 x) (<= x 19))))))
(list (list month day year))))
(defun diary-bahai-date ()
"Baha'i calendar equivalent of date diary entry."
(format "Baha'i date: %s" (calendar-bahai-date-string date)))
(defun holiday-bahai (month day string)
"Holiday on MONTH, DAY (Baha'i) called STRING.
If MONTH, DAY (Baha'i) is visible, the value returned is corresponding
Gregorian date in the form of the list (((month day year) STRING)). Returns
nil if it is not visible in the current calendar window."
(let* ((bahai-date (calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(list displayed-month 15 displayed-year))))
(m (extract-calendar-month bahai-date))
(y (extract-calendar-year bahai-date))
(date))
(if (< m 1)
nil ;; Baha'i calendar doesn't apply.
(increment-calendar-month m y (- 10 month))
(if (> m 7) ;; Baha'i date might be visible
(let ((date (calendar-gregorian-from-absolute
(calendar-absolute-from-bahai (list month day y)))))
(if (calendar-date-is-visible-p date)
(list (list date string))))))))
(defun list-bahai-diary-entries ()
"Add any Baha'i date entries from the diary file to `diary-entries-list'.
Baha'i date diary entries must be prefaced by an
`bahai-diary-entry-symbol' (normally a `B'). The same diary date
forms govern the style of the Baha'i calendar entries, except that the
Baha'i month names must be given numerically. The Baha'i months are
numbered from 1 to 19 with Baha being 1 and 19 being `Ala. If a
Baha'i date diary entry begins with a `diary-nonmarking-symbol', the
entry will appear in the diary listing, but will not be marked in the
calendar. This function is provided for use with the
`nongregorian-diary-listing-hook'."
(if (< 0 number)
(let ((buffer-read-only nil)
(diary-modified (buffer-modified-p))
(gdate original-date)
(mark (regexp-quote diary-nonmarking-symbol)))
(calendar-for-loop i from 1 to number do
(let* ((d diary-date-forms)
(bdate (calendar-bahai-from-absolute
(calendar-absolute-from-gregorian gdate)))
(month (extract-calendar-month bdate))
(day (extract-calendar-day bdate))
(year (extract-calendar-year bdate)))
(while d
(let*
((date-form (if (equal (car (car d)) 'backup)
(cdr (car d))
(car d)))
(backup (equal (car (car d)) 'backup))
(dayname
(concat
(calendar-day-name gdate) "\\|"
(substring (calendar-day-name gdate) 0 3) ".?"))
(calendar-month-name-array
bahai-calendar-month-name-array)
(monthname
(concat
"\\*\\|"
(calendar-month-name month)))
(month (concat "\\*\\|0*" (int-to-string month)))
(day (concat "\\*\\|0*" (int-to-string day)))
(year
(concat
"\\*\\|0*" (int-to-string year)
(if abbreviated-calendar-year
(concat "\\|" (int-to-string (% year 100)))
"")))
(regexp
(concat
"\\(\\`\\|\^M\\|\n\\)" mark "?"
(regexp-quote bahai-diary-entry-symbol)
"\\("
(mapconcat 'eval date-form "\\)\\(")
"\\)"))
(case-fold-search t))
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(if backup (re-search-backward "\\<" nil t))
(if (and (or (char-equal (preceding-char) ?\^M)
(char-equal (preceding-char) ?\n))
(not (looking-at " \\|\^I")))
;; Diary entry that consists only of date.
(backward-char 1)
;; Found a nonempty diary entry--make it visible and
;; add it to the list.
(let ((entry-start (point))
(date-start))
(re-search-backward "\^M\\|\n\\|\\`")
(setq date-start (point))
(re-search-forward "\^M\\|\n" nil t 2)
(while (looking-at " \\|\^I")
(re-search-forward "\^M\\|\n" nil t))
(backward-char 1)
(subst-char-in-region date-start (point) ?\^M ?\n t)
(add-to-diary-list
gdate
(buffer-substring-no-properties entry-start (point))
(buffer-substring-no-properties
(1+ date-start) (1- entry-start)))))))
(setq d (cdr d))))
(setq gdate
(calendar-gregorian-from-absolute
(1+ (calendar-absolute-from-gregorian gdate)))))
(set-buffer-modified-p diary-modified))
(goto-char (point-min))))
(defun mark-bahai-diary-entries ()
"Mark days in the calendar window that have Baha'i date diary entries.
Each entry in diary-file (or included files) visible in the calendar
window is marked. Baha'i date entries are prefaced by a
bahai-diary-entry-symbol \(normally a B`I'). The same
diary-date-forms govern the style of the Baha'i calendar entries,
except that the Baha'i month names must be spelled in full. The
Baha'i months are numbered from 1 to 12 with Baha being 1 and 12 being
`Ala. Baha'i date diary entries that begin with a
diary-nonmarking-symbol will not be marked in the calendar. This
function is provided for use as part of the
nongregorian-diary-marking-hook."
(let ((d diary-date-forms))
(while d
(let*
((date-form (if (equal (car (car d)) 'backup)
(cdr (car d))
(car d)));; ignore 'backup directive
(dayname (diary-name-pattern calendar-day-name-array))
(monthname
(concat
(diary-name-pattern bahai-calendar-month-name-array t)
"\\|\\*"))
(month "[0-9]+\\|\\*")
(day "[0-9]+\\|\\*")
(year "[0-9]+\\|\\*")
(l (length date-form))
(d-name-pos (- l (length (memq 'dayname date-form))))
(d-name-pos (if (/= l d-name-pos) (+ 2 d-name-pos)))
(m-name-pos (- l (length (memq 'monthname date-form))))
(m-name-pos (if (/= l m-name-pos) (+ 2 m-name-pos)))
(d-pos (- l (length (memq 'day date-form))))
(d-pos (if (/= l d-pos) (+ 2 d-pos)))
(m-pos (- l (length (memq 'month date-form))))
(m-pos (if (/= l m-pos) (+ 2 m-pos)))
(y-pos (- l (length (memq 'year date-form))))
(y-pos (if (/= l y-pos) (+ 2 y-pos)))
(regexp
(concat
"\\(\\`\\|\^M\\|\n\\)"
(regexp-quote bahai-diary-entry-symbol)
"\\("
(mapconcat 'eval date-form "\\)\\(")
"\\)"))
(case-fold-search t))
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(let* ((dd-name
(if d-name-pos
(buffer-substring
(match-beginning d-name-pos)
(match-end d-name-pos))))
(mm-name
(if m-name-pos
(buffer-substring
(match-beginning m-name-pos)
(match-end m-name-pos))))
(mm (string-to-int
(if m-pos
(buffer-substring
(match-beginning m-pos)
(match-end m-pos))
"")))
(dd (string-to-int
(if d-pos
(buffer-substring
(match-beginning d-pos)
(match-end d-pos))
"")))
(y-str (if y-pos
(buffer-substring
(match-beginning y-pos)
(match-end y-pos))))
(yy (if (not y-str)
0
(if (and (= (length y-str) 2)
abbreviated-calendar-year)
(let* ((current-y
(extract-calendar-year
(calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(calendar-current-date)))))
(y (+ (string-to-int y-str)
(* 100 (/ current-y 100)))))
(if (> (- y current-y) 50)
(- y 100)
(if (> (- current-y y) 50)
(+ y 100)
y)))
(string-to-int y-str)))))
(if dd-name
(mark-calendar-days-named
(cdr (assoc-ignore-case (substring dd-name 0 3)
(calendar-make-alist
calendar-day-name-array
0
'(lambda (x) (substring x 0 3))))))
(if mm-name
(if (string-equal mm-name "*")
(setq mm 0)
(setq mm
(cdr (assoc-ignore-case
mm-name
(calendar-make-alist
bahai-calendar-month-name-array))))))
(mark-bahai-calendar-date-pattern mm dd yy)))))
(setq d (cdr d)))))
(defun mark-bahai-calendar-date-pattern (month day year)
"Mark dates in calendar window that conform to Baha'i date MONTH/DAY/YEAR.
A value of 0 in any position is a wildcard."
(save-excursion
(set-buffer calendar-buffer)
(if (and (/= 0 month) (/= 0 day))
(if (/= 0 year)
;; Fully specified Baha'i date.
(let ((date (calendar-gregorian-from-absolute
(calendar-absolute-from-bahai
(list month day year)))))
(if (calendar-date-is-visible-p date)
(mark-visible-calendar-date date)))
;; Month and day in any year--this taken from the holiday stuff.
(let* ((bahai-date (calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(list displayed-month 15 displayed-year))))
(m (extract-calendar-month bahai-date))
(y (extract-calendar-year bahai-date))
(date))
(if (< m 1)
nil;; Baha'i calendar doesn't apply.
(increment-calendar-month m y (- 10 month))
(if (> m 7);; Baha'i date might be visible
(let ((date (calendar-gregorian-from-absolute
(calendar-absolute-from-bahai
(list month day y)))))
(if (calendar-date-is-visible-p date)
(mark-visible-calendar-date date)))))))
;; Not one of the simple cases--check all visible dates for match.
;; Actually, the following code takes care of ALL of the cases, but
;; it's much too slow to be used for the simple (common) cases.
(let ((m displayed-month)
(y displayed-year)
(first-date)
(last-date))
(increment-calendar-month m y -1)
(setq first-date
(calendar-absolute-from-gregorian
(list m 1 y)))
(increment-calendar-month m y 2)
(setq last-date
(calendar-absolute-from-gregorian
(list m (calendar-last-day-of-month m y) y)))
(calendar-for-loop date from first-date to last-date do
(let* ((b-date (calendar-bahai-from-absolute date))
(i-month (extract-calendar-month b-date))
(i-day (extract-calendar-day b-date))
(i-year (extract-calendar-year b-date)))
(and (or (zerop month)
(= month i-month))
(or (zerop day)
(= day i-day))
(or (zerop year)
(= year i-year))
(mark-visible-calendar-date
(calendar-gregorian-from-absolute date)))))))))
(defun insert-bahai-diary-entry (arg)
"Insert a diary entry.
For the Baha'i date corresponding to the date indicated by point.
Prefix arg will make the entry nonmarking."
(interactive "P")
(let* ((calendar-month-name-array bahai-calendar-month-name-array))
(make-diary-entry
(concat
bahai-diary-entry-symbol
(calendar-date-string
(calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(calendar-cursor-to-date t)))
nil t))
arg)))
(defun insert-monthly-bahai-diary-entry (arg)
"Insert a monthly diary entry.
For the day of the Baha'i month corresponding to the date indicated by point.
Prefix arg will make the entry nonmarking."
(interactive "P")
(let* ((calendar-date-display-form
(if european-calendar-style '(day " * ") '("* " day )))
(calendar-month-name-array bahai-calendar-month-name-array))
(make-diary-entry
(concat
bahai-diary-entry-symbol
(calendar-date-string
(calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(calendar-cursor-to-date t)))))
arg)))
(defun insert-yearly-bahai-diary-entry (arg)
"Insert an annual diary entry.
For the day of the Baha'i year corresponding to the date indicated by point.
Prefix arg will make the entry nonmarking."
(interactive "P")
(let* ((calendar-date-display-form
(if european-calendar-style
'(day " " monthname)
'(monthname " " day)))
(calendar-month-name-array bahai-calendar-month-name-array))
(make-diary-entry
(concat
bahai-diary-entry-symbol
(calendar-date-string
(calendar-bahai-from-absolute
(calendar-absolute-from-gregorian
(calendar-cursor-to-date t)))))
arg)))
(provide 'cal-bahai)
;;; arch-tag: c1cb1d67-862a-4264-a01c-41cb4df01f14
;;; cal-bahai.el ends here

View file

@ -66,6 +66,8 @@
'("Insert Hebrew" . calendar-mouse-insert-hebrew-diary-entry))
(define-key calendar-mode-map [menu-bar diary isl]
'("Insert Islamic" . calendar-mouse-insert-islamic-diary-entry))
(define-key calendar-mode-map [menu-bar diary baha]
'("Insert Baha'i" . calendar-mouse-insert-bahai-diary-entry))
(define-key calendar-mode-map [menu-bar diary cyc]
'("Insert Cyclic" . insert-cyclic-diary-entry))
(define-key calendar-mode-map [menu-bar diary blk]
@ -109,6 +111,8 @@
'("Julian Date" . calendar-goto-julian-date))
(define-key calendar-mode-map [menu-bar goto islamic]
'("Islamic Date" . calendar-goto-islamic-date))
(define-key calendar-mode-map [menu-bar goto persian]
'("Baha'i Date" . calendar-goto-bahai-date))
(define-key calendar-mode-map [menu-bar goto persian]
'("Persian Date" . calendar-goto-persian-date))
(define-key calendar-mode-map [menu-bar goto hebrew]
@ -288,6 +292,19 @@ ERROR is t, otherwise just returns nil."
'("Yearly" . insert-yearly-islamic-diary-entry))))))
(and islamic-selection (call-interactively islamic-selection))))
(defun calendar-mouse-insert-bahai-diary-entry (event)
"Pop up menu to insert an Baha'i-date diary entry."
(interactive "e")
(let ((bahai-selection
(x-popup-menu
event
(list "Baha'i insert menu"
(list (calendar-bahai-date-string (calendar-cursor-to-date))
'("One time" . insert-bahai-diary-entry)
'("Monthly" . insert-monthly-bahai-diary-entry)
'("Yearly" . insert-yearly-bahai-diary-entry))))))
(and bahai-selection (call-interactively bahai-selection))))
(defun calendar-mouse-sunrise/sunset ()
"Show sunrise/sunset times for mouse-selected date."
(interactive)
@ -496,7 +513,9 @@ The output is in landscape format, one month to a page."
(list (format "Hebrew date (before sunset): %s"
(calendar-hebrew-date-string date)))
(list (format "Persian date: %s"
(calendar-persian-date-string date))))
(calendar-persian-date-string date)))
(list (format "Baha'i date (before sunset): %s"
(calendar-bahai-date-string date))))
(let ((i (calendar-islamic-date-string date)))
(if (not (string-equal i ""))
(list (list (format "Islamic date (before sunset): %s" i)))))

View file

@ -26,26 +26,29 @@
;;; Commentary:
;; This collection of functions implements a calendar window. It generates a
;; calendar for the current month, together with the previous and coming
;; months, or for any other three-month period. The calendar can be scrolled
;; forward and backward in the window to show months in the past or future;
;; the cursor can move forward and backward by days, weeks, or months, making
;; it possible, for instance, to jump to the date a specified number of days,
;; weeks, or months from the date under the cursor. The user can display a
;; list of holidays and other notable days for the period shown; the notable
;; days can be marked on the calendar, if desired. The user can also specify
;; that dates having corresponding diary entries (in a file that the user
;; specifies) be marked; the diary entries for any date can be viewed in a
;; separate window. The diary and the notable days can be viewed
;; independently of the calendar. Dates can be translated from the (usual)
;; Gregorian calendar to the day of the year/days remaining in year, to the
;; ISO commercial calendar, to the Julian (old style) calendar, to the Hebrew
;; calendar, to the Islamic calendar, to the French Revolutionary calendar, to
;; the Mayan calendar, to the Chinese calendar, to the Coptic calendar, to the
;; Ethiopic calendar, and to the astronomical (Julian) day number. When
;; floating point is available, times of sunrise/sunset can be displayed, as
;; can the phases of the moon. Appointment notification for diary entries is
;; This collection of functions implements a calendar window. It
;; generates a calendar for the current month, together with the
;; previous and coming months, or for any other three-month period.
;; The calendar can be scrolled forward and backward in the window to
;; show months in the past or future; the cursor can move forward and
;; backward by days, weeks, or months, making it possible, for
;; instance, to jump to the date a specified number of days, weeks, or
;; months from the date under the cursor. The user can display a list
;; of holidays and other notable days for the period shown; the
;; notable days can be marked on the calendar, if desired. The user
;; can also specify that dates having corresponding diary entries (in
;; a file that the user specifies) be marked; the diary entries for
;; any date can be viewed in a separate window. The diary and the
;; notable days can be viewed independently of the calendar. Dates
;; can be translated from the (usual) Gregorian calendar to the day of
;; the year/days remaining in year, to the ISO commercial calendar, to
;; the Julian (old style) calendar, to the Hebrew calendar, to the
;; Islamic calendar, to the Baha'i calendar, to the French
;; Revolutionary calendar, to the Mayan calendar, to the Chinese
;; calendar, to the Coptic calendar, to the Ethiopic calendar, and to
;; the astronomical (Julian) day number. When floating point is
;; available, times of sunrise/sunset can be displayed, as can the
;; phases of the moon. Appointment notification for diary entries is
;; available. Calendar printing via LaTeX is available.
;; The following files are part of the calendar/diary code:
@ -56,6 +59,7 @@
;; cal-dst.el Daylight savings time rules
;; cal-hebrew.el Hebrew calendar
;; cal-islam.el Islamic calendar
;; cal-bahai.el Baha'i calendar
;; cal-iso.el ISO calendar
;; cal-julian.el Julian/astronomical calendars
;; cal-mayan.el Mayan calendars
@ -316,6 +320,16 @@ calendar."
:type 'function
:group 'diary)
;;;###autoload
(defcustom all-bahai-calendar-holidays nil
"*If nil, show only major holidays from the Baha'i calendar.
These are the days on which work and school must be suspended.
If t, show all the holidays that would appear in a complete Baha'i
calendar."
:type 'boolean
:group 'holidays)
;;;###autoload
(defcustom calendar-load-hook nil
"*List of functions to be called after the calendar is first loaded.
@ -463,21 +477,23 @@ Diary entries can be based on Lisp sexps. For example, the diary entry
%%(diary-block 11 1 1990 11 10 1990) Vacation
causes the diary entry \"Vacation\" to appear from November 1 through November
10, 1990. Other functions available are `diary-float', `diary-anniversary',
`diary-cyclic', `diary-day-of-year', `diary-iso-date', `diary-french-date',
`diary-hebrew-date', `diary-islamic-date', `diary-mayan-date',
causes the diary entry \"Vacation\" to appear from November 1 through
November 10, 1990. Other functions available are `diary-float',
`diary-anniversary', `diary-cyclic', `diary-day-of-year',
`diary-iso-date', `diary-french-date', `diary-hebrew-date',
`diary-islamic-date', `diary-bahai-date', `diary-mayan-date',
`diary-chinese-date', `diary-coptic-date', `diary-ethiopic-date',
`diary-persian-date', `diary-yahrzeit', `diary-sunrise-sunset',
`diary-phases-of-moon', `diary-parasha', `diary-omer', `diary-rosh-hodesh',
and `diary-sabbath-candles'. See the documentation for the function
`list-sexp-diary-entries' for more details.
`diary-phases-of-moon', `diary-parasha', `diary-omer',
`diary-rosh-hodesh', and `diary-sabbath-candles'. See the
documentation for the function `list-sexp-diary-entries' for more
details.
Diary entries based on the Hebrew and/or the Islamic calendar are also
possible, but because these are somewhat slow, they are ignored
unless you set the `nongregorian-diary-listing-hook' and the
`nongregorian-diary-marking-hook' appropriately. See the documentation
for these functions for details.
Diary entries based on the Hebrew, the Islamic and/or the Baha'i
calendar are also possible, but because these are somewhat slow, they
are ignored unless you set the `nongregorian-diary-listing-hook' and
the `nongregorian-diary-marking-hook' appropriately. See the
documentation for these functions for details.
Diary files can contain directives to include the contents of other files; for
details, see the documentation for the variable `list-diary-entries-hook'."
@ -502,6 +518,12 @@ details, see the documentation for the variable `list-diary-entries-hook'."
:type 'string
:group 'diary)
;;;###autoload
(defcustom bahai-diary-entry-symbol "B"
"*Symbol indicating a diary entry according to the Baha'i calendar."
:type 'string
:group 'diary)
;;;###autoload
(defcustom diary-include-string "#include"
"*The string indicating inclusion of another file of diary entries.
@ -554,8 +576,9 @@ See the documentation for the function `list-sexp-diary-entries'."
;;;###autoload
(defcustom abbreviated-calendar-year t
"*Interpret a two-digit year DD in a diary entry as either 19DD or 20DD.
For the Gregorian calendar; similarly for the Hebrew and Islamic calendars.
If this variable is nil, years must be written in full."
For the Gregorian calendar; similarly for the Hebrew, Islamic and
Baha'i calendars. If this variable is nil, years must be written in
full."
:type 'boolean
:group 'diary)
@ -796,12 +819,15 @@ diary buffer, set the variable `diary-list-include-blanks' to t."
;;;###autoload
(defcustom nongregorian-diary-listing-hook nil
"*List of functions called for listing diary file and included files.
As the files are processed for diary entries, these functions are used to cull
relevant entries. You can use either or both of `list-hebrew-diary-entries'
and `list-islamic-diary-entries'. The documentation for these functions
As the files are processed for diary entries, these functions are used
to cull relevant entries. You can use either or both of
`list-hebrew-diary-entries', `list-islamic-diary-entries' and
`list-bahai-diary-entries'. The documentation for these functions
describes the style of such diary entries."
:type 'hook
:options '(list-hebrew-diary-entries list-islamic-diary-entries)
:options '(list-hebrew-diary-entries
list-islamic-diary-entries
list-bahai-diary-entries)
:group 'diary)
;;;###autoload
@ -825,12 +851,15 @@ function `include-other-diary-files' as part of `list-diary-entries-hook'."
;;;###autoload
(defcustom nongregorian-diary-marking-hook nil
"*List of functions called for marking diary file and included files.
As the files are processed for diary entries, these functions are used to cull
relevant entries. You can use either or both of `mark-hebrew-diary-entries'
and `mark-islamic-diary-entries'. The documentation for these functions
As the files are processed for diary entries, these functions are used
to cull relevant entries. You can use either or both of
`mark-hebrew-diary-entries', `mark-islamic-diary-entries' and
`mark-bahai-diary-entries'. The documentation for these functions
describes the style of such diary entries."
:type 'hook
:options '(mark-hebrew-diary-entries mark-islamic-diary-entries)
:options '(mark-hebrew-diary-entries
mark-islamic-diary-entries
mark-bahai-diary-entries)
:group 'diary)
;;;###autoload
@ -1067,6 +1096,48 @@ See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
;;;###autoload
(put 'bahai-holidays 'risky-local-variable t)
;;;###autoload
(defcustom bahai-holidays
'((holiday-fixed
3 21
(format "Baha'i New Year (Naw-Ruz) %d" (- displayed-year (1- 1844))))
(holiday-fixed 4 21 "First Day of Ridvan")
(if all-bahai-calendar-holidays
(holiday-fixed 4 22 "Second Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 4 23 "Third Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 4 24 "Fourth Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 4 25 "Fifth Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 4 26 "Sixth Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 4 27 "Seventh Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 4 28 "Eighth Day of Ridvan"))
(holiday-fixed 4 29 "Ninth Day of Ridvan")
(if all-bahai-calendar-holidays
(holiday-fixed 4 30 "Tenth Day of Ridvan"))
(if all-bahai-calendar-holidays
(holiday-fixed 5 1 "Eleventh Day of Ridvan"))
(holiday-fixed 5 2 "Twelfth Day of Ridvan")
(holiday-fixed 5 23 "Declaration of the Bab")
(holiday-fixed 5 29 "Ascension of Baha'u'llah")
(holiday-fixed 7 9 "Martyrdom of the Bab")
(holiday-fixed 10 20 "Birth of the Bab")
(holiday-fixed 11 12 "Birth of Baha'u'llah")
(if all-bahai-calendar-holidays
(holiday-fixed 11 26 "Day of the Covenant"))
(if all-bahai-calendar-holidays
(holiday-fixed 11 28 "Ascension of `Abdu'l-Baha")))
"*Baha'i holidays.
See the documentation for `calendar-holidays' for details."
:type 'sexp
:group 'holidays)
;;;###autoload
(put 'solar-holidays 'risky-local-variable t)
;;;###autoload
@ -1104,15 +1175,16 @@ See the documentation for `calendar-holidays' for details."
(defcustom calendar-holidays
(append general-holidays local-holidays other-holidays
christian-holidays hebrew-holidays islamic-holidays
oriental-holidays solar-holidays)
bahai-holidays oriental-holidays solar-holidays)
"*List of notable days for the command \\[holidays].
Additional holidays are easy to add to the list, just put them in the list
`other-holidays' in your .emacs file. Similarly, by setting any of
`general-holidays', `local-holidays' `christian-holidays', `hebrew-holidays',
`islamic-holidays', `oriental-holidays', or `solar-holidays' to nil in your
.emacs file, you can eliminate unwanted categories of holidays. The intention
is that (in the US) `local-holidays' be set in site-init.el and
Additional holidays are easy to add to the list, just put them in the
list `other-holidays' in your .emacs file. Similarly, by setting any
of `general-holidays', `local-holidays' `christian-holidays',
`hebrew-holidays', `islamic-holidays', `bahai-holidays',
`oriental-holidays', or `solar-holidays' to nil in your .emacs file,
you can eliminate unwanted categories of holidays. The intention is
that (in the US) `local-holidays' be set in site-init.el and
`other-holidays' be set by the user.
Entries on the list are expressions that return (possibly empty) lists of
@ -1128,6 +1200,7 @@ Several basic functions are provided for this purpose:
DAYNAME after/before MONTH DAY.
(holiday-hebrew MONTH DAY STRING) a fixed date on the Hebrew calendar
(holiday-islamic MONTH DAY STRING) a fixed date on the Islamic calendar
(holiday-bahai MONTH DAY STRING) a fixed date on the Baha'i calendar
(holiday-julian MONTH DAY STRING) a fixed date on the Julian calendar
(holiday-sexp SEXP STRING) SEXP is a Gregorian-date-valued expression
in the variable `year'; if it evaluates to
@ -1155,6 +1228,11 @@ add the Islamic feast celebrating Mohammed's birthday use
(holiday-islamic 3 12 \"Mohammed's Birthday\")
since the Islamic months are numbered from 1 starting with Muharram. To
add an entry for the Baha'i festival of Ridvan, use
(holiday-bahai 2 13 \"Festival of Ridvan\")
since the Baha'i months are numbered from 1 starting with Baha. To
add Thomas Jefferson's birthday, April 2, 1743 (Julian), use
(holiday-julian 4 2 \"Jefferson's Birthday\")
@ -1680,6 +1758,14 @@ Driven by the variable `calendar-date-display-form'.")
"String of Islamic date of Gregorian date."
t)
(autoload 'calendar-print-bahai-date "cal-bahai"
"Show the Baha'i date equivalents of date."
t)
(autoload 'calendar-bahai-date-string "cal-bahai"
"String of Baha'i date of Gregorian date."
t)
(autoload 'calendar-goto-hebrew-date "cal-hebrew"
"Move cursor to Hebrew date date."
t)
@ -1803,6 +1889,21 @@ to the date indicated by point."
to the date indicated by point."
t)
(autoload 'insert-bahai-diary-entry "cal-bahai"
"Insert a diary entry for the Baha'i date corresponding to the date
indicated by point."
t)
(autoload 'insert-monthly-bahai-diary-entry "cal-bahai"
"Insert a monthly diary entry for the day of the Baha'i month corresponding
to the date indicated by point."
t)
(autoload 'insert-yearly-bahai-diary-entry "cal-bahai"
"Insert an annual diary entry for the day of the Baha'i year corresponding
to the date indicated by point."
t)
(autoload 'list-calendar-holidays "holidays"
"Create a buffer containing the holidays for the current calendar window.
The holidays are those in the list `calendar-notable-days'. Returns t if any
@ -2066,6 +2167,7 @@ the inserted text. Value is always t."
(define-key calendar-mode-map "ga" 'calendar-goto-astro-day-number)
(define-key calendar-mode-map "gh" 'calendar-goto-hebrew-date)
(define-key calendar-mode-map "gi" 'calendar-goto-islamic-date)
(define-key calendar-mode-map "gb" 'calendar-goto-bahai-date)
(define-key calendar-mode-map "gC" 'calendar-goto-chinese-date)
(define-key calendar-mode-map "gk" 'calendar-goto-coptic-date)
(define-key calendar-mode-map "ge" 'calendar-goto-ethiopic-date)
@ -2106,6 +2208,7 @@ the inserted text. Value is always t."
(define-key calendar-mode-map "pa" 'calendar-print-astro-day-number)
(define-key calendar-mode-map "ph" 'calendar-print-hebrew-date)
(define-key calendar-mode-map "pi" 'calendar-print-islamic-date)
(define-key calendar-mode-map "pb" 'calendar-print-bahai-date)
(define-key calendar-mode-map "pf" 'calendar-print-french-date)
(define-key calendar-mode-map "pm" 'calendar-print-mayan-date)
(define-key calendar-mode-map "po" 'calendar-print-other-dates)
@ -2122,6 +2225,9 @@ the inserted text. Value is always t."
(define-key calendar-mode-map "iid" 'insert-islamic-diary-entry)
(define-key calendar-mode-map "iim" 'insert-monthly-islamic-diary-entry)
(define-key calendar-mode-map "iiy" 'insert-yearly-islamic-diary-entry)
(define-key calendar-mode-map "iBd" 'insert-bahai-diary-entry)
(define-key calendar-mode-map "iBm" 'insert-monthly-bahai-diary-entry)
(define-key calendar-mode-map "iBy" 'insert-yearly-bahai-diary-entry)
(define-key calendar-mode-map "?" 'calendar-goto-info-node)
(define-key calendar-mode-map "tm" 'cal-tex-cursor-month)
(define-key calendar-mode-map "tM" 'cal-tex-cursor-month-landscape)
@ -2907,6 +3013,9 @@ Defaults to today's date if DATE is not given."
(let ((i (calendar-islamic-date-string date)))
(if (not (string-equal i ""))
(format "Islamic date (before sunset): %s" i)))
(let ((b (calendar-bahai-date-string date)))
(if (not (string-equal b ""))
(format "Baha'i date (before sunset): %s" b)))
(format "Chinese date: %s"
(calendar-chinese-date-string date))
(let ((c (calendar-coptic-date-string date)))

View file

@ -123,6 +123,22 @@ The holidays are those in the list `calendar-holidays'.")
(autoload 'mark-islamic-calendar-date-pattern "cal-islam"
"Mark dates in calendar window that conform to Islamic date MONTH/DAY/YEAR.")
(autoload 'diary-bahai-date "cal-bahai"
"Baha'i calendar equivalent of date diary entry."
t)
(autoload 'list-bahai-diary-entries "cal-bahai"
"Add any Baha'i date entries from the diary file to `diary-entries-list'."
t)
(autoload 'mark-bahai-diary-entries "cal-bahai"
"Mark days in the calendar window that have Baha'i date diary entries."
t)
(autoload 'mark-bahai-calendar-date-pattern "cal-bahai"
"Mark dates in calendar window that conform to Baha'i date MONTH/DAY/YEAR."
t)
(autoload 'diary-hebrew-date "cal-hebrew"
"Hebrew calendar equivalent of date diary entry.")
@ -1129,6 +1145,8 @@ be used instead of a colon (:) to separate the hour and minute parts."
0 1200)))
(t diary-unknown-time)))) ; Unrecognizable
;; Unrecognizable
(defun list-sexp-diary-entries (date)
"Add sexp entries for DATE from the diary file to `diary-entries-list'.
Also, Make them visible in the diary file. Returns t if any entries were

View file

@ -84,6 +84,10 @@
"Holiday on MONTH, DAY (Islamic) called STRING."
t)
(autoload 'holiday-bahai "cal-bahai"
"Holiday on MONTH, DAY (Baha'i) called STRING."
t)
(autoload 'holiday-chinese-new-year "cal-china"
"Date of Chinese New Year."
t)
@ -141,6 +145,7 @@ The optional LABEL is used to label the buffer created."
(if christian-holidays (cons "Christian" christian-holidays))
(if hebrew-holidays (cons "Hebrew" hebrew-holidays))
(if islamic-holidays (cons "Islamic" islamic-holidays))
(if bahai-holidays (cons "Baha'i" bahai-holidays))
(if oriental-holidays (cons "Oriental" oriental-holidays))
(if solar-holidays (cons "Solar" solar-holidays))
(cons "Ask" nil)))

View file

@ -122,10 +122,6 @@ This option slows down recursive glob processing by quite a bit."
:type '(repeat (cons character (choice regexp function)))
:group 'eshell-glob)
;;; Internal Variables:
(defvar eshell-glob-chars-regexp nil)
;;; Functions:
(defun eshell-glob-initialize ()
@ -134,8 +130,6 @@ This option slows down recursive glob processing by quite a bit."
(when (boundp 'eshell-special-chars-outside-quoting)
(set (make-local-variable 'eshell-special-chars-outside-quoting)
(append eshell-glob-chars-list eshell-special-chars-outside-quoting)))
(set (make-local-variable 'eshell-glob-chars-regexp)
(format "[%s]+" (apply 'string eshell-glob-chars-list)))
(add-hook 'eshell-parse-argument-hook 'eshell-parse-glob-chars t t)
(add-hook 'eshell-pre-rewrite-command-hook
'eshell-no-command-globbing nil t))
@ -184,6 +178,8 @@ interpretation."
(buffer-substring-no-properties (1- (point)) (1+ end))
(goto-char (1+ end))))))))))
(defvar eshell-glob-chars-regexp nil)
(defun eshell-glob-regexp (pattern)
"Convert glob-pattern PATTERN to a regular expression.
The basic syntax is:
@ -204,7 +200,10 @@ set to true, then these characters will match themselves in the
resulting regular expression."
(let ((matched-in-pattern 0) ; How much of PATTERN handled
regexp)
(while (string-match eshell-glob-chars-regexp
(while (string-match
(or eshell-glob-chars-regexp
(set (make-local-variable 'eshell-glob-chars-regexp)
(format "[%s]+" (apply 'string eshell-glob-chars-list))))
pattern matched-in-pattern)
(let* ((op-begin (match-beginning 0))
(op-char (aref pattern op-begin)))

View file

@ -1,6 +1,6 @@
;;; subst-big5.el --- Unicode/GB2312 translation -*-coding: big5;-*-
;; Copyright (C) 2002 Free Software Foundation, Inc.
;; Copyright (C) 2002, 2004 Free Software Foundation, Inc.
;; Author: Dave Love <fx@gnu.org>
;; Keywords: i18n
@ -23,7 +23,7 @@
;;; Commentary:
;; Provides translation tables between Unicode and chinese-big5 for
;; use by the `utf-translate-cjk' option. See subst-jis.el for the
;; use by the `utf-translate-cjk-mode' option. See subst-jis.el for the
;; method used.
;;; Code:

View file

@ -1,6 +1,6 @@
;;; subst-gb2312.el --- Unicode/GB2312 translation -*-coding: euc-china;-*-
;; Copyright (C) 2002 Free Software Foundation, Inc.
;; Copyright (C) 2002, 2004 Free Software Foundation, Inc.
;; Author: Dave Love <fx@gnu.org>
;; Keywords: i18n
@ -23,7 +23,7 @@
;;; Commentary:
;; Provides translation tables between Unicode and chinese-gb2312 for
;; use by the `utf-translate-cjk' option. See subst-jis.el for the
;; use by the `utf-translate-cjk-mode' option. See subst-jis.el for the
;; method used.
;;; Code:

View file

@ -1,5 +1,5 @@
;;; subst-jis.el --- Unicode/JISX translation -*-coding: euc-jp;-*-
;; Copyright (C) 2002 Free Software Foundation, Inc.
;; Copyright (C) 2002, 2004 Free Software Foundation, Inc.
;; Author: Dave Love <fx@gnu.org>
;; Keywords: i18n
@ -23,7 +23,7 @@
;; Provides translation tables between Unicode and
;; japanese-jisx0208/japanese-jisx0212 charsets for use by the
;; `utf-translate-cjk' option.
;; `utf-translate-cjk-mode' option.
;;; Code:

View file

@ -1,5 +1,5 @@
;;; subst-ksc.el --- Unicode/KSC-5601 translation -*-coding: euc-kr;-*-
;; Copyright (C) 2002 Free Software Foundation, Inc.
;; Copyright (C) 2002, 2004 Free Software Foundation, Inc.
;; Author: Dave Love <fx@gnu.org>
;; Keywords: i18n
@ -22,7 +22,7 @@
;;; Commentary:
;; Provides translation tables between Unicode and korean-ksc5601 for
;; use by the `utf-translate-cjk' option. See subst-jis.el for the
;; use by the `utf-translate-cjk-mode' option. See subst-jis.el for the
;; method used.
;;; Code:

View file

@ -1,6 +1,6 @@
;;; utf-16.el --- UTF-16 encoding/decoding
;; Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
;; Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
;; Author: Dave Love <fx@gnu.org>
;; Keywords: Unicode, UTF-16, i18n
@ -351,7 +351,7 @@ sequence representing U+FFFD (REPLACEMENT CHARACTER)."))
(dependency unify-8859-on-encoding-mode
unify-8859-on-decoding-mode
utf-fragment-on-decoding
utf-translate-cjk)))
utf-translate-cjk-mode)))
(make-coding-system
'mule-utf-16be 4 ?u
@ -372,7 +372,7 @@ sequence representing U+FFFD (REPLACEMENT CHARACTER)."))
(dependency unify-8859-on-encoding-mode
unify-8859-on-decoding-mode
utf-fragment-on-decoding
utf-translate-cjk)))
utf-translate-cjk-mode)))
(make-coding-system
'mule-utf-16le-with-signature 4 ?u
@ -396,7 +396,7 @@ sequence representing U+FFFD (REPLACEMENT CHARACTER)."))
(dependency unify-8859-on-encoding-mode
unify-8859-on-decoding-mode
utf-fragment-on-decoding
utf-translate-cjk)))
utf-translate-cjk-mode)))
(make-coding-system
'mule-utf-16be-with-signature 4 ?u
@ -419,7 +419,7 @@ sequence representing U+FFFD (REPLACEMENT CHARACTER)."))
(dependency unify-8859-on-encoding-mode
unify-8859-on-decoding-mode
utf-fragment-on-decoding
utf-translate-cjk)))
utf-translate-cjk-mode)))
(make-coding-system
'mule-utf-16 4 ?u
@ -442,7 +442,7 @@ sequence representing U+FFFD (REPLACEMENT CHARACTER)."))
(dependency unify-8859-on-encoding-mode
unify-8859-on-decoding-mode
utf-fragment-on-decoding
utf-translate-cjk)
utf-translate-cjk-mode)
(post-read-conversion . mule-utf-16-post-read-conversion)))
)

View file

@ -1,6 +1,6 @@
;;; utf-8.el --- UTF-8 decoding/encoding support -*- coding: iso-2022-7bit -*-
;; Copyright (C) 2001 Electrotechnical Laboratory, JAPAN.
;; Copyright (C) 2001, 2004 Electrotechnical Laboratory, JAPAN.
;; Licensed to the Free Software Foundation.
;; Copyright (C) 2001, 2002 Free Software Foundation, Inc.
@ -97,7 +97,7 @@ translation-table named `utf-translation-table-for-encode'")
(defvar ucs-mule-cjk-to-unicode (make-hash-table :test 'eq)
"Hash table mapping Emacs CJK character sets to Unicode code points.
If `utf-translate-cjk' is non-nil, this table populates the
If `utf-translate-cjk-mode' is non-nil, this table populates the
translation-hash-table named `utf-subst-table-for-encode'.")
(define-translation-hash-table 'utf-subst-table-for-encode
@ -106,7 +106,7 @@ translation-hash-table named `utf-subst-table-for-encode'.")
(defvar ucs-unicode-to-mule-cjk (make-hash-table :test 'eq)
"Hash table mapping Unicode code points to Emacs CJK character sets.
If `utf-translate-cjk' is non-nil, this table populates the
If `utf-translate-cjk-mode' is non-nil, this table populates the
translation-hash-table named `utf-subst-table-for-decode'.")
(define-translation-hash-table 'utf-subst-table-for-decode
@ -814,7 +814,7 @@ sequence representing U+FFFD (REPLACEMENT CHARACTER)."
(dependency unify-8859-on-encoding-mode
unify-8859-on-decoding-mode
utf-fragment-on-decoding
utf-translate-cjk)))
utf-translate-cjk-mode)))
(define-coding-system-alias 'utf-8 'mule-utf-8)

227
lisp/isearchb.el Normal file
View file

@ -0,0 +1,227 @@
;;; isearchb --- a marriage between iswitchb and isearch
;; Copyright (C) 2004 John Wiegley
;; Author: John Wiegley <johnw@gnu.org>
;; Created: 16 Apr 2004
;; Version: 1.5
;; Keywords: lisp
;; X-URL: http://www.newartisans.com/johnw/emacs.html
;; 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 2, 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; see the file COPYING. If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;;; Commentary:
;; This module allows you to switch to buffers even faster than with
;; iswitchb! It is not intended to replace it, however, as it works
;; well only with buffers whose names don't typically overlap. You'll
;; have to try it first, and see how your mileage varies.
;;
;; The first way to use isearchb is by holding down a modifier key, in
;; which case every letter you type while holding it searches for any
;; buffer matching what you're typing (using the same ordering scheme
;; employed by iswitchb). To use it this way, add to your .emacs:
;;
;; (isearchb-set-keybindings 'super) ; s-x s-y s-z now finds "xyz"
;;
;; The other way is by using a command that puts you into "search"
;; mode, just like with isearch. I use C-z for this. The binding in
;; my .emacs looks like:
;;
;; (define-key global-map [(control ?z)] 'isearchb-activate)
;;
;; Now, after pressing C-z (for example), each self-inserting
;; character thereafter will search for a buffer containing those
;; characters. For instance, typing "C-z xyz" will switch to the
;; first buffer containing "xyz". Once you press a non-self-inserting
;; character (such as any control key sequence), the search will end.
;;
;; C-z after C-z toggles between the previously selected buffer and
;; the current one.
;;
;; C-g aborts the search and returns you to your original buffer.
;;
;; TAB, after typing in a few characters (after C-z), will jump into
;; iswitchb, using the prefix you've typed so far. This is handy when
;; you realize that isearchb is not powerful enough to find the buffer
;; you're looking for.
;;
;; C-s and C-r move forward and backward in the buffer list. If
;; `isearchb-show-completions' is non-nil (the default), the list of
;; possible completions is shown in the minibuffer.
;;
;; If `isearchb-idle-timeout' is set to a number, isearchb will quit
;; after that many seconds of idle time. I recommend trying it set to
;; one or two seconds. Then, if you switch to a buffer and wait for
;; that amount of time, you can start typing without manually exiting
;; isearchb.
;; TODO:
;; C-z C-z is broken
;; killing iswitchb.el and then trying to switch back is broken
;; make sure TAB isn't broken
(require 'iswitchb)
(defgroup isearchb nil
"Switch between buffers using a mechanism like isearch."
:group 'iswitchb)
(defcustom isearchb-idle-timeout nil
"*Number of idle seconds before isearchb turns itself off.
If nil, don't use a timeout."
:type '(choice (integer :tag "Seconds")
(const :tag "Disable" nil))
:group 'isearchb)
(defcustom isearchb-show-completions t
"*If non-nil, show possible completions in the minibuffer."
:type 'boolean
:group 'isearchb)
(defvar isearchb-start-buffer nil)
(defvar isearchb-last-buffer nil)
(defvar isearchb-idle-timer nil)
(defun isearchb-stop (&optional return-to-buffer ignore-command)
"Called by isearchb to terminate a search in progress."
(remove-hook 'pre-command-hook 'isearchb-follow-char)
(if return-to-buffer
(switch-to-buffer isearchb-start-buffer)
(setq isearchb-last-buffer isearchb-start-buffer))
(when isearchb-idle-timer
(cancel-timer isearchb-idle-timer)
(setq isearchb-idle-timer nil))
(if ignore-command
(setq this-command 'ignore
last-command 'ignore))
(message nil))
(defun isearchb-iswitchb ()
"isearchb's custom version of the `iswitchb' command.
It's purpose is to pass different call arguments to
`iswitchb-read-buffer'."
(interactive)
(let* ((prompt "iswitch ")
(iswitchb-method 'samewindow)
(buf (iswitchb-read-buffer prompt nil nil iswitchb-text t)))
(if (eq iswitchb-exit 'findfile)
(call-interactively 'find-file)
(when buf
(if (get-buffer buf)
;; buffer exists, so view it and then exit
(iswitchb-visit-buffer buf)
;; else buffer doesn't exist
(iswitchb-possible-new-buffer buf))))))
(defun isearchb ()
"Switch to buffer matching a substring, based on chars typed."
(interactive)
(unless (eq last-command 'isearchb)
(setq iswitchb-text nil))
(unless iswitchb-text
(setq iswitchb-text "")
(iswitchb-make-buflist nil))
(if last-command-char
(setq iswitchb-rescan t
iswitchb-text (concat iswitchb-text
(char-to-string last-command-char))))
(iswitchb-set-matches)
(let* ((match (car iswitchb-matches))
(buf (and match (get-buffer match))))
(if (null buf)
(progn
(isearchb-stop t)
(isearchb-iswitchb))
(switch-to-buffer buf)
(if isearchb-show-completions
(message "isearchb: %s%s" iswitchb-text
(iswitchb-completions iswitchb-text nil))
(if (= 1 (length iswitchb-matches))
(message "isearchb: %s (only match)" iswitchb-text)
(message "isearchb: %s" iswitchb-text))))))
(defun isearchb-set-keybindings (modifier)
"Setup isearchb on the given MODIFIER."
(dotimes (i 128)
(if (eq 'self-insert-command
(lookup-key global-map (vector i)))
(define-key global-map (vector (list modifier i)) 'isearchb))))
(defun isearchb-follow-char ()
"Function added to post-command-hook to handle the isearchb \"mode\"."
(let (keys)
(if (not (and (memq last-command '(isearchb isearchb-activate))
(setq keys (this-command-keys))
(= 1 (length keys))))
(isearchb-stop)
(cond
((or (equal keys "\C-h") (equal keys "\C-?")
(equal keys [backspace]) (equal keys [delete]))
(setq iswitchb-text
(substring iswitchb-text 0 (1- (length iswitchb-text))))
(if (= 0 (length iswitchb-text))
(isearchb-stop t t)
(setq last-command-char nil)
(setq this-command 'isearchb)))
((or (equal keys "\C-i") (equal keys [tab]))
(setq this-command 'isearchb-iswitchb))
((equal keys "\C-s")
(iswitchb-next-match)
(setq last-command-char nil)
(setq this-command 'isearchb))
((equal keys "\C-r")
(iswitchb-prev-match)
(setq last-command-char nil)
(setq this-command 'isearchb))
((equal keys "\C-g")
(ding)
(isearchb-stop t t))
((eq (lookup-key global-map keys) 'self-insert-command)
(setq this-command 'isearchb)))
(if (and isearchb-idle-timeout
(null isearchb-idle-timer))
(setq isearchb-idle-timer
(run-with-idle-timer isearchb-idle-timeout nil
'isearchb-stop))))))
;;;###autoload
(defun isearchb-activate ()
"Active isearchb mode for subsequent alphanumeric keystrokes.
Executing this command again will terminate the search; or, if
the search has not yet begun, will toggle to the last buffer
accessed via isearchb."
(interactive)
(cond
((eq last-command 'isearchb)
(isearchb-stop nil t))
((eq last-command 'isearchb-activate)
(if isearchb-last-buffer
(switch-to-buffer isearchb-last-buffer)
(error "isearchb: There is no previous buffer to toggle to."))
(isearchb-stop nil t))
(t
(message "isearchb: ")
(setq iswitchb-text nil
isearchb-start-buffer (current-buffer))
(add-hook 'pre-command-hook 'isearchb-follow-char))))
(provide 'isearchb)
;;; arch-tag: 9277523f-a624-4aa0-ba10-b89eeb7b6e99
;;; isearchb.el ends here

View file

@ -307,6 +307,20 @@ multitude of buffers open."
:type '(choice (const :tag "Show all" nil) integer)
:group 'iswitchb)
(defcustom iswitchb-use-virtual-buffers nil
"*If non-nil, refer to past buffers when none match.
This feature relies upon the `recentf' package, which will be
enabled if this variable is configured to a non-nil value."
:type 'boolean
:require 'recentf
:set (function
(lambda (sym value)
(recentf-mode value)
(set sym value)))
:group 'iswitchb)
(defvar iswitchb-virtual-buffers nil)
(defcustom iswitchb-cannot-complete-hook 'iswitchb-completion-help
"*Hook run when `iswitchb-complete' can't complete any more.
The most useful values are `iswitchb-completion-help', which pops up a
@ -571,12 +585,18 @@ in a separate window.
(iswitchb-possible-new-buffer buf)))
))))
(defun iswitchb-read-buffer (prompt &optional default require-match)
(defun iswitchb-read-buffer (prompt &optional default require-match
start matches-set)
"Replacement for the built-in `read-buffer'.
Return the name of a buffer selected.
PROMPT is the prompt to give to the user. DEFAULT if given is the default
buffer to be selected, which will go to the front of the list.
If REQUIRE-MATCH is non-nil, an existing-buffer must be selected."
PROMPT is the prompt to give to the user.
DEFAULT if given is the default buffer to be selected, which will
go to the front of the list.
If REQUIRE-MATCH is non-nil, an existing-buffer must be selected.
If START is a string, the selection process is started with that
string.
If MATCHES-SET is non-nil, the buflist is not updated before
the selection process begins. Used by isearchb.el."
(let
(
buf-sel
@ -589,14 +609,15 @@ If REQUIRE-MATCH is non-nil, an existing-buffer must be selected."
(iswitchb-define-mode-map)
(setq iswitchb-exit nil)
(setq iswitchb-rescan t)
(setq iswitchb-text "")
(setq iswitchb-default
(if (bufferp default)
(buffer-name default)
default))
(setq iswitchb-text (or start ""))
(unless matches-set
(setq iswitchb-rescan t)
(iswitchb-make-buflist iswitchb-default)
(iswitchb-set-matches)
(iswitchb-set-matches))
(let
((minibuffer-local-completion-map iswitchb-mode-map)
;; Record the minibuffer depth that we expect to find once
@ -609,19 +630,29 @@ If REQUIRE-MATCH is non-nil, an existing-buffer must be selected."
'(("dummy" . 1)) ;table
nil ;predicate
nil ;require-match [handled elsewhere]
nil ;initial-contents
start ;initial-contents
'iswitchb-history)))
(if (and (not (eq iswitchb-exit 'usefirst))
(get-buffer iswitchb-final-text))
;; This happens for example if the buffer was chosen with the mouse.
(setq iswitchb-matches (list iswitchb-final-text)))
(setq iswitchb-matches (list iswitchb-final-text)
iswitchb-virtual-buffers nil))
;; If no buffer matched, but a virtual buffer was selected, visit
;; that file now and act as though that buffer had been selected.
(if (and iswitchb-virtual-buffers
(not (iswitchb-existing-buffer-p)))
(let ((virt (car iswitchb-virtual-buffers)))
(find-file-noselect (cdr virt))
(setq iswitchb-matches (list (car virt))
iswitchb-virtual-buffers nil)))
;; Handling the require-match must be done in a better way.
(if (and require-match (not (iswitchb-existing-buffer-p)))
(if (and require-match
(not (iswitchb-existing-buffer-p)))
(error "Must specify valid buffer"))
(if (or
(eq iswitchb-exit 'takeprompt)
(if (or (eq iswitchb-exit 'takeprompt)
(null iswitchb-matches))
(setq buf-sel iswitchb-final-text)
;; else take head of list
@ -629,8 +660,7 @@ If REQUIRE-MATCH is non-nil, an existing-buffer must be selected."
;; Or possibly choose the default buffer
(if (equal iswitchb-final-text "")
(setq buf-sel
(car iswitchb-matches)))
(setq buf-sel (car iswitchb-matches)))
buf-sel))
@ -731,18 +761,29 @@ If no buffer exactly matching the prompt exists, maybe create a new one."
(setq iswitchb-exit 'findfile)
(exit-minibuffer))
(eval-when-compile
(defvar recentf-list))
(defun iswitchb-next-match ()
"Put first element of `iswitchb-matches' at the end of the list."
(interactive)
(let ((next (cadr iswitchb-matches)))
(setq iswitchb-buflist (iswitchb-chop iswitchb-buflist next))
(if (and (null next) iswitchb-virtual-buffers)
(setq recentf-list
(iswitchb-chop recentf-list
(cdr (cadr iswitchb-virtual-buffers))))
(setq iswitchb-buflist (iswitchb-chop iswitchb-buflist next)))
(setq iswitchb-rescan t)))
(defun iswitchb-prev-match ()
"Put last element of `iswitchb-matches' at the front of the list."
(interactive)
(let ((prev (car (last iswitchb-matches))))
(setq iswitchb-buflist (iswitchb-chop iswitchb-buflist prev))
(if (and (null prev) iswitchb-virtual-buffers)
(setq recentf-list
(iswitchb-chop recentf-list
(cdr (car (last iswitchb-virtual-buffers)))))
(setq iswitchb-buflist (iswitchb-chop iswitchb-buflist prev)))
(setq iswitchb-rescan t)))
(defun iswitchb-chop (list elem)
@ -834,7 +875,8 @@ current frame, rather than all frames, regardless of value of
(setq iswitchb-matches
(let* ((buflist iswitchb-buflist))
(iswitchb-get-matched-buffers iswitchb-text iswitchb-regexp
buflist)))))
buflist))
iswitchb-virtual-buffers nil)))
(defun iswitchb-get-matched-buffers (regexp
&optional string-format buffer-list)
@ -1188,6 +1230,10 @@ Copied from `icomplete-exhibit' with two changes:
contents
(not minibuffer-completion-confirm)))))))
(eval-when-compile
(defvar most-len)
(defvar most-is-exact))
(defun iswitchb-output-completion (com)
(if (= (length com) most-len)
;; Most is one exact match,
@ -1221,6 +1267,35 @@ Modified from `icomplete-completions'."
first)
(setq comps (cons first (cdr comps)))))
;; If no buffers matched, and virtual buffers are being used, then
;; consult the list of past visited files, to see if we can find
;; the file which the user might thought was still open.
(when (and iswitchb-use-virtual-buffers (null comps)
recentf-list)
(setq iswitchb-virtual-buffers nil)
(let ((head recentf-list) name)
(while head
(if (and (setq name (file-name-nondirectory (car head)))
(string-match (if iswitchb-regexp
iswitchb-text
(regexp-quote iswitchb-text)) name)
(null (get-file-buffer (car head)))
(not (assoc name iswitchb-virtual-buffers))
(not (iswitchb-ignore-buffername-p name))
(file-exists-p (car head)))
(setq iswitchb-virtual-buffers
(cons (cons name (car head))
iswitchb-virtual-buffers)))
(setq head (cdr head)))
(setq iswitchb-virtual-buffers (nreverse iswitchb-virtual-buffers)
comps (mapcar 'car iswitchb-virtual-buffers))
(let ((comp comps))
(while comp
(put-text-property 0 (length (car comp))
'face 'font-lock-builtin-face
(car comp))
(setq comp (cdr comp))))))
(cond ((null comps) (format " %sNo match%s"
open-bracket-determined
close-bracket-determined))
@ -1255,10 +1330,9 @@ Modified from `icomplete-completions'."
(most nil)
(most-len (length most))
most-is-exact
(alternatives (if most
(mapconcat 'iswitchb-output-completion
comps ",")
(mapconcat 'identity comps ","))))
(alternatives
(mapconcat (if most 'iswitchb-output-completion
'identity) comps ",")))
(concat

View file

@ -1516,9 +1516,11 @@ for the overlay."
;*---------------------------------------------------------------------*/
(defun flyspell-highlight-incorrect-region (beg end poss)
"Set up an overlay on a misspelled word, in the buffer from BEG to END."
(let ((inhibit-read-only t))
(unless (run-hook-with-args-until-success
'flyspell-incorrect-hook beg end poss)
(if (or flyspell-highlight-properties (not (flyspell-properties-at-p beg)))
(if (or flyspell-highlight-properties
(not (flyspell-properties-at-p beg)))
(progn
;; we cleanup current overlay at the same position
(if (and (not flyspell-persistent-highlight)
@ -1531,16 +1533,19 @@ for the overlay."
(setq overlays (cdr overlays)))))
;; now we can use a new overlay
(setq flyspell-overlay
(make-flyspell-overlay beg end
'flyspell-incorrect-face
'highlight))))))
(make-flyspell-overlay
beg end 'flyspell-incorrect-face 'highlight)))))))
;*---------------------------------------------------------------------*/
;* flyspell-highlight-duplicate-region ... */
;*---------------------------------------------------------------------*/
(defun flyspell-highlight-duplicate-region (beg end)
"Set up an overlay on a duplicated word, in the buffer from BEG to END."
(if (or flyspell-highlight-properties (not (flyspell-properties-at-p beg)))
(let ((inhibit-read-only t))
(unless (run-hook-with-args-until-success
'flyspell-incorrect-hook beg end poss)
(if (or flyspell-highlight-properties
(not (flyspell-properties-at-p beg)))
(progn
;; we cleanup current overlay at the same position
(if (and (not flyspell-persistent-highlight)
@ -1555,7 +1560,7 @@ for the overlay."
(setq flyspell-overlay
(make-flyspell-overlay beg end
'flyspell-duplicate-face
'highlight)))))
'highlight)))))))
;*---------------------------------------------------------------------*/
;* flyspell-auto-correct-cache ... */
@ -2061,23 +2066,23 @@ possible corrections as returned by 'ispell-parse-output'.
This function is meant to be added to 'flyspell-incorrect-hook'."
(when (consp poss)
(let ((temp-buffer (get-buffer-create " *flyspell-temp*"))
found)
(catch 'done
(let ((str (buffer-substring beg end))
(i 0) (len (- end beg)) tmp)
(while (< (1+ i) len)
(setq tmp (aref str i))
(aset str i (aref str (1+ i)))
(aset str (1+ i) tmp)
(when (member str (nth 2 poss))
(save-excursion
(copy-to-buffer temp-buffer beg end)
(set-buffer temp-buffer)
(goto-char (1+ (point-min)))
(while (and (not (eobp)) (not found))
(transpose-chars 1)
(if (member (buffer-string) (nth 2 poss))
(setq found (point))
(transpose-chars -1)
(forward-char))))
(when found
(save-excursion
(goto-char (+ beg found -1))
(transpose-chars -1)
t)))))
(goto-char (+ beg i 1))
(transpose-chars 1))
(throw 'done t))
(setq tmp (aref str i))
(aset str i (aref str (1+ i)))
(aset str (1+ i) tmp)
(setq i (1+ i))))
nil)))
(defun flyspell-maybe-correct-doubling (beg end poss)
"Check replacements for doubled characters.
@ -2091,24 +2096,19 @@ possible corrections as returned by 'ispell-parse-output'.
This function is meant to be added to 'flyspell-incorrect-hook'."
(when (consp poss)
(let ((temp-buffer (get-buffer-create " *flyspell-temp*"))
found)
(save-excursion
(copy-to-buffer temp-buffer beg end)
(set-buffer temp-buffer)
(goto-char (1+ (point-min)))
(while (and (not (eobp)) (not found))
(when (char-equal (char-after) (char-before))
(catch 'done
(let ((str (buffer-substring beg end))
(i 0) (len (- end beg)))
(while (< (1+ i) len)
(when (and (= (aref str i) (aref str (1+ i)))
(member (concat (substring str 0 (1+ i))
(substring str (+ i 2)))
(nth 2 poss)))
(goto-char (+ beg i))
(delete-char 1)
(if (member (buffer-string) (nth 2 poss))
(setq found (point))
(insert-char (char-before) 1)))
(forward-char)))
(when found
(save-excursion
(goto-char (+ beg found -1))
(delete-char 1)
t)))))
(throw 'done t))
(setq i (1+ i))))
nil)))
;*---------------------------------------------------------------------*/
;* flyspell-already-abbrevp ... */

View file

@ -1,5 +1,19 @@
2004-05-08 Peter Whaite <emacs@whaite.ca> (tiny change)
* data.c (Fquo): If any argument is float, do the computation in
floating point.
2004-05-08 Juanma Barranquero <lektu@terra.es>
* process.c (Fwaiting_for_user_input_p, Fmake_network_process)
(Fset_process_query_on_exit_flag, Vprocess_adaptive_read_buffering):
Fix spelling of Emacs on docstring.
(Fset_process_coding_system, Fprocess_coding_system)
(Fset_process_filter_multibyte, Fprocess_filter_multibyte_p):
Make argument names match their use in docstring.
(Fprocess_id, Fprocess_query_on_exit_flag, Finterrupt_process):
Fix docstring.
* editfns.c (Finsert_buffer_substring): Make argument names match their
use in docstring.

View file

@ -2698,6 +2698,12 @@ usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
int nargs;
Lisp_Object *args;
{
int argnum;
if (nargs == 2)
return arith_driver (Adiv, nargs, args);
for (argnum = 0; argnum < nargs; argnum++)
if (FLOATP (args[argnum]))
return float_arith_driver (0, 0, Adiv, nargs, args);
return arith_driver (Adiv, nargs, args);
}

View file

@ -842,7 +842,7 @@ If PROCESS has not yet exited or died, return 0. */)
DEFUN ("process-id", Fprocess_id, Sprocess_id, 1, 1, 0,
doc: /* Return the process id of PROCESS.
This is the pid of the Unix process which PROCESS uses or talks to.
This is the pid of the external process which PROCESS uses or talks to.
For a network connection, this value is nil. */)
(process)
register Lisp_Object process;
@ -1081,7 +1081,7 @@ DEFUN ("set-process-query-on-exit-flag",
Fset_process_query_on_exit_flag, Sset_process_query_on_exit_flag,
2, 2, 0,
doc: /* Specify if query is needed for PROCESS when Emacs is exited.
If the second argument FLAG is non-nil, emacs will query the user before
If the second argument FLAG is non-nil, Emacs will query the user before
exiting if PROCESS is running. */)
(process, flag)
register Lisp_Object process, flag;
@ -1094,7 +1094,7 @@ exiting if PROCESS is running. */)
DEFUN ("process-query-on-exit-flag",
Fprocess_query_on_exit_flag, Sprocess_query_on_exit_flag,
1, 1, 0,
doc: /* Return the current value of query on exit flag for PROCESS. */)
doc: /* Return the current value of query-on-exit flag for PROCESS. */)
(process)
register Lisp_Object process;
{
@ -2608,7 +2608,7 @@ successful) or "failed" when the connect completes. Default is to use
a blocking connect (i.e. wait) for stream type connections.
:noquery BOOL -- Query the user unless BOOL is non-nil, and process is
running when emacs is exited.
running when Emacs is exited.
:stop BOOL -- Start process in the `stopped' state if BOOL non-nil.
In the stopped state, a server process does not accept new
@ -2954,7 +2954,7 @@ usage: (make-network-process &rest ARGS) */)
struct hostent *host_info_ptr;
/* gethostbyname may fail with TRY_AGAIN, but we don't honour that,
as it may `hang' emacs for a very long time. */
as it may `hang' Emacs for a very long time. */
immediate_quit = 1;
QUIT;
host_info_ptr = gethostbyname (SDATA (host));
@ -3964,7 +3964,7 @@ server_accept_connection (server, channel)
/* This variable is different from waiting_for_input in keyboard.c.
It is used to communicate to a lisp process-filter/sentinel (via the
function Fwaiting_for_user_input_p below) whether emacs was waiting
function Fwaiting_for_user_input_p below) whether Emacs was waiting
for user-input when that process-filter was called.
waiting_for_input cannot be used as that is by definition 0 when
lisp code is being evalled.
@ -5060,7 +5060,7 @@ read_process_output (proc, channel)
DEFUN ("waiting-for-user-input-p", Fwaiting_for_user_input_p, Swaiting_for_user_input_p,
0, 0, 0,
doc: /* Returns non-nil if emacs is waiting for input from the user.
doc: /* Returns non-nil if Emacs is waiting for input from the user.
This is intended for use by asynchronous process output filters and sentinels. */)
()
{
@ -5723,7 +5723,7 @@ process_send_signal (process, signo, current_group, nomsg)
DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0,
doc: /* Interrupt process PROCESS.
PROCESS may be a process, a buffer, or the name of a process or buffer.
nil or no arg means current buffer's process.
No arg or nil means current buffer's process.
Second arg CURRENT-GROUP non-nil means send signal to
the current process-group of the process's controlling terminal
rather than to the process's own process group.
@ -6468,13 +6468,13 @@ DEFUN ("set-process-coding-system", Fset_process_coding_system,
doc: /* Set coding systems of PROCESS to DECODING and ENCODING.
DECODING will be used to decode subprocess output and ENCODING to
encode subprocess input. */)
(proc, decoding, encoding)
register Lisp_Object proc, decoding, encoding;
(process, decoding, encoding)
register Lisp_Object process, decoding, encoding;
{
register struct Lisp_Process *p;
CHECK_PROCESS (proc);
p = XPROCESS (proc);
CHECK_PROCESS (process);
p = XPROCESS (process);
if (XINT (p->infd) < 0)
error ("Input file descriptor of %s closed", SDATA (p->name));
if (XINT (p->outfd) < 0)
@ -6484,7 +6484,7 @@ encode subprocess input. */)
p->decode_coding_system = decoding;
p->encode_coding_system = encoding;
setup_process_coding_systems (proc);
setup_process_coding_systems (process);
return Qnil;
}
@ -6492,12 +6492,12 @@ encode subprocess input. */)
DEFUN ("process-coding-system",
Fprocess_coding_system, Sprocess_coding_system, 1, 1, 0,
doc: /* Return a cons of coding systems for decoding and encoding of PROCESS. */)
(proc)
register Lisp_Object proc;
(process)
register Lisp_Object process;
{
CHECK_PROCESS (proc);
return Fcons (XPROCESS (proc)->decode_coding_system,
XPROCESS (proc)->encode_coding_system);
CHECK_PROCESS (process);
return Fcons (XPROCESS (process)->decode_coding_system,
XPROCESS (process)->encode_coding_system);
}
DEFUN ("set-process-filter-multibyte", Fset_process_filter_multibyte,
@ -6507,15 +6507,15 @@ If FLAG is non-nil, the filter is given multibyte strings.
If FLAG is nil, the filter is given unibyte strings. In this case,
all character code conversion except for end-of-line conversion is
suppressed. */)
(proc, flag)
Lisp_Object proc, flag;
(process, flag)
Lisp_Object process, flag;
{
register struct Lisp_Process *p;
CHECK_PROCESS (proc);
p = XPROCESS (proc);
CHECK_PROCESS (process);
p = XPROCESS (process);
p->filter_multibyte = flag;
setup_process_coding_systems (proc);
setup_process_coding_systems (process);
return Qnil;
}
@ -6523,13 +6523,13 @@ suppressed. */)
DEFUN ("process-filter-multibyte-p", Fprocess_filter_multibyte_p,
Sprocess_filter_multibyte_p, 1, 1, 0,
doc: /* Return t if a multibyte string is given to PROCESS's filter.*/)
(proc)
Lisp_Object proc;
(process)
Lisp_Object process;
{
register struct Lisp_Process *p;
CHECK_PROCESS (proc);
p = XPROCESS (proc);
CHECK_PROCESS (process);
p = XPROCESS (process);
return (NILP (p->filter_multibyte) ? Qnil : Qt);
}
@ -6747,11 +6747,11 @@ The value takes effect when `start-process' is called. */);
#ifdef ADAPTIVE_READ_BUFFERING
DEFVAR_LISP ("process-adaptive-read-buffering", &Vprocess_adaptive_read_buffering,
doc: /* If non-nil, improve receive buffering by delaying after short reads.
On some systems, when emacs reads the output from a subprocess, the output data
On some systems, when Emacs reads the output from a subprocess, the output data
is read in very small blocks, potentially resulting in very poor performance.
This behaviour can be remedied to some extent by setting this variable to a
non-nil value, as it will automatically delay reading from such processes, to
allowing them to produce more output before emacs tries to read it.
allowing them to produce more output before Emacs tries to read it.
If the value is t, the delay is reset after each write to the process; any other
non-nil value means that the delay is not reset on write.
The variable takes effect when `start-process' is called. */);