暗无天日

=============>DarkSun的个人博客

Emacs中的日程管理

1 Calendar

通过Emacs提供的calendar+Appointment可以实现简单的日程管理功能. 此外Emacs其实还提供了功能更强的Org-mode,但该mode太过复杂,简单的日程管理无需用到这么复杂的东西.

1.1 定位日期

使用M-x calendar就可以调用Emacs的calendar功能,这时Emacs会打开一个显示了三个月(分别是前一个月,当前月,后一个月)信息的日历,光标自动放在表示今天的那个位置. Emacs提供了大量的命令对光标所在的日期进行日程管理. 默认情况下calendar将周日作为一周的第一天,我们可以通过更改变量calendar-week-start的值来设置以星期几作为一周的第一天

(setq calendar-week-start 1)            ;设置星期一为每周的第一天

一般情况下我们可以直接用上下左右方向键移动光标到其他日期处,也可以直接用鼠标点击要定位的日期. 此外,Emacs也提供了其他的移动命令,如下表所示:

表1  移动命令
命令 说明
C-f 或者 左方向键 后一日
C-b 或者 右方向键 前一日
C-n 或者 下方向键 后一周
c-p 或者 上方向键 前一周
M-} 后一月
M-{ 前一月
C-x ] 后一年
C-x [ 前一年
C-a 移动到一周的开始
C-e 移动到一周的末尾
M-a 移动到一月的开始
M-e 移动到一月的末尾
M-< 移动到一年的开始
M-> 移动到一年的末尾

除了使用上诉的移动命令来定位日期外,Emacs还提供了多个命令直接定位到指定的日期处:

  • 使用g d移动到指定的日期 在calendar下按下g d键后,在minibuffer提示我们依次输入年 月 日, Emacs直接将光标定位到输入的日期处.
  • 使用g D移动到某年的指定天数处 在calendar下按下g D键后,在minibuffer提示我们依次输入年 该年的第几天, Emacs将光标定位到指定的日期处. 值得一提的是,输入天数时可以输入负数,如果输入的是负数,则表示还有多少天到年底.
  • 使用. 移动到当前的日期处 在calendar下按下.键后,光标直接跳到代表今天的日期处.
  • 使用g C移动到指定的农历所表示的日期处 在calendar下按下g C键后,Emacs提示你输入农历的信息,Emacs将光标定位到指定的日期处.
表2  定位命令
命令 说明
g d 根据日期定位
g D 根据天数
. 移动到当前日期
g C 定位到指定的阴历

1.2 添加代办事项

在Calendar中可以为指定的日期添加代办事项:

  • 使用i d命令为指定日期添加代办事项 在calendar中输入i d命令后,Emacs会打开一个教diary的文件,并自动填入光标所处的日期信息,我们只需要接着输入代办事项的信息并保存就可以了.
  • 使用i w命令为每周的某一天添加代办事项 我们可以使用i w命令建立每周例行任务
  • 使用i m命令为每月的某一天添加代办事项 我们可以使用i m命令建立每月例行任务
  • 使用i y命令为每年的某一天添加代变事项 我们可以使用i y命令建立每年的例行任务
  • 使用i a建立周年纪念日 跟i y命令类似,但calendar会记录起始年份
  • 使用i b命令为一个时间段添加代办事项 将光标和mark放置在一段时间的起始/结尾处,按下i b键,Calendar自动插入时间段的信息,我们只要输入待办事项的信息就行了
  • 使用i c命令定义一个循环事项 按下i c后,calendar提示输入循环间隔的日期,虽有Calendar自动插入代表循环的时间信息,我们只需要输入代变事项的信息就行了
表3  添加代办事项
命令 说明
i d 添加待办事项
i w 添加每周例行任务
i m 添加每月例行任务
i y 添加每年例行任务
i a 添加周年纪念日
i b 为一段时间添加待办事项
i c 添加循环事项

1.3 日期信息

将光标定位到指定的日期处后,Emacs还提供了一些命令来获取光标所处日期的信息. 常用到的命令有:

  • 使用p d命令显示光标所处日期是当年中的第几天
  • 使用p C命令显示光标所处日期的农历信息
  • M-=计算一段时间的天数 在要计算时间段的起始天数/结束天数用命令C-@定义为mark,然后将光标移动到时间段的结束天数/起始天数,这就定义了一个时间段区域,按下M-=后就会在minibuffer中显示该时间段包含的天数. 其中,该天数包含了起始天数和结束天数的.
  • 使用h命令查看光标所处日期的假期信息 如果光标所处的日期并没有假期,则Emacs在minibuffer提示No Holidays known,否则则显示该日期对应节假日的名字. Emacs内置了一些常见的节假日信息,另外,Emacs也提供了一些函数供我们自定义节假日:

    (holiday-fixed m d 节日名) ;定义m月的第d日为xx节假日
    (holiday-float m w n 节日名) ;定义m月的第w个星期的第n天为xx节假日,默认周日为第0日
    
  • 使用a命令查看所有三个月的假期信息 按下a键后,Emacs会在另一个窗口显示calendar中三个月期间内的所有节假日信息.
  • 使用x命令在calendar中标示出所有为节假日的日期来 若我们想让calendar自动标示出节假日的日期来,则更改calendar-mark-holidays-flag的值为非nil即可

    (setq calendar-mark-holidays-flag t)    ;让calendar自动标记出节假日的日期
    
  • 使用d命令显示光标当前日期的代办事项 可以在d命令前加上一个数字n,表示显示n天内的所有代办事项
  • 使用m命令在calendar中标记出所有记有待办事项的日期 该命令跟x类似,只是它标记出的是带有待办事项的日期. 同样的,你也可以通过更改变量calendar-mark-diary-entries-flag的值为非nil来让calendar自动标记出记有待办事项的日期.

    (setq calendar-mark-diary-entries-flag t)    ;让calendar自动标记出记有待办事项的日期
    

    值得一提的时,如果你将记录某项代办事项但却不想被标记出来,只需要在执行插入待办事项的命令前执行C-u就行了(就像C-u i d这样).

  • 使用u命令去除calendar中的标记
命令 说明
p d 显示当前日期是当年的第几天
p C 显示当前日期的农历信息
M-= 计算一段时间的天数
h 查看当前日期的假期信息
a 查看三个月内的所有节假日信息
x 标记出calendar中所有为节假日的日期
d 查看指定日期的待办事项
m 标记出calendar中所有记有待办事项的日期
u 清除calendar中的标记

1.4 导出为HTML

Emacs提供了两个命令来将日历信息,节假日信息和待办事项信息一起导出成HTML文件供我们查看,这两个命令为:

命令 说明
H m 导出单月的日程安排信息
H y 导出当年的每个月的日程安排信息
   

2 约会提醒功能

  • 用M-x appt-activate开启约会提醒功能 要使用约会提醒功能,先需要开启appointment通知功能,命令是M-x appt-activate
  • 随后使用M-x appt-add命令来添加一个约会提醒. 执行app-add命令后,在Emacs提醒你依次输入约会开始的时间,提醒的消息,和提前多少分钟开始提醒. 虽有在离约会还有指定分钟的时候,Emacs会在底部弹出一个窗口,窗口的内容显示了指定的提醒消息.
  • 使用M-x appt-delete来删除一个约会提醒 执行appt-delete后,Emacs依次显示所有添加的约会提醒,并询问是否删除,按y表示删除,按n表示保留
  • 在mode-line上显示约会提醒的倒计时 通过设置变量appt-display-mode-line的值为非nil,Emacs会在mode-line上显示还有多少分钟到下一个约会的倒计时.

    (setq appt-display-mode-line t)         ;在mode-line上显示还有多少分钟到约会的倒计时
    
    命令 说明
    M-x appt-activate 开启appointment提醒功能
    M-x appt-add 添加一个约会提醒
    M-x appt-delete 删除约会提醒