deft

deft

Emacs纯文本笔记管理与快速搜索插件

Deft是一款专为Emacs开发的纯文本笔记管理插件。它提供快速浏览、实时过滤和编辑功能,简化了文件查找和管理流程。Deft支持快速搜索、自动保存等特性,能够提高写作和记录效率。该工具受Notational Velocity启发,致力于帮助用户在需要时迅速定位所需文件,是一个高效的纯文本笔记组织解决方案。

DeftEmacs文本笔记搜索过滤文件浏览Github开源项目

Emacs的Deft插件 MELPA徽章 MELPA稳定版徽章 Travis CI构建状态

Deft是一个Emacs模式,用于快速浏览、过滤和编辑纯文本笔记目录,灵感来自Notational Velocity。它的设计目的是通过快速简单地在正确的时间找到正确的文件,并自动化许多常见任务(如创建新文件和保存文件),从而提高写作和记笔记时的生产力。

Deft屏幕录像

获取Deft

Deft是开源软件,可以在BSD许可下自由分发和修改。最新的稳定版本是0.8版,发布于2018年1月12日。

通过MELPA Stable安装

推荐的安装Deft方法是使用package.elMELPA Stable获取稳定版本。首先,通过在您的.emacsinit.el或等效启动文件中添加以下内容来配置package.el和MELPA Stable仓库:

(require 'package)
(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/"))
(package-initialize)

然后,重启Emacs或评估上述语句后,执行以下命令:<kbd>M-x package-install RET deft RET</kbd>

直接下载

或者,您可以手动下载并安装Deft。首先,下载最新的稳定版本并将文件保存在Emacs可以找到的位置——load-path中的一个目录:

然后,在您的启动文件中添加以下行:

(require 'deft)

开发版本

要关注或贡献Deft的开发,您可以在GitHub上浏览或克隆Git仓库:

git clone https://github.com/jrblevin/deft.git

如果您更喜欢安装和使用开发版本(可能在某些时候变得不稳定),您可以克隆Git仓库或从MELPA安装Deft。

如果您直接克隆仓库,请确保Emacs可以找到它,方法是在启动文件中添加以下行:

(add-to-list 'load-path "/path/to/deft/repository")

概述

Deft缓冲区只是一个文件浏览器,列出Deft目录中所有文本文件的标题,后面跟着简短摘要和最后修改时间。标题被视为文件的第一行,摘要从后面的文本中提取。默认情况下,文件按最后修改日期排序,从最新到最旧。

所有Deft文件或笔记都是简单的纯文本文件,其中第一行包含标题。例如,以下目录结构生成了上面的截图。

% ls ~/.deft
about.txt    browser.txt     directory.txt   operations.txt
ack.txt      completion.txt  extensions.org
binding.txt  creation.txt    filtering.txt

% cat ~/.deft/about.txt
# About

An Emacs mode for slicing and dicing plain text files.

Deft的主要操作是搜索和过滤。可以使用搜索字符串限制或过滤文件列表,该字符串将匹配标题和正文文本。要开始过滤,只需开始输入。过滤是实时进行的。当您输入时,文件浏览器会更新,只包括匹配当前字符串的文件。

要打开第一个匹配的文件,只需按<kbd>RET</kbd>。如果没有文件匹配您的搜索字符串,按<kbd>RET</kbd>将使用该字符串作为标题创建一个新文件。这是开始写新笔记的一种非常快速的方法。文件名将自动生成。如果您更喜欢提供特定的文件名,请使用<kbd>C-RET</kbd>

要打开第一个匹配之外的文件,使用<kbd>C-p</kbd><kbd>C-n</kbd>上下导航,然后在要打开的文件上按<kbd>RET</kbd>。打开文件时,Deft会向前搜索并将光标留在过滤字符串的第一个匹配项的末尾。

您还可以按<kbd>C-o</kbd>在另一个窗口中打开文件,而不切换到该窗口。使用前缀参数<kbd>C-u C-o</kbd>执行相同的命令,可以在另一个窗口中打开文件并切换到该窗口。

要编辑过滤字符串,按DEL(退格键)删除最后一个字符,或按<kbd>M-DEL</kbd>删除最后一个"单词"。要将最近剪切(剪切或复制)的文本粘贴到过滤字符串中,请按<kbd>C-y</kbd>。按<kbd>C-c C-c</kbd>清除过滤字符串并显示所有文件,按<kbd>C-c C-g</kbd>使用当前过滤字符串刷新文件浏览器。

对于更高级的编辑操作,您还可以通过按<kbd>C-c C-l</kbd>在迷你缓冲区中编辑过滤字符串。在迷你缓冲区中,可以通过按<kbd>M-p</kbd><kbd>M-n</kbd>循环浏览之前的编辑历史。这种静态、一次性过滤(相对于增量、实时过滤)在某些情况下可能更可取,例如在连接速度慢或交互式过滤性能较差的系统上。

默认情况下,Deft以增量字符串搜索模式过滤文件,其中"search string"将匹配所有包含"search"和"string"的文件,顺序不限。另外,Deft支持直接正则表达式过滤,其中过滤字符串被解释为正式的正则表达式。例如,^\(foo\|bar\)匹配行首的foo或bar。按<kbd>C-c C-t</kbd>可以在增量搜索和正则表达式搜索模式之间切换。正则表达式搜索模式在模式行中用"R"表示。 Deft还可以执行常见的文件操作。 可以使用<kbd>C-c C-r</kbd>重命名文件或使用<kbd>C-c C-d</kbd>删除文件。 还可以使用<kbd>C-c C-n</kbd>快速创建新文件,或使用<kbd>C-c C-m</kbd>提示输入文件名;加上前缀参数时,这些操作会询问文件扩展名。随时可以使用<kbd>C-c C-q</kbd>退出Deft。

可以按<kbd>C-c C-a</kbd>归档未使用的文件。文件将被移动到deft-archive-directory,默认为deft-directory中名为archive的目录。

通过Deft打开的文件会在Emacs空闲一段时间后自动保存。这个时间间隔是一个可自定义的浮点数,由deft-auto-save-interval指定(默认值:1.0)。

入门

按照上述方法之一安装Deft后,只需运行<kbd>M-x deft</kbd>即可启动Deft。为了快速启动,最好为deft函数创建一个全局键绑定(如功能键)(详见下文)。

首次运行Deft时,它会提示找不到~/.deft目录。你可以创建一个指向保存笔记的其他目录的符号链接,或运行<kbd>M-x deft-setup</kbd>自动创建~/.deft目录。

Deft的一个实用方法是将笔记目录保存在Dropbox文件夹中。这样可以与其他应用程序和移动设备配合使用,例如OS X上的nvALTNotational VelocitySimplenote,或iOS上的EditorialByword1Writer

基本自定义

你可以自定义deft组中的项目来更改默认功能。

默认情况下,Deft在~/.deft目录中搜索扩展名为.txt.text.md.markdown.org的文件作为笔记。你可以运行<kbd>M-x customize-group</kbd>并输入deft来自定义文件扩展名和Deft目录。或者,你可以在.emacs文件中进行配置:

(setq deft-extensions '("txt" "tex" "org"))
(setq deft-directory "~/Dropbox/notes")

deft-extensions的第一个元素(在Lisp术语中称为car)是用于创建新文件的默认扩展名。

默认情况下,Deft只在deft-directory中搜索文件,不搜索任何子目录。deft-directory中所有具有指定扩展名的文件都将被包含,除了那些匹配deft-ignore-file-regexp的文件。将deft-recursive设置为非nil值以启用子目录搜索(不匹配deft-recursive-ignore-dir-regexp的子目录):

(setq deft-recursive t)

你可以轻松设置Deft的全局键盘绑定。例如,要将其绑定到F8,请将以下代码添加到.emacs文件中:

(global-set-key [f8] 'deft)

如果你使用use-package管理加载包,则可以通过在初始化文件中添加如下声明来进行配置:

(use-package deft
  :bind ("<f8>" . deft)
  :commands (deft)
  :config (setq deft-directory "~/Dropbox/notes"
                deft-extensions '("md" "org")))

读取文件

每个文件显示的标题取自文件的第一行,并删除开头的某些字符。会删除Markdown标题中使用的井号字符和Org Mode标题中使用的星号。此外,还会从显示的标题中删除Org mode的#+TITLE:标签、MultiMarkdown的Title:标签、LaTeX注释标记和Emacs模式行声明(例如-*-mode-*-)。可以通过更改deft-strip-title-regexp来自定义这一行为。

更一般地,可以通过设置deft-parse-title-function来自定义标题后处理函数,该函数接受文件的第一行作为参数,并返回要在文件浏览器中显示的解析后的标题。默认函数是deft-strip-title,它会删除上述所有deft-strip-title-regexp的匹配项。

为了与使用文件名作为笔记标题的其他应用程序兼容(而不是文件的第一行),请将deft-use-filename-as-title标志设置为非nil值。然后Deft将使用笔记文件名生成在Deft文件浏览器中显示的标题。要启用此功能,请将以下内容添加到.emacs文件中:

(setq deft-use-filename-as-title t)

最后,可以通过更改deft-strip-summary-regexp来自定义文件标题后显示的简短摘要。默认情况下,它被设置为删除某些org-mode元数据语句,如#+OPTIONS:#+AUTHOR:

创建文件

Deft会自动生成新创建文件的文件名。 生成过程由变量deft-use-filename-as-titledeft-use-filter-string-for-filename以及deft-file-naming-rules关联列表中的规则决定。 可能的情况如下:

  1. 默认(deft-use-filename-as-titledeft-use-filter-string-for-filename都为nil):

    文件名将使用类似ISO的短时间戳自动生成,如2016-05-12T09:00.txt。可以通过设置变量deft-new-file-format来自定义格式。过滤字符串将被插入文件的第一行(也用作显示标题)。如果文件名冲突,将在扩展名之前添加下划线和数字后缀(例如_2)。

  2. 文件名作为标题(deft-use-filename-as-title为非nil): 当 deft-use-filename-as-title 不为 nil 时,过滤字符串将被用作新文件的文件名(适当的文件扩展名会被附加到末尾)。在这种情况下,新文件创建的示例如下:

  • 过滤字符串: "My New Project"
  • 文件名: "My New Project.txt"
  • 文件内容: [空]
  1. 可读的文件名deft-use-filename-as-titlenildeft-use-filter-string-for-filename 不为 nil):

在这种情况下,你可以选择显示从文件第一行解析的标题,同时也为新文件生成基于过滤字符串的可读文件名。变量 deft-use-filter-string-for-filename 控制这种行为,并将标题显示(deft-use-filename-as-title)与实际文件名分离。新文件名将根据过滤字符串生成,并按照 deft-file-naming-rules 列表中定义的规则进行处理。默认情况下,斜杠会被删除并替换为连字符,但还有许多其他选项(驼峰命名法、用连字符替换空格等)。有关更多详细信息,请参阅 deft-file-naming-rules 的文档。

例如,使用以下 deft-file-naming-rules 值,Deft 将把所有斜杠和空格替换为连字符,并将文件名转换为小写:

(setq deft-file-naming-rules
      '((noslash . "-")
        (nospace . "-")
        (case-fn . downcase)))

以下是这种情况下的示例,使用上述文件命名规则。注意,过滤字符串被插入为文件的第一行,但也用于生成"可读"的文件名。

  • 过滤字符串: "My New Project"
  • 文件名: "my-new-project.txt"
  • 文件内容: "My New Project"

从过滤字符串插入文件的标题也可以针对两种常见模式进行自定义,即 markdown-modeorg-mode,通过设置以下变量:

  • deft-markdown-mode-title-level - 当设置为正整数时,决定在新的 Markdown 文件中标题前添加多少个井号。换句话说,将 deft-markdown-mode-title-level 设置为 <kbd>2</kbd> 将导致新文件创建时使用 ## Title 形式的二级标题。

  • deft-org-mode-title-prefix - 当不为 nil 时,新 org-mode 文件中自动生成的标题将以 #+TITLE: 为前缀。

其他自定义设置

Deft 默认按最新到最旧的顺序列出文件。你可以将 deft-current-sort-method 设置为 'title 以按文件标题排序(忽略大小写)。或者,你可以使用 deft-toggle-sort-method 切换排序方法。

增量字符串搜索是启动时的默认过滤方法,但你可以将 deft-incremental-search 设置为 nil,使正则表达式搜索成为默认方法。

Deft 还提供了一个不直接使用 Deft 缓冲区打开文件的函数。调用 deft-find-file 将提示打开一个文件,类似于 find-file,但仅限于 deft-directory 中 Deft 已知的文件(即那些匹配 deft-extensions 的文件)。与 find-file 不同,会提供所有这些文件的列表,并且可以使用 completing-read 完成所需的文件名(因此,当启用时,deft-find-file 将使用 ido、helm 等读取/完成文件名)。如果选定的文件在 deft-directory 中,它将以常用的 Deft 功能打开(自动保存、自动更新 Deft 缓冲区等)。否则,该文件将像往常一样由 find-file 打开。因此,你可以为这个函数设置一个全局快捷键,以在任何地方打开 Deft 文件。例如,要使用 <kbd>C-x C-g</kbd><kbd>C-x C-f</kbd> 的邻居),可以使用以下设置:

(global-set-key (kbd "C-x C-g") 'deft-find-file)

用于高亮显示屏幕各个部分的面也可以自定义。默认情况下,这些面继承自当前颜色主题定义的标准 font-lock 面的属性。

Deft 还提供了几个钩子:deft-mode-hookdeft-filter-hookdeft-open-file-hook。有关更多详细信息,请参阅这些变量的文档。

致谢

感谢 Konstantinos Efstathiou 编写 simplenote.el,我从中借鉴了很多,也感谢 Zachary Schneirov 编写 Notational Velocity,我希望将其功能和精神带到 Emacs 中。

历史

版本 0.8 (2018-01-12):

  • deft-find-file 限制为 Deft 已知的文件,并支持 completing-read。
  • 显示文件名时保留子目录部分。
  • 新变量 deft-width-offset 用于自定义摘要行宽度偏移。
  • 尝试在刷新浏览器后恢复光标位置,并在过滤时保持位置。
  • 添加钩子:deft-filter-hook 用于过滤字符串变化,deft-open-file-hook 在打开文件后运行。
  • 防止 Deft 浏览器的虚假刷新,解决了与 sublimity-mode 的问题。
  • 窗口大小变化时更可靠地更新浏览器。
  • 仅在缓冲区可见时更新宽度。
  • 保存文件后延迟更新 Deft 缓冲区。
  • 删除文件时关闭打开的缓冲区。
  • 即使在后台启动时也初始化宽度。
  • 忽略从 org 或 markdown 生成的文件。
  • 自定义格式字符串 deft-new-file-format 用于新文件名。
  • 当没有边缘时减少摘要行宽度。
  • 支持 Org 链接。
  • 选项 deft-filter-only-filenames 仅对文件名进行过滤。

版本 0.7 (2015-12-21):

  • 添加自定义正则表达式 deft-strip-summary-regexp 用于删除生成摘要行时的多余文本。默认情况下删除所有 org-mode 元数据。
  • 新的可自定义正则表达式用于忽略文件和目录。参见 deft-recursive-ignore-dir-regexpdeft-ignore-file-regexp
  • 错误修复:防止控制台模式下行换行。
  • 错误修复:在加载时设置 deft-extensionsdeft-default-extension
  • 错误修复:尝试防止在 org-mode 笔记中出现误匹配标题,其中 #+TITLE: 字符串可能也出现在正文中。
  • 错误修复:在自动保存文件时使用 with-current-buffer 而不是 save-excursion,因为我们不想保存光标位置。
  • 错误修复:在 deft-file-naming-rules 中不转义引号。

版本 0.6 (2015-06-26):

  • 子目录递归搜索(可选)。将 deft-recursive 设置为非空值以启用。
  • 通过 deft-extensions 列表支持多个扩展名。因此,deft-extension 现已弃用。
  • 新变量 deft-create-file-from-filter-string 可以启用基于过滤字符串生成新文件名的功能。这将标题显示(deft-use-filename-as-title)与实际文件名生成分离。
  • 新变量 deft-file-naming-rules 允许自定义文件名生成,包括字母大小写和空格处理。
  • 新变量 deft-markdown-mode-title-leveldeft-org-mode-title-prefix 用于自动插入标题标记。
  • deft-archive-directory 中归档文件。
  • 通过 deft-current-sort-method 可以按标题或修改时间排序。
  • 更新默认的 deft-strip-title-regexp 以移除以下内容:
    • org-mode 的 #+TITLE: 标签
    • MultiMarkdown 的 Title: 标签
    • LaTeX 注释标记
    • Emacs 模式行声明(如 -*-mode-*-
  • 移除标题首尾的空白字符。
  • 禁用可视行模式以防止换行。
  • 启用行截断以避免显示截断字符。
  • 重命名文件时,将旧文件名显示为默认提示。
  • 打开文件时调用 hack-local-variables 以读取文件局部变量。
  • 修复了几个字节编译警告。
  • 错误修复:更健壮地处理相对和绝对文件名。
  • 错误修复:使用字符串宽度而非长度进行计算。
  • 错误修复:修复空文件时的 string-width 错误。

版本 0.5.1 (2013-01-28):

  • 错误修复:当过滤字符串和 deft-use-filename-as-title 都非空时,使用 <kbd>C-c C-n</kbd> 创建文件会导致无效路径。
  • 错误修复:已关闭的缓冲区会在 deft-auto-save-buffers 中持续存在。

版本 0.5 (2013-01-25):

  • 实现增量字符串搜索(默认)和正则表达式搜索。可以通过按 <kbd>C-c C-t</kbd> 切换这些搜索模式。
  • 可以通过设置 deft-incremental-search 更改默认搜索方法。
  • 支持自定义 deft-parse-title-function 进行标题后处理。
  • 默认的 deft-parse-title-function 只是去除 deft-strip-title-regexp 的匹配项,用于移除 Markdown 和 Org 标题。
  • 使用 <kbd>C-o</kbd> 在另一个窗口打开文件。用 <kbd>C-u</kbd> 前缀可切换到另一个窗口。
  • 对于符号链接,使用目标文件的修改时间进行排序。
  • 打开文件时,将光标移动到过滤字符串第一个匹配项的末尾。
  • 改进了过滤编辑:删除(DEL)、删除词(<kbd>M-DEL</kbd>)和粘贴(<kbd>C-y</kbd>)。
  • 在小缓冲区中进行高级过滤编辑(<kbd>C-c C-l</kbd>)。

版本 0.4 (2011-12-11):

  • 提高过滤性能。
  • 可选择从文件名而非内容第一行获取标题(参见 deft-use-filename-as-title)。
  • 动态调整宽度以适应整个窗口。
  • 可自定义时间格式(参见 deft-time-format)。
  • 正确处理带或不带尾斜杠的 deft-directory

版本 0.3 (2011-09-11):

  • 国际化:支持使用多字节字符进行过滤。

版本 0.2 (2011-08-22):

  • 过滤时匹配文件名。
  • 自动保存打开的文件(可选)。
  • 解决一些字节编译警告。

Deft 最初由 Jason Blevins 编写。 初始版本 0.1 于 2011 年 8 月 6 日发布。

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI助手AI工具AI写作工具AI辅助写作蛙蛙写作学术助手办公助手营销助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

聊天机器人AI助手热门AI工具AI对话
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多