This avoids `calendar-dlet' and unprefixed dynamic variable bindings
when calling user format functions, as discussed in Bug#74994.
* lisp/calendar/diary-icalendar.el (diary-icalendar-time-format): Fix
whitespace.
(diary-icalendar-format-attendee)
(diary-icalendar-format-entry): Use fewer dynamic variables, prefix
them, replace `calendar-dlet' with `dlet', and call user format
functions with the node to be formatted.
(diary-icalendar-attendee-format-function)
(diary-icalendar-vevent-format-function)
(diary-icalendar-vjournal-format-function)
(diary-icalendar-vtodo-format-function): Document these changes.
(diary-icalendar-attendee-skeleton)
(diary-icalendar-vevent-skeleton)
(diary-icalendar-vjournal-skeleton)
(diary-icalendar-vtodo-skeleton): Use `defun' with `skeleton-insert'
instead of `define-skeleton'. Update variable references.
(diary-icalendar-import-buffer-to-buffer)
(diary-icalendar-add-valarms): Replace `calendar-dlet' with `dlet'.
* doc/emacs/calendar.texi (Diary iCalendar Import): Update example in
manual.
Thanks to Stefan Monnier for the comments in Bug#74994 leading to most
of these changes.
Improvements in diary-icalendar.el and related changes:
* lisp/calendar/diary-icalendar.el
(icalendar-save-binary-atttachment): Rename to
`diary-icalendar-save-binary-attachment'. Document internal require.
(diary-icalendar-attendee-skeleton-command): Rename to
`diary-icalendar-attendee-format-function'.
(diary-icalendar-vevent-skeleton-command): Rename to
`diary-icalendar-vevent-format-function'.
(diary-icalendar-vjournal-skeleton-command): Rename to
`diary-icalendar-vjournal-format-function'.
(diary-icalendar-vtodo-skeleton-command): Rename to
`diary-icalendar-vtodo-format-function'.
* doc/emacs/calendar.texi (Diary iCalendar Import)
* lisp/calendar/icalendar.el (icalendar-import-format)
(icalendar-import-format-summary, icalendar-import-format-description)
(icalendar-import-format-location, icalendar-import-format-organizer)
(icalendar-import-format-url, icalendar-import-format-uid)
(icalendar-import-format-status, icalendar-import-format-class): Update
references to renamed functions.
(diary-icalendar-attendee-format-function): Fix quoted function name.
(diary-icalendar-attendee-format-function)
(diary-icalendar-vevent-format-function)
(diary-icalendar-vjournal-format-function)
(diary-icalendar-vtodo-format-function)
(diary-icalendar-after-mailcap-viewer-hook): Improve docstrings.
(diary-icalendar-skip-addresses-regexp): Ensure default value is a
regexp.
(diary-icalendar-description-regexp): Fix :type declaration to agree
with default.
(diary-icalendar-format-date): Replace unnecessary `calendar-dlet' with
`dlet'.
(diary-icalendar-vevent-format-function)
(diary-icalendar-vjournal-format-function)
(diary-icalendar-vtodo-format-function)
(diary-icalendar-format-entry)
(diary-icalendar-import-buffer-to-buffer)
(diary-icalendar--entry-import)
(diary-icalendar-import-buffer)
(diary-icalendar-import-file): Change "non-marking" to "nonmarking" in
variable names for consistency (cf. `diary-nonmarking-symbol').
(diary-icalendar-attendee-skeleton): Remove unnecessary call to
`skeleton-insert'.
(diary-icalendar-vevent-skeleton)
(diary-icalendar-vjournal-skeleton)
(diary-icalendar-vtodo-skeleton): Don't insert return values of `let'
forms.
(diary-icalendar-parse-entry): Call
`diary-icalendar-other-properties-parser' with type and properties as
arguments, instead of dynamic binding.
(diary-icalendar-other-properties-parser): Document the new calling
convention.
* test/lisp/calendar/diary-icalendar-tests.el
(diary-icalendar-test-parse-@-location): Accept the new arguments.
Clarify `declare-function' usage:
* lisp/calendar/icalendar-parser.el (icalendar-read-time)
(icalendar-period-end, icalendar-parse-calendar)
(icalendar-index-insert, icalendar-index-get)
* lisp/calendar/icalendar-ast.el (icalendar-printable-value-type-symbol-p)
(icalendar-ast-node-valid-value-p)
* lisp/calendar/icalendar-utils.el (icalendar-date-time-add)
(icalendar-dates-until, icalendar-date-time-variant): Move
`declare-function' forms to corresponding `require' forms.
Improve debugging with icalendar-ast.el macros:
* lisp/calendar/icalendar-ast.el
(icalendar-make-value-node-of): Add explanatory comment to require.
(icalendar--make-param--list, icalendar--make-param--nonlist)
(icalendar--make-property--list, icalendar--make-property--nonlist): New
functions.
(icalendar-make-param, icalendar-make-property): Use them to reduce code
generated by these macros. Add (declare (debug ...)) forms.
(icalendar-make-component, icalendar-make-node-from-templates):
Add (declare (debug ...)) forms.
* test/lisp/calendar/icalendar-ast-tests.el: New file.
Various other minor changes:
* lisp/calendar/icalendar-macs.el (icalendar-define-type): Improve
docstring.
(icalendar-define-property): Fix deprecation warning: replace 'any' with
'not-newline' in rx definition.
*
test/lisp/calendar/icalendar-recur-tests.el (icalendar-test-rrule-test):
Pass tags on to `ert-deftest' and mark several tests as expensive.
* lisp/calendar/calendar.el (diary-date-insertion-form): Remove
constants from :set-after list.
* lisp/calendar/diary-lib.el (diary-time-regexp): Clarify FIXME comment.
* lisp/calendar/icalendar-parser.el
(icalendar-x-name): Fix indentation.
(icalendar-cal-address): Improve docstring.
This is a fix for Bug#74994 that replaces the existing support
in icalendar.el. It implements a full parser, recurrence rule
and time zone calculations, diary import and export, and a
major mode with syntax highlighting for iCalendar data. It
obsoletes most of the code in icalendar.el.
In addition to Bug#74994, the proposal to update Emacs' iCalendar
support was discussed on emacs-devel in this thread:
https://lists.gnu.org/archive/html/emacs-devel/2024-10/msg00425.html
icalendar.el pre-dates the current standard (RFC5545), contains numerous
bugs, is not well documented, and could not easily be updated or
extended; starting fresh was the simplest path to creating an iCalendar
library that other Emacs applications and packages can rely on. It was
decided to leave icalendar.el's code in place for posterity, but declare
it obsolete. Most of the changes in icalendar.el simply consist of such
declarations. The old To Do list has also been deleted.
A few changes in icalendar.el, however, consist of new code for
library-wide functions and options, especially error handling. In
particular:
* lisp/calendar/icalendar.el: Log iCalendar library errors in a single
buffer.
(icalendar-errors-mode): New mode for it.
(icalendar-uid-format): Change the default value to "%h", a hash
value (for privacy).
(icalendar-make-uid): New function, to replace 'icalendar--create-uid'.
(icalendar-debug-level, icalendar-vcalendar-prodid): New option.
(icalendar-vcalendar-version): New constant.
* lisp/calendar/icalendar.el (icalendar-import-format)
(icalendar-import-format-summary, icalendar-import-format-description)
(icalendar-import-format-location, icalendar-import-format-organizer)
(icalendar-import-format-url, icalendar-import-format-uid)
(icalendar-import-format-status, icalendar-import-format-class)
(icalendar-recurring-start-year, icalendar-export-hidden-diary-entries)
(icalendar-export-sexp-enumerate-all, icalendar-export-alarms,
icalendar-debug, icalendar--weekday-array, icalendar--dmsg)
(icalendar--get-unfolded-buffer icalendar--clean-up-line-endings)
(icalendar--rris, icalendar--read-element)
(icalendar--get-event-property, icalendar--get-event-properties)
(icalendar--get-event-property-attributes)
(icalendar--get-children, icalendar--all-events, icalendar--split-value)
(icalendar--convert-tz-offset, icalendar--parse-vtimezone)
(icalendar--get-most-recent-observance)
(icalendar--convert-all-timezones, icalendar--find-time-zone)
(icalendar--decode-isodatetime)
(icalendar--decode-isoduration, icalendar--add-decoded-times)
(icalendar--datetime-to-american-date)
(icalendar--datetime-to-european-date, icalendar--datetime-to-iso-date)
(icalendar--datetime-to-diary-date, icalendar--datetime-to-colontime)
(icalendar--get-month-number, icalendar--get-weekday-number)
(icalendar--get-weekday-numbers, icalendar--get-weekday-abbrev)
(icalendar--date-to-isodate, icalendar--datestring-to-isodate)
(icalendar--diarytime-to-isotime, icalendar--convert-string-for-export)
(icalendar--convert-string-for-import, icalendar-export-file)
(icalendar-export-region, icalendar--create-uid)
(icalendar--parse-summary-and-rest, icalendar--create-ical-alarm)
(icalendar--do-create-ical-alarm, icalendar--convert-ordinary-to-ical)
(icalendar-first-weekday-of-year, icalendar--convert-weekly-to-ical)
(icalendar--convert-yearly-to-ical, icalendar--convert-sexp-to-ical)
(icalendar--convert-block-to-ical, icalendar--convert-float-to-ical)
(icalendar--convert-date-to-ical, icalendar--convert-cyclic-to-ical)
(icalendar--convert-anniversary-to-ical, icalendar-import-file)
(icalendar-import-buffer, icalendar--format-ical-event)
(icalendar--convert-to-ical, icalendar--convert-ical-to-diary)
(icalendar--convert-recurring-to-diary)
(icalendar--convert-non-recurring-all-day-to-diary)
(icalendar--convert-non-recurring-not-all-day-to-diary)
(icalendar--add-diary-entry, icalendar-import-format-sample): Mark them
as obsolete.
In addition to the changes above, the new iCalendar library consists of
the following:
* lisp/calendar/diary-icalendar.el:
* lisp/calendar/icalendar-ast.el:
* lisp/calendar/icalendar-macs.el:
* lisp/calendar/icalendar-mode.el:
* lisp/calendar/icalendar-parser.el:
* lisp/calendar/icalendar-recur.el:
* lisp/calendar/icalendar-utils.el: New files
A few changes were made to existing files dealing with the calendar and
diary:
* lisp/calendar/calendar.el (calendar-date-from-day-of-year): New
function, extracted from calendar-goto-day-of-year.
* lisp/calendar/cal-move.el (calendar-goto-day-of-year): Use it.
* lisp/calendar/cal-dst.el (calendar-dst-find-data): Improve docstring.
* lisp/calendar/calendar.el (diary-date-insertion-form): New option.
(diary-american-date-insertion-form, diary-european-date-insertion-form)
(diary-iso-date-insertion-form): New constants.
* lisp/calendar/diary-lib.el (diary-insert-entry): Use the new
'diary-date-insertion-form' option.
(diary-time-regexp): Add FIXME to an existing comment.
The user-facing aspects of the above changes are documented in the Emacs
manual and the NEWS file:
* doc/emacs/calendar.texi (Diary Conversion): Update manual section to
describe the new importer and exporter.
* doc/emacs/emacs.texi (Detailed node listing): Update to include the
new nodes in docs/emacs/calendar.texi.
* etc/NEWS: Briefly describe the new library, major mode, and options.
The remainder of the changes apply to test files.
The following changes introduce new test files related to the new diary
importer and exporter:
* test/lisp/calendar/diary-icalendar-tests.el (Diary import and export):
Tests for diary-icalendar. In addition to new tests for the exporter,
the existing import tests for icalendar.el have been ported here; these
use the existing iCalendar files in
test/lisp/calendar/icalendar-resources. (A few new input .ics files
have also been added to this directory; see below.)
* test/lisp/calendar/diary-icalendar-resources: New directory containing
expected outputs for the import tests in diary-icalendar-tests.el.
(These have the same or similar names to the output files for the old
importer, in test/lisp/calendar/icalendar-resources, but different
contents. Thus they live in a new directory.)
* test/lisp/calendar/icalendar-resources/import-legacy-function.ics: New
input file to test backward compatibility of the new importer with a
function as the value of 'icalendar-import-format', now obsolete.
* test/lisp/calendar/icalendar-resources/import-legacy-vars.ics: New
input file to test backward compatibility of the new importer with
values for options provided by icalendar.el which are now obsolete.
* test/lisp/calendar/icalendar-resources/import-with-attachment.ics: New
input file to test import of base64-encoded attachments.
* icalendar-resources/import-time-format-12hr-blank.ics: New input file
to test import with a custom value of 'diary-icalendar-time-format'.
Two other new test files provide unit tests for the main functions of
the library:
* test/lisp/calendar/icalendar-parser-tests.el (Parser): Tests for
icalendar-parser. Most of these are derived from examples in RFC5545,
to ensure the parser implements the standard.
* test/lisp/calendar/icalendar-recur-tests.el (Recurrence rules): Tests
for icalendar-recur. Most of these are derived from examples in RFC5545,
to ensure the recurrence rule interpreter implements the standard.
A few of the existing test files for icalendar.el have also been
modified. Besides the specific changes mentioned below, the modified
.ics files also now use CR-LF line endings, as required by RFC5545:
* test/lisp/calendar/icalendar-tests.el (icalendar-deftest-obsolete):
New macro.
* test/lisp/calendar/icalendar-resources/import-non-recurring-all-day.ics:
Correct a malformed VALUE parameter.
* test/lisp/calendar/icalendar-resources/import-rrule-anniversary.ics:
Correct representation of a recurring event.
*
test/lisp/calendar/icalendar-resources/import-rrule-daily-with-exceptions.ics:
Add a required VALUE parameter.
* test/lisp/calendar/icalendar-resources/import-rrule-daily.ics:
* test/lisp/calendar/icalendar-resources/import-rrule-monthly-no-end.ics:
* test/lisp/calendar/icalendar-resources/import-rrule-monthly-with-end.ics:
* test/lisp/calendar/icalendar-resources/import-rrule-weekly.ics:
Correct a malformed RRULE property.
* doc/misc/tramp.texi (Remote processes): Provide more details in
"Running remote processes on MS Windows hosts".
* test/lisp/net/tramp-tests.el (tramp-test29-start-file-process)
(tramp-test30-make-process): Adapt tests.
* doc/misc/tramp.texi (Remote processes): Provide more details in
"Running remote processes on MS Windows hosts".
* lisp/net/tramp-smb.el (tramp-smb-handle-make-process):
Suppress lock files.
* test/lisp/net/tramp-tests.el (auto-revert-notify-watch-descriptor)
(auto-revert-remote-files, auto-revert-use-notify): Declare. Set
proper values.
(tramp-test30-make-process): Adapt test.
The previous phrasing could be read as if backquote expansion were
mutable if containing substitions, but that is simply not true;
they should always be treated as non-mutable.
* doc/misc/auth.texi (Help for users): Improve
'auth-source-ignore-non-existing-file' description. Include
warning about storing cleartext in .authinfo.
* admin/merge-gnulib (AVOIDED_MODULES): Add strncpy, as Emacs is not
likely to exercise the FreeBSD 15 strncpy bug that this module fixes.
* lib/issymlinkat.h: New file, taken from Gnulib.
* doc/emacs/custom.texi (Early Init File): Document feature and
related user options.
* etc/NEWS: Mention new feature.
* lisp/startup.el (user-lisp-auto-scrape, user-lisp-directory)
(user-lisp-ignored-directories): New user options.
(prepare-user-lisp): New command.
(command-line): Invoke 'prepare-user-lisp' during startup if a
user-lisp directory exists and if not disabled per
'user-lisp-auto-scrape'.
* lisp/vc/vc-dir.el (vc-dir-show-outgoing-count): New defcustom.
(vc-dir-headers): Use it.
* doc/emacs/maintaining.texi (VC Directory Buffer):
* etc/NEWS: Document it.
* doc/misc/tramp.texi (Remote processes): Rewrite subsection
"Running remote processes on MS Windows hosts".
* etc/NEWS: Mention remote process support for Tramp's "smb" method.
Presentational fixes and improvements.
* lisp/net/tramp-smb.el (tramp-smb-file-name-handler-alist):
Use `tramp-smb-handle-make-process', `tramp-smb-handle-shell-command'
and `tramp-handle-start-file-process'.
(tramp-smb-matching-line): New defvar.
(tramp-smb-handle-make-process, tramp-smb-handle-shell-command)
(tramp-smb-shell-prompt): New defuns.
(tramp-smb-handle-process-file): Rewrite.
(tramp-smb-handle-start-file-process): Remove.
(tramp-smb-get-localname, tramp-smb-shell-quote-localname):
New optional argument SHARE.
(tramp-smb-send-command): Remove echoed command string.
(tramp-smb-maybe-open-connection): Initialize variables.
(tramp-smb-wait-for-output): Wait more robust.
(tramp-smb-call-winexe): Check for share. Goto current directory.
(tramp-smb-connection-local-powershell-variables): New defconst.
Set it as connection local variables.
* test/lisp/net/tramp-tests.el (tramp-test28-process-file)
(tramp-test29-start-file-process, tramp-test30-make-process)
(tramp-test32-shell-command, tramp--test-async-shell-command)
(tramp--test-supports-processes-p): Adapt for "smb" method.
(tramp-test34-explicit-shell-file-name)
(tramp-test45-asynchronous-requests): Skip for "smb" method.
(tramp--test-check-files): Skip shell test for some special
characters in the "smb" case.
(tramp-test52-unload): Disable further tests.
In 2014, the Universal House of Justice announced modifications to
the Badí' calendar to bring it more in line with its original design.
>From 172 BE (Naw-Rúz 2015) onwards, Naw-Rúz is determined by the
vernal equinox as observed from Tehran, and the Twin Holy Birthdays
are calculated from the eighth new moon after Naw-Rúz.
* doc/emacs/calendar.texi (Calendar Systems): Update Bahá'í calendar
description to mention the 2014 reform, Ayyám-i-Há, and the
astronomical basis for Naw-Rúz and Twin Holy Birthday calculations.
* lisp/calendar/cal-bahai.el: Require 'solar' and 'lunar' for
astronomical calculations.
(calendar-bahai-tehran-latitude)
(calendar-bahai-tehran-longitude)
(calendar-bahai-tehran-timezone)
(calendar-bahai-reform-year): New constants for Tehran-based
astronomical observations and reform year (172 BE).
(calendar-bahai-nawruz-for-gregorian-year): New function to calculate
Naw-Rúz from vernal equinox relative to Tehran sunset.
(calendar-bahai-nawruz): New function returning absolute date of
Naw-Rúz for a given Bahá'í year.
(calendar-bahai-twin-holy-birthdays-for-year): New function to
calculate Birth of the Báb and Birth of Bahá'u'lláh from the eighth
new moon after Naw-Rúz.
(calendar-bahai-leap-year-p): Handle post-reform years based on gap
between successive Naw-Rúz dates.
(calendar-bahai-to-absolute, calendar-bahai-from-absolute): Rewrite
to use astronomical Naw-Rúz dates for years >= 172 BE.
(holiday-bahai-new-year): Calculate variable Naw-Rúz date.
(holiday-bahai-twin-holy-birthdays): New function for lunar-based
Twin Holy Birthday dates.
(holiday-bahai-ridvan): Use Bahá'í calendar dates instead of fixed
Gregorian dates.
(calendar-bahai--nawruz-reference-dates)
(calendar-bahai--twin-birthdays-reference-dates): New constants with
official dates from Bahá'í World Centre for 2015-2064.
(calendar-bahai--verify-nawruz)
(calendar-bahai--verify-twin-birthdays)
(calendar-bahai-verify-calculations): New verification functions to
test calculations against official reference data.
* lisp/calendar/holidays.el (holiday-bahai-holidays): Use
'holiday-bahai' with Bahá'í calendar dates instead of 'holiday-fixed'
with Gregorian dates. Add 'holiday-bahai-twin-holy-birthdays' for
lunar-calculated dates.
* lisp/cus-start.el: Make 'abbrev-mode' customizable.
* doc/emacs/abbrevs.texi (Abbrev Concepts):
* etc/NEWS:
* src/buffer.c (syms_of_buffer): <abbrev-mode>: Document
enabling Abbrev mode by default in all buffers by customizing
'abbrev-mode' to a non-nil value.
* lisp/vc/diff-mode.el (diff-revert-and-kill-hunk): When the
region is active, operate on all hunks it overlaps.
* doc/emacs/files.texi (Diff Mode):
* etc/NEWS: Document the change.
* lisp/vc/diff-mode.el (diff-apply-buffer): New 'no-save'
meaning for fourth optional argument. Reserve other non-nil
values for this argument. Use ngettext for one message.
(diff-apply-hunk): If the region is active, apply all hunks that
the region overlaps, like diff-apply-buffer.
* doc/emacs/files.texi (Diff Mode):
* etc/NEWS: Document the change to diff-apply-hunk.
* doc/lispref/frames.texi (Font and Color Parameters): Fix
documentation of values of 'alpha-background'. Suggested by Jacob
S. Gordon <jacob.as.gordon@gmail.com>. (Bug#79861)
* doc/emacs/search.texi (Query Replace): Mention new key 'd'.
* lisp/replace.el (query-replace-help): Mention the key 'd'.
(query-replace-map): Bind the key 'd' to 'diff'.
(perform-replace): When 'def' is equal to 'diff',
call 'multi-file-replace-as-diff' to show the diff buffer
with replacements (bug#79761).
* doc/emacs/programs.texi (Hideshow): Add 'hs-cycle-filter' and
remove duplicate 'hs-toggle-hiding'.
* lisp/progmodes/hideshow.el (hs-cycle-filter): New defcustom (bug#79585).
(hs-minor-mode-map): Bind 'TAB' to 'hs-toggle-hiding' using the filter.
Also clarify how to turn off semantic tokens and inlay hints, since I
suspect that will be a theme.
* doc/misc/eglot.texi (Eglot Features): Add semantic tokens. (Eglot
Commands): Document eglot-semantic-tokens-mode. (Eglot and Buffers):
Provide example on how to turn off semtok and inlay hints.
* etc/EGLOT-NEWS (Changes to upcoming Eglot): Announce semantic
tokens support