- CLI
【免费下载链接】jrnl
Collect your thoughts and notes without leaving the command line.
jrnl是一款面向命令行的轻量级日记应用,让你无需离开终端即可随时记录、检索和回顾思绪与笔记。本文以官方 overview.md 为主线,系统讲解其"纯文本存储、内联标签、多日记支持、外部编辑器、AES 加密、导入导出、跨平台"七大核心能力,并结合仓库源码与配套文档给出可复制的命令与配置示例。读完本文,你将掌握 jrnl 的完整功能地图:从第一条jrnl命令写起,到多日记管理、标签过滤、加密解密、格式导出,以及如何按需接入外部编辑器与配置文件调优。
设计哲学:功能恰到好处
jrnl的定位是一句简洁的话:"一个简单的命令行日记应用"("a simple journal application for the command line")。它让创建、搜索、查看日记条目变得轻而易举,同时刻意保持克制——正如官方文档所言:"jrnl 拥有你所需的大部分功能,而只包含你不需要的那一小部分"(jrnl has most of the features you need, and few of the ones you don't)。
这种"少即是多"的设计在架构层面有直观体现:日记被存储为人类可读的纯文本,可选地使用 AES 加密 保护;核心数据模型集中在 jrnl/journals/Journal.py,其默认配置字典(journal、encrypt、default_hour、timeformat、tagsymbols等)直接反映了这款应用开箱即用的行为基线。
纯文本存储:可同步、极紧凑、永不过时
jrnl 将每一本日记以纯文本形式落盘,这是它最根本的存储哲学:
- 存放位置自由:日记文件可以放在任何地方,包括共享文件夹中,从而在多个设备之间保持同步;
- 体积极小:数千条条目占用空间不足 1 MiB(官方文档原话为thousands of entries take up less than 1 MiB);
- 可读性极强:纯文本能被几乎所有电子设备读取,无论现在还是可预见的未来,都不存在专有格式的锁定风险。
从源码看,这种设计由 jrnl/journals/ 下的三类日记实现共同支撑:
| 日记类型 | 存储形态 | 实现文件 | 关键约束 |
|---|---|---|---|
| 单文件日记 | 一个文本文件(可加密) | Journal.py | 最灵活,唯一支持加密的类型 |
| 文件夹日记 | YYYY/MM/DD.txt目录树 | FolderJournal.py | 按年月分子目录,同一天多条条目共用一个.txt |
| DayOne Classic | .dayone目录 +entries/子目录 | DayOneJournal.py | 兼容 DayOne Classic 原始格式 |
细节可参见 journal-types.md:文件夹日记与 DayOne Classic 均不可加密;若想在三种类型间迁移,官方推荐的做法是先定义一个新类型日记,再用管道把旧日记以txt格式导出并导入:
jrnl projects --format txt | jrnl new --import内联标签:用@组织与检索
为了让日后查找更容易,jrnl 内置了**内联标签(inline tags)**支持,默认标签符号是@(之所以不用#,是因为在多数 shell 中#是注释元字符,详见 reference-config-file.md 中tagsymbols一节的说明)。你可以用标签配合其他搜索条件来定位和过滤条目:
jrnl Had a wonderful day at the @beach with @Tom and @Anna.标签的检索与告警机制
- 按标签过滤:
jrnl @pinkie @WorldDomination显示含任一标签的条目,jrnl -n 5 @pinkie -and @WorldDomination则显示同时包含两者的最近 5 条(详见 usage.md); - 标签搜索不区分大小写,且单条条目中的标签数量没有上限;
- 写入时 jrnl 会检测新标签与历史标签的相似度并给出提示(如
The tag '@works' is similar to: @work),但这只是警告,不会阻断保存; - 查看全库标签统计:
jrnl --tags(即--format tags)。
从源码看,标签过滤与-and/-not等逻辑的解析集中在 jrnl/args.py:其中parse_not_arg()专门处理-not -starred、-not -tagged这类"反转排除"语义,并保证-not不允许空参。标签符号可在配置文件中通过tagsymbols自定义,例如tagsymbols: "@#"。
多日记支持:单文件或文件集,自动时间戳
jrnl 支持创建多本日记,每本既可以是一个单文件,也可以是一组文件(文件夹结构)。条目会自动以人类可读格式打上时间戳,方便一次查看多条;jrnl 也能轻松定位你想读或想改的条目。
在配置文件中定义多日记
在 reference-config-file.md 的journals键下为每本日记指定路径即可:
journals: default: ~/journal.txt work: ~/work.txt- 若日记键的值直接是路径(如
default: ~/journal.txt),则无需额外子键; - 若需附加该日记的专属选项,则使用子键形式,并至少提供
journal路径:
encrypt: false journals: default: ~/journal.txt work: journal: ~/work.txt encrypt: true display_format: json editor: code -rw food: display_format: markdown journal: ~/recipes.txt如上例所示,顶层所有可配置项都能按日记粒度覆盖:work日记加密、默认以 JSON 输出、用 VSCode 现有窗口编辑;food日记默认以 Markdown 输出,其余沿用全局默认(示例出自 advanced.md)。
多日记的命令行用法
jrnl work at 10am: Meeting with @Steve # 写入 work 日记 jrnl work -n 3 # 查看 work 日记最近 3 条 jrnl -n 3 # 查看 default 日记最近 3 条 jrnl --list # 列出配置路径与全部日记外部编辑器:与你的最爱编辑器无缝协作
jrnl 与你喜欢的文本编辑器配合默契:你可以选择在编辑器里撰写日记条目,或对条目做更复杂的批量修改。jrnl 会过滤出指定条目,并把它们交给所选的外部编辑器处理。完整说明见 external-editors.md。
配置与三种使用方式
在 配置文件 中通过editor键指定编辑器(若编辑器不在系统PATH中,需写完整路径)。随后有三种用法:
jrnl # 直接进入编辑器撰写新条目 jrnl yesterday: All my troubles seemed so far away. # 跳过编辑器,命令行快速记录 jrnl yesterday: All my troubles seemed so far away. --edit # 命令行起头,再进编辑器续写关键前提:编辑器必须是阻塞进程(blocking process)——jrnl 需要等编辑器关闭临时文件后才把内容写入日记。若 jrnl 打开编辑器后立刻结束,说明编辑器未阻塞,常见解决方式是加等待参数。
常见编辑器配置速查
| 编辑器 | jrnl.yaml 配置 | 说明 |
|---|---|---|
| Sublime Text | editor: "subl -w" | -w等待文件关闭 |
| VS Code | editor: "code --wait" | Windows 下需写code.exe完整路径 |
| MacVim | editor: "mvim -f" | -f前台等待 |
| Vim / Neovim | editor: "vim"或"nvim" | Linux 下直接指定可执行名 |
| iA Writer (macOS) | editor: "open -b pro.writer.mac -Wn" | -Wn等待关闭且新开实例 |
| Notepad++ (Windows) | editor: "C:\\Program Files (x86)\\Notepad++\\notepad++.exe -multiInst -nosession" | 路径需双反斜杠 |
| emacs | editor: emacsclient -a "" -c | 完成后C-x #关闭 buffer |
| gedit | editor: "gedit -w" | -w/--wait等待关闭 |
提示:编辑器可能泄露敏感信息(如历史记录),相关缓解建议见 privacy-and-security.md。
AES 加密:从 v1/v2 到 v3 的演进
jrnl 内置 AES 加密 支持。加密相关内容已单独立页,这里给出概览与要点。
加密行为概览
- 新写入的加密日记一律使用jrnl v3 格式;
- v1 与 v2 的加密文件是只读格式:仍可打开和解密,但新的加密写入总是 v3。
v3 文件格式
v3 每次加密写入使用随机的 16 字节盐(salt),存放在魔术前缀之后的 JSON 头中,从而规避 v2 静态盐的弱点。文件布局如下:
| 字段 | 大小 | 描述 |
|---|---|---|
JRNLv3 | 6 字节 | 魔术前缀 |
header_len | 2 字节(uint16 大端) | 头字段长度,最大 64KB |
| header | header_len字节 | Base64 编码的 JSON,含salt(base64url 编码的 16 字节盐) |
| Fernet token | 剩余字节 | 密文 |
该格式的读写实现见 jrnl/encryption/Jrnlv3Encryption.py,并有对应的单元测试 tests/unit/test_jrnlv3_encryption.py 以及测试数据文件 tests/data/journals/encrypted_v3.journal 可对照验证。需要注意的是,在 v3 头部改为 Base64 编码之前加密的旧文件仍可正常读取,下次保存时会自动写入新编码格式。
加密/解密命令
jrnl --encrypt [FILENAME] # 加密日记;已加密时用于修改密码(先问旧密码再设新密码) jrnl --decrypt [FILENAME] # 解密为纯文本;指定文件名则保留原加密文件,另生成明文副本警告:修改配置文件中
encrypt字段不会触发加密或解密,它只声明日记是否加密;手动改动该字段很可能导致日记文件无法加载。因此必须使用上述命令。
密码与钥匙串(Keychain)
jrnl 无法找回或重置密码——一旦丢失,数据将永久不可访问。为此,加密时 jrnl 会询问是否将密码存入系统钥匙串(keychain),存入后与日记交互时无需再输密码。若当时未存、事后又想存(或只在某台电脑上存),可对已加密日记再次执行jrnl --encrypt并输入相同密码,即会触发钥匙串存储提示。
手动解密(应急兜底)
万一 jrnl 不可用,仍可用任何支持 AES(确切地说是 AES-CBC)的程序手动解密,关键信息如下:
- 密钥:密码的 [SHA-256] 哈希;
- IV:加密日记文件的前 16 字节;
- 正文:前 16 字节之后的部分,按 UTF-8 编码并经 PKCS#7 填充后加密。
encryption.md 中提供了针对 jrnl v2 文件(基于cryptography库的 Fernet/PBKDF2)与 v1 文件(基于pycrypto的 AES-CBC)的两份 Python 脚本示例。注意这些脚本仅用于说明"即使 jrnl 消失,文件仍可恢复",日常请优先使用jrnl --decrypt。
导入与导出:多种格式自由流转
jrnl 让从其他来源导入条目变得容易,也能把已有条目以多种格式导出(详见 formats.md)。任何格式都可以与搜索组合(如jrnl -contains "lorem ipsum" --format json),也可以单独使用(如jrnl --format json输出全库)。格式通过 jrnl/plugins/ 下的插件机制注册(json_exporter、yaml_exporter、xml_exporter、markdown_exporter、text_exporter、tag_exporter、fancy_exporter 等),因此系统上可用的格式以jrnl --help实际列为准。
展示类格式
| 格式 | 命令 | 特点 |
|---|---|---|
| pretty | jrnl --format pretty(默认) | 时间戳 + 标题同行,正文换行缩进显示;受colors、indent_character、linewrap、timeformat配置影响 |
| short | jrnl --format short/jrnl --short | 只显示日期与标题 |
| fancy / boxed | jrnl --format fancy | 每条条目带边框,起止分明 |
数据类格式
- JSON:
jrnl --format json,输出含tags统计与entries数组(每个条目含title、body、date、time、tags、starred),可配合jq做二次处理; - Markdown:
jrnl --format markdown(别名md),按年、月分组并自动生成#/##标题层级,已有标题会被递增以适配(如#变##); - 纯文本:
jrnl --format text(别名txt),即 jrnl 落盘的存储格式,最适合日记间导入导出; - XML:
jrnl --format xml,输出<journal>结构的 XML; - YAML:
jrnl --format yaml --file my_directory/,仅支持导出到目录,每条条目单独一个文件。
报表类格式
- tags:
jrnl --format tags(别名jrnl --tags),列出每个标签及其出现次数,按频次降序排列。
导出选项--file
默认输出到终端;给定--file后则写入文件,与管道重定向等价:
jrnl --format json --file myjournal.json jrnl --format json > myjournal.json若--file指向目录,则每条条目导出为独立文件:
jrnl --format yaml --file my_entries/ # 生成如 my_entries/2013_06_03_a-beautiful-day.yaml注意:使用这些格式时,"2 entries found" 之类的提示消息写入的是
stderr,使用|管道时不会混入 stdout。
跨平台与安装
jrnl 兼容绝大多数操作系统,可通过多种包管理器安装,也可从源码构建(见 installation.md)。最简安装方式是使用 Python 3.11+ 环境下的pipx:
pipx install jrnl提示:安装时不要使用
sudo,否则可能引发路径问题。首次运行 jrnl 时会询问日记文件创建位置及是否需要加密。
安装后即可进入 基础用法 的两种模式:撰写模式(不带-/--参数时,直接在命令行写条目)与查看模式。核心交互约定是:单横线参数(-)用于过滤日记,双横线参数(--)用于控制显示/导出方式,过滤参数可任意组合,控制参数互斥。例如:
jrnl yesterday: Called in sick. Used the time to clean, and spent 4h on writing my book.yesterday:会被解析为时间戳,第一个句号前的部分作为标题,其余作为正文。完整命令行参考见 reference-command-line.md,其参数解析实现位于 jrnl/args.py。
开源与社区
jrnl 使用 [Python] 编写,由友好的开源软件爱好者社区维护,遵循 GPL-3.0 许可(见 LICENSE.md)。仓库内还包含完整的 CHANGELOG.md、CONTRIBUTING.md 与 BDD/单元测试体系(见 tests/),其中 tests/bdd/features/ 下的core.feature、encrypt.feature、format.feature、multiple_journals.feature等行为特性文件,恰好可以当作本文所述各项能力的"可执行文档"来阅读与验证。
- CLI
【免费下载链接】jrnl
Collect your thoughts and notes without leaving the command line.
相关推荐
5分钟快速上手:Windows虚拟显示器驱动完整配置指南
5分钟快速上手:Windows虚拟显示器驱动完整配置指南 Virtual Display Driver是一款功能强大的Windows虚拟显示器驱动解决方案,能够
CLI如何永久保存微信聊天记录:WeChatMsg导出工具完整指南
如何永久保存微信聊天记录:WeChatMsg导出工具完整指南 你是否担心重要的微信对话会因手机故障而永久消失?想要将珍贵的聊天记录转换为可永久保存的文档格式?W
jrnl 命令行日记进阶技巧实战指南:标签共现、模板工作流与终端快记
jrnl 命令行日记进阶技巧实战指南:标签共现、模板工作流与终端快记 本指南基于 jrnl (在命令行中记录想法与笔记的日记工具)官方文档 docs/tips
CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考