Featured image of post Emacsでノート検索が捗るパッケージ「Xeft.el」

Emacsでノート検索が捗るパッケージ「Xeft.el」

Xeft.elはDeft likeなノート検索インターフェイスを提供するElispパッケージです。

dynamic moduleを使ってXapianを検索エンジンとして利用することで、Deftよりも高速で高機能な検索機能を提供していることが特徴です。 Emacs 26以上で利用できます。

Xapianとは

Xapian projectはC++で開発されているオープンソース検索エンジンライブラリです。

Xapian is a highly adaptable toolkit which allows developers to easily add advanced indexing and search facilities to their own applications. It has built-in support for several families of weighting models and also supports a rich set of boolean query operators.

公式ページによると、PythonやJava、Node.jsなど様々な言語ランタイムにバインドできるサポートがあるようです。 current usersを見るとDoxygenなどが検索エンジンとして内包しているようですね。知らなかった。

Xeft.elでは検索機能をこのXapianを利用して実現しているため、XapianのQuery syntaxを利用して検索することもできます。

インストール

Xeft.elはGithubにもmirrorがありますが、READMEにあるとおりプライマリーリポジトリはsourcehutのようです。

straight.elでsourcehutからインストールします。

1
2
3
(use-package xeft
  :ensure t
  :straight (xeft :type git :host sourcehut :repo "casouri/xeft"))

Xeft.elはGNU Elpaでも配信されているのでそちらからインストールしてもよいと思います。 後述のdynamic moduleのビルドを考えるとGNU Elpaの方がいいかもしれません。

次にXeft.elが対象とするノートファイルが保存されているディレクトリを設定します。 必要に応じてXeft.elが作成するデータベースを保存するディレクトリや、検索対象ディレクトリの再帰設定などもしておきます。

1
2
3
4
5
6
7
8
(use-package xeft
  :ensure t
  :straight (xeft :type git :host sourcehut :repo "casouri/xeft")
  :custom
  (xeft-directory "~/.org")
  (xeft-database "~/.org/db")
  (xeft-default-extension "org")
  (xeft-recusive t))

Xeft.elは前述のとおりdynamic moduleを利用してXapianを利用しているので、そのビルドが必要です。 初回に起動したときに、ビルド済みバイナリをダウンロードするか、手元でビルドするかを聞かれます。 ここでは、手元でビルドします。

Xapianのビルド

ここでのXapianのビルドにはMacOSを利用します。

ビルドにはXapianのライブラリが必要です。 XapianはMacOS向けにはbrewやmacportで配信されているのでこれらのツールでインストールできます。 ここでは、Nixpkgs経由でインストールします。

1
nix-env -iA nixpkgs.xapian

あとはXeft.elをもってきたディレクトリで make します。 NixpkgsでインストールしたXapianは、 PREFIX=/Users/{user}/.nix-profile でビルドできます。

straight.el を利用した場合、dynamic moduleは build 以下に配置したいのですが、 repo 以下にしかMakefileやdynamic module用のソースがないためビルドに失敗します。 直接 repo 以下でビルドし、成果物を build 以下に配置する必要があります。またstraightがリビルドしたタイミングで消去されたりするので注意が必要です。

この記事の時点では最新のv3.3で作業しています。 CHANGELOGによると、v3.0のbreaking changeでDBの後方互換が崩れているので、もしv2.0系を利用している場合はデータベースを一回消す必要があります。

Xeft.elにパッチをあてる

v3.3を利用していると検索中に停止して動作しないことがあります。 エラーを見てみると、 void-function string-split と怒られているので、typoの修正を行っておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
---
 xeft.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xeft.el b/xeft.el
index f2ad5e2..df854fe 100644
--- a/xeft.el
+++ b/xeft.el
@@ -641,7 +641,7 @@ entered by the user."
   (if (equal search-phrase "")
       excerpt-list
     (let* ((phrase-list
-            (mapcar #'downcase (string-split search-phrase))))
+            (mapcar #'downcase (split-string search-phrase))))
       (cl-stable-sort
        excerpt-list
        (lambda (ex1 ex2)
--
2.38.1

sourcehutではメーリングリストによるpatch送信が通例のようですので、このpatchはXeft.elの作者様にメールしておきます。

便利に使うための設定いくつか

検索ハイライト色を変更する

検索結果は目立つ色にハイライトしておきたいので、変更します。

1
2
3
4
5
(use-package xeft
  ...
  :custom-face
  (xeft-inline-highlight
   ((t (:foreground "black" :background "findHighlightColor" :inherit underline :extend t)))))

SKKによる日本語入力を有効にする

Xapianは日本語検索をサポートしているので、日本語検索がすぐできるよう、XeftバッファではSKKを有効にしておきます。

1
2
3
4
(use-package xeft
  ...
  :hook
  (xeft-mode-hook . skk-mode))

ノートの作成時にOrgフォーマットのテンプレートを挿入する

ここではXeft.elからノートを作成したときに、 #+date: ヘッダーの挿入とバレットを自動で挿入するようにします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(use-package xeft
  ...
  :config
  (defadvice xeft-create-note (around insert-date-prop activate)
    "insert org property: DATE with date of today"
    (let ((search-phrase (xeft--get-search-phrase)))
      ad-do-it
      (erase-buffer)
      (save-excursion
        (goto-char (point-min))
        (insert (format "#+title: %s\n" search-phrase))
        (insert "#+date: ")
        (org-insert-time-stamp (current-time))
        (insert (format "\n\n* %s" search-phrase))))))

まとめ

Xeft.elはDeftに比べると大量のノートに対する検索は高速でかなり快適です。日本語もそのまま使え、クエリもあるので非常に便利です。

Deftはelispだけで実装されているためポータビリティが高いですが、Xeft.elはdynamic moduleが必要なためポータビリティはDeftに比べるとやや劣ります。 しかし、Emacsユーザーの多くはWindowsでもWSLを利用しているでしょうし、LinuxやMacユーザーにはそれほど大ききなビハインドではないと思いますので、Xeft.elはおすすめです。

Org roamでは全文検索にDeftを案内していますが、Xeftでも代用できます。ノートが大きくなってパフォーマンスが辛い人には非常によい選択肢ではないでしょうか。

Built with Hugo
テーマ StackJimmy によって設計されています。