日历管理Skill calendar

这个技能使用khal CLI和vdirsyncer工具来管理日历事件,包括查看、创建、编辑、删除事件,同步远程日历与CalDAV服务器,管理多个日历,并支持自动化脚本和集成。关键词:日历管理、khal、vdirsyncer、CalDAV、事件同步、命令行工具、自动化、生产力工具。

日历管理 0 次安装 2 次浏览 更新于 3/15/2026

名称: 日历 描述: 使用khal CLI和vdirsyncer管理日历。当用户想要查看、创建、编辑或删除日历事件,与CalDAV服务器同步日历,管理多个日历,或提及“日历”、“事件”、“约会”、“会议”、“日程”、“CalDAV”、“khal”、“vdirsyncer”时使用。

日历管理

使用基于标准的CLI日历应用程序khal和用于与CalDAV服务器同步日历的工具vdirsyncer来管理日历。

代理使用(高级用户模式)

当将此技能用作代理时,通过execute_command运行命令。优先使用这些模式:

  1. 读前同步:首先运行vdirsyncer sync以确保本地数据是最新的,特别是对于远程日历。

  2. **使用khal list**获取人类可读的输出,或使用khal list --format "{start} {end} {title}" <日期范围>进行解析。对于机器解析,khal printcalendars -p导出ICS。

  3. 自然语言快速添加效果很好:khal new "明天下午3点到4点的团队会议"khal new "下周二中午与约翰共进午餐"

  4. 结构化创建,当您有确切细节时:

    khal new -a work 2026-02-15 14:00 1h "冲刺规划" --location "房间A"
    
  5. 编辑/删除前查找UIDkhal search "会议"khal search --days 7 "项目"返回UID。使用UID与khal edit <uid>khal delete <uid>

  6. 首先列出日历khal printcalendars显示可用日历。使用-a <日历>指定特定日历。

  7. 日期范围khal list todaykhal list weekkhal list 2026-02-01 2026-02-28khal 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-passwordicloud/app-password)以在电子邮件和日历技能中重复使用。对于多个账户,使用分层结构(例如,google/personal/app-passwordgoogle/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": "📅 {}"
}

最佳实践

  1. 定期同步:通过cron或systemd计时器设置自动vdirsyncer同步
  2. 备份:定期备份~/.local/share/khal/calendars/
  3. 多个日历:为工作、个人、生日等使用单独的日历
  4. 一致格式:使用ISO日期格式(YYYY-MM-DD)以提高清晰度
  5. 事件模板:为常见事件类型创建shell别名
  6. 时区:始终为有远程参与者的事件指定时区
  7. 冲突解决:及时在ikhal中查看同步冲突

额外资源