惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
U
Unit 42
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog
C
Check Point Blog
WordPress大学
WordPress大学
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
腾讯CDC
GbyAI
GbyAI
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
H
Help Net Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
小众软件
小众软件

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 读:AI Agent 生产化——一份从原型到上线的速查清单 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日
PARA Org-mode 测试配置 - 暗无天日
2026-04-16 · via 暗无天日

前置说明

这份配置用于测试博文《AI 时代的 PARA 方法》中的 Org-mode PARA 实现。 使用方式:

  1. 先执行 创建目录结构 中的 shell 代码块(=C-c C-c=)
  2. Emacs 配置 中的代码加入你的 init.el*scratch* buffer 执行
  3. M-x org-capture 测试四个模板
  4. C-c C-w (org-refile) 测试归档

基础目录设为 ~/我的笔记 ,可按需修改 org-para-base-dir

创建目录结构

PARA_DIR="$HOME/org"

mkdir -p "$PARA_DIR/projects/2026-博客重构"
mkdir -p "$PARA_DIR/projects/2026-Anki插件开发"
mkdir -p "$PARA_DIR/areas/健康"
mkdir -p "$PARA_DIR/areas/财务"
mkdir -p "$PARA_DIR/areas/职业"
mkdir -p "$PARA_DIR/resources/emacs"
mkdir -p "$PARA_DIR/resources/python"
mkdir -p "$PARA_DIR/resources/linux"
mkdir -p "$PARA_DIR/archives"

cat > "$PARA_DIR/projects/inbox.org" << 'EOF'
#+TITLE: Projects Inbox
#+FILETAGS: :project:

* Projects Inbox
EOF

cat > "$PARA_DIR/areas/inbox.org" << 'EOF'
#+TITLE: Areas Inbox
#+FILETAGS: :area:

* Areas Inbox
EOF

cat > "$PARA_DIR/resources/inbox.org" << 'EOF'
#+TITLE: Resources Inbox
#+FILETAGS: :resource:
EOF

touch "$PARA_DIR/journal.org"

cat > "$PARA_DIR/projects/2026-博客重构/index.org" << 'EOF'
#+TITLE: 2026 博客重构
#+FILETAGS: :project:

* TODO 重新设计博客首页
  SCHEDULED: <2026-04-20 日>
* TODO 迁移到新的静态站点生成器
* DONE 梳理现有文章分类
  CLOSED: [2026-04-10 四]
EOF

cat > "$PARA_DIR/projects/2026-Anki插件开发/index.org" << 'EOF'
#+TITLE: 2026 Anki 插件开发
#+FILETAGS: :project:

* TODO 调研 Anki 插件 API
* TODO 设计卡片模板系统
* INPROGRESS 编写核心功能代码
EOF

cat > "$PARA_DIR/areas/健康/index.org" << 'EOF'
#+TITLE: 健康
#+FILETAGS: :area:

* 每周运动目标:3 次
* 年度体检:每年 Q1
* TODO 预约牙科检查
EOF

cat > "$PARA_DIR/areas/财务/index.org" << 'EOF'
#+TITLE: 财务
#+FILETAGS: :area:

* TODO 完成 2025 年度报税
  DEADLINE: <2026-05-31 日>
* 每月记账复盘
EOF

cat > "$PARA_DIR/resources/emacs/index.org" << 'EOF'
#+TITLE: Emacs 学习笔记
#+FILETAGS: :resource:

* Org-mode 技巧
** 使用 columnview 生成任务报表
** org-roam 双向链接配置
* Elisp 常用模式
** advice-add / advice-remove
** defmacro 与 defun 的区别
EOF

echo "PARA 目录结构创建完成:"
echo ""
tree "$PARA_DIR" 2>/dev/null || find "$PARA_DIR" -type f | sort
PARA 目录结构创建完成:             /home/lujun9972/org       ├── archives     ├── areas     │   ├── inbox.org   │   ├── 健康   │   │   └── index.org │   ├── 职业   │   └── 财务   │   └── index.org   ├── journal.org     ├── projects     │   ├── 2026-Anki插件开发   │   │   └── index.org │   ├── 2026-博客重构   │   │   └── index.org │   └── inbox.org   └── resources     ├── emacs     │   └── index.org   ├── inbox.org     ├── linux     └── python             13 directories, 9 files

Emacs 配置

(defvar org-para-base-dir "~/org"
  "PARA 方法的根目录。")


(setq org-todo-keywords
      '((sequence "TODO(t)" "INPROGRESS(i)" "|" "DONE(d)" "CANCELLED(c)")))


(setq org-capture-templates
      `(("p" "Project - 项目任务" entry
         (file+headline ,(expand-file-name "projects/inbox.org" org-para-base-dir)
                        "Projects Inbox")
         "* TODO %?\n  %U\n  %a\n  %i"
         :empty-lines 1)

        ("a" "Area - 领域任务" entry
         (file+headline ,(expand-file-name "areas/inbox.org" org-para-base-dir)
                        "Areas Inbox")
         "* TODO %?\n  %U\n  %a\n  %i"
         :empty-lines 1)

        ("r" "Resource - 资源笔记" entry
         (file ,(expand-file-name "resources/inbox.org" org-para-base-dir))
         "* %? :resource:\n  %U\n  %i"
         :empty-lines 1)

        ("j" "Journal - 日记" entry
         (file+datetree ,(expand-file-name "journal.org" org-para-base-dir))
         "* %?\n  %U"
         :empty-lines 1)

                ("c" "Capture with choice" entry
         (file+headline ,(expand-file-name "projects/inbox.org" org-para-base-dir)
                        "Projects Inbox")
         "* TODO %^{任务描述}\n  %U\n  %a\n  %i"
         :empty-lines 1)))


(setq org-refile-targets
      `((,(expand-file-name "projects/*.org" org-para-base-dir) :maxlevel . 2)
        (,(expand-file-name "projects/**/*.org" org-para-base-dir) :maxlevel . 2)
        (,(expand-file-name "areas/*.org" org-para-base-dir) :maxlevel . 2)
        (,(expand-file-name "areas/**/*.org" org-para-base-dir) :maxlevel . 2)
        (,(expand-file-name "resources/*.org" org-para-base-dir) :maxlevel . 1)
        (,(expand-file-name "resources/**/*.org" org-para-base-dir) :maxlevel . 1)
        (,(expand-file-name "archives/*.org" org-para-base-dir) :maxlevel . 1)))

(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps t)


(setq org-agenda-files
      (append
       (directory-files-recursively (expand-file-name "projects" org-para-base-dir) "\\.org$")
       (directory-files-recursively (expand-file-name "areas" org-para-base-dir) "\\.org$")))

(setq org-agenda-custom-commands
      '(("P" "PARA 视图"
         ((agenda "" ((org-agenda-span 'week)))
          (todo "TODO|INPROGRESS"
                ((org-agenda-overriding-header "活跃项目任务")
                 (org-agenda-files
                  (directory-files-recursively
                   (expand-file-name "projects" org-para-base-dir) "\\.org$"))))
          (todo "TODO"
                ((org-agenda-overriding-header "领域维护任务")
                 (org-agenda-files
                  (directory-files-recursively
                   (expand-file-name "areas" org-para-base-dir) "\\.org$"))))))
        ("p" "仅项目任务"
         todo "TODO|INPROGRESS"
         ((org-agenda-overriding-header "项目任务")
          (org-agenda-files
           (directory-files-recursively
            (expand-file-name "projects" org-para-base-dir) "\\.org$"))))))


(with-eval-after-load 'org-roam
  (setq org-roam-directory org-para-base-dir)

      (setq org-roam-node-display-template
        "${tags:20} ${title:*}")

    (defun my/org-roam-filter-by-tag (tag)
    "返回一个过滤函数,只保留带有 TAG 的 org-roam 节点。"
    (lambda (node)
      (member tag (org-roam-node-tags node))))

  (defun my/org-roam-list-notes-by-tag (tag)
    "列出所有带有 TAG 的 org-roam 笔记文件路径。"
    (mapcar #'org-roam-node-file
            (seq-filter
             (my/org-roam-filter-by-tag tag)
             (org-roam-node-list))))

    (defun my/org-roam-find-project ()
    "查找或创建项目笔记。"
    (interactive)
    (org-roam-node-find nil nil (my/org-roam-filter-by-tag "project")))

  (defun my/org-roam-find-area ()
    "查找或创建领域笔记。"
    (interactive)
    (org-roam-node-find nil nil (my/org-roam-filter-by-tag "area")))

  (defun my/org-roam-find-resource ()
    "查找或创建资源笔记。"
    (interactive)
    (org-roam-node-find nil nil (my/org-roam-filter-by-tag "resource"))))


(defun my/para-archive-project (project-file)
  "将一个完成的项目移到 archives 目录。
PROJECT-FILE 是项目文件或目录的路径。"
  (interactive
   (list (completing-read "归档项目: "
                          (directory-files
                           (expand-file-name "projects" org-para-base-dir)
                           t directory-files-no-dot-files-regexp))))
  (let* ((archive-dir (expand-file-name "archives" org-para-base-dir))
         (project-name (file-name-nondirectory project-file))
         (dest (expand-file-name project-name archive-dir)))
    (rename-file project-file dest)
    (message "已归档: %s -> %s" project-name dest)))

(defun my/para-show-stats ()
  "显示当前 PARA 各层的文件数量统计。"
  (interactive)
  (let ((stats
         (cl-loop for category in '("projects" "areas" "resources" "archives")
                  for dir = (expand-file-name category org-para-base-dir)
                  for count = (length (directory-files-recursively dir "\\.org$"))
                  collect (cons category count))))
    (with-output-to-temp-buffer "*PARA Stats*"
      (princ "PARA 目录统计\n")
      (princ (make-string 30 ?=)) (terpri)
      (cl-loop for (cat . cnt) in stats
               do (princ (format "%-15s %d 个文件\n" cat cnt)))
      (terpri)
      (princ (format "总计: %d 个文件\n"
                     (cl-loop for (_ . cnt) in stats sum cnt))))))

(global-set-key (kbd "C-c p c") #'org-capture)
(global-set-key (kbd "C-c p a") #'org-agenda)
(global-set-key (kbd "C-c p s") #'my/para-show-stats)
(global-set-key (kbd "C-c p A") #'my/para-archive-project)

(provide 'para-config)

测试步骤

1. 创建目录结构

在 shell 中执行:

bash /tmp/para-setup-$(whoami).sh

或者在 org 文件中 C-c C-c 执行 创建目录结构 的代码块。

2. 加载 Emacs 配置

(load "/tmp/para-config-$(whoami).el")


3. 测试 org-capture

C-c p cp Project 任务 projects/inbox.org C-c p ca Area 任务 areas/inbox.org C-c p cr Resource 笔记 resources/inbox.org C-c p cj 日记 journal.org
快捷键 模板 目标

4. 测试 org-refile

在任何 org 条目上按 C-c C-w (org-refile),应该能看到:

  • projects 下的项目文件
  • areas 下的领域文件
  • resources 下的资源文件
  • archives 目录

5. 测试 agenda 视图

C-c p aP PARA 总览(按周 agenda + 项目任务 + 领域任务) C-c p ap 仅显示项目任务
快捷键 视图

6. 测试统计

C-c p s 显示各层文件数量。

快捷键速查

C-c p c org-capture C-c p a org-agenda C-c p s PARA 统计 C-c p A 归档项目 C-c C-w org-refile(在任何 org 条目上)
快捷键 功能