Ledger 是一个命令行会计工具,基于文本日记账提供复式记账功能。它没有任何花哨的功能,让用户回到了用户界面甚至还未在其父辈的 CRT 显示器上闪烁的时代。
Ledger-mode 帮助您维护 Ledger 的输入文件、运行报表以及更多功能...
Ledger-mode 的 Emacs Lisp 源代码包含在 Ledger 的源代码发行版中,完全位于 lisp 子目录中。要使用 Ledger-mode,请在您的 Emacs 初始化文件(~/.emacs、~/.emacs.d/init.el 或 ~/.Aquamacs/Preferences.el)中包含以下内容。
(autoload 'ledger-mode "ledger-mode" "Ledger 的主模式" t) (add-to-list 'load-path (expand-file-name "/path/to/ledger/source/lisp/")) (add-to-list 'auto-mode-alist '("\\.ledger$" . ledger-mode))这将设置 Emacs 自动识别以 .ledger 结尾的文件并启动 Ledger-mode。只要 ledger 命令行工具已正确安装,无需其他配置。
从 Ledger 源代码的 test/input 目录加载演示文件 demo.ledger。账本将被加载并进行语法高亮显示。此时您可以手动编辑交易记录,并通过便捷的命令行运行 Ledger。
尽管 Ledger 的交易格式很简单,但手动添加大量交易记录仍然可能令人望而生畏。Ledger 提供了两种方法,以最少的输入量添加交易记录。这两种方法都基于一个理念:大多数交易都是先前交易的重复。
在 demo.ledger 缓冲区中,使用正确的格式输入日期。然后在 demo.ledger 缓冲区中输入另一个收款人名称的前几个字符。按下 C-c TAB。Ledger-mode 将搜索具有相同开头的收款人,并将交易的其余部分复制到您的新条目中。
此外,您还可以使用账本 xact 命令,通过输入 C-c C-a 或使用‘添加交易’菜单项。然后输入与收款人相近的匹配项。Ledger-mode 将使用您输入的数据调用 ledger xact,并将交易放置在账本中正确的时间顺序位置。后续调用 C-c C-a 会记住最后日期,因此可以轻松输入过去的多个日期。日期格式可以通过修改 ledger-default-date-format 来更改。
维护账本的最大任务是确保其与外部世界匹配。这个过程称为对账(参见 对账基础),可能相当繁琐。Ledger-mode 试图使其尽可能轻松。
在 demo.ledger 缓冲区中输入 C-c C-r。如果光标位于某个账户上,Ledger-mode 将提议该账户,或在 Minibuffer 中提示输入要核对的对账账户。如果您对提议的账户满意,请按 RET,或者输入‘Checking’作为示例。Emacs 随后将提示输入目标值。目标值是您希望缓冲区中已清算交易总计达到的金额。通常这将是您银行对账单的期末值,或在线交易摘要中的最新值。输入‘1710’。请注意,Ledger-mode 假设您使用‘$’(美元)作为默认商品,这可以在自定义变量中轻松更改。参见 Ledger-mode 自定义。
您现在在 demo.ledger 缓冲区下方看到一个未清算交易列表。触摸 SPC 栏将标记交易为待处理,并显示当前已清算(和待处理)余额,以及达到目标所需的剩余差额。清除前三个交易,您将看到与目标的差额达到‘$0’。通过输入 C-c C-c 结束对账。这将保存 demo.ledger 缓冲区并标记交易为最终已清算。输入 q 关闭对账缓冲区。
Ledger 的真正威力在于其报告功能。报告可以在单独的 Emacs 缓冲区中运行和显示。在 demo.ledger 缓冲区中,输入 C-c C-o C-r。在 Minibuffer 中,Emacs 将提示输入报告名称。有一些内置报告,您可以添加所需的任何报告。参见 添加和编辑报告。
在迷你缓冲区输入‘account’。当提示输入账户类型时,输入‘checking’。在一个名为*Ledger Report*的缓冲区中,您将看到一个 Ledger 登记报告。您可以在缓冲区中移动,当光标位于某个交易上时,按RET键。Ledger 模式将直接带您到demo.ledger缓冲区中的该交易。
另一个内置报告是余额报告。在demo.ledger缓冲区中,输入C-c C-o C-r。当提示要运行的报告时,输入‘bal’,将显示所有账户的余额报告。
Ledger 文件可能会变得非常大。将缓冲区折叠以仅显示您感兴趣的交易会很有帮助。Ledger 模式复制了occur模式的功能。输入C-c C-f并在迷你缓冲区中输入任何正则表达式,将仅显示匹配该正则表达式的交易。正则表达式可以针对任何字段或金额。编辑交易后使用C-c C-g重新应用当前的正则表达式。再次输入C-c C-f可取消范围限定。
除了快速添加交易的两种方式(参见快速添加)外,Ledger 模式通过为收款人和账户提供强大的TAB补全功能来协助您。Ledger 模式将扫描现有缓冲区中的收款人和账户。包含的文件目前不包含在补全扫描中。Ledger 模式遵循 Emacs 控制TAB补全的变量,请特别参见tab-always-indent。
要通过多次按TAB键在补全选项间循环,您可以像这样调整标准补全配置:
(add-hook 'ledger-mode-hook (lambda () (setq-local tab-always-indent 'complete) (setq-local completion-cycle-threshold t) (setq-local ledger-complete-in-steps t)))
Ledger 模式将帮助您保持金额对齐。在缩进或补全时,Ledger 模式会自动放置所有金额,使其最后一位数字对齐到由ledger-post-amount-alignment-column指定的列,该列默认为‘52’。请参阅Ledger 过账自定义组。
要防止金额的自动重新对齐,请禁用ledger-post-auto-align。请参阅Ledger 过账自定义组。
Ledger 允许向交易添加信息以补充日期细节。例如,您可以指定交易何时录入、交易何时结算,或个别过账何时结算。Ledger 模式将这些附加日期称为生效日期。要设置交易的生效日期,请将光标置于交易的第一行并输入C-c C-t。生效日期将被添加到交易中。要为个别过账设置生效日期,请将光标置于该过账处并输入C-c C-t,该过账的生效日期将被添加到过账末尾。
您经常会想要快速查看某个账户的余额。最简单的方法是将光标定位在您感兴趣的账户上,然后输入C-c C-p。Minibuffer 会要求您确认所需账户的名称,如果名称正确,请按RET键,然后该账户的余额将显示在 Minibuffer 中。
复制交易的简便方法是输入C-c C-k或选择菜单项‘复制光标处交易’。系统会提示您输入复制交易的新日期,确认RET后,新交易将被插入到缓冲区中的日期位置。
如果您希望在交易之间保留空行,可以在ledger-copy-transaction-insert-blank-line-after中更改默认设置。
GNU Emacs 计算器,又称‘Calc’,是一款功能强大的逆波兰表示法计算器,内置于所有近期版本的 Emacs 中。Ledger-mode 通过集成 Calc 使得计算金额值变得简单。当光标位于分录所在行的任意位置时,输入 C-c C-b 将调出 Calc 缓冲区,并将当前分录的金额推送到 Calc 栈顶。执行所需计算以获得最终值,然后输入 y 将栈顶值拉回账本缓冲区。注意:Calc 不直接支持逗号作为小数分隔符。Ledger-mode 会将十进制逗号格式的值转换为十进制点号格式以供 Calc 使用,但无法拦截从 Calc 栈拉回的值,因此使用十进制逗号的用户需要手动将点号替换为逗号。
Ledger 认为交易或分录处于三种状态之一:未清算、已清算和待处理。在计算时,除非特别指示使用这些状态,否则 Ledger 会忽略它们。Ledger-mode 为这些状态赋予了一些额外的含义:
输入 C-c C-c,根据光标位置,将清算整个交易或单个分录。这会在整个交易的收款人前或单个分录的账户前放置一个星号‘*’。当光标位于交易内部,特别是在单个分录上时,您仍可通过输入 C-c C-e 来清算整个交易。
编辑交易时,频繁使用TAB键可保持交易格式良好。若需让 Ledger 模式清理交易格式,可使用菜单栏中的‘对齐交易’或‘对齐区域’。
菜单项‘清理缓冲区’会按日期排序缓冲区中的所有交易,移除多余空行并对齐每笔交易。
操作 Ledger 文件时可能变得杂乱。虽然 Ledger 本身不在意,但人脑偏好有序。将缓冲区交易按时间排序可化混乱为有序。通过菜单项‘排序区域’或键入C-c C-s可按日期排序区域交易。Ledger 模式对日期处理不智能,仅按交易开头字符串排序,故建议使用易排序的 ISO 8601 标准日期格式‘YYYY/MM/DD’。
注意:‘排序缓冲区’菜单项可排序整个缓冲区。自动化交易等特殊交易在排序过程中会被移动,可能导致功能异常,因此未设快捷键。
可通过在账本中嵌入 Ledger 模式标记来限定可排序区域。例如:
<<< 不排序的信息 >>> ; Ledger-mode: 开始排序 <<< 待排序交易 >>> ; Ledger-mode: 结束排序 <<< 不排序的信息 >>>
可使用菜单项‘标记排序开始’插入起始标记,‘标记排序结束’插入结束标记。这些功能会自动删除旧标记并在光标处插入新标记。
常需运行 Ledger 寄存器报告仅查看特定交易集。若不需要 Ledger 处理的运行总额计算,Ledger 模式提供比寄存器命令更简捷的快速限定缓冲区显示内容的方式。
基于 Alexey Veretennikov 的 Emacs Occur 模式,Ledger-occur 会隐藏所有不符合特定正则表达式的交易记录。该正则表达式可以匹配交易的任何部分。如果您想查找所有金额以'.37'结尾的交易,您也可以做到(虽然我不知道为什么要这样做,但嘿,只要能让您的飞艇飘起来就行)。
使用C-c C-f或'按正则表达式筛选'菜单项,在 Minibuffer 中输入正则表达式。Ledger-mode 将隐藏所有其他交易。有关正则表达式语法的详细信息,请参阅您的 Emacs 文档。这里给出一些使用demo.ledger的示例:
仅显示包含'Groceries'账户条目的交易。
仅显示 2011 年 1 月发生的交易。
仅显示 2011 年每月 25 日发生的交易。
仅显示收款人、账户或注释中包含'auto'的交易。
仅显示任何行以'harley'结尾的交易。
要重新显示所有交易,只需再次调用'按正则表达式筛选'或按C-c C-f。
如果在筛选后编辑了某些交易,导致它们不再匹配正则表达式,您可以使用C-c C-g刷新筛选视图。
即使在这个相对现代化的时代,金融交易也不会即时发生,除非您使用现金支付。当您刷借记卡时,资金可能需要几天时间才能真正从您的账户中扣除,或者支票可能需要几天时间才能清算。这就是承诺资金和支出资金之间差异的根源。承诺意味着您已同意支付,但支出要等到资金实际离开您的账户时才发生。或者在收到付款的情况下,您有一个应收账款,直到资金实际到账为止。
在对账户进行对账后,您已验证该账户中的所有交易都已正确记录,并且各方都达成一致。
要开始对账账户,您必须有一个目标,包括您已知的交易和银行已知的交易。您可以从月结单或在线交易历史中获取这些信息。了解您要达成的最终已结清余额也非常有帮助。
使用菜单‘对账账户’或键盘快捷键C-c C-r开始对账。
如果光标位于某个账户上,Ledger 模式将建议该账户,或在 Minibuffer 中提示输入要核对的账户。如果对建议的账户满意,请按RET键,或输入‘Checking’作为示例。Ledger 模式对您输入的账户名称没有特定要求。您可以留空,*Reconcile*缓冲区将显示所有未结清交易。
输入账户后,输入目标金额。输入带有商品的金额会很有帮助。您也可以留空,这样您可以清除交易,但无法受益于余额计算。系统最初假定您使用‘$’(美元)作为默认商品。如果您使用不同货币,可以在变量ledger-reconcile-default-commodity中更改默认值为您需要的任何货币。如果您使用多种商品,只需输入商品化金额(例如‘340 VSDX’,表示 340 股 VSDX)。
Ledger 模式对账目前无法处理具有多种商品的账户,如经纪账户。您可以使用对账模式清除交易,但余额计算不会显示完整的商品列表。
*Reconcile*缓冲区将显示符合正则表达式条件的所有未结清交易。默认情况下,未结清交易以红色显示。当您确认交易已被对方正确完整记录后,使用SPC空格键将交易标记为待处理。继续此过程,直到您与对方达成一致,且与目标的差异为零。
如果在对账过程中发现错误,您可以通过按RET键访问*Reconcile*缓冲区中的交易记录。这将带您到账本缓冲区中的交易记录。完成交易编辑后,保存缓冲区将自动返回到*Reconcile*缓冲区,您可以在适当时标记该交易。
当您将所有交易标记为待处理且已清算余额正确时,输入C-c C-c完成对账。这将把所有待处理交易标记为已清算并保存账本缓冲区。
输入q关闭对账缓冲区。如果设置了变量ledger-reconcile-finish-force-quit,则在输入C-c C-c后对账缓冲区将自动关闭。
Ledger 的真正强大之处在于其出色的报表功能。Ledger 模式提供了直接从 Emacs 运行报表的便捷功能。它内置了四种报表,并支持添加自定义报表。
输入 C-c C-o C-r 或使用菜单‘运行报表’会提示输入已保存报表的名称。内置报表包括:
生成所有账户的余额报表。
生成所有交易的登记报表。
提示输入收款人,然后生成涉及该收款人的所有交易的登记报表。
提示输入账户,然后生成涉及该账户的所有交易的登记报表。
查看报表时,您可以轻松在账本缓冲区和 *Ledger 报表* 缓冲区之间切换。在 *Ledger 报表* 缓冲区中,输入 RET 将跳转到账本缓冲区中的对应交易。在账本缓冲区中,输入 C-c C-o C-g 可返回 *Ledger 报表* 缓冲区。
默认情况下,Ledger 模式会在保存账本缓冲区时刷新报表缓冲区。如需在其他时间重新运行报表,请使用 C-c C-o C-a。这在您有其他程序在 Emacs 外修改账本文件时非常有用。
如果您输入了 Ledger 模式无法识别的报表名称,它会提示您输入要运行的 ledger 命令行。该命令会自动以给定名称保存,您可以随时重新运行它。
有两种方法可以编辑报表的命令行。第一种是为运行报表命令提供前缀参数。例如,输入 M-1 C-c C-o C-r。这会提示您输入报表名称,然后显示待编辑的报表命令行。当您按下 RET 时,报表将被运行,但不会永久保存。如需保存,请在 *Ledger 报表* 缓冲区中输入 S,您可以选择为其赋予新名称或覆盖旧报表。
删除报表可通过输入 C-c C-o C-e、使用账本缓冲区中的‘编辑报表’菜单,或在 *Ledger 报表* 缓冲区中输入 e 来完成。这将带您进入 Ledger 报表变量的 Emacs 自定义窗口。使用小部件删除要移除的报表。
输入 C-c C-o C-s 将提示输入名称并保存当前报表。
有时为了方便定制报告而无需每次都保存命令行。例如,在运行时为用户输入的特定账户运行一个登记报告。内置报告account正是这样做的,使用变量扩展来提示用户输入要使用的账户。有四个变量可以扩展以运行报告:
返回要操作的文件。
提示输入收款人。
提示输入账户。
提示输入元数据标签名称。
提示输入元数据标签值。
返回当前月份。
您可以在账本报告命令中使用这些扩展值。例如,如果您想指定一个登记报告,显示来自用户确定的账户且具有特定元数据标签值的交易,您可以指定以下命令行:
ledger -f %(ledger-file) reg %(account) \ --limit \"tag('my-tag') =~/%(value)/\"请注意双引号是如何用反斜杠转义的。
此外,如果您想要一个显示特定月份的报告,并且能够轻松更改该月份,您可以使用%(month)指定符来指定一个期间,如下所示:
ledger -f %(ledger-file) balance --period %(month) ^Income ^Expenses
当您这样做时,您可以使用M-p或M-n来重新打开相同报告,但使用上个月或下个月。
在大型登记报告中,能够跳转到源交易是很方便的。Ledger-mode 会自动在每个不包含--subtotal选项的登记文件中包含源信息。它通过向您指定的登记报告命令行添加--prepend-format='%(filename):%(beg_line):'来实现这一点。您通常不需要看到这个,但如果您的账本输出有错误,这些额外信息可能不会被从可见报告中剥离。
通常,银行显示其在线交易历史时,最近的交易位于顶部。Ledger 本身无法以反向时间顺序进行合理的账本报告,如果您按反向日期排序,计算也会以相反方向运行。如果您想将账本登记报告与银行报告进行比较,且最近的交易位于顶部,请在*Ledger Report*缓冲区中键入R,它将反转交易顺序并保持正确的数学意义。
Ledger 程序提供了自动化交易功能,但这些交易并非真实的,它们仅存在于账本会话中,不会反映在实际数据文件中。许多交易具有高度重复性,但可能在发生日期或金额上略有不同。有些交易是每周、每月、每季度或每年发生的。Ledger 模式通过灵活的调度器提供了一种安排未来交易的方式,允许您在单独的账本文件中指定交易并计算这些交易的未来发生时间。然后您可以将这些交易复制到实时数据文件中。
指定交易的格式与 Ledger 文件格式相同,但日期字段除外。日期字段通过用方括号括起来并使用通配符和特殊字符来指定交易应出现的时间。
很多时候您会输入每月在同一天发生的重复交易。这些可以通过在年和月使用通配符,在日使用固定日期来指定。以下条目指定了每年每月第一天和第十五天发生的交易。
[*/*/1,15] 工资收入:工作 $1000.00 资产:支票账户
有些交易并非每月都发生。还可以指定用逗号分隔的月份列表,或使用'E'表示偶数月,'O'表示奇数月。以下条目指定了在偶数月发生的双月除虫账单:
[*/E/01] 除虫费用:家庭 $100.00 资产:支票账户
有些交易的发生与星期几相关,而不是与月份中的日期相关。例如,许多人每两周领取一次工资,而不考虑月份中的具体日期。其他事件可能在特定的星期几发生,无论具体日期如何。例如,以下交易创建了每隔一个星期四发生的交易:
[2014/11/27+2Th] 工资收入:工作 $1000.00 资产:支票账户
为了指定这种类型的重复关系,必须指定一个起始日期。日期名称是双字符代码,默认为 Mo、Tu、We、Th、Fr、Sa、Su,分别代表星期一、星期二、星期三、星期四、星期五、星期六、星期日。您可以通过自定义 ledger 的ledger-schedule-week-days来更改代码以适应您的地区习惯。这些代码必须为两个字符长度。
Ledger 模式提供了多个可配置选项。所有选项都可以通过 Emacs 自定义菜单进行配置,或在您的 Emacs 初始化文件中指定。完整的选项列表如下所示。要使用 Emacs 自定义菜单更改选项,只需在选项菜单中选择自定义,并在数据选项下查找 Ledger。或者,您可以选择‘自定义特定组’并输入‘Ledger’作为组名。
如果非空值,则在 ledger-occur 模式下使用自定义界面显示交易,使用 ledger-occur-xact-face。
如果非空值,清除整个交易,而不是单个过账。
如果非空值,使用 ledger-font-highlight-face 高亮显示光标下的交易。
用于对账缓冲区的名称。默认为 *Reconcile*。
如果为 t,将主缓冲区中显示的交易限制为与核对正则表达式匹配的交易。
如果为 t,当光标移动到*核对*缓冲区中的新交易时,该交易将在其源缓冲区中显示。
如果为 t,使*核对*窗口出现在登记窗口底部并调整大小。
如果为 t,则在未清算和待处理‘!’之间切换。如果为 false,则在未清算和已清算‘*’之间切换。
核对缓冲区的日期格式。默认为ledger-default-date-format。
核对目标的提示。默认为"核对目标金额"。
核对缓冲区的标题字符串。如果非空,正在核对的账户名称将被替换到'%s'中。如果为空,则不显示标题。默认为"核对账户 %s\n\n"。
账本核对条目格式字符串。可用字段包括日期、状态、代码、收款人、账户、金额。每个字段的格式为%宽度(字段),宽度前可以加负号表示左对齐并填充字段。宽度是要显示的最小字符数;如果字符串更长,除非定义了ledger-reconcile-buffer-payee-max-chars或ledger-reconcile-buffer-account-max-chars,否则不会被截断。默认为"%(date)s %-4(code)s %-50(payee)s %-30(account)s %15(amount)s\n"
如果为正数,从右侧截断收款人名称至最大字符数。
如果为正数,从左侧截断账户名称至最大字符数。
核对缓冲区排序键。可能值为'(date)'、'(amount)'、'(payee)'或'(0)'表示不排序,即使用账本文件顺序。默认为'(0)'。
如果为 t,在核对期间清算交易时提示输入生效日期。
如果为 t,将在C-c C-c后强制关闭核对窗口。
要运行的报告定义。
一个关联列表,将账本报告格式说明符映射到实现函数。
报告是否应使用与在命令行调用 ledger 时相同的颜色显示。
报告是否应填满*Report*窗口的整个宽度
账本界面:Ledger 模式高亮显示
Ledger 的默认外观。
已清算‘*’交易的默认外观。
光标所在交易的默认外观。
待处理‘!’交易的默认外观。
其他交易的默认外观。
Ledger 账户的外观。
已清算 Ledger 账户的外观。
Ledger 待处理账户的外观。
Ledger 金额的外观。
Ledger 出现模式隐藏交易的默认外观。
Ledger 出现模式显示交易的默认外观。
用于 Ledger 注释的字体样式。
*Reconcile* 缓冲区中未清算交易的默认字体样式。
*Reconcile* 缓冲区中已清算‘*’交易的默认字体样式。
*Reconcile* 缓冲区中待处理‘!’交易的默认字体样式。
应用于 *Report* 缓冲区中可点击条目的字体样式。
Ledger Post:
Ledger 模式用于对齐金额的列。
条目中账户交易的默认缩进。
| 跳转到: | B C D E G I M P R T U |
|---|
| 跳转到: | B C D E G I M P R T U |
|---|
| 跳转到: | A C D E G M Q R S T Y |
|---|
| 跳转到: | A C D E G M Q R S T Y |
|---|