ledger-mode 到底怎么添加交易?

开始用 ledger 记账了. ledger 添加 transaction 的一个麻烦的地方是, 实际上一个 entry 基本上只有 description 和数字不一样,date 往往是今天,两个交易账户往往是已经出现过的。因此我希望 ledger-mode 能提供点便利。 但我怎么都搞不明白 ledger-mode 怎么添加 transaction. 比如我执行了 ledger-add-transaction, 输入日期后,按 info page 的说法,Then typing a close match to the payee. 但我不行,我尝试输入 Expenses:Taxi, 但会报错:

Error: No accounts, and no past transaction matching 'Expenses:Taxi'

但前面已经出现过 Expenses:Taxi 了. 所以我该怎么用呢?

我用beancount,帮顶了

没用过 ledger, 不过 beancount 用了 n 年了。从你的需求看,即使这样的插入能搞定也效率不高。应该是直接复制之前的 entry,然后修改描述和金额即可。我在我的 beancount 配置就专门还设置了 duplicate entry at point 的函数与快捷键。后来用了 lsp,就更简单了(虽然还有些问题没解决):

(defun pina/evil-textobj-tree-sitter-transaction (count &optional beg end type)
    "Select a Beancount transaction node using tree-sitter.
     COUNT is the numeric prefix.
     TYPE is inner or outer."
    (interactive "P")
    (let* ((node (treesit-node-at (point)))
           (transaction-node (treesit-parent-until node (lambda (n) (string-match-p "transaction" (treesit-node-type n))))))
      (if transaction-node
          (progn
            ;; 获取节点的起始和结束位置
            (setq beg (treesit-node-start transaction-node))
            (setq end (treesit-node-end transaction-node))
            ;; 根据 count 扩展范围
            (when count
              (let ((sibling (treesit-node-next-sibling transaction-node)))
                (dotimes (_ (1- count))
                  (when sibling
                    (setq end (treesit-node-end sibling))
                    (setq sibling (treesit-node-next-sibling sibling))))))
            ;; 返回范围
            (evil-range beg end))
        (message "No transaction found at point."))))

(map! (:map +tree-sitter-inner-text-objects-map
            "t" 'pina/evil-textobj-tree-sitter-transaction)
      (:map +tree-sitter-outer-text-objects-map
            "t" 'pina/evil-textobj-tree-sitter-transaction)
      )

由于我刚用 ledger, 换的成本还不高,我想请问,beancount 在输入效率或者查询方面比 ledger 是否有优势呢?

ledger 没用过不清楚,但当初选择 beancount 时应该是比较过的。beancount 其实基本不用输入,都是用 python 写脚本自动化账单导入,然后手工修改一些描述、账户名字。查询不知道你想查什么,建议看看 beancount 的可视化前端 fava 以及相关插件。

感谢。我想问,你是说支付宝,银行这些记录都可以自动导入?导入频率如果是每天都导入会麻烦么?

要输入的是交易标题(按文档的说法是 payee),不是账户名。

假设有:

2025/02/07 Uber Eats
    Expenses:Food                              22.18 USD
    Assets:Credit:BOC

按 C-c C-a ,回车确认日期,在第二个提示处输入 uber eats 回车,而不是 Expenses:Food。

2 个赞

補充一點,如果payee不存在,回車確認日期後,第二個提示處不要輸入直接回車,就可以建立一個空白的payee做手動輸入。

对,可以参考一下 https://github.com/kaaass/my-beancount-template。基于 kaaass 的程序,在 AI 的帮助下写了自己的账单导入。

当你发现可以导出账单,就跟信用卡账单一样,就不用手工记录,那也就意味着不需要每天处理了。事实上我是每月初下载上个月的账单,导入成 beancount 文件,手工修改一些内容。

1 个赞

你们是各个渠道下载么?还是尽量用一个渠道消费?

我的下载账单主要包括

  1. 微信
  2. 支付宝
  3. 主要信用卡
  4. 主要借记卡
  5. 主要券商