Snippet指一组内容片段。可以给这组内容片段起一个短小,易记的名称,输入这个名称,就可以自动输入这一组内容片段,达到快速输入的效果。

Snippet可以很好的应对周期性出现的,可能具有一定相似性的交易。比如,每月的薪水,房租或者软件订阅费等。

这类交易有几个特点:

  • 周期性出现,周期可能是月度,季度等等。周期间隔越久,两个周期之间就会容纳更多的其他交易条目。如果你像我一样,习惯用单文件来记录整个账本的话,要向上翻很久才能找到上一次记录的交易。
  • 具有相似性,最典型的就是薪资收入,每月缴税金额会变动, 因此每次都需要复制,粘贴后,还需要修改从上一个周期复制下来的交易明细数据。

周期性交易条目示例

示例一:房租消费:

2024-07-01 * "南山炸猪排3栋604" "7月房租"
  Expenses:Apartment:Rent                                           1680.00 CNY
  Expenses:Apartment:Water                                            12.00 CNY
  Expenses:Apartment:Electricity                                     202.86 CNY
  Assets:CN:CMB:Checking

示例二:薪水收入:

2023-07-05 * "6月工资"
  Income:CN:COMPANY:Salary                                        -12000.00 CNY
  Expenses:CN:GOV:住房公积金                                         600.00 CNY
  Expenses:CN:GOV:Tax                                                843.29 CNY
  Expenses:CN:GOV:社保:养老保险                                      768.00 CNY
  Expenses:CN:GOV:社保:医疗保险                                      192.00 CNY
  Expenses:CN:GOV:社保:失业保险                                        7.08 CNY
  Assets:CN:CMB:Checking

使用snippet,我们就可以很快速输入这类内容片段:

An image to describe post

创建自定义snippet

有很多工具都带有自定义snippet的功能,我习惯使用VS Code来记录,因为VS Code上有一些实用的扩展插件,同时VS Code的文档也非常完善。

其实自定义snippet的前提,是我们已经将一些交易条目“固化”了。这个过程是也手动记账的优势。经过几次手动记录和调整,对最终的条目满意之后,我们就可以使用snippet,实现“半自动化”。

根据VS Code的帮助文档,在指定位置创建一个名为beancount.json的文件。

上面示例的内容,通过输入rent_example关键字,就可以自动填充关于每月支出房租的交易条目,也正因为这个snippet是我们经过多轮手动记账之后保留下来的最终形式,因此重复的内容不需要改动,只需要修改每次有变动的数字,比如水电费。

  "房租": {
    "prefix": "rent_example",
    "body": [
      "${1:日期} * \"${2:房屋地址}\" \"${3:N}月房租\" ",
      "note: ${4}",
      "    Expenses:Apartment:Rent                                         1680.00 CNY",
      "    Expenses:Apartment:Water                                        ${5} CNY ;水费",
      "    Expenses:Apartment:Electricity                                  ${6} CNY ;电费",
      "    ${7:Assets:CN:CMB:Checking}                          -${8:总支出} CNY"
    ],
    "description": "预定义房租postings"
  }

prefix:是我们调用这个snippet需要输入的关键字;

body:是具体的交易条目,其中的数字就是第几次按Tab键要跳到的位置;

当输入prefix的时候,就能看到我们自定义的snippet
An image to describe post

对于每个月的薪水,也是类似的做法:

 "工资": {
    "prefix": "salary_example",
    "body": [
      "${1:日期} * \"${2:公司名称}\" \"${3:N}月工资\" ",
      "    Income:CN:COMPANY:Salary                                        -12000.00 CNY",
      "    Expenses:CN:GOV:住房公积金                                         600.00 CNY",
      "    Expenses:CN:GOV:Tax                                       ${4:个人所得税} CNY",
      "    Expenses:CN:GOV:社保:养老保险                                       768.00 CNY",
      "    Expenses:CN:GOV:社保:医疗保险                                       192.00 CNY",
      "    Expenses:CN:GOV:社保:失业保险                                        7.08 CNY",
      "    Assets:CN:CMB:Checking                                         ${5:税后收入}"
    ],
    "description": "预定义工资postings"
  }

完整的snnipet文件可以在这里找到。

Bonus

使用这些Snippets还有一个好处:可以发现某些交易条目的金额变动。
拿工资收入举例来说,住房公积金养老保险医疗保险失业保险 基本上一年之中,很少会变化,所以我们在自定义snippet的时候,就有理由把金额固定。并且,即使金额固定,在登记个人所得税税后收入之后,不会引发插件报错,即我们所记录的这笔账,是平的(借贷相等),符合复式记账的基本要求。

如果有一天,公司调整了其中某一项的金额,在你按照平时的习惯记完这笔帐之后,就会出现账不平的错误信息,自然也就迫使你去寻找究竟是哪一个金额发生了变动。
An image to describe post


关于这个系列

Beancount Magazine | Beancount 杂志系列是关于使用Beancount记录个人财务的自我实践,分享自己对管理,理解个人财务状况和记账的想法。

如果你也对这些主题感兴趣,不妨订阅试试看,希望能这些内容能对你有帮助😁