[分享] autoflow.el 依次执行固定工作流

晚上睡觉前我会固定地做下面一系列的事情:检查每日待办,写总结,记录习惯。这些事情都是在emacs中进行,存放在不同的文件中。我发现每次当我做其中一件时,都要反应一下需要打开什么文件,这就很烦。本着不让大脑在重复的事情上增加思考的原则,想到了实现“将一系列固定工作流自动化执行”的想法,这便有了 autoflow.el

源码

(defvar autoflow-list nil)
(defvar autoflow-curr-nth 0)
(defvar autoflow-curr-flow nil)

(defmacro define-autoflow (name &rest funcs)
  `(progn
     (if-let ((match (assoc ,name autoflow-list)))
         (unless (equal (cdr match) ',funcs)
           (setcdr match ',funcs))
       (push (append (list ,name) ',funcs) autoflow-list))
     autoflow-list))

(defun autoflow-set-header-info ()
  (let* ((name autoflow-curr-flow)
         (funcs (autoflow-flows name)))
    (setq-local header-line-format
                (format "Autoflow %s/%s [%s] "
                        (1+ autoflow-curr-nth) (length funcs) name))))

(defun autoflow-flows (name)
  (cdr (assoc name autoflow-list)))

(defun autoflow--curr-func (nth funcs)
  "Return the current applying function as a list."
  (if-let* ((func (nth nth funcs))
            (_ (functionp func)))
      (list func)
    func))

(defun autoflow--next ()
  (cl-incf autoflow-curr-nth)
  (let* ((flow-name autoflow-curr-flow)
         (flow-funcs (autoflow-flows flow-name)))
    (if (< autoflow-curr-nth (length flow-funcs))
        (progn
          (setq-local header-line-format nil)
          (apply (autoflow--curr-func autoflow-curr-nth flow-funcs))
          (autoflow-set-header-info))
      (message "autoflow %s over!" autoflow-curr-flow)
      (setq autoflow-curr-flow nil)
      (setq autoflow-curr-nth 0)
      (setq-local header-line-format nil))))

;;;###autoload
(defun autoflow-start (&optional name)
  (interactive)
  (if autoflow-curr-flow
      (autoflow--next)
    (let* ((flow-name (completing-read "Choose a autoflow: "
                                  autoflow-list nil t))
           (flow-funcs (autoflow-flows flow-name)))
      (setq autoflow-curr-flow flow-name)
      (setq autoflow-curr-nth 0)
      (apply (autoflow--curr-func autoflow-curr-nth flow-funcs))
      (autoflow-set-header-info))))

(global-set-key (kbd "C-c n n") #'autoflow-start)

使用

使用 define-autoflow 宏定义一个自动流程。该宏的第一个参数是流程的名字,剩下的参数需要提供一系列的函数。M-x autoflow-start 命令选择事先定义好的一个流程后开始执行,每做完一件事情,继续 M-x autoflow-start,直到整个工作流结束。

比如下面定义了一个我每晚睡前总结的工作流:

(define-autoflow "summary routine"
  (para-daily-page-today) ;; 1.检查今日计划
  (para-find-habit) ;; 2.记录习惯完成情况
  (para-find-summary)) ;; 3.写今日总结

Demo

9 个赞

感觉分享,之前一直是用 yankpad 或者 yasnippet 来做。同楼主所说,有点负担: 比如模板是什么来着?触发缩写是什么?

这套流程,感觉像获得了使用时的瞬移技能,和之前的流程是反过来。

想到可以更方便来优化已有流程:

天小结: 扫一遍当天的日志;零时的想法再回顾;需要验证重温的知识;

之前的日志,回顾的时候并没有形成一个稳定的流程,比如该注意什么东西,该处理什么样的信息。

周\月小结: 各种计划进展追踪;得失思考;改进想法;

可以用来简化触发能耗,所以会更愿意去做。

定时清理: 下载文档\照片\视频\语音的归整;

测试时,第一感觉就是楼主这套函数很轻松,只需要知道想干这样一个流程,瞬移到对的地方,之后的行为就是肌肉记忆了。

1 个赞

赞,喜欢这种 Workflow 的分享

我用的org-agenda,一个每日重复的TODO,下面再分几个清单,附带org-link跳转对应文件。

https://orgmode.org/worg/org-contrib/org-checklist.html

org-checklist.el里提供了一个配置,可以通过设置RESET_CHECK_BOXESt,在完成主TODO之后刷新下属checkbox的状态。

Demo用的是哪个主题theme?

doom-one-light

能稍微举例介绍下不,我也是用agenda,但是好像没你这么流畅