GNUEmacsManual:28

From 흡혈양파의 번역工房
Jump to: navigation, search
캘린더와 다이어리(The Calendar and the Diary)

캘린더와 다이어리(The Calendar and the Diary)

Emacs는 미래 또는 과거 이벤트가 포함된 다이어리와 함께 데스크 캘린더 기능을 제공한다. 이는 약속을 관리하고, 특정 프로젝트에 소요된 시간을 추적하는 기능을 제공한다.


캘린더를 사용하기 위해 M-x calendar 를 입력하면 이번 달을 중심으로 3개월이 표시된 캘린더가 나타나고 포인트는 오늘 날짜에 위치한다. C-u M-x calendar 에서처럼 수치적 인자를 이용하면 3개월 캘린더의 중심에 위치시킬 월(month) 및 연도(year)를 입력할 수 있다. 캘런더는 고유의 버퍼를 사용하며 버퍼의 주 모드는 Calendar 모드이다.


캘린더에서 Mouse-3 을 이용하면 특정 일자에 사용 가능한 연산의 메뉴를 불러오고, Mouse-2 를 이용하면 특정 일자와 상관없이 공통적으로 사용되는 캘린더 기능 메뉴를 가져온다. 캘린더를 종료하려면 q 를 입력한다.


이번 장에서는 기본적인 캘린더 기능을 설명한다. 고급 주제는 Specialized Emacs Features 의 "Advanced Calendar/Diary Usage"절을 참고한다.


캘린더에서 이동(Movement in the Calendar)

캘린더 모드는 일, 주, 월, 년의 논리적 시간 단위로 캘린더를 이동하는 명령어를 제공한다. 처음에 표시되는 3개월을 벗어난 위치로 이동할 경우 캘린더 화면은 선택된 일자를 표시하기 위해 자동으로 시간을 "스크롤"한다. 날짜로 이동하면 휴일이나 다이어리 엔트리를 확인하거나 다른 캘린더로 변환하며, 긴 시간만큼 이동하는 것은 캘린더를 스크롤하는 데에 유용하다.

표준 시간만큼 이동(Motion by Standard Lengths of Time)

캘린더 버퍼 내에서 이동을 위한 명령어는 텍스트 내에서 이동하는 데에 사용되는 명령어와 일치한다. 일, 주, 월, 년을 단위로 순방향 또는 역방향으로 이동할 수 있다.


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


일(day)과 주(week) 명령어는 문자별 그리고 라인별로 이동하는 데 사용되는 Emacs 문자열과 비슷하다. C-n 에서와 같이 다음 라인에서 동일한 열로 이동하고, Calendar 모드에서는 다음주에서 동일한 요일로 이동한다. C-p 는 전주에서 동일한 요일로 이동한다.


화살표 키는 C-f, C-b, C-n, C-p 와 같고 다른 모드에서와 동일하게 작동한다.


월(month)별 또는 연별(year)로 이동하는 명령어도 주별로 이동하는 명령어와 동일하게 작동하지만 이동 거리가 크다는 것이 차이다. M-}M-{ 명령어는 전체 월만큼 순방향 또는 역방향으로 이동한다. 연도 명령어인 C-x ]C-x [ 는 전체 연도를 순방향 또는 역방향으로 이동한다.


이러한 명령어를 기억하는 가장 쉬운 방법은 월과 연도를 각각 텍스트의 문단과 페이지로 생각하는 것이다. 하지만 명령어가 동일한 것은 아니다. 일반 Emacs 문단 명령어들은 문단의 시작이나 끝으로 이동하는 반면 월과 연도 명령어들은 전체 월 또는 연도만큼 이동하면서 월 또는 연도 내에 동일한 일자를 유지한다.


이러한 명령어들은 모두 수치적 인자를 반복 계수로 실행한다. 편의상 숫자 키와 마이너스 부호는 Meta 수식키 없이도 Calendar 모드에서 수치적 인자를 명시한다. 예를 들어 100 C-f 는 현재 위치에서 포인트를 100일만큼 순방향으로 이동시킨다.


주, 월, 연도의 시작과 끝(Beginning or End of Week, Month or Year)

주(또는 월 또는 연도)는 요일의 수에 해당할 뿐만 아니라 특정 일자부터 시작해 몇 주(몇 달, 몇 년)라는 개념도 생각한다. 따라서 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
).


이러한 명령어들은 수치적 인자를 반복 계수로 취하고, 반복 계수는 주, 월, 년을 얼만큼 순방향 또는 역방향으로 이동시킬 것인지 나타낸다.


기본적으로 일주일은 Sunday 에서 시작한다. Monday 부터 시작하도록 만들고 싶다면
calendar-week-start-day
변수를 1로 설정한다.


명시된 일자 (Specified Dates)

Calendar 모드는 다양한 방식으로 명시된 날짜에 이동하는 명령어를 제공한다.


g d
명시된 일자로 포인트를 이동한다(
calendar-goto-date
).


g D
명시된 연중 날짜로 포인트를 이동한다(
calendar-goto-day-of-year
).


g w
명시된 연중 주(week)로 포인트를 이동한다(
calendar-iso-goto-week
).


o
명시된 월을 중심으로 캘린더를 표시한다(
calendar-other-month
).


.
오늘 날자로 포인트를 이동한다(
calendar-goto-today
).


g d (
calendar-goto-date
)는 연도, 월, 요일을 입력하도록 요청한 뒤 해당 일자로 이동한다. 캘린더는 현대 시작부터 모든 일자를 포함하므로 연도를 '
90
' 이 아니라 '
1990
' 과 같이 분명하게 입력해야 한다.


g D (
calendar-goto-day-of-year
)는 연도와 날짜 번호의 입력을 요청한 뒤 해당 날짜로 이동한다. 음수로 된 날짜 번호는 연도 끝에서부터 역방향으로 수를 센다. g w (
calendar-iso-goto-week
)는 연도와 주 번호를 입력하도록 요청한 뒤 해당하는 주로 이동한다.


o (
calendar-other-month
) 는 월과 연도를 입력하도록 요청하여 해당하는 월을 중심으로 3개월의 캘린더를 표시한다.


.(마침표) (
calendar-goto-today
)를 이용해 오늘 날짜로 돌아갈 수 있다.


캘린더에서 스크롤하기(Scrolling in the Calendar)

캘린더 디스플레이는 사용자가 화면 밖으로 이동하면 자동으로 시간을 스크롤한다. 수동으로 스크롤하는 방법도 있다. 캘린더 창에 월별로 표시된 긴 종이가 포함되어 있다고 상상해보자. 캘린더를 스크롤하면 종이를 가로로 이동함을 의미하므로 새로운 달(months)이 창에 표시될 것이다.


>
캘린더를 한 달만큼 앞으로 스크롤한다(
calendar-scroll-left
).


<
캘린더를 한 달만큼 뒤로 스크롤한다(
calendar-scroll-right
).


C-v
next
캘린더를 세 달만큼 앞으로 스크롤한다(
calendar-scroll-left-three-months
).


M-v
prior
캘린더를 세 달만큼 뒤로 스크롤한다(
calendar-scroll-right-three-months
).


가장 기본적인 캘린더 스크롤 명령어들은 한 번에 한 달만큼 스크롤한다. 즉, 명령어를 사용하기 전에 디스플레이와 후에 디스플레이에는 두 달이 중복됨을 의미한다. > 는 캘린더 내용을 한 달만큼 앞으로 스크롤한다. < 는 내용을 한 달만큼 뒤로 스크롤한다.


C-vM-v 명령어는 일반적인 사용과 마찬가지로 캘린더 전체 "화면을(screenful)", 즉 3개월만큼 스크롤한다. C-v 는 이후 날짜를 보이게 만들고 M-v 는 이전 날짜를 보이게 만든다. 이러한 명령어들은 수치적 인자를 반복 계수로 취하는데, 특히 C-u 는 뒤따라 사용하는 명령어에 4를 곱하므로 C-u C-v 는 캘린더를 한 해만큼 앞으로 스크롤하고, C-u M-v 는 한 해만큼 뒤로 스크롤한다.


nextprior 기능키(function key)는 다른 모드에서 C-vM-v 를 사용하는 것과 같다.


요일 세기(Counting Days)

M-=
현재 영역 내 요일 수를 표시한다(
calendar-count-days-region
).


영역 내에 요일의 수를 결정하려면 C-SPC 를 이용해 하나의 날짜에 마크를 설정하고 포인트를 다른 날짜로 이동시킨 후 M-= (
calendar-count-days-region
) 을 입력한다. 표시되는 요일 수는 inclusive(포괄적)이므로, 마크와 포인트가 명시하는 요일도 포함한다.


다양한 캘린더 명령어(Miscellaneous Calendar Commands)

p d
day-in-year 를 표시한다(
calendar-print-day-of-year
).


C-c C-l
캘린더 창을 다시 만든다(
calendar-redraw
).


SPC
다음 화면으로 스크롤 업을 실행한다(
scroll-other-window
).


DEL
S-SPC
다음 화면으로 스크롤 다운을 실행한다(
scroll-other-window-down
).


q
캘린더를 종료한다(
calendar-exit
).


연도의 시작부터 며칠이 지났는지 혹은 연도에서 며칠이 남았는지 표시하려면 p d 명령어를 입력한다(
calendar-print-day-of-year
). 그러면 2개의 숫자가 에코 영역에 표시된다. 경과된 시간은 선택된 날짜를 포함하지만 남은 시간은 선택된 날짜를 포함하지 않는다.


캘린더 창 텍스트가 잘못된 경우 C-c C-l (
calendar-redraw
)을 입력하여 다시 표시한다. (non-Calendar-mode 편집 명령어를 사용할 때에만 발생한다)


Calendar 모드에서는 SPC (
scroll-other-window
)와 DEL (
scroll-other-window-down
)을 이용해 다른 창(존재할 경우)을 위로 혹은 아래로 스크롤한다. 이 기능은 휴일 또는 다이어리 엔트리 목록을 다른 창에 표시할 때 편리한 기능이다.


캘린더에서 벗어나려면 q (
calendar-exit
)를 입력한다. 그러면 캘린더와 관련된 버퍼를 모두 bury하고 나머지 버퍼들이 선택된다. (프레임이 전용 캘린더 창을 포함하고 있을 때 캘린더를 종료하면
calendar-remove-frame-by-deleting
값에 따라 해당 프레임을 삭제하거나 아이콘으로 바꾼다.)


캘린더 파일 작성하기(Writing Calendar Files)

캘린더와 다이어리 엔트리는 HTML 과 LaTeX 파일로 작성할 수 있다.


Calendar HTML 명령어는 캘린더, 휴일, 다이어리 엔트리를 포함하는 HTML 코드의 파일을 생성한다. 각 파일은 하나의 월(month)에 적용되고
yyyy-mm.html
포맷의 이름을 가지는데 여기서 yyyymm 은 각각 네 자리 수의 연도와 두 자리 수의 월을 나타낸다.
cal-html-directory
변수는 HTML 파일에 대한 기본 출력 디렉터리를 명시한다. 휴일을 표시하지 않으려면
cal-html-holidays
를 맞춤화한다.


<
>
사이에 포함된 다이어리 엔트리는 HTML 태그로 해석된다(예: 이것은 <font color="red">some red text</font> 를 이용한 다이어리 엔트리다). 표시된 HTML 페이지의 모양(예: 다양한 페이지 요소의 색상이나 헤더 스타일)은 HTML 파일을 포함하는 디렉터리에서
cal.css
라는 스타일시트를 통해 변경할 수 있다(관련된 스타일 설정은
cal-html-css-default
변수의 값을 참조).


H m
한달 달력을 생성한다({{RoundTitleNavy|cal-html-cursor-month).


H y
한 해의 월마다 캘린더 파일과 색인 페이지를 생성한다(
cal-html-cursor-year
). 기본적으로 이 명령어는 yyyy 하위디렉터리로 파일을 작성하는데, 이 값을 수정할 경우 연도 사이에 위치하는 일부 하이퍼링크가 작동하지 않을지도 모른다.


cal-html-print-day-number-flag
변수가
nil
값이 아닌 경우 월별 달력은 {{RoundTitleNavy|
day-of-the-year
숫자를 표시한다.
cal-html-year-index-cols
변수는 연별 색인 페이지에 열 변호를 명시한다.


Calendar LaTeX 명령어는 캘린더로 출력되는 LaTeX 코드의 버퍼를 생성한다. 출력되는 캘린더는 사용되는 명령어에 따라 포인트가 위치하는 일, 주, 월, 또는 연도에 적용된다.


t m
한달 캘린더를 생성한다(
cal-tex-cursor-month
).


t M
측면으로 출력되는(sideways-printing) 한달 캘린더를 생성한다(
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-style 캘린더를 시간을 표시하지 않고 생성한다(
cal-tex-cursor-week-iso
).


t w 4
Monday 로 시작하는 한 주마다 캘린더를 시간 표시와 함께 생성한다(
cal-tex-cursor-week-monday
).


t w W
한 주마다 두 페이지로 된 캘린더를 시간을 표시하지 않고 생성한다(
cal-tex-cursor-week2-summary
).


t f w
Filofax-style two-weeks-at-a-glance 캘린더를 생성한다(
cal-tex-cursor-filofax-2week
).


t f W
Filofax-style one-week-at-a-glance 캘린더를 생성한다(
cal-tex-cursor-filofax-week
).


t y
한 해를 나타내는 캘린더를 표시한다(
cal-tex-cursor-year
).


t Y
한 해를 나타내는 측면 출력되는(sideways-printing) 캘린더를 생성한다(
cal-tex-cursor-year-landscape
).


t f y
한 해를 나타내는 Filofax-style 캘린더를 생성한다(
cal-tex-cursor-filofax-year
).


이러한 명령어 중 일부는 calendar sideways("landscape mode"에서) 인쇄하므로 세로 길이보다 가로 길이가 길 수 있다. 그 중 일부는 Filofax 용지 크기를 사용한다(3.75in x 6.75in). 위의 명령어는 모두 수치적 인자를 허용하며, 얼마나 많은 요일, 주, 월, 또는 연도를 출력할 것인지 명시한다(항상 선택된 일자부터 시작).


cal-tex-holidays
변수가
nil
이 아닌 값(기본값)일 경우 인쇄된 캘린더는
calendar-holidays
에 휴일을 표시한다.
cal-tex-diary
변수가
nil
이 아닌 경우 (기본값은
nil
), 다이어리 엔트리도 포함된다(월별, Filofax, iso-week 캘린더에만 해당).
cal-tex-rules
변수가
nil
이 아닌 경우 (기본값은
nil
), 캘린더는 충분한 공간이 있는 스타일로 줄이 쳐진(ruled) 페이지를 표시한다. 이러한 기능을 지원하는 캘린더를 확인하려면 각 cal-tex 함수의 문서를 참고한다.


필요하다면
cal-tex-preamble-extra
변수를 이용해 생성된 문서의 서문에 추가로 LaTeX 명령어를 삽입할 수 있다.


휴일(Holidays)

Emacs 캘린더는 크고 작은 휴일을 인식하고 표시할 수 있다. 기본 목록에 사용자만의 휴일을 추가하는 기능도 있다.


Mouse-3 Holidays

h
선택된 일자에 해당하는 휴일을 표시한다(calendar-cursor-holidays).
x
캘린더 창에 휴일을 마크한다(calendar-mark-holidays).
u
캘린더 창에 휴일의 마크를 해제한다(calendar-unmark).
a
표시된 3개월에 해당하는 휴일을 모두 다른 창에 열거한다(calendar-list-holidays).


M-x holidays
오늘 날짜를 중심으로 3개월 동안 휴일을 모두 다른 창에 열거한다.


M-x list-holidays
명시된 연도 범위의 휴일을 모두 다른 창에 열거한다.


주어진 날짜에 해당하는 휴일을 확인하려면 캘린더 창의 해당 날짜에 포인트를 위치시키고 h 명령어를 사용한다. 아니면 Mouse-3 으로 해당 날짜를 클릭하여 표시되는 메뉴에서
Holidays
를 선택해도 된다. 어떤 방법을 사용하든 해당 날짜에 해당하는 휴일이 에코 영역에 들어맞으면 그곳에 표시하고, 크기가 맞지 않으면 별도의 창에 표시한다.


캘린더에 표시된 모든 날짜의 휴일을 확인하려면 x 명령어를 사용한다. 이는 휴일이 있는 날짜를 다른 겉모습(face)으로 표시한다. Specialized Emacs Features 의 "Calendar Customizing" 절을 참고한다. 명령어는 현재 표시된 월, 그리고 스크롤하여 다음으로 표시되는 월에 모두 적용된다. 마크를 끄고 현재 마크를 제거하려면 u 를 입력하면 되는데, 그럴 경우 다이어리 마크까지 모두 삭제될 것이다(341 페이지의 28.10절 [다이어리(Diary)] 참고).
calendar-mark-holidays-flag
변수가 non-
nil
값인 경우 캘린더를 생성하거나 업데이트하면 자동으로 휴일을 마크한다.


좀 더 상세한 정보를 얻기 위해 a 명령어를 사용하면 현재 3개월 범위의 모든 휴일 목록을 포함하는 별도의 버퍼를 표시한다. 캘린더 창에서 SPCDEL 을 사용하면 목록을 각각 스크롤 업, 스크롤 다운할 수 있다.


M-x holidays 명령어는 이번 달, 지난달, 다음 달의 휴일 목록을 표시하는데, 캘린더 창이 없을 때에도 작동한다.
calendar-view-holidays-initially-flag
변수가
nil
이외의 값일 경우 캘린더를 생성하면 휴일을 이런 방식으로 표시한다. 이번 달을 중심으로 휴일 목록을 표시하길 원한다면 C-u M-x holidays 를 사용할 수 있는데, 이는 월과 연도의 입력을 요할 것이다.


Emacs 에는 미국 휴일, 그리고 바하이교, 중국, 기독교, 이슬람교, 유대교의 주요 휴일을 비롯해 지점(solstices)과 분점(equinoxes)도 포함되어 있다.


M-x holiday-list 명령어는 여러 해를 범위로 한 휴일 목록을 표시한다. 이 함수는 시작하는 연도와 끝나는 연도를 질문하고, 사용자가 휴일의 여러 범주 중에서 하나 또는 모두를 선택하도록 허용한다. 캘린더 창이 없을 때에도 이 명령어를 사용할 수 있다.


Emacs 가 휴일에 사용하는 날짜는 역사적 사실이 아니라 현행 관습(current practice)을 기반으로 한다. 가령 재향 군인의 날은 1919년에 시작했지만 그 전 달력에도 매년 표시된다.


일출 및 일몰 시간(Times of Sunrise and Sunset)

특수 캘린더 명령어들은 어떤 날짜든 일출 및 일몰 시간을 1-2분 이내에 알려줄 수 있다.


Mouse-3 Sunrise/sunset

S
선택된 날짜의 일출 및 일몰 시간을 표시한다(
calendar-sunrise-sunset
).


M-x sunrise-sunset
오늘 날짜의 일출 및 일몰 시간을 표시한다.


C-u M-x sunrise-sunset
명시된 날짜의 일출 및 일몰 시간을 표시한다.


M-x calendar-sunrise-sunset-month
선택된 달의 일출 및 일몰 시간을 표시한다.


캘린더 안에서 일출 및 일몰이 발생하는 지역 시간(local time)을 에코 영역에 표시하려면 원하는 날짜로 포인트를 이동하여 S 를 입력한다. 아니면 날짜에서 Mouse-3 을 클릭하여 나타나는 메뉴에서 'Sunrise/sunset'을 선택한다. M-x sunrise-sunset 명령어를 이용하면 캘린더 밖에서도 명시된 날짜 또는 오늘 날짜에 관한 이 정보를 표시할 수 있다. 오늘을 제외한 날짜를 명시하기 위해서는 C-u M-x sunrise-sunset 을 이용하면 연, 월, 일을 입력하도록 요구할 것이다.


C-u C-u M-x sunrise-sunset 을 이용하면 어떤 위치와 어떤 날짜든 일출 및 일몰 시간을 표시할 수 있다. 이 명령어를 사용하면 협정세계시(Coordinated Universal Time)와의 경도, 위도, 분(minute) 차이와 날짜를 요청하고, 해당 일자에 해당 위치에서 일출 및 일몰 시간을 알려준다.


일출 및 일몰 시간은 지구상 위치에 따라 다르기 때문에 이러한 명령어를 사용하기 전에 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
값은 지역 표준 시간과 협정세계시(Coordinated Universal Time; 그리니치 표준시)의 차이를 분으로 표시한다.
calendar-standard-time-zone-name
calendar-daylight-time-zone-name
의 값은 당신의 시간대에서 사용되는 약어이다. Emacs는 서머타임제에 맞게 수정된 일출과 일몰의 시간을 표시한다. 서머타임제를 어떻게 결정하는지는 347 페이지의 28.13절 [서머타임(Daylight Saving)]을 참고한다.


사용자에게는 .emacs 파일에서 물리적 위치에 대한 캘린더 위치 변수를 설정하는 것이 편리할 것이다. 하지만 시스템 운영자라면 모든 사용자를 위해 이러한 변수들을 default.el 파일에서 설정하길 원할 것이다. 437 페이지의 33.4절 [Init 파일(Init File)] 을 참고한다.


달의 위상(Phases of the Moon)

이러한 캘린더 명령어들은 달의 위상에 대한 날짜와 시간을 표시한다(초승달, 상현달, 보름달, 하현달). 이 기능은 "달의 위상에 따라 좌우되는" 디버깅 문제에 유용하다.


M
표시된 3개월 동안 네 가지 달 위상의 날짜와 시간을 표시한다(
calendar-lunar-phases
).


M-x lunar-phases
오늘 날짜를 중심으로 3개월 동안 네 가지 달 위상의 날짜와 시간을 표시한다.


캘린더 안에서 M 명령어를 사용하면 현재 3개월 범위에서 달의 위상에 대해 구분된 버퍼를 표시한다. 열거된 날짜와 시간은 몇 초 이내까지 정확하다.


캘린더 밖에서 M-x lunar-phases 명령어를 사용하면 현재 월, 전월과 다음월에 대한 달의 위상 목록을 표시한다. 다른 달(month)에 관한 정보는 C-u M-x lunar-phases 를 사용하면 월과 연도를 입력하도록 요할 것이다.


달의 위상에 주어진 날짜와 시간은 지역 시간으로 제공된다(일광 절약 시간에 알맞게 수정되어). 관련 내용은 이전 절을 참고한다. 또한 336 페이지의 28.7절 [일출/일몰(Sunrise/Sunset)]을 참고한다.


다른 캘린더와의 변환(Conversion To and From Other Calendars)

표시되는 Emacs 캘린더는 항상 그레고리력(Gregorian calendar)으로, 오늘날 전세계 거의 모든 곳에서 사용되며, "새로운 스타일(new style)"의 달력이라고 불리기도 한다. 하지만 이 달력은 16세기 전에는 존재하지 않았고 18세기 이전에는 널리 사용되지도 않았으며, 20세기 초반까지는 율리우스력을 완전히 대체하지도 그렇다고 보편적으로 인정을 받지도 못했다. Emacs 캘린더는 현시대의 1년 1월부터 어떤 월이든 표시할 수 있지만 표시되는 캘린더는 항상 그레고리력으로서 그레고리력이 존재하지 않았던 날짜를 표시하더라도 마찬가지다.


Emacs는 다른 캘린더를 표시할 수는 없지만 여러 캘린더와 양방향으로 날짜를 변환할 수는 있다.


지원되는 캘린더 시스템(Supported Calendar Systems)

비즈니스용으로는 ISO 상업용 캘린더가 자주 사용된다.


율리우스 카이사르의 이름을 딴 율리우스력은 중세시대에 유럽에서 사용되다가 19세기까지 많은 국가에서 사용되었다.


천문학자들은 율리우스력에서 기원전 4713년 1월 1일 월요일 정오부터 경과한 일수를 사용한다. 경과 일수를 율리우스 일(Julian day number) 또는 천문일(Astronomical day number)이라고 부른다.


유대력(Hebrew calendar)은 전통에 따라 유대교에서 사용된다. Emacs 캘린더 프로그램은 유대인들의 휴일을 계산하기 위해 유대력을 사용한다. 유대력은 일몰부터 하루가 시작하여 다음 일몰에 끝이 난다.


이슬람력은 주로 다수의 이슬람국에서 사용된다. Emacs는 이슬람 휴일을 결정하기 위해 사용된다. 이슬람 세계에서는 캘린더에 대한 보편적 합의가 이루어지지 않고 있지만 Emacs는 가장 널리 사용되는 버전을 사용하며, 이슬람 휴일의 정확한 날짜는 계산에 따르지 않고 종교 권위 단체의 선언에 따라 좌우되곤 한다. 그 결과 의식의 실제 날짜와 Emacs가 계산한 날짜가 약간씩 다르기도 하다. 이슬람력의 하루는 일몰에 시작하여 끝난다.


프랑스 혁명력은 1789년 혁명 이후 세속적이고 자연을 기반으로 한 연 주기를 표현하고 10일로 이루어진 주를 미터법과 비슷한 합리화 치수로 나타내기 위해 Jacobins가 만든 달력이다. 프랑스 정부는 1805 말부터 공식적으로 이 달력을 파기하였다.


중앙 아메리카의 마야에서는 구분되어 있지만 중복된 3개의 캘린더 시스템을 사용하는데, long count, tzolkin, haab이 그것들이다. Emacs는 세 가지 캘린더에 대해 모두 알고 있다. 전문가들은 마야력과 우리 달력의 정확환 상관관계에 대해 논쟁하고 있는데, Emacs는 계산 시 Goodman-Martinez-Thompson 상관관계를 사용한다.


콥트 사람들은 고대 이집트인의 태양력을 바탕으로 달력을 사용한다. 그들의 달력은 30일로 된 12개월 뒤에 5일이 추가된다. 4년마다 이 5일 기간에 윤일이 추가되어 6일이 된다. 에티오피아력도 이와 구조는 동일하나 연도 수와 월 이름이 다르다.


페르시아인들은 Omar Khayyam의 디자인을 바탕으로 양력을 사용한다. 이들의 달력은 12개월로 구성되고, 처음 6개월은 31일을, 나머지 5개월은 30일, 마지막 1개월은 평년의 경우 29일로, 윤년의 경우 30일로 구성된다. 윤년은 4-5년마다 복잡한 패턴으로 발생한다. 여기서 구현되는 캘린더는 2,820년 주기를 바탕으로 Birashk가 내세운 산술적 페르시아력이다. 이는 천문학적 사건을 바탕으로 한 천문학적 페르시아력(Persian calendar)과는 차이가 있다. 이 글을 작성하는 시점부터 첫 차이는 2025년 3월 20에 발생할 것이다. 이란(Iran)의 공식 달력이 그때 무엇을 할 것인지는 현재 명확하지 않다.


태음 태양력(Chinese calendar)은 음력이 양력으로 포함된 복잡한 체계이다. 해는 60개월의 주기로 돌아가고, 각 해마다 평년에는 12개월이, 윤년에는 13개월이 포함되며, 각 월은 29일 또는 30일로 구성된다. 연도, 평월(ordinary months), 일자는 10개의 "천간(celestial stems)" 중 하나와 12개의 "지지(terrestrial branches)" 중 하나가 결합되어 총 60 주기로 반복되는 60개의 이름 중 하나로 명명된다.


바하이 달력 체계는 매월 19일로 구성된 19개월의 태양 순환기를 바탕으로 한다. 18번째와 19번째 달 사이에 나머지 4일의 "윤일(intercalary day)"이 추가된다.


다른 달력으로 변환하기(Converting To Other Calendars)

다음 명령어는 선택된 날짜를 (포인트에 위치한 날짜) 여러 다른 달력 체계로 설명한다:


Mouse-3 Other calendars

p o
선택된 일자를 다양한 달력에 표시한다(
calendar-print-other-dates
).
p c
선택된 일자에 해당하는 ISO 상업용 달력을 표시한다(
calendar-iso-print-date
).
p j
선택된 일자에 해당하는 율리우스 적일을 표시한다(
calendar-julian-print-date
).
p a
선택된 일자에 해당하는 천문학적 율리우스 적일을 표시한다(
calendar-astro-print-day-number
).
p h
선택된 일자에 해당하는 유대력(Hebrew)의 날짜를 표시한다(
calendar-hebrew-print-date
).
p i
선택된 일자에 해당하는 이슬람력(Islamic)의 날짜를 표시한다(
calendar-islamic-print-date
).
p f
선택된 일자에 해당하는 프랑스 혁명력(French Revolutionary)의 날짜를 표시한다(
calendar-french-print-date
).
p b
선택된 일자에 해당하는 바하이력 날짜를 표시한다(
calendar-bahai-print-date
).
p C
선택된 일자에 해당하는 태음 태양력(Chinese)의 날짜를 표시한다(
calendar-chinese-print-date
).
p k
선택된 일자에 해당하는 콥트력(Coptic)의 날짜를 표시한다(
calendar-coptic-print-date
).
p e
선택된 일자에 해당하는 에티오피아력(Ethiopic)의 날짜를 표시한다(
calendar-ethiopic-print-date
).
p p
선택된 일자에 해당하는 페르시아력(Persian)의 날짜를 표시한다(
calendar-persian-print-date
).
p m
선택된 일자에 해당하는 마야력(Mayan)의 날짜를 표시한다(
calendar-mayan-print-date
).


아니면 포인트를 변환하고자 하는 날짜 위로 이동시켜 위의 테이블에서 p 로 시작하는 적절한 명령어를 입력하라. 접두어 p 는 "출력(print)"의 연상 기호인데, Emacs가 상응하는 날짜를 에코 영역에 "출력"하기 때문에 붙여진 문자다. p o 는 Emacs가 이해하는 모든 형태로 날짜를 표시한다. Mouse-3 을 사용해 나타나는 메뉴에서
Other calendars
를 선택하는 방법도 있다. 그러면 Emacs 가 이해하는 모든 캘린더에 상응하는 날짜 형태를 메뉴로 표시한다. (이 메뉴에서 다른 것을 선택하더라도 아무 일도 실행하지 않으며, 메뉴는 표시용으로 사용될 뿐이다.)


다른 캘린더로부터 변환하기(Converting From Other Calendars)

다른 지원되는 캘린더를 이용해 이동할 날짜를 명시할 수도 있다. 이번 절에서는 마야력(Mayan calendar) 이외의 달력을 이용하여 이를 실행하는 명령어를 설명하고자 하는데, 마야력과 관련된 내용은 다음 절을 참고한다.


g c
ISO 상업용 캘린더에 명시된 날짜로 이동한다(
calendar-iso-goto-date
).


g w
ISO 상업용 캘린더에 명시된 주로 이동한다(
calendar-iso-goto-week
).


g J
율리우스력에 명시된 날짜로 이동한다(
calendar-julian-goto-date
).


g a
천문(율리우스)일 숫자로 명시된 날짜로 이동한다(
calendar-astro-goto-day-number
).


g b
바하이력에 명시된 날짜로 이동한다(
calendar-bahai-goto-date
).


g h
유대력에 명시된 날짜로 이동한다(
calendar-hebrew-goto-date
).


g i
이슬람력에 명시된 날짜로 이동한다(
calendar-islamic-goto-date
).


g f
프랑스 혁명력에 명시된 날짜로 이동한다(
calendar-french-goto-date
).


g C
태음 태양력(Chinese calendar)에 명시된 날짜로 이동한다(
calendar-chinese-goto-date
).


g p
페르시아력에 명시된 날짜로 이동한다(
calendar-persian-goto-date
).


g k
에 명시된 날짜로 이동한다(
calendar-coptic-goto-date
).


g e
에티오피아력에 명시된 날짜로 이동한다(
calendar-ethiopic-goto-date
).


이러한 명령어들은 다른 달력에서 날짜를 사용자에게 요청한 후 포인트를 해당 날짜에 해당하는 그레고리력으로 이동시키고, 다른 캘린더의 날짜는 에코 영역에 표시한다. Emacs는 사용자에게 월 이름(month name)을 입력하도록 요청 시 엄격한 완성 기능(strict completion)을 사용하므로 히브리어, 이슬람어, 또는 프랑스어로 된 이름의 맞춤법을 염려할 필요가 없다(30 페이지의 5.4.3절 [완성 종료(Completion Exit)] 참고).


유대력에 관해 흔히 발생하는 한 가지 문제가 있는데, 바로 "yahrzeit(기일)"라고 불리는 사망일에 대한 기념일 계산이다. Emacs 캘린더는 그러한 계산을 위한 기능을 제공한다. 캘린더를 사용할 때 M-x calendar-hebrew-list-yahrzeits 명령어를 사용하면 연도 범위를 질문한 후 해당 범위에서 포인트로 제공되는 날짜에 해당하는 기일의 목록을 표시한다. 캘린더를 사용하고 있지 않다면 이 명령어는 사망일과 연도 범위를 질문한 후 기일 목록을 표시한다.


다이어리(The Diary)

Emacs 다이어리는 캘린더와 함께 하루 단위로 약속이나 다른 이벤트를 기록한다. 다이어리 기능을 확인하려면 먼저 이벤트와 그 날짜 목록을 포함하는 다이어리 파일(diary file)을 생성해야 한다. 이후 Emacs는 오늘, 가까운 미래, 또는 명시된 날짜에 해당하는 이벤트를 자동으로 선택하여 포함한다.


다이어리 파일명은
diary-file
변수로 명시하며,
~/diary
가 기본값이다. 이 파일이 어떤 모양인지 예를 들어보겠다:
12/22/2012  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, 2013 	Income tax due. 
&* 15       time cards due.


이러한 포맷은 일부 Unix 시스템에 존재하는 별도의
calendar
유틸리티가 사용하는 것과 기본적으로 동일하다. 위의 예에서는 대부분 엔트리의 이벤트 설명을 정렬하기 위해 추가 공백을 사용한다. 그러한 포맷팅은 전적으로 사용자의 취향에 따라 좌우된다.


다이어리를 수동으로 생성하여 시작하겠지만 Emacs 는 다이어리 엔트리를 보고, 추가하며, 변경할 수 있도록 여러 명령어를 제공한다.


다이어리 표시하기(Displaying the Diary)

다이어리 파일을 생성했다면 캘린더를 이용해 볼 수 있다. Calendar 모드 밖에서 오늘의 이벤트를 확인하는 것도 가능하다. 다음은 Calendar 버퍼를 참조하는 키 바인딩이 소개되어 있다.


Mouse-3 Diary

d
선택된 날짜에 대한 모든 다이어리 엔트리를 표시한다(
diary-view-entries
).
s
전체 다이어리 엔트리를 표시한다(
diary-show-all-entries
).
m
다이어리 엔트리를 가진 표시된 날짜를 모두 마크한다(
diary-mark-entries
).
u
캘린더 창을 마크 해제한다(
calendar-unmark
).


M-x diary-print-entries
다이어리 디스플레이가 나타날 때 하드 카피를 출력한다.


M-x diary
오늘 날짜에 해당하는 다이어리 엔트리를 모두 표시한다.


M-x diary-mail-entries
다가오는 다이어리 엔트리에 관한 이메일 알림(reminder)을 사용자에게 메일로 보낸다.


d를이용해 다이어리 엔트리를 표시하면 캘린더에서 선택한 날짜에 해당하는 다이어리 엔트리를 다른 창에 표시할 것이다. 새 창의 모드 라인은 다이어리 엔트리의 날짜를 표시한다. 휴일은 사용자가 선택하는 디스플레이 방법에 따라 버퍼나 모드 라인에 표시된다(Specialized Emacs Features 의 "Diary Display" 절을 참고). d에 수치적 인자를 명시할 경우 이후 요일에 해당하는 다이어리 엔트리를 모두 표시한다. 따라서 2 d는 선택된 날짜와 다음날에 해당하는 엔트리를 모두 표시한다.


날짜에 해당하는 다이어리 엔트리를 표시하는 또 다른 방법은 날짜를 Mouse-3 으로 클릭하여 나타나는 메뉴에서 Diary entries를 선택하는 방법이다.
calendar-view-diary-initially-flag
변수의 값이
nil
외의 값일 때 캘린더를 생성하면 현재 날짜에 해당하는 다이어리 엔트리를 열거한다(현재 날짜가 표시되어 있을 때).


다이어리에 어떠한 날짜가 언급되었는지 좀 더 광범위하게 보기 위해서는 m 명령어를 사용하라. 그러면 다른 겉모습(face)으로 된 다이어리 엔트리를 가진 날짜가 마크될 것이다. 관련 내용은 Specialized Emacs Features 의 "Calendar Customizing"절을 참고한다.


이 명령어는 현재 표시가 되어 있는 달과 스크롤 이후에 표시되는 달에 모두 적용된다. 마크 기능을 끄고 현재 마크를 삭제하려면 u 를 입력하면 되는데, 이런 경우 휴일 마크 역시 꺼진다(335 페이지의 28.6절 [휴일(Holidays)] 참고).
calendar-mark-diary-entries-flag
변수가
nil
값이 아닌 경우 캘린더를 생성하거나 업데이트하면 자동으로 다이어리 날짜를 마크한다.


엔트리 몇 가지가 아니라 전체 다이어리 파일을 확인하려면 s 명령어를 사용하라.


M-x diary 명령어는 캘린더 디스플레이와 무관하게 현재 날짜에 해당하는 다이어리 엔트리를 표시하고, 이후 며칠 동안의 다이어리 엔트리를 선택적으로 표시하는 기능을 제공하는데,
diary-number-of-entries
변수는 이후 몇 일을 포함시킬 것인지 명시한다. 관련 내용은 Specialized Emacs Features 의 "Diary Customizing"절을 참고한다.


(diary)를 .emacs 파일에 넣으면 Emacs를 시작할 때 해당 요일의 다이어리 엔트리를 보여주는 창을 자동으로 표시할 것이다.


어떤 사람들은 다이어리의 이벤트에 대해 이메일 알림을 수신하길 원하기도 한다. 그러한 메일을 수신하고 싶다면 M-x diary-mail-entries 명령어를 사용하라. 접두 인자를 사용해 확인할 일수(오늘부터 시작)를 명시하고, 명시하지 않을 경우
diary-mail-days
변수가 명시해줄 것이다.


다이어리 파일(The Diary File)

사용자의 다이어리 파일(diary file)은 특정 날짜와 관련된 이벤트를 기록하는 파일이다. 다이어리 파일명은
diary-file
변수로 명시되며
~/diary
가 기본값이다.
calendar
유틸리티 프로그램은 Emacs 다이어리 기능이 허용하는 포맷의 하위집합을 지원하므로 이 유틸리티를 이용해 그것이 이해하지 못하는 엔트리를 제외한 합당한 결과로 된 다이어리 파일을 확인할 수 있다.


다이어리 파일 내 각 엔트리는 하나의 이벤트를 설명하고, 하나 또는 이상의 라인으로 구성되어 있다. 엔트리는 항상 왼쪽 여백에서 날짜 명세(date specification)로 시작해야 한다. 엔트리의 나머지 부분은 이벤트를 설명하는 단순한 텍스트이다. 엔트리가 하나 이상의 라인을 포함할 경우 첫 라인 이후의 모든 라인은 공백으로 시작되어 이전 엔트리와 연속됨을 나타내야 한다. 유효한 날짜로 시작하지 않고 이전 엔트리를 계속하지 않는 라인은 무시된다.


다이어리 엔트리의 첫 라인이 (공백이나 구두점이 뒤따라오지 않고) 날짜나 요일명으로만 구성된 포맷도 사용할 수 있다. 예를 들면 아래와 같다:

02/11/2012
      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


해당 엔트리는 단순한 다이어리 디스플레이를 사용할 경우 다른 모양을 할 것이다(Specialized Emacs Features 의 "Diary Display"절 참고). 단순한 다이어리 디스플레이는 시작 부분에 날짜 라인을 생략하고, 연속 행만 표시된다. 이러한 스타일의 엔트리는 사용자가 단 하루의 엔트리만 표시할 때 외형이 훨씬 깔끔하며 사용자가 하루 이상의 엔트리를 요청 시 혼동을 야기할 수 있다.


캘린더 창에서 특정 다이어리 엔트리의 마크를 금지할 수도 있는데, 이를 위해선
diary-nonmarking-symbol
이 명시하는 문자열을 (기본값 '
&
') 날짜 앞의 엔트리 시작 부분에 삽입하라. 이는 다이어리 창의 엔트리 디스플레이에는 어떠한 효과도 미치지 않고 캘린더 창의 날짜에 위치한 마크에만 영향을 미친다. 비마킹 엔트리는 특히 다른 여러 날짜를 마크하는 포괄적 엔트리(generic entry)에 유용하다.


날짜 포맷(Date Formats)

날짜를 포맷팅하는 방법을 설명하기 위해 다이어리 엔트리의 예를 몇 가지 들어보겠다. 이 예들은 날짜를 미국식(월, 일, 연)으로 표시하지만 Calendar 모드는 유럽식(일, 월, 연)과 ISO식(연, 월, 일)도 옵션으로 지원한다.

4/20/12  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


첫 엔트리는 2012년 4월 20일에 한 번만 나타난다. 두, 세 번째 엔트리는 매년 명시된 날짜마다 나타나고, 네 번째는 월(month) 자리에 와일드카드(별표)를 사용하므로 매월 25일에 나타난다. 마지막 엔트리는 매주 금요일마다 나타난다.


'
month/day
' 또는 '
month/day/year
' 과 같이 숫자를 이용해 날짜를 표현하는 방법도 있다. 이런 경우 날짜 다음에 nondight(숫자 아닌 문자)가 따라와야 한다. 날짜의 month 와 day 는 하나 또는 두 자리로 된 숫자이다. 선택적 year 역시 숫자로, 마지막 두 자릿수로 축약할 수 있으므로 '11/12/2012' 와 '11/12/12' 중에서 사용 가능하다.


날짜는 월 이름을 전부 나타내거나 (마침표의 사용이 가능하게) 줄여서 'monthname day' 또는 'monthname day, year' 형태를 가질 수도 있다. 월과 일에 선호하는 약어는
calendar-abbrev-length
,
calendar-month-abbrev-array
,
calendar-day-abbrev-array
변수를 이용해 설정할 수 있다. 기본값은 이름의 첫 세 문자만 약어로 사용하는 것이다. 대, 소문자는 중요하지 않다.


날짜는 포괄적(generic)이어서 일부가 명시되지 않기도 한다. 그러면 엔트리는 명세에 일치하는 모든 문자로 적용된다. 날짜가 연도를 포함하지 않을 때에도 포괄적(generic)인 특성으로 인해 모든 연도에 적용된다. 대안적으로 month, day, year 중 하나가 '
*
'가 될 수도 있는데, 이는 각각 어떠한 월, 일, 연도에도 매칭한다. 따라서 다이어리 엔트리 '
3/*/*
' 는 어떠한 연도의 3월 중 어떤 날이든 매칭하므로 사실상 '
march *
'와 동일하다.


날짜를 작성하는 데에 유럽식(월보다 일자가 앞서는) 스타일이나 ISO 스타일(연, 월, 일자순)을 선호한다면 캘린더에 있을 때 M-x calendar-set-date-style 을 입력하거나
calendar-date-style
변수를 맞춤화하라. 이는 다이어리 일자가 해석되는 방식, 일자의 표시, 일부 명령어들이 기대하는 인자가 제공되는 순서에 영향을 미친다.


일주일 중에서 어떤 요일의 이름을 포괄적인 날짜(generic date)로 사용하면, 해당하는 요일의 주에 포함된 모든 날짜로 적용시킬 수도 있다. 위에서 설명한 바와 같이 요일을 줄여쓰거나 그대로 사용할 수 있으며, 대, 소문자는 중요하지 않다.


다이어리로 추가하는 명령어(Commands to Add to the Diary)

캘린더에 있는 동안 다이어리 엔트리를 생성하는 데에 사용할 수 있는 명령어가 몇 가지 있다. 기본 명령어만 본문에서 소개하고, 좀 더 복잡한 명령어는 다음 절에 싣겠다(344 페이지의 28.10.5절 [특수 다이어리 엔트리] 참고). 엔트리는 비그레고리력(non-Gregorian)을 기반으로 할 수도 있다. 관련 내용은 Specialized Emacs Features 의 "Non-Gregorian Diary" 절을 참고한다.


i d
선택된 요일에 다이어리 엔트리를 추가한다(
diary-insert-entry
).


i w
선택된 주중 요일에 다이어리 엔트리를 추가한다(
diary-insert-weekly-entry
).


i m
선택된 월중 요일에 다이어리 엔트리를 추가한다(
diary-insert-monthly-entry
).


i y
선택된 연중 요일에 다이어리 엔트리를 추가한다(
diary-insert-yearly-entry
).


캘린더 창에서 특정 날짜를 선택하고 i d 명령어를 입력함으로써 해당 날짜에 대한 다이어리 엔트리를 만들 수 있다. 이 명령어가 다이어리 파일의 끝을 다른 창에 표시하고 날짜를 삽입하면 다이어리 엔트리 나머지 부분을 입력할 수 있다.


주중 특정 날짜에 적용되는 다이어리 엔트리를 만들고 싶다면 해당하는 주중 요일을 선택하여 (어떠한 발생이든 가능) i w 를 입력한다. 이는 day-of-week 을 포괄적 날짜(generic date)로서 삽입할 것이며, 이제 사용자는 나머지 다이어리 엔트리를 입력할 수 있다. 월별 다이어리 엔트리도 동일한 방식으로 만들 수 있으므로, 월중 요일을 선택하여 i m 명령어를 사용한 후 나머지 엔트리를 입력하면 된다. 이와 마찬가지로 연중 다이어리 엔트리는 i y 명령어를 이용해 삽입하면 된다.


위의 명령어는 모두 기본적으로 마킹 다이어리 엔트리를 만든다. 비마킹(nonmarking) 다이어리 엔트리를 만들기 위해서는 명령어에 접두 인자를 제공한다. 가령 C-u i w 는 비마킹 주별 다이어리 엔트리를 만든다.


다이어리 파일을 수정할 때는 Emacs 를 종료하기 전에 파일을 꼭 저장하도록 하라. 위의 삽입 명령어 중 하나라도 사용한 후 다이어리 파일을 저장하면 캘린더 창에서 다이어리 마크를 적절하게 자동 업데이트할 것이다. 언제든
calendar-redraw
명령어를 이용하면 업데이트를 강제로 실행할 수도 있다.


특수 다이어리 엔트리(Special Diary Entries)

다이어리 파일은 캘린더 날짜를 바탕으로 한 엔트리 외에도 기념일과 같은 일반적인 이벤트를 위한 sexp 엔트리(sexp entries)도 포함한다. 이러한 엔트리는 Emacs가 다이어리 파일을 스캔할 때 평가하는 Lisp 표현식(sexps)을 바탕으로 한다. sexp 엔트리에는 날짜 대신 '%%' 뒤에 괄호로 시작하고 끝나는 Lisp 표현식이 포함된다. Lisp 표현식은 엔트리가 적용되는 날짜를 결정한다.


Calendar 모드는 자주 사용되는 특정 sexp 엔트리를 삽입하는 명령어들을 제공한다:


i a
선택된 날짜에 기념일 다이어리 엔트리를 추가한다(
diary-insert-anniversary-entry
).


i b
현재 지역에 블록(block) 다이어리 엔트리를 추가한다(
diary-insert-block-entry
).


i c
날짜부터 시작하는 순환(cyclic) 다이어리 엔트리를 추가한다(
diary-insert-cyclic-entry
).


특정 날짜의 기념일에 적용되는 다이어리 엔트리를 만들고 싶다면 포인트를 해당 날짜로 이동하여 i a 명령어를 사용한다. 이는 다이어리 파일의 끝을 다른 창에 표시하고 기념일 설명을 삽입하며, 이제 나머지 다이어리 엔트리를 입력할 수 있다. 엔트리는 아래와 같은 모양을 한다:

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


해당 엔트리는 1948 년 이후 모든 연도의 10월 31일(October 31)에 적용되고, '
10 31 1948
' 은 날짜를 명시한다. (European 또는 ISO 캘린더 스타일을 사용 중일 경우 월, 일, 연도의 입력 순서가 다르다.) 이 표현식에서 시작 연도를 요구하는 이유는 고급 다이어리 함수들이 경과한 햇수(elapsed years)를 계산하는 데에 그 수치를 사용할 수 있기 때문이다.


블록(block) 다이어리 엔트리는 명시된 연속 날짜 범위에 적용된다. 2012년 6월 24일부터 2012년 7월 10일까지 모든 날짜에 적용되는 블록 다이어리 엔트리다:

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


'
6 24 2012
' 는 시작일을 나타내고 '
7 10 2012
' 는 종료일을 나타낸다. (다시 말하지만 European 또는 ISO 캘린더 스타일을 사용 중이라면 월, 일, 연도의 입력 순서가 다르다.)


블록 엔트리를 삽입하려면 범위가 시작하고 끝나는 두 날짜에 포인트와 마크를 위치시키고 i b 를 입력하라. 이 명령어는 다이어리 파일의 끝을 다른 창에 표시하고 블록 설명을 삽입하여 이제 사용자는 다이어리 엔트리를 입력할 수 있게 된다.


순환(cyclic) 다이어리 엔트리는 정해진 일자 간격이 지나면 반복된다. 순환 다이어리 엔트리를 생성하려면 시작일을 선택하여 i c 명령어를 사용한다. 명령어는 시간 간격의 입력을 요구한 후 다음과 같은 엔트리를 삽입한다:

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


해당 엔트리는 2012년 3월 1일부터 50일째마다 적용되며 '
3 1 2012
' 는 시작일을 명시한다. European 또는 ISO 캘린더 스타일을 사용 중이라면 월, 일, 연도의 입력 순서가 다르다.)


위의 세 가지 명령어 모두 마킹 다이어리 엔트리를 만든다. 비마킹(nonmarking) 엔트리를 삽입하려면 명령어에 접두 인자를 제공하라. 가령 C-u i a 는 비마킹 기념일 다이어리 엔트리를 만든다.


캘린더에서 sexp 다이어리 엔트리를 마킹하는 작업에는 시간이 소요될 수 있는데, 캘린더 창에 표시되는 모든 날짜를 따로 확인해야 하기 때문이다. 따라서 가능하다면 sexp 다이어리 엔트리는 비마킹으로 ('
&
' 를 사용) 만드는 것이 좋다.


또 다른 정교한 유형의 sexp 엔트리로 floating 다이어리 엔트리가 있는데, 이는 정기적으로 발생하는 이벤트를 일, 주, 월로 명시된 오프셋(offsets)으로 명시한다. 이는
cron
유틸리티가 해석하는 crontab 엔트리에 비할 수 있겠다. 11월 4번째 목요일에 적용되는 비마킹 유동적(floating) 다이어리 엔트리를 예로 들어보겠다:
&%%(diary-float 11 4 4) American Thanksgiving


11은 November(11번째 달)을 명시하고, 4는 Thursday(Sunday의 0을 기준으로 주중 4번째 요일)를 명시하며, 두 번째 4는 4번째 Thursday를 명시한다(1은 "첫 번째", 2는 "두 번째", -2는 "마지막에서 두 번째"를 의미한다). 월은 하나의 월이거나 월로 이루어진 목록이 가능하다. 따라서 11을 '
'(1 2 3)
'으로 변경하면 1월, 2월, 3월의 마지막 목요일로 엔트리를 적용할 수 있다. 월을 t로 설정하면 엔트리는 해당 연도의 모든 달에 적용된다.


각 표준 sexp 다이어리 엔트리는 캘린더에서 엔트리를 마킬할 때 사용할 단일 문자 문자열이나 겉모습(face) 이름을 명시하는 선택적 매개변수를 취한다. 가장 일반적으로 sexp 다이어리 엔트리는 언제 적용할 것인지 결정하기 위해 임의의 계산을 실행할 수 있다. Specialized Emacs Features 의 "Sexp Diary Entries"절을 참고한다.


약속

약속에 사용할 다이어리 엔트리가 있고, 다이어리 엔트리가 인식 가능한 시간으로 시작되는 경우 Emacs는 약속이 있음을 미리 알려줄 수 있다. Emacs 는
appt-display-format
변수를 이용해 사용자가 선택한 포맷으로 메시지를 표시하여 약속을 알려준다.
appt-audible
값이
nil
이 아닌 경우 경고는 소리로 된 알림(reminder)을 포함한다. 또한
appt-display-mode-line
nil
값이 아닌 경우 Emacs는 약속까지 남은 분(minutes)의 수를 모드 라인에 표시한다.


appt-display-format
의 값이
window
인 경우
appt-display-duration
변수는 알림 창을 얼마나 표시할 것인지 제어하고,
appt-disp-window-function
appt-delete-window-function
변수는 각각 창을 생성하고 삭제(destroy)하는 데에 사용할 함수명을 제공한다.


약속 알림을 켜기 위해서는 M-x appt-activate 를 입력한다. 양의 인자를 사용하면 알림을 켜고, 음의 인자는 알림을 끄는데, 인자가 없다면 토글을 실행한다. 알림을 켜면 다이어리 파일로부터 오늘의 약속 목록을 가져와 인식 가능한 시간을 이용해 발견한 모든 다이어리 엔트리를 제공하고, 각 약속 시각이 다가오기 전에 알려줄 것이다.


가령 다이어리 파일이 다음과 같은 내용을 포함한다고 가정하자:

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


그러면 월요일(Mondays)마다 오전 9시 20분이 다가오면 커피를 마실 휴식 시간을 알려주고, 오전 11시 50분에는 점심 시간임을 알려줄 것이다.
appt-message-warning-time
변수는 얼마나 일찍 알려줄 것인지 분으로 명시한다(기본값 12). 이는 기본 알림(warning) 시간이다.
appt-warning-time-regexp
에 일치하는 piece 를 추가함으로써 약속마다 다른 알림 시간을 명시할 수 있다(상세한 내용은 변수의 문서를 참고).


시간은 am/pm 스타일이나 ('
12:00am
' 은 자정을, '{{RoundTitleNavy|12:00pm}' 은 정오를 의미), 24시간제 European/military 스타일로 작성할 수 있다. 다이어리 파일에서는 두 스타일을 하나로 통일할 필요 없이 섞어서 사용할 수도 있다. 시간을 인식하기 위해서는 다이어리 엔트리 시작에 위치시켜야 한다.


Emacs 는 자정이 지나면 바로 다이어리 파일에서 약속 목록을 자동으로 업데이트한다. 약속 알림을 다시 켜면 언제든 강제로 업데이트를 실행할 수 있다. 두 가지 방법 모두 해당 요일의 다이어리 버퍼를 표시하는데,
appt-display-diary
nil
로 설정하면 기능이 꺼진다. 약속 목록은 다이어리 파일을 저장할 때마다 (또는 그 파일이 포함하는 파일을 저장할 때마다; Specialized Emacs Features 의 "Fancy Diary Display"절 참고) 업데이트되기도 한다.


약속 알림 기능은 알람 시계처럼 사용할 수도 있다. M-x appt-add 명령어를 사용하면 다이어리 파일에 영향을 미치지 않고 약속 목록에 엔트리를 추가한다. M-x appt-delete 를 사용하면 약속 목록에서 엔트리를 삭제한다.


다이어리 엔트리 가져오기와 내보내기(Importing and Exporting Diary Entries)

Emacs 다이어리 파일과 다른 다양한 포맷들 간에 다이어리 엔트리를 전송할 수 있다.


Outlook 에서 생성한 약속 메시지에서 다이어리 엔트리를 가져올 수도 있다. 이러한 메시지를 Rmail 이나 Gnus에서 확인하는 동안 M-x diary-from-outlook 을 실행하면 엔트리를 가져온다.
diary-outlook-formats
변수를 맞춤화하여 이 명령어가 추가 약속 메시지를 인식하도록 만들 수 있다. 다른 메일 클라이언트들은
diary-from-outlook-function
을 적절한 값으로 설정할 수도 있다.


icalendar 패키지는 "RFC2445-Internet Calendaring and Scheduling Core Object Specification (iCalendar)"에 (이전 vCalendar 포맷과 함께) 정의된 iCalendar 파일들과 사용자의 Emacs 다이어리 파일 간에 데이터를 전송할 수 있도록 해준다.


icalendar-import-buffer
명령어는 현재 버퍼로부터 iCalendar 데이터를 압축 해제하여 당신의 다이어리 파일로 추가한다. 이 함수는 iCalendar 데이터의 자동 압축 해제에 적합하므로 Rmail 메일 클라이언트의 경우 아래를 사용할 수 있다:
(add-hook 'rmail-show-message-hook 'icalendar-import-buffer)


icalendar-import-file
명령어는 iCalendar 파일을 가져와서 결과를 Emacs 다이어리 파일로 추가하는데, 아래의 예를 살펴보라:
(icalendar-import-file "/here/is/calendar.ics"
                       "/there/goes/ical-diary")


{{RoundTitleNavy|#include} 지시어를 이용해 메인 다이어리 파일로 중요한 파일 내용을 추가할 수 있는데, 단 서로 다른 파일이어야 한다. Specialized Emacs Features 의 "Fancy Diary Display" 절을 참고한다.


전체 Emacs 다이어리 파일을 iCalendar 포맷으로 내보내기 위해서는
icalendar-export-file
을 사용하라. 다이어리 파일의 일부만 내보내려면 관련 영역을 마크하여
icalendar-export-region
을 호출하라. 두 경우 모두 Emacs는 대상 파일에 결과를 추가(append)할 것이다.


서머타임(Daylight Saving Time)

Emacs는 표준시간과 서머타임의 차이를 구별하여 일몰, 일출, 지점(solstice), 분점(equinox), 달의 위상에 주어진 시간들은 그러한 차이를 고려한다. 서머타임 규칙은 장소마다 다양하고 해마다 역사적으로 다양하다. 작업을 올바로 처리하기 위해 Emacs는 어떠한 규칙을 따를 것인지 이해할 필요가 있다.


일부 운영체제는 사용자가 위치한 장소에 적용되는 규칙을 추적하는데, 이러한 시스템에서는 Emacs가 시스템에서 필요한 정보를 자동으로 얻는다. 이러한 정보의 일부 또는 전부가 누락된 경우 Emacs는 그 차이를 Messachusetts 의 Cambridge 에서 현재 사용하는 규칙으로 메운다. 그 결과 본인이 원하는 규칙이 아니라면
calendar-daylight-savings-starts
calendar-daylight-savings-ends
를 설정하여 Emacs가 사용할 규칙을 알리도록 한다.


이러한 값들은 변수 year를 참조하는 Lisp 표현식이어야 하고, 리스트
(month day year)
형태로 서머타임의 시작과 끝이 위치한 그레고리력 날짜로 평가해야 한다. 서머타임을 사용하지 않는 지역(area)이라면 값은
nil
이어야 한다.


Emacs는 이러한 표현식을 이용해 음력과 양력으로 시각을 바로잡거나 휴일 목록에 사용할 서머타임 시작일을 결정한다.


Messachusetts 의 Cambridge 에 대한 값은 다음과 같다:

(calendar-nth-named-day 2 0 3 year) 
(calendar-nth-named-day 1 0 11 year)


즉 명시된 year 연도에서 세 번째 달(March)의 두 번째 0번 요일(Sunday)과 해당 연도의 11번째 달(November)의 첫 번째 Sunday가 되겠다. 서머타임이 October 1 에서 시작하도록 변경되면
calendar-daylight-savings-starts
를 다음과 같이 설정해야 할 것이다:
(list 10 1 year)


서머타임제가 없는 지역에 거주하거나 표준시간을 항상 사용하고 싶다면
calendar-daylight-savings-starts
calendar-daylight-savings-ends
nil
로 설정하라.


calendar-daylight-time-offset
변수는 서머타임과 표준시간의 차이를 분으로 명시한다. Masacchusettes 의 Cambridge 에 대한 값은 60이다.


마지막으로
calendar-daylight-savings-starts-time
calendar-daylight-savings-ends-time
변수는 서머타임의 시작과 끝 시간을 자정 이후 경과한 분(minutes)으로 명시한다. Massachusetts 의 Cambridge 에 대한 두 변수의 값은 120이다.


가산 시간 간격(Summing time Intervals)

타임클락(timeclock) 패키지는 시간 간격을 증가시므로 특정 프로젝트에서 작업한 시간을 추적하는 것이 가능하다.


프로젝트에 작업을 시작할 때 M-x timeclock-in 명령어를 사용하고 작업이 완료되면 M-x timeclock-out 명령어를 사용하라. 사용할 때마다 프로젝트의 기록에 하나의 시간 간격이 추가된다. M-x timeclock-change 를 이용하면 다른 프로젝트로 작업을 변경할 수 있다.


여러 시간 간격으로부터 데이터를 수집하였다면 M-x timeclock-workday-remaining 을 사용하여 오늘 작업할 시간이 얼마나 남았는지 확인하고 (하루 평균 8시간이라고 가정하여), 작업이 "완료"되는 시간을 계산하려면 M-x timeclock-when-to-leave 를 이용하라.


Emacs가 "남은" 작업 시간을 모드 라인에 표시하길 원한다면
timeclock-modeline-display
변수를 t로 설정하거나, M-x timeclock-modeline-display 명령어를 호출하라.


현재 Emacs 세션을 종료하면 당신이 프로젝트의 작업을 중단하였는지 알지 못하므로 Emacs가 질문을 할 것이다. 이때
timeclock-ask-before-exiting
변수를
nil
로 설정하면 질문을 피할 수는 있으나 현재 시간 간격이 종료되었음을 Emacs로 알리려면 M-x timeclock-out 또는 M-x timeclock-change 를 직접 사용해야만 한다.


타임클락 함수는
~/.emacs.d/timelog
라는 파일로 데이터를 누적하여 작동한다.
timeclock-file
변수를 맞춤화하면 해당 파일에 다른 이름을 명시할 수 있다. 타임클락 파일을 수동으로 편집하거나 타임클락 의 맞춤화 가능한 변수의 값을 변경하는 경우 파일로부터 Emacs의 데이터를 업데이트하려면 M-x timeclock-reread-log 명령어를 실행해야 한다.


Notes