Календарь и дневник

Emacs может работать как настольный календарь с ежедневником для планируемых и прошедших событий. Чтобы войти в календарь, наберите M-x calendar; это покажет календарь на три месяца, отцентрированный на текущем месяце, а точка будет находиться на текущей дате. С числовым аргументом, как в C-u M-x calendar, эта команда запрашивает у вас месяц и год, которые должны оказаться в центре трехмесячного календаря. Календарь использует свой собственный буфер с основным режимом Calendar.

Mouse-2 в календаре выводит меню операций для даты; C-Mouse-3 выводит меню часто используемых средств календаря, которые не зависят от конкретной даты. Чтобы выйти из календаря, введите q. Смотрите раздел `Calendar' в The Emacs Lisp Reference Manual, для получения информации о настройке календаря и дневника.

Перемещение по календарю

Режим Calendar позволяет вам перемещаться по календарю через логические промежутки времени, такие как дни, недели, месяцы и годы. Если вы переместитесь за те три месяца, которые показываются изначально, календарь автоматически "прокручивается" на столько, сколько нужно, чтобы выбранная дата стала видимой. Перемещение к дате позволяет вам просмотреть приходящиеся на нее праздники или записи в дневнике или преобразовать её в другие календарные системы; перемещение на большие интервалы времени также полезно просто для прокрутки календаря.

Перемещение по обычным календарным единицам

Команды для перемещения в буфере календаря аналогичны командам для перемещения в тексте. Вы можете переходить вперёд и назад по дням, неделям, месяцам и годам.

C-f
Перемещает на день вперёд (calendar-forward-day).
C-b
Перемещает на день назад (calendar-backward-day).
C-n
Перемещает на неделю вперёд (calendar-forward-week).
C-p
Перемещает на неделю назад (calendar-backward-week).
M-}
Перемещает на месяц вперёд (calendar-forward-month).
M-{
Перемещает на месяц назад (calendar-backward-month).
C-x ]
Перемещает на год вперёд (calendar-forward-year).
C-x [
Перемещает на год назад (calendar-backward-year).

Команды для перемещения по дням и неделям -- это естественные аналоги обычных команд Emacs для перемещения по знакам или строкам. Так же, как C-n обычно перемещает к тому же столбцу в следующей строке, в режиме Calendar она перемещает к тому же дню следующей недели. А C-p перемещает к тому же дню предыдущей недели.

Курcорные стрелки эквивалентны C-f, C-b, C-n и C-p, как и в других режимах.

Команды для перемещения по месяцам и годам работают так же, как команды для недель, но переносят на большие расстояния. Команды для месяцев M-} и M-{ перемещают вперёд или назад на целый месяц. Команды для лет C-x ] и C-x [ перемещают вперёд или назад на целый год.

Простейший способ запомнить эти команды -- рассматривать месяцы и годы как аналоги абзацев и страниц, соответственно. Но сами команды не вполне аналогичны. Обычные команды Emacs для абзацев передвигают к началу или концу абзаца, тогда как эти команды для месяцев и лет перемещают по целому месяцу или году, что обычно подразумевает переход за конец месяца или года.

Все эти команды принимают числовой аргумент в качестве счетчика повторов. Для удобства, в режиме Calendar цифры и знак минус задают числовой аргумент даже без модификатора Meta. Например, 100 C-f перемещает точку на 100 дней вперёд от её текущей позиции.

Начало или конец недели, месяца или года

Неделя (или месяц, или год) -- это не просто некоторое количество дней; мы полагаем, что недели (месяцы, года) начинаются с определённых дат. Поэтому режим Calendar предоставляет команды для перехода к началу или концу недели, месяца или года:

C-a
Переход к началу недели (calendar-beginning-of-week).
C-e
Переход к концу недели (calendar-end-of-week).
M-a
Переход к началу месяца (calendar-beginning-of-month).
M-e
Переход к концу месяца (calendar-end-of-month).
M-<
Переход к началу года (calendar-beginning-of-year).
M->
Переход к концу года (calendar-end-of-year).

Эти команды также принимают числовые аргументы в качестве счетчиков повторений, который указывает, на сколько недель, месяцев или лет нужно переместиться вперёд или назад.

По умолчанию недели начинаются с воскресенья. Чтобы сделать так, чтобы они начинались с понедельника, установите переменную calendar-week-start-day в значение 1.

Указанные даты

Режим Calendar предоставляет команды для перехода к конкретной дате, которую можно задать многими способами.

g d
Перемещает точку к указанной дате (calendar-goto-date).
o
Центрирует календарь вокруг указанного месяца (calendar-other-month).
.
Перемещает точку к сегодняшней дате (calendar-goto-today).

g d (calendar-goto-date) запрашивает год, месяц и день месяца, а затем перемещает к этой дате. Поскольку календарь включает все даты от начала нашей эры, вы должны вводить год полностью; то есть пишите `1990', а не `90'.

o (calendar-other-month) запрашивает месяц и год, а затем центрирует трехмесячный календарь вокруг этого месяца.

Вы можете вернуться к сегодняшней дате с помощью команды . (calendar-goto-today).

Прокрутка календаря

Изображение календаря автоматически прокручивается, когда вы сдвигаетесь за пределы видимой части. Вы также можете прокручивать его вручную. Представьте, что окно календаря содержит длинную ленту бумаги с месяцами. Прокрутка её означает, что в этом окне станут видимыми новые месяцы.

C-x <
Прокручивает календарь на один месяц вперёд (scroll-calendar-left).
C-x >
Прокручивает календарь на один месяц назад (scroll-calendar-right).
C-v
NEXT
Прокручивает календарь на три месяца вперёд (scroll-calendar-left-three-months).
M-v
PRIOR
Прокручивает календарь на три месяца назад (scroll-calendar-right-three-months).

Самые основные команды прокрутки календаря прокручивают по одному месяцу за раз. Это означает, что между отображением до команды и отображением после делается два месяца перекрытия. C-x < прокручивает содержимое календаря на месяц влево; то есть она перемещает вид вперёд по времени. C-x > прокручивает содержимое календаря вправо, что перемещает назад во времени.

Команды C-v и M-v прокручивают календарь по целым экранам --- по три месяца -- по аналогии с обычным значением этих команд. C-v делает видимыми более поздние даты, а M-v -- более ранние. Эти команды принимают числовой аргумент в качестве счетчика повторов; в частности, так как C-u умножает следующую команду на четыре, набор C-u C-v прокручивает календарь на год вперёд, а C-u M-v прокручивает на год назад.

Функциональные клавиши NEXT и PRIOR эквивалентны C-v и M-v, как и в других режимах.

Посчет дней

M-=
Выводит число дней в текущей области (calendar-count-days-region).

Чтобы определить число дней в области, наберите M-= (calendar-count-days-region). Количество дней выводится включительно; то есть дни, указываемые точкой и меткой, учитываются.

Другие команды календаря

p d
Выводит номер дня в году (calendar-print-day-of-year).
C-c C-l
Заново генерирует окно календаря (redraw-calendar).
SPC
Прокручивает следующее окно (scroll-other-window).
q
Выходит из календаря (exit-calendar).

Чтобы напечатать число дней, прошедших с начала года или остающихся до конца года, наберите команду p d (calendar-print-day-of-year). Она покажет оба этих числа в эхо-области. Количество прошедших дней включает выбранную дату. Число оставшихся дней не включает её.

Если окно календаря окажется испорчено, наберите C-c C-l (redraw-calendar) чтобы его перерисовать. (Такое может случиться, только если вы используете команды редактирования не из режима Calendar.)

В режиме Calendar вы можете использовать SPC (scroll-other-window) для прокрутки другого окна. Это удобно, если вы смотрите в другом окне список праздников или записи ежедневника.

Чтобы выйти из календаря, наберите q (exit-calendar). Эта команда прячет все буферы, связанные с календарем, и выбирает другие буферы. (Если фрейм содержит специально назначенное окно календаря, выход из календаря минимизирует этот фрейм.)

LaTeX и календарь

Команды календаря для работы с LaTeX генерируют буфер с LaTeX-кодом, который печатает календарь. В зависимости от использованой команды напечатанный календарь покрывает день, неделю, месяц или год, в котором находится точка.

t m
Генерирует календарь на один месяц (cal-tex-cursor-month).
t M
Генерирует горизонтальный календарь на один месяц (cal-tex-cursor-month-landscape).
t d
Генерирует календарь на один день (cal-tex-cursor-day).
t w 1
Генерирует одностраничный календарь на одну неделю (cal-tex-cursor-week).
t w 2
Генерирует двухстраничный календарь на одну неделю (cal-tex-cursor-week2).
t w 3
Генерирует календарь в стиле ISO на одну неделю (cal-tex-cursor-week-iso).
t w 4
Генерирует календарь на одну неделю, начинающуюся с понедельника (cal-tex-cursor-week-monday).
t f w
Генерирует двухнедельный календарь на одной странице в стиле Filofax (cal-tex-cursor-filofax-2week).
t f W
Генерирует недельный календарь на одной странице в стиле Filofax (cal-tex-cursor-filofax-week).
t y
Генерирует календарь на один год (cal-tex-cursor-year).
t Y
Генерирует горизонтальный календарь на один год (cal-tex-cursor-year-landscape).
t f y
Генерирует календарь на один год в стиле Filofax (cal-tex-cursor-filofax-year).

Некоторые из этих команд печатают календарь горизонально (в "ландшафтном режиме"), поэтому его ширина может быть больше длины. Некоторые из них используют размер бумаги Filofax (3.75 на 6.75 дюймов). Все эти команды принимают префиксный аргумент, задающий число печатаемых дней, недель, месяцев или лет (всегда начиная от текущего).

Если переменная cal-tex-holidays не равна nil (это значение по умолчанию), то печатаемые календари показывают праздники из calendar-holidays. Если переменная cal-tex-diary отлична от nil (по умолчанию это nil), также включаются записи из дневника (только в недельные и месячные календари).

Праздники

Календарь Emacs знает обо всех больших и о многих малых праздниках и может их отображать.

h
Показать праздники, приходящиеся на выбранную дату (calendar-cursor-holidays).
Mouse-2 Holidays
Показать все праздники для даты, на которой вы щёлкнули.
x
Пометить праздники в окне календаря (mark-calendar-holidays).
u
Снять метки в окне календаря (calendar-unmark).
a
Перечислить в другом окне все праздники для показанных трех месяцев (list-calendar-holidays).
M-x holidays
Перечислить в другом окне все праздники для трех месяцев вокруг текущей даты.
M-x list-holidays
Перечислить в другом окне праздники для заданного промежутка лет.

Чтобы узнать, не приходится ли на данную дату праздников, расположите точку на этой дате в окне календаря и используйте команду h. Или щелкните на этой дате Mouse-2 и затем выберите из появившегося меню пункт Holidays. В обоих случаях выводятся праздники для заданной даты, в эхо-области, если они там умещаются, или в отдельном окне.

Чтобы просмотреть распределение праздников для всех показанных в календаре дат, используйте команду x. Она отображает праздничные дни другим начертанием (или помещает после этих дат значок `*', если множественные начертания недоступны). Эта команда применяется и к месяцам, видимым в данный момент, и к тем, что станут впоследствии видимыми при прокрутке. Чтобы выключить разметку и стереть текущие метки, наберите u, что также стирает метки дневника (смотрите раздел Дневник).

Чтобы получить ещё более подробную информацию, используйте команду a, которая показывает отдельный буфер, содержащий список всех праздников в текущем трехмесячном диапазоне. Вы можете использовать SPC в окне календаря для прокрутки этого списка.

Команда M-x holidays выводит список праздников для текущего, предыдущего и следующего месяца; она работает, даже если у вас нет окна календаря. Если вы хотите получить перечень праздников, центрированный вокруг другого месяца, используйте C-u M-x holidays, которая спрашивает месяц и год.

Известные Emacs праздники включают праздники США и основные христианские, иудейские и исламские праздники; также он знает о солнцестояниях и равноденствиях.

Команда M-x list-holidays выводит список праздников для нескольких лет. Эта функция запрашивает у вас начальный и конечный год и позволяет выбрать все праздники или одну из их категорий. Вы можете использовать эту команду, даже если у вас нет окна календаря.

Emacs использует для праздников даты, основанные на текущей практике, а не на исторических фактах. К примеру, исторически момент сезонного перевода времени и даже само его существование изменялось от года к году, но текущий закон США говорит, что время переводится в первое воскресенье апреля. Когда правила сезонного перевода времени установлены по американским нормам, Emacs всегда использует текущее определение, даже если оно было неправильно в некоторые прошлые годы.

Время восхода и заката Солнца

Особые команды календаря могут сообщить вам с точностью до минуты-двух времена восхода и заката Солнца для любой даты.

S
Показывает времена восхода и заката Солнца для выбранной даты (calendar-sunrise-sunset).
Mouse-2 Sunrise/Sunset
Показывает времена восхода и заката Солнца для даты, на которой вы щёлкнули.
M-x sunrise-sunset
Показывает времена восхода и заката Солнца для сегодняшней даты.
C-u M-x sunrise-sunset
Показывает времена восхода и заката Солнца для заданной даты.

Чтобы просмотреть в эхо-области местное время восхода и заката Солнца, находясь в календаре, переместите точку к желаемой дате и нажмите S. Или щелкните на этой дате Mouse-2 и выберите из появившегося меню пункт Sunrise/Sunset. Команда M-x sunrise-sunset, доступная извне календаря, показывает эту информацию для текущей или указанной даты. Чтобы задать отличную от сегодняшней дату, используйте команду C-u M-x sunrise-sunset, которая спросит год, месяц и день.

Вы можете просмотреть время восхода и заката Солнца для любой местности и даты с помощью C-u C-u M-x sunrise-sunset. Эта команда запрашивает вас широту, долготу, разницу от универсального координированного времени и дату, а затем сообщает вам времена восхода и заката для этого места и этой даты.

Поскольку время восхода и заката Солнца зависит от положения на Земле, перед использованием этих команд вы должны сказать Emacs вашу широту, долготу и название местности. Вот пример задаваемых значений:

(setq calendar-latitude 40.1)
(setq calendar-longitude -88.2)
(setq calendar-location-name "Urbana, IL")

Задавайте значения calendar-latitude и calendar-longitude с точностью до одной десятой.

Ваш часовой пояс также влияет на время восхода и заката. Обычно Emacs получает информацию о часовом поясе от операционной системы, но если это не те значения, которые вы хотите (или если операционная система их не предоставляет), вы должны установить их сами. Вот пример:

(setq calendar-time-zone -360)
(setq calendar-standard-time-zone-name "CST")
(setq calendar-daylight-time-zone-name "CDT")

Значение calendar-time-zone -- это разница между вашим местным стандартным и универсальным координированным (гринвичским) временем, выраженная в минутах. Значения calendar-standard-time-zone-name и calendar-daylight-time-zone-name -- это сокращения, принятые для обозначения вашего часового пояса. Emacs показывает время восхода и заката в с учетом сезонного перевода часов. Смотрите раздел Сезонный перевод времени, о том, как определяется сезонная поправка.

Как пользователь, вы можете счесть удобным установить переменные календаря для задания вашего обычного физического местонахождения в вашем файле `.emacs'. А когда вы устанавливаете Emacs на машине, вы можете создать файл `default.el', который будет правильно их устанавливать для типичного местонахождения большинства пользователей этой машины. Смотрите раздел Файл инициализации, `~/.emacs'.

Фазы Луны

Эти команды календаря показывают даты и времена лунных фаз (новолуние, первая четверть, полнолуние, последняя четверть). Эта возможность полезна при отладке проблем, которые "зависят от фазы Луны".

M
Выводит даты и времена всех четвертей Луны для показанного трехмесячного периода (calendar-phases-of-moon).
M-x phases-of-moon
Выводит даты и времена четвертей Луны для трех месяцев вокруг сегодняшней даты.

Внутри календаря, для показа в отдельном буфере фаз Луны для текущего трехмесячного периода используется команда M. Перечислямые даты и времена точны до нескольких минут.

Вне календаря, для показа фаз Луны для текущего, предыдущего и следующего месяца используйте команду M-x phases-of-moon. Чтобы получить сведения для какого-то другого месяца, используйте C-u M-x phases-of-moon, она спросит вас о месяце и годе.

Даты и времена лунных фаз даются в местном времени (с учетом сезонных поправок, если это необходимо); но если переменная calendar-time-zone не определена, используется универсальное координированное время (гринвичский часовой пояс). Смотрите раздел Сезонный перевод времени.

Преобразование в другие календарные системы и из них

В Emacs всегда показывается григорианский календарь, иногда называемый календарем "нового стиля", который в наши дни применяется почти везде. Однако, этот календарь не существовал до шестнадцатого столетия и не использовался широко до восемнадцатого; только в начале девятнадцатого века он полностью вытеснил юлианский календарь и получил всемирное признание. Календарь Emacs может отобразить любой месяц начиная от января первого года нашей эры, но всегда показывает григорианский календарь, даже для дат, когда его ещё не существовало.

Хотя Emacs не может показывать другие календари, он умеет преобразовавать даты из нескольких других календарных систем.

Поддерживаемые календарные системы

Коммерческий календарь ISO используется в основном в Европе.

Юлианский календарь, названный в честь Юлия Цезаря, использовался в Европе в средние века и во многих других странах вплоть до девятнадцатого века.

Астрономы используют простой подсчет дней, истекших от полудня понедельника, первого января, 4713-го года до нашей эры по юлианскому календарю. Число прошедших дней называется юлианским или астрономическим номером дня.

Иудейский календарь по традиции используется в еврейской религии. Календарная программа Emacs использует иудейский календарь для определения дат еврейских праздников. Даты иудейского календаря начинаются и завершаются при заходе Солнца.

Исламский календарь используется во многих мусульманских странах. Emacs использует его для определения дат исламских праздников. В исламском мире нет всеобщей договоренности о календаре; в Emacs применяется широко распространенная версия, но точные даты исламского календаря часто основываются на высказываниях религиозных авторитетов, а не на вычислениях. Как следствие, действительные даты наблюдения могут слегка отличаться от вычисленных в Emacs. Даты исламского календаря начинаются и завершаются при заходе Солнца.

Календарь французской революции был создан якобинцами после революции 1789-го года для введения более светского и основанного на представлениях о природе взгляда на годовой цикл и для установления десятидневной недели, более рационалистической, как метрическая система. Французское правительство официально отменило этот календарь в конце 1805-го года.

Центральноамериканские Майя использовали три разные, перекрывающиеся календарные системы, долгий счет, тцолкин и хааб. Emacs знает обо всех трех календарях. Эксперты обсуждают точное соответствие между календарем Майя и нашим календарем; Emacs использует для вычислений корреляцию Гудмана-Мартинеса-Томсона.

Копты используют календарь, основанный на древнеегипетском солнечном календаре. Он состоит из двенадцати тридцатидневных месяцев, за которым идет дополнительный пятидневный период. Раз в четыре года к этому периоду добавляется шестой, високосный день. Эфиопский календарь обладает такой же структурой, но в нем другие номера лет и названия месяцев.

Персы используют солнечный календарь, основанный на разработках Омара Хайама. Их календарь состоит из двенадцати месяцев, первые шесть из которых содержат 31 дней, следующие пять -- 30 дней, а в последнем 29 дней в обычные года и 30 дней в високосные. Високосные года случаются по сложному образцу каждые четыре или пять лет.

Китайский календарь -- это сложная система лунных месяцев, скомбинированных с солнечными годами. Годы проходят по циклам из шестидесяти лет, обычный год содержит 12 месяцев, високосный -- 13; в каждом месяце либо 29, либо 30 дней. Каждый год, обычный месяц и день именуется комбинацией одного из десяти "небесных стеблей" и одной из двенадцати "земных ветвей", в общей сложности есть шестьдесят имен, которые проходят по кругу.

Преобразование в другой календарь

Следующие команды описывают выбранную дату (дату, в которой находится точка) в различных календарных системах:

Mouse-2 Other Calendars
Выводит дату, на которой вы щёлкнули, выраженную через различные другие календари.
p c
Выводит эквивалент выбранного дня в коммерческом календаре ISO (calendar-print-iso-date).
p j
Выводит юлианскую дату для выбранного дня (calendar-print-julian-date).
p a
Выводит астрономический (юлианский) номер дня для выбранной даты (calendar-print-astro-day-number).
p h
Показывает иудейскую дату для выбранного дня (calendar-print-hebrew-date).
p i
Показывает исламскую дату для выбранного дня (calendar-print-islamic-date).
p f
Показывает французскую революционную дату для выбранного дня (calendar-print-french-date).
p C
Показывает китайскую дату для выбранного дня (calendar-print-chinese-date).
p k
Показывает коптскую дату для выбранного дня (calendar-print-coptic-date).
p e
Показывает эфиопскую дату для выбранного дня (calendar-print-ethiopic-date).
p p
Показывает дату персидского календаря для выбранного дня (calendar-print-persian-date).
p m
Показывает дату календаря Майя для выбранного дня (calendar-print-mayan-date).

Если вы используете X, простейший способ перевести дату в другие календари -- щёлкнуть на ней Mouse-2 и выбрать из появившегося меню пункт Other Calendars. Это покажет в виде меню эквивалентные формы для данной даты во всех календарях, которые понимает Emacs. (Выбор альтернатив из этого меню не делает ничего -- оно используется только для показа.)

Переместите точку к желаемой дате в григорианском календаре и нажмите подходящие клавиши. p -- это мнемоника для "print", поскольку Emacs "печатает" эквивалентную дату в эхо-области.

Преобразование из другого календаря

Вы можете использовать поддерживаемые календари для задания даты, к которой следует переместиться. Этот раздел описывает команды для проделывания этого во всех календарях, кроме майянского; чтобы узнать, как это сделать для календаря Майя, смотрите следующий раздел.

g c
Переход к дате, заданной в коммерческом календаре ISO (calendar-goto-iso-date).
g j
Переход к дате, заданной в юлианском календаре (calendar-goto-julian-date).
g a
Переход к дате, заданной астрономическим (юлианским) номером дня (calendar-goto-astro-day-number).
g h
Переход к дате, заданной в иудейском календаре (calendar-goto-hebrew-date).
g i
Переход к дате, заданной в исламском календаре (calendar-goto-islamic-date).
g f
Переход к дате, заданной во французском революционном календаре (calendar-goto-french-date).
g C
Переход к дате, заданной в китайском календаре (calendar-goto-chinese-date).
g p
Переход к дате, заданной в персидском календаре (calendar-goto-persian-date).
g k
Переход к дате, заданной в коптском календаре (calendar-goto-coptic-date).
g e
Переход к дате, заданной в эфиопском календаре (calendar-goto-ethiopic-date).

Эти команды запрашивают у вас дату из другого календаря, перемещают точку к эквивалентной дате григорианского календаря и показывают дату другого календаря в эхо-области. При считывании названия месяца Emacs использует строгое завершение (смотрите раздел Завершение), поэтому вам не нужно беспокоиться о правильности написания иудейских, исламских или французских названий.

Один из вопросов, часто возникающих в связи с иудейским календарем, --- вычисление годовщины смерти, называемой "yahrzeit". Календарь Emacs включает средства для таких вычислений. Если вы находитесь в календаре, команда M-x list-yahrzeit-dates спрашивает вас о промежутке лет и затем показывает для этого промежутка список yahrzeit для даты в точке. Если вы не в календаре, эта команда сначала спросит о дате смерти и промежутке лет, а затем покажет список дат yahrzeit.

Преобразование из календаря Майя

Это команды для выбора дат, оснаванных на календаре Майя:

g m l
Переходит к дате, заданной календарем долгого счета (calendar-goto-mayan-long-count-date).
g m n t
Переходит к следующему появлению некоторого места в календаре тцолкин (calendar-next-tzolkin-date).
g m p t
Переходит к предыдущему появлению некоторого места в календаре тцолкин (calendar-previous-tzolkin-date).
g m n h
Переходит к следующему появлению некоторого места в календаре хааб (calendar-next-haab-date).
g m p h
Переходит к предыдущему появлению некоторого места в календаре хааб (calendar-previous-haab-date).
g m n c
Переходит к следующему появлению некоторого места в календарном круге (calendar-next-calendar-round-date).
g m p c
Переходит к предыдущему появлению некоторого места в календарном круге (calendar-previous-calendar-round-date).

Чтобы понять эти команды, вы должны понимать календари Майя. Долгий счет -- это подсчет дней в следующих единицах:

1 кин = 1 день 1 уинал = 20 кин 1 тун = 18 уинал
1 катун = 20 тун 1 бактун = 20 катун

Таким образом, дата 12.16.11.16.6 в долгом счете означает 12 бактун, 16 катун, 11 тун, 16 уинал и 6 кин. Календарь Emacs может обрабатывать майянские даты долгого счета от 7.17.18.13.1, но не более ранние. Когда вы используете команду g m l, набирайте майянскую дату долгого счета, разделяя бактун, катун, тун, уинал и кин точками.

Майянский календарь тцолкин -- это цикл из 260 дней, формируемый парой независимых циклов из 13 и 20 дней. Поскольку этот цикл повторяется бесконечно, Emacs предоставляет команды для перемещения назад и вперёд к предыдущей или следующей точке цикла. Наберите g m p t, чтобы перейти к предыдущей дате в тцолкин; Emacs спросит у вас дату в тцолкин и переместит точку к предыдущему появлению этой даты. Аналогично, наберите g m n t, чтобы перейти к следующему появлению даты в тцолкин.

Майянский календарь хааб -- это цикл из 365 дней, собранный из 18 месяцев по 20 в каждом, за которыми следует пятидневный период без месяца. Подобно циклу тцолкин, этот цикл повторяется бесконечно, и есть команды для перехода назад и вперёд к предыдущей или следующей точке этого цикла. Наберите g m p h, чтобы перейти к предыдущей дате хааб; Emacs спросит у вас дату в хааб и переместит точку к предыдущему появлению этой даты. Аналогично, наберите g m n h, чтобы перейти к следующему появлению даты в хааб.

Майя также использовали комбинацию дат тцолкин и хааб. Эта комбинация --- цикл примерно в 52 года, назыавемый календарным кругом. Если вы наберете g m p c, Emacs спросит у вас даты хааб и тцолкин и затем переместит точку к предыдущему появлению этой комбинации. Используйте g m n c для перемещения точки к следующему появлению комбинации. Эти команды сообщают об ошибке, если набранная вами комбинация дат хааб/тцолкин невозможна.

При запросе майянской даты Emacs использует строгое завершение (смотрите раздел Строгое завершение), поэтому вам не нужно беспокоиться о правильности написания.

Дневник

С помощью дневника Emacs можно прослеживать назначенные встречи и другие события на ежедневной основе и в совокупности с календарем. Чтобы воспользоваться этими возможностями, вы должны сначала создать файл дневника, содержащий перечень событий и их дат. Тогда Emacs сможет автоматически подобрать и показать вам события на сегодняшний день, на ближайшее будущее или для указанной даты.

По умолчанию в качестве файла дневника Emacs использует файл `~/diary'. Это тот же самый файл, что применяеися в утилите calendar. Вот пример файла `~/diary':

12/22/1988 Twentieth wedding anniversary!!
&1/1. Happy New Year!
10/22 Ruth's birthday.
* 21, *: Payday
Tuesday--weekly meeting with grad students at 10am
 Supowit, Shen, Bitner, and Kapoor to attend.
1/13/89 Friday the thirteenth!!
&thu 4pm squash game with Lloyd.
mar 16 Dad's birthday
April 15, 1989 Income tax due.
&* 15 time cards due.

В данном примере для выравнивания описаний в большинстве вхождений событий использованы пробелы. Такое форматирование полностью является делом вкуса.

Хотя вероятнее всего вы начнете составлять ежедневник вручную, Emacs предоставляет вам несколько команд для просмотра, добавления и изменения записей дневника.

Команды для просмотра записей в дневнике

После того как вы создали файл `~/diary', вы можете просматривать его из календаря. Вы также можете просмотреть список сегодняшних событий извне режима Calendar.

d
Показывает все записи дневника для выбранной даты (view-diary-entries).
Mouse-2 Diary
Показывает все записи дневника для даты, на которой вы щёлкнули.
s
Показывает весь файл дневника (show-all-diary-entries).
m
Помечает все видимые даты, для которых есть записи в дневнике (mark-diary-entries).
u
Убирает метки из окна календаря (calendar-unmark).
M-x print-diary-entries
Печатает твердую копию отображаения дневника в том виде, в каком он есть на экране.
M-x diary
Показывает все вхождения дневника для сегодняшней даты.
M-x diary-mail-entries
Отправляет вам по почте напоминание о предстоящих событиях.

Отображение записей дневника с помощью d показывает в отдельном окне вхождения дневника для выбранной в календаре даты. Строка режима нового окна показывает дату для этих записей и все выпадающие на нее праздники. Если вы зададите для d числовой аргумент, она покажет все записи дневника на указанное число дней. То есть, 2 d покажет все записи для выбранной даты и для следующего дня.

Другой способ просмотреть записи дневника для какой-либо даты --- щёлкнуть на этой дате Mouse-2, а затем выбрать из появившегося меню пункт Diary.

Чтобы получить более широкий обзор упомянутых в календаре дней, используйте команду m. Она показывает даты, для которых в дневнике есть записи, другим начертанием (или помещает после них знак `+', если дисплей не может отобразить несколько начертаний). Эта команда применяется как к видимым в данный момент месяцам, так и к остальным, которые становятся видимыми при последующей прокрутке. Чтобы выключить разметку и стереть текущие метки, нажмите u, что выключает также и метки праздников (смотрите раздел Праздники).

Чтобы увидеть файл дневника полностью, а не только некоторые его вхождения, используйте команду s.

При выводе избранных записей дневника применяется средство выборочного показа, чтобы скрыть ненужные записи.

Буфер дневника в той форме, как вы его видите -- это иллюзия, поэтому простая его печать не даст то, что вы видите на экране. Для получения твердой копии буфера дневника таким, каким он виден, есть особая команда; это команда M-x print-diary-entries. Она посылает данные непосредственно на принтер. Вы можете настраивать её, как lpr-region (смотрите раздел Вывод твердой копии).

Команда M-x diary показывает записи дневника для текущей даты, независимо от того, виден ли календарь, и кроме того, возможно, для нескольких следующих дней; переменная number-of-diary-entries задаёт число включаемых дней. Смотрите раздел `Calendar' в The Emacs Lisp Reference Manual.

Если вы поместите в ваш файл `.emacs' строку (diary), то при входе в Emacs вам будет автоматически показываться окно с записями дневника на сегодняшний день. Строка режима этого окна показывает дату и выпадающие на нее праздники.

Многим пользователям нравится получать напоминания о событиях из ежедневника по почте. Чтобы послать себе такие сообщения, используйте команду M-x diary-mail-entries. Префиксный аргумент указывает, сколько дней (начиная с сегодняшнего) следует проверять; иначе число дней определяется по переменной diary-mail-days.

Файл дневника

Ваш файл дневника -- это файл, в котором записаны события, связанные с определёнными датами. Имя этого файла задаётся переменной diary-file; по умолчанию это `~/diary'. Программа calendar поддерживает подмножество формата, допускаемого средствами дневника в Emacs, так что вы можете использовать эту утилиту для просмотра файла дневника с разумными результатами, если не считать вхождений, которые она не понимает.

Каждая запись в файле дневника описывает одно событие и состоит из одной или нескольких строк. Запись всегда начинается со спецификации даты с левого края. Остальная часть записи -- это просто текст, описывающий событие. Если запись содержит более одной строки, то строки после первой должны начинаться с отступа, как указание на то, что они продолжают предыдущее вхождение. Строки, которые не начинаются с правильной даты и не продолжают предыдущее вхождение, игнорируются.

Вы можете подавить разметку определённых записей из дневника в окне календаря; чтобы сделать так, вставьте в начале записи перед датой знак `&'. Это не влияет на отображение записи в окне дневника; это затрагивает только метки дат в окне календаря. Запрет пометки записи особенно полезен для обобщенных вхождений, которые иначе пометили бы слишком много разных дней.

Если первая строка записи состоит только из даты или названия дня недели, и после нее нет пропусков или пунктуации, то такая строка не выводится в окне дневника; там появляются только строки продолжения. Например, такая запись:

02/11/1989
 Bill B. visits Princeton today
 2pm Cognitive Studies Committee meeting
 2:30-5:30 Liz at Lawrenceville
 4:00pm Dentist appt
 7:30pm Dinner at George's
 8:00-10:00pm concert

появляется в окне дневника без строки с датой в начале. Такой стиль записей выглядит красивее, если вы просматриваете вхождения для одного дня, но может запутать, если вы попросите показать записи для нескольких дней.

Вы можете редактировать записи дневника в том виде, как они появляются в окне, но важно помнить, что этот показанный буфер содержит полный файл дневника, но некоторые его части скрыты из вида. Это означает в частности, что команда C-f (forward-char) может поместить точку в таком месте, которое кажется концом строки, но на самом деле это середина какой-то скрытой строки.

Будьте внимательны при редактировании записей дневника! Вставка новых строк или добавление/удаление знаков в середине видимой строки не могут причинить проблем, но редактирование в конце строки может делать не то, что вы ожидаете. Удаление строки может удалить другие невидимые записи, которые следуют за ней. Перед редактированием дневника лучше всего отобразить файл полностью с помощью команды s (show-all-diary-entries).

Формат дат

Вот несколько примерных записей дневника, иллюстрирующих различные способы форматирования даты. Все эти примеры показывают даты, записанные в американском порядке (месяц, день, год), но режим Calendar поддерживает европейский порядок (день, месяц, год) как альтернативу.

4/20/93 Switch-over to new tabulation system
apr. 25 Start tabulating annual results
4/30 Results for April are due
*/25 Monthly cycle finishes
Friday Don't leave without backing up files

Первая запись появляется только один раз, 20 апреля 1993 года. Вторая и третья появляются каждый год в заданные дни, а четвертая использует для месяца символ подстановки (звездочку), поэтому она появляется 25-го числа каждого месяца. Последняя запись появляется каждую неделю в пятницу.

Для выражения даты вы можете использовать только числа, как `месяц/день' или `месяц/день/год'. После этого должна идти не-цифра. В самой дате, месяц и день должны быть однозначными или двузначными числами. Необязательный год -- это тоже число, его можно сокращать до последних двух цифр; то есть вы можете писать как `11/12/1989', так и `11/12/89'.

Даты также можно записывать в формате `название-месяца день' или `название-месяца день, год', где название месяца можно писать полностью или сокращать до трех букв (с точкой или без). Регистр значения не имеет.

Дата может быть обобщенной, то есть частично недоопределенной. Тогда она применяется ко всем датам, соответствующим спецификации. Если дата не содержит год, то она обобщенная и относится ко всем годам. Или же месяц, день или год могут быть знаком `*'; это соответствует любому месяцу, дню или году. Таким образом, вхождение дневника `3/*/*' соответствует любому дню марта в каждом году; то же и для `march *'.

Если вы предпочитаете европейский стиль написания дат -- когда день идет перед месяцем -- наберите в календаре M-x european-calendar или установите переменную european-calendar-style в значение t перед использованием любой команды календаря или дневника. Этот режим интерпретирует все даты в дневнике в европейском стиле, а также применяет европейский стиль при отображении дат дневника. (Заметьте, что после названия-месяца в европейском стиле нет запятой.) Чтобы вернуться к американскому (принимаемому по умолчанию) стилю написания дат, наберите M-x american-calendar.

Вы можете использовать название дня недели в качестве обобщенной даты, которая относится к любой дате, приходящейся на этот день недели. Названия дней недели можно сокращать до трех букв (с точкой или без) или писать полностью; регистр значения не имеет.

Команды для добавления к дневнику

Когда вы находитесь в календаре, вам доступны несколько команд для создания записей в дневнике:

i d
Добавляет в дневник запись для выбранной даты (insert-diary-entry).
i w
Добавляет в дневник запись для выбранного дня недели (insert-weekly-diary-entry).
i m
Добавляет в дневник запись для выбранного дня месяца (insert-monthly-diary-entry).
i y
Добавляет в дневник запись для выбранного дня года (insert-yearly-diary-entry).

Вы можете создать в дневнике запись для конкретной даты, выбрав эту дату в окне календаря и выполнив команду i d. Эта команда показывает конец вашего файла дневника в другом окне и вставляет дату; затем вы можете напечатать остальную часть записи.

Если вы хотите сделать в дневнике запись, которая относится к какому-то дню недели, выберите этот день (можно любое его появление) и наберите i w. Это вставит название дня недели как обобщенную дату; потом вы можете ввести остальную часть записи. Таким же способом вы можете создать ежемесячную запись. Выберите день месяца, примените команду i m и введите остаток записи. Аналогично вы можете вставить ежегодную запись при помощи команды i y.

Все описанные выше команды по умолчанию создают помечаемые записи. Чтобы сделать в дневнике непомечаемую запись, дайте команде числовой аргумент. Например, C-u i w создаёт в дневнике непомечаемую еженедельную запись.

Когда вы измените файл дневника, убедитесь, что вы сохранили его перед выходом из Emacs.

Особые записи дневника

Помимо вхождений, основанных на календарных датах, файл дневника может содержать sexp-вхождения для регулярных событий, таких как годовщины. Такие записи основаны на лисповских выражениях (s-выражениях), которые Emacs выполняет по мере сканирования файла дневника. Вместо даты sexp-вхождение содержит строку `%%', за которой идет лисповское выражение, заключенное в круглые скобки. Это выражение определяет, к каким датам относится данная запись.

Режим Calendar предоставляет команды для вставки некоторых часто используемых sexp-вхождений:

i a
Добавляет в дневник запись о годовщине события для текущей даты (insert-anniversary-diary-entry).
i b
Добавляет блочную запись дневника для текущей области (insert-block-diary-entry).
i c
Добавляет циклическую запись дневника, начинающуюся от текущей даты (insert-cyclic-diary-entry).

Если вы хотите создать в дневнике запись, которая относится к годовщине какой-то даты, переместите точку к этой дате и используйте команду i a. Это покажет конец вашего файла дневника в другом окне и вставит описание годовщины; затем вы можете набрать остальную часть записи. Запись выглядит так:

%%(diary-anniversary 10 31 1948) Arthur's birthday

Эта запись относится к 31 октября каждого года после 1948; `10 31 1948' задаёт дату. (Если вы используете европейский стиль календаря, месяц и день меняются местами.) Причина того, что это выражение требует указания начального года, состоит в том, что продвинутые функции календаря могут использовать его для подсчета истекших лет.

Блочная запись дневника применяется к заданному промежутку последовательных дат. Вот блочная запись, которая относится ко всем датам от 24 июня 1990 до 10 июля 1990 года.

%%(diary-block 6 24 1990 7 10 1990) Vacation

`6 24 1990' обозначает начальную дату, а `7 10 1990' --- конечную. (Опять же, если вы используете европейский стиль календаря, месяц и день меняются местами.)

Чтобы вставить блочную запись, поместите точку и метку на двух датах, которые начинают и завершают промежуток, и наберите i b. Эта команда показывает конец вашего файла дневника в другом окне и вставляет описание блока; потом вы можете напечатать остальную часть записи.

Циклические записи дневника повторяются после фиксированного интервала дней. Чтобы создать такую запись, выберите начальную дату и используйте команду i c. Эта команда спросит у вас длину интервала, а затем вставит запись, выглядящую следующим образом:

%%(diary-cyclic 50 3 1 1990) Renew medication

Эта запись относится к 1 марта 1990 года и к каждому 50-ому последующему дню; `3 1 1990' задаёт начальную дату. (Если вы используете европейский стиль календаря, месяц и день меняются местами.)

Все три эти команды создают помечаемые записи. Чтобы вставить непомечаемую запись, дайте команде числовой аргумент. Например, C-u i a создаёт непомечаемую запись для годовщины некоторого события.

Пометка sexp-вхождений дневника в календаре чрезвычайно требовательна ко времени, поскольку должна быть отдельно проверена каждая видимая в окне календаря дата. Поэтому лучше делать sexp-вхождения дневника непомечаемыми (с `&'), если возможно.

Другой, усложненный вид sexp-вхождения, плавающая запись, задаёт регулярно случающееся событие по сдвигу, выраженному в днях, неделях и месяцах. Её можно сравнить с записями crontab, интерпретируемыми утилитой cron. Вот непомечаемая плавающая запись, которая относится к последнему четвергу ноября:

&%%(diary-float 11 4 -1) American Thanksgiving

Число 11 обозначает ноябрь (одиннадцатый месяц), 4 обозначает четверг (четвёртый день недели, где воскресенье считается нулем), а -1 обозначает "последний" (1 обозначало бы "первый", 2 обозначало бы "второй", -2 -- "предпоследний" и так далее). Месяц может быть единственным или списком месяцев. Таким образом, вы могли бы изменить 11 выше на `'(1 2 3)' и получить запись, относящуюся к последнему четвергу января, февраля и марта. Если месяц задан как t, запись относится ко всем месяцам года.

В самом общем виде, sexp-вхождения дневника могут производить для определения своей применимости любые вычисления. Смотрите раздел `Sexp Diary Entries' в The Emacs Lisp Reference Manual.

Напоминания о назначенных событиях

Если у вас в дневнике есть запись о назначенном событии, и эта запись начинается с распознаваемого описания времени, Emacs может предупредить вас за несколько минут о приближении этого времени. Emacs предупреждает вас о назначении, показывая сообщение в строке режима.

Чтобы включить напоминание о назначенных событиях, вы должны задействовать средство Emacs для показа времени, M-x display-time (смотрите раздел Строка режима). Вы также должны добавить к ловушке diary-hook функцию appt-make-list следующим образом:

(add-hook 'diary-hook 'appt-make-list)

Помещение такого текста в ваш файл `.emacs' делает все сразу:

(display-time)
(add-hook 'diary-hook 'appt-make-list)
(diary 0)

Если сделана такая подготовка, то когда вы отображаете дневник (с помощью команды d в окне календаря или через M-x diary), для всех записей дневника, в которых есть распознаваемые описания времени, настраивается список назначенных событий, и перед каждым из них вам делается напоминание.

Предположим например, что файл дневника содержит такие строки:

Monday
 9:30am Coffee break
 12:00pm Lunch

Тогда по понедельникам, после того, как вы отобразите дневник, вам будут напоминать в 9:20 о перерыве для кофе и в 11:50 об обеде.

Вы можете записывать время в стиле am/pm (где `12:00am' обозначает полночь, а `12:00pm' -- полдень) или в двадцатичетырехчасовом европейском/военном стиле. Необязательно быть постоянным; файл дневника может содержать смесь этих двух стилей.

Emacs автоматически обновляет список напоминаний сразу после полуночи. Это также отображает в буфере дневника записи для следующего дня, если только вы не установили appt-display-diary равной nil.

Вы также можете использовать средства напоминания о назначенных событиях в качестве будильника. Команда M-x appt-add добавляет записи в список напоминаний, не затрагивая ваш файл дневника. Для удаления записей из списка напоминаний применяется команда M-x appt-delete.

Вы можете в любое время выключить средство напоминания о назначенных событиях, установив appt-issue-message в значение nil.

Сезонный перевод времени

Emacs понимает разницу между стандартным и сезонным временем --- времена, выдаваемые для восходов и закатов Солнца, солнцестояний, равноденствий и фаз Луны, учитывают его. Правила сезонного перевода времени меняются от места к месту и кроме того колебались исторически от года к году. Чтобы делать свою работу правильно, Emacs должен знать, какое правило использовать.

Некоторые операционные системы отслеживают правила, применяющиеся в той местности, где вы находитесь; на таких системах Emacs получает необходимую информацию от системы автоматически. Если часть этой информации или вся она неизвестна, Emacs заполняет пробелы правилами, используемыми в данное время в Кембридже, Массачусетс. Если получившиеся правила -- это не то, что вы хотите, вы можете сообщить Emacs нужные правила, устанавливая определённые переменные: calendar-daylight-savings-starts и calendar-daylight-savings-ends.

Значениями этих переменных должны быть лисповские выражения, ссылающиеся на переменную year и вычисляющие григорианскую дату перехода на зимнее и летнее время в форме списка (месяц день год). Эти значения должны быть равны nil, если в вашей местности не бывает сезонного перевода времени.

Emacs использует эти выражения для определения даты перевода времени при создании списка праздников и для корректровки времени при вычислениях, связанных с Луной и Солнцем.

Для массачусетского Кембриджа эти значения таковы:

(calendar-nth-named-day 1 0 4 year)
(calendar-nth-named-day -1 0 10 year)

Это обозначает первый нулевой день недели (воскресенье) четвертого месяца (апреля) в году, задаваемом переменной year, и последнее воскресенье десятого месяца (октября) в этом же году. Если момент перевода времени сменился бы на 1 октября, вы установили бы переменную calendar-daylight-savings-starts в такое значение:

(list 10 1 year)

Если в вашей местности время не переводится, или если вы хотите получать всегда стандартное время, установите calendar-daylight-savings-starts и calendar-daylight-savings-ends равными nil.

Переменная calendar-daylight-time-offset задаёт разницу во времени после перевода, измеряемую в минутах. Для массачусетского Кембриджа это 60.

Переменные calendar-daylight-savings-starts-time и calendar-daylight-savings-ends-time задают число минут после полуночи по местному времени, когда происходит перевод часов. Для массачусетского Кембриджа значения обоих этих переменных равны 120.

Назад |  Вперед |  Содержание



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024