☰
jrnl 命令行日记应用全览:纯文本存储、标签检索、多日记管理与 AES 加密实战指南
2026/9/28 3:58:43 网站建设 项目流程
  • CLI

【免费下载链接】jrnl

Collect your thoughts and notes without leaving the command line.

项目地址:https://gitcode.com/gh_mirrors/jr/jrnl
点击查看免费下载

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 Texteditor: "subl -w"-w等待文件关闭
VS Codeeditor: "code --wait"Windows 下需写code.exe完整路径
MacVimeditor: "mvim -f"-f前台等待
Vim / Neovimeditor: "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"路径需双反斜杠
emacseditor: emacsclient -a "" -c完成后C-x #关闭 buffer
gediteditor: "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 静态盐的弱点。文件布局如下:

字段大小描述
JRNLv36 字节魔术前缀
header_len2 字节(uint16 大端)头字段长度,最大 64KB
headerheader_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实际列为准。

展示类格式

格式命令特点
prettyjrnl --format pretty(默认)时间戳 + 标题同行,正文换行缩进显示;受colors、indent_character、linewrap、timeformat配置影响
shortjrnl --format short/jrnl --short只显示日期与标题
fancy / boxedjrnl --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.

项目地址:https://gitcode.com/gh_mirrors/jr/jrnl
点击查看免费下载

相关推荐

上一篇:Electric Agents 实体设计实战:五阶段工作流与七种协调模式的完整实现指南
下一篇:DiceDB 多线程分片架构设计解析:Store 抽象、Shard 管理与跨分片命令协调(2024-08-19 架构讨论纪要)

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询