询问: 如何对一组 org 文件进行全文搜索?

最近在使用 org-roam 记笔记, 效果都很理想. 目前困惑在于根据关键词查找很多 org 文件中的某项内容时十分困难.

目前自己找到的方案都不是很理想, 它们有:

  • deft: 这个似乎只能根据一组 org 笔记的文件标题或者文件名进行搜索.

  • org-roam: 这是目前我在用的卡片盒. 它的节点定位能够相比 deft 的文件名更精准, 但是想要根据关键词全文搜索内容还是做不到.

我的需求是可以在搜索时通过 org 文件的内容来进行定位, 而不是标题或者 org-roam 的 node.

如上所述, 折腾了一阵并未找到解决方案.

在这里求教一下各位, 有没有好的方案可以解决这个问题?

1 个赞

(defun bms/org-roam-rg-search ()
    "Search org-roam directory using consult-ripgrep. With live-preview."
    (interactive)
    (let ((consult-ripgrep-command "rg --null --ignore-case --type org --line-buffered --color=always --max-columns=500 --no-heading --line-number . -e ARG OPTS"))
      (consult-ripgrep org-roam-directory)))
3 个赞

使用 grep 类函数或者工具

  1. 补全类框架自带的函数,如:counsel-grep/rg, consult-grep/ripgrep
  2. 项目管理插件带的相关函数,如:project-find-regexp, projectile-grep/ripgrep
  3. 搜索类插件:rg, ripgrep
2 个赞

alphapapa/org-rifle: Rifle through your Org-mode buffers and acquire your target

可以对agenda中的org文件进行全文搜索,搜索效果的展示也很直观。

下图是在我的笔记中搜索「零和」的效果,可以看到是那个文件,heading层级,关键词也高亮了:

6 个赞

https://github.com/Wilfred/deadgrep

前面几个方法感觉都挺好,我也打算替换楼主提的deft,不过我这里deft是可以检索文件内容的,不光光是文件标题和文件名,只是定位不好

1 个赞

楼主对 rg 不满意?

对照着改了一个counsel的版本,counsel似乎不支持color=always,另外--fixed-strings好像不能用,会导致搜索不到任何结果,不知道能不能改进一下

(defun solarion/org-roam-rg ()
        "Search org-roam directory using counsel-rg."
        (interactive)
        (let ((counsel-rg-base-command '("rg" "--max-columns" "500" "--with-filename" "--no-heading" "--line-number" "--color" "never" "--ignore-case" "--type" "org" "%s")))
          (counsel-rg nil org-roam-directory)))
1 个赞

上面代码我是在org-roam论坛抄来的。

1 个赞

如果会做web后端的话,可以直接把org文件放进数据库,然后写sql语句查询搜索,这样org文件数在多,量在大也可以应对。输入->执行->搜索结果展示这些都可以 全在org-mode里面进行的

1 个赞

直接 rg 啊,把 org 所在的目录 git init 一下

1 个赞

rg不太好对搜索结果按笔记日期排序,以及切换排序方式

1 个赞

学到了, 原来还可以这样操作. 我有时间研究研究, 有成果的话就把操作过程贴过来.

https://github.com/casouri/xeft

2 个赞