名称: 日历 描述: 使用khal CLI和vdirsyncer管理日历。当用户想要查看、创建、编辑或删除日历事件,与CalDAV服务器同步日历,管理多个日历,或提及“日历”、“事件”、“约会”、“会议”、“日程”、“CalDAV”、“khal”、“vdirsyncer”时使用。
日历管理
使用基于标准的CLI日历应用程序khal和用于与CalDAV服务器同步日历的工具vdirsyncer来管理日历。
代理使用(高级用户模式)
当将此技能用作代理时,通过execute_command运行命令。优先使用这些模式:
-
读前同步:首先运行
vdirsyncer sync以确保本地数据是最新的,特别是对于远程日历。 -
**使用
khal list**获取人类可读的输出,或使用khal list --format "{start} {end} {title}" <日期范围>进行解析。对于机器解析,khal printcalendars -p导出ICS。 -
自然语言快速添加效果很好:
khal new "明天下午3点到4点的团队会议"或khal new "下周二中午与约翰共进午餐" -
结构化创建,当您有确切细节时:
khal new -a work 2026-02-15 14:00 1h "冲刺规划" --location "房间A" -
编辑/删除前查找UID:
khal search "会议"或khal search --days 7 "项目"返回UID。使用UID与khal edit <uid>或khal delete <uid>。 -
首先列出日历:
khal printcalendars显示可用日历。使用-a <日历>指定特定日历。 -
日期范围:
khal list today、khal list week、khal list 2026-02-01 2026-02-28或khal list tomorrow
先决条件检查
在任何日历操作之前,验证工具是否已安装和配置:
# 检查khal是否已安装
which khal
# 检查vdirsyncer是否已安装
which vdirsyncer
# 检查khal配置
khal printcalendars
# 检查vdirsyncer配置
vdirsyncer discover
安装
macOS (Homebrew)
brew install khal
brew install vdirsyncer
Arch Linux
pacman -S khal
pacman -S vdirsyncer
Debian/Ubuntu
apt install khal
apt install vdirsyncer
Nix
nix-env -i khal
nix-env -i vdirsyncer
FreeBSD
pkg install py-khal
pkg install py-vdirsyncer
pip (任何操作系统)
pip install khal
pip install vdirsyncer
安装最新版本
pip install git+https://github.com/pimutils/khal
pip install git+https://github.com/pimutils/vdirsyncer
日历设置
快速开始:仅本地日历
创建基本的本地日历配置:
# 创建配置目录
mkdir -p ~/.config/khal
# 创建基本配置
cat > ~/.config/khal/config << 'EOF'
[calendars]
[[personal]]
path = ~/.local/share/khal/calendars/personal
color = dark blue
[locale]
timeformat = %H:%M
dateformat = %Y-%m-%d
longdateformat = %Y-%m-%d
datetimeformat = %Y-%m-%d %H:%M
longdatetimeformat = %Y-%m-%d %H:%M
EOF
# 创建日历目录
mkdir -p ~/.local/share/khal/calendars/personal
高级:与CalDAV服务器同步
步骤1:配置vdirsyncer
# 创建vdirsyncer配置目录
mkdir -p ~/.config/vdirsyncer
# 创建配置(通用CalDAV示例)
cat > ~/.config/vdirsyncer/config << 'EOF'
[general]
status_path = "~/.local/share/vdirsyncer/status/"
# 个人日历对
[pair personal_calendar]
a = "personal_local"
b = "personal_remote"
collections = ["from a", "from b"]
# 本地存储
[storage personal_local]
type = "filesystem"
path = "~/.local/share/khal/calendars/"
fileext = ".ics"
# 远程CalDAV存储
[storage personal_remote]
type = "caldav"
url = "https://caldav.example.com/"
username = "your_username"
password.fetch = ["command", "pass", "caldav/password"]
EOF
步骤2:发现日历
# 发现服务器上的可用日历
vdirsyncer discover
# 第一次同步
vdirsyncer sync
步骤3:配置khal以使用同步的日历
cat > ~/.config/khal/config << 'EOF'
[calendars]
[[personal]]
path = ~/.local/share/khal/calendars/personal
color = dark blue
priority = 20
[[work]]
path = ~/.local/share/khal/calendars/work
color = dark red
priority = 10
[locale]
timeformat = %H:%M
dateformat = %Y-%m-%d
longdateformat = %Y-%m-%d
datetimeformat = %Y-%m-%d %H:%M
longdatetimeformat = %Y-%m-%d %H:%M
firstweekday = 0 # 星期一
weeknumbers = right
[default]
default_calendar = personal
EOF
提供商特定设置
| 提供商 | CalDAV URL | 备注 |
|---|---|---|
| Google Calendar | https://apidata.googleusercontent.com/caldav/v2/ |
需要应用密码或OAuth 2.0 |
| Nextcloud | https://nextcloud.example.com/remote.php/dav/ |
标准用户名/密码 |
| iCloud | https://caldav.icloud.com/ |
需要应用特定密码 |
| Fastmail | https://caldav.fastmail.com/dav/calendars/user/ |
标准用户名/密码 |
| Radicale | http://localhost:5232/ |
自托管,标准认证 |
💡 提示:大多数提供商使用相同的应用特定密码来处理电子邮件和日历。将凭据存储在pass中,并使用一致的命名(例如,google/app-password、icloud/app-password)以在电子邮件和日历技能中重复使用。对于多个账户,使用分层结构(例如,google/personal/app-password、google/work/app-password)—/创建文件夹以保持组织。
有关详细提供商配置,请参阅references/providers.md
常见操作
查看日历
# 以交互模式查看日历(ikhal)
ikhal
# 查看今天的事件
khal list today
# 查看本周
khal list week
# 查看特定日期
khal list 2026-02-15
# 查看日期范围
khal list 2026-02-01 2026-02-28
# 月历概览
khal calendar
创建事件
# 快速添加事件(自然语言)
khal new "明天下午3点到4点的团队会议"
# 结构化添加带详情
khal new -a work \
--location "会议室A" \
--categories "会议,重要" \
2026-02-15 14:00 1h "冲刺规划"
# 全天事件
khal new 2026-02-20 "生日派对" -a personal
# 重复事件(每周一上午9点)
khal new --repeat weekly --until 2026-12-31 \
"2026-02-03 09:00" 1h "每周站会"
# 带描述的事件
khal new "2026-02-15 14:00" 2h "项目评审" \
--description "讨论第一季度交付物和路线图"
编辑事件
# 交互式编辑(在ikhal中打开)
ikhal
# 搜索事件
khal search "会议"
# 通过UID编辑事件(先用搜索找到UID)
khal edit <事件-uid>
删除事件
# 通过UID删除事件
khal delete <事件-uid>
# 交互式删除(在ikhal中)
ikhal
# 导航到事件,按'd'删除
搜索事件
# 按关键字搜索
khal search "会议"
# 在特定日历中搜索
khal search -a work "评审"
# 在日期范围内搜索
khal search --days 30 "生日"
同步
# 与远程服务器同步所有日历
vdirsyncer sync
# 同步特定日历对
vdirsyncer sync personal_calendar
# 强制完全同步
vdirsyncer sync --force-delete
# 自动化同步(添加到crontab)
# 每15分钟同步一次
*/15 * * * * vdirsyncer sync >/dev/null 2>&1
交互式日历 (ikhal)
ikhal是用于浏览和编辑日历的交互式TUI。
启动
ikhal
键盘快捷键
| 键 | 动作 |
|---|---|
n |
创建新事件 |
e |
编辑选中事件 |
d |
删除选中事件 |
t |
跳转到今天 |
/ |
搜索事件 |
↑↓←→ |
导航日历 |
Enter |
查看事件详情 |
Tab |
切换窗格 |
q |
退出 |
高级工作流
导入ICS文件
# 导入外部.ics文件
khal import event.ics -a personal
# 从URL导入
curl -L https://example.com/calendar.ics | khal import -a personal -
导出日历
# 将所有事件导出到ICS
khal printcalendars -p > my_calendars.ics
# 导出特定日期范围
khal list --format "{start-date} {title}" 2026-01-01 2026-12-31 > events.txt
多个日历
# 列出所有配置的日历
khal printcalendars
# 将事件添加到特定日历
khal new -a work "会议" 2026-02-15 14:00 1h
# 仅查看来自特定日历的事件
khal list -a personal today
事件提醒
通过添加到khal配置来配置桌面通知:
[default]
default_event_duration = 1h
default_dayevent_duration = 1d
[view]
event_view_always_visible = True
# 通知(需要系统通知守护进程)
[notifications]
notify = 15 # 事件前15分钟通知
配置技巧
时区
在~/.config/khal/config中处理多个时区:
[locale]
local_timezone = America/New_York
default_timezone = America/New_York
日历颜色
自定义日历颜色以提高可见性:
[calendars]
[[work]]
path = ~/.local/share/khal/calendars/work
color = dark red
priority = 10
[[personal]]
path = ~/.local/share/khal/calendars/personal
color = dark blue
priority = 20
[[birthdays]]
path = ~/.local/share/khal/calendars/birthdays
color = dark green
readonly = true
日期格式
自定义日期/时间显示:
[locale]
timeformat = %I:%M %p # 12小时格式
dateformat = %m/%d/%Y # MM/DD/YYYY
longdateformat = %A, %B %d, %Y
datetimeformat = %m/%d/%Y %I:%M %p
故障排除
vdirsyncer同步失败
# 检查状态
vdirsyncer sync --verbosity=DEBUG
# 重置同步状态(谨慎使用)
rm -rf ~/.local/share/vdirsyncer/status/
vdirsyncer sync
khal显示无事件
# 验证日历路径是否存在
khal printcalendars
# 检查日历文件是否有内容
ls -la ~/.local/share/khal/calendars/*/
# 重建缓存
rm -rf ~/.local/share/khal/khal.db
khal list today
同步后重复事件
# 这通常意味着UID冲突
# 检查vdirsyncer配置以进行适当的集合映射
vdirsyncer sync --verbosity=DEBUG
# 可能需要在ikhal中手动删除重复项
权限错误
# 修复权限
chmod 700 ~/.config/khal
chmod 700 ~/.config/vdirsyncer
chmod 600 ~/.config/vdirsyncer/config
自动化示例
每日议程电子邮件
#!/bin/bash
# 通过电子邮件发送每日议程
AGENDA=$(khal list today tomorrow)
if [ -n "$AGENDA" ]; then
echo "$AGENDA" | mail -s "今日议程" user@example.com
fi
网络更改时同步
# 添加到NetworkManager调度程序或类似
#!/bin/bash
# /etc/NetworkManager/dispatcher.d/vdirsyncer-sync
if [ "$2" = "up" ]; then
su - username -c "vdirsyncer sync" &
fi
通知脚本
#!/bin/bash
# 检查即将到来的事件并发送通知
EVENTS=$(khal list --format "{start-time} {title}" today | head -5)
if [ -n "$EVENTS" ]; then
notify-send "即将到来的事件" "$EVENTS"
fi
与其他工具集成
tmux状态栏
添加到.tmux.conf:
set -g status-right '#(khal list today | head -1 | cut -c 1-40)'
Waybar/i3status
"custom/calendar": {
"exec": "khal list today | head -1",
"interval": 300,
"format": "📅 {}"
}
最佳实践
- 定期同步:通过cron或systemd计时器设置自动vdirsyncer同步
- 备份:定期备份
~/.local/share/khal/calendars/ - 多个日历:为工作、个人、生日等使用单独的日历
- 一致格式:使用ISO日期格式(YYYY-MM-DD)以提高清晰度
- 事件模板:为常见事件类型创建shell别名
- 时区:始终为有远程参与者的事件指定时区
- 冲突解决:及时在ikhal中查看同步冲突
额外资源
- khal文档:https://khal.readthedocs.io/
- vdirsyncer文档:https://vdirsyncer.pimutils.org/
- CalDAV规范:https://datatracker.ietf.org/doc/html/rfc4791
- 提供商特定配置:请参阅references/providers.md