乍听之下,不无道理;仔细揣摩,胡说八道

0%

“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。

GTD的第一条原则是“搜集”,为此我有一个inbox.org文件,专门记录所有的新想法、新任务。我会在每晚的固定时间处理其中的内容——有些可以马上开始做并做完,更多的则是移动到其它.org文件中,等待排期。

org-mode有一个内置的快捷键C-c C-w,专门完成将条目(org-mode的术语,即.org文件中带星号前缀的一行,参见An Explanation of Basic Org-Mode Concepts)移动到其它.org文件的需求,但它有一个缺陷——不能把条目移动到其它.org文件的顶层,而这是我经常需要做的。

为了移动到顶层,需要:

  1. 使用org-cut-subtree命令剪切当前条目(其实还会包括条目的子节点,但inbox.org中的条目基本上都没有子节点);
  2. 打开目标的.org文件;
  3. 将光标定位到文件末尾;
  4. 使用org-paste-subtree命令粘贴条目。

为了轻松完成上述四个步骤,org-refile-to-eof函数应运而生。

阅读全文 »

上大学后不久我开始用挖财记账,当时记得很随意,不会去追究一些不知道花在哪里的钱,不时就要强行修正账户余额,就这么一直用到了2019年中。后来挖财的启动时间越来越长,同时我不想看启动时的广告,便动了换记账软件的念头。

本想着试试MoneyWiz,但其价格令人望而却步,于是决定继续物色免费的记账工具,不久便遇到了GnuCash。由于它是GNU出品的,让我对其一开始便比较有好感,加上想尝试一下复式记账,便在同年9月份换到了GnuCash上。

可惜好景不长,我很快便发现了GnuCash的不足:

  1. 启动速度随着录入数据的增多显著变慢;
  2. UI不够美观;
  3. 比较依赖鼠标操作;
  4. 交易时间的精度只到天,且无法轻松调整一笔交易的位置——这一点是我尤其在意的,因为着意味着一旦我有一笔交易漏记了,再追加回去后,整个账本的交易数据次序也与银行记录的不一致了。

于是我抛弃了GnuCash,投向了ledger(以及ledger-mode)的怀抱。

ledger和ledger-mode

阅读全文 »

“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。

序言

在之前的文章中,我提到自己用org-mode管理工作日午餐和晚餐要看的动画及其进度。简单来说,就是为每部动画创建同名的二级条目(它们有一个共同的一级条目叫“动画”),每当准备看新一集时,就在对应二级条目下创建形如“观看第X话”的三级条目并设为TODO。

按这种方式,在《钢炼FA》下最终会创建出64个三级条目——而可怜的Emacs甚至一屏只能显示50行!这些“阅后即焚”的三级条目浪费了其它(或许)更有价值的内容的展示空间,因此最好将每一个切换至 DONE状态的三级条目藏起来。

org-mode可以“internal archive”一个条目,但这样仍无法节省它们占据的纵向空间。后来,我想到了org-mode的drawer特性。

阅读全文 »

序言

在入手MacBook Pro前,我的开发环境主要是一个运行在VirtualBox中的Mint发行版。在这个系统中,只要运行一次git push并输入passphrase(下称密码)后,之后便不再需要输入了——即使ssh登录远程机器也是如此。

但用上Mac后发现,这里的ssh没有这个方便的特性——每次运行git pushssh,都需要输入密码,颇不方便。

为了避免一遍又一遍地输入密码,每次登录后,我都会运行ssh-add来一劳永逸地解决问题

1
ssh-add ~/.ssh/id_rsa

自从升级到macOS Catalina后,如果在合盖睡眠前没有注销的话,下次开盖唤醒极有可能卡死在登录界面。无奈之下,我每天都需要注销并在第二天重新登录,以至于每天都得运行ssh-add并输入密码。久而久之,这也挺烦人的。

一次失败的优化

阅读全文 »

《实战Common Lisp》系列主要讲述在使用Common Lisp时能派上用场的小函数,希望能为Common Lisp的复兴做一些微小的贡献。MAKE COMMON LISP GREAT AGAIN。

序言

因为觉得Common Lisp原生的let操作符在许多时候不够好用,我编写了vertical-let。(详情可以参见这篇文章)比起原生的letvertical-let的优势在于:

  1. 有效减少代码的缩进——尤其是嵌套使用let的时候;
  2. 方便增减binding,对其余代码的布局没有影响。

除了letdestructuring-bind也是一个常用的声明binding的语法。但如果用在vertical-let中的话,会打乱原有的代码布局。比如原本的代码为

阅读全文 »