書籍の翻訳作業を継続的に行えるように工夫する

僕は技術書の翻訳の仕事をしている。この仕事をする上で重宝する素養の1つは間違いなく根気だろう。書籍は1行を1つずつ舐めるように確認していき、正確さを確認したり、文章をこねくり回して伝わりやすそうな表現にしていく。LLM(大規模言語モデル)の得意とする所だ。僕もLLMは使用しているけれど、大切な事は自分が納得する内容となっている事であるため、基本的には僕の手によって全てが書かれる事になる。時間は当然かかるのだけれど、それほどまとまった時間を一度に確保する事はできないし、集中力も続かない。そのため6ヶ月とか1年とか、そこそこ長い期間に渡って作業を進める事になる。その際、作業自体は分割して作業する事になるのだが、作業が分割されると、途中で止めていた作業を再開する事が難しくなってくる。この作業の再開コストを下げる事で、程良いスピードで作業が進められるように工夫したい所だ。

まずは、そんなに難しくない事から取り組んでいこう。

前回作業した箇所を記録しておき、作業再開時にはその位置を開くようにしよう。Emacsには recentf という仕組みと save-place-mode がある。これらの標準機能を組み合わせ、さらにプロジェクト固有のファイルをフィルタリングできる仕組みを追加する。

Emacsの標準機能を活用することで、シンプルな実装が可能になる。

使用する標準機能

recentf-mode
最近開いたファイルのリストを自動的に記録する機能。ファイルを開くたびに履歴が更新される。履歴には recentf-list でアクセスできる。
save-place-mode
ファイルごとのカーソル位置を記録し、再度開いた時に同じ位置にカーソルを復元する機能。

これら2つの機能を組み合わせると、「最後に作業していたファイル」と「そのファイルのどの位置にいたか」の両方が自動的に記録される。

コード実装

;;; my-work.el --- 書籍翻訳作業の継続サポート

(require 'recentf)
(require 'saveplace)

(defcustom my-work-on-book-translation-path-pattern ""
  "現在作業中の翻訳リポジトリへのパスやディレクトリ名"
  :type 'string
  :group 'my-work)

;;;###autoload
(defun my-work-on-book-translation ()
  "翻訳プロジェクトのファイルを選択して開く"
  (interactive)
  ;; 必要なモードを有効化(既に有効なら何もしない)
  (recentf-mode 1)
  (save-place-mode 1)
  (find-file (completing-read
              "Open recent translation: "
              (completion-table-with-metadata
               (seq-filter (lambda (l) (string-search my-work-on-book-translation-path-pattern l))
                           recentf-list)
               '((category . my-work)))
              nil t)))

(provide 'my-work)
;;; my-work.el ends here

設定と実行

init.elに以下を追加する。

(require 'my-work)

;; 翻訳プロジェクトのパスパターンを設定
(setq my-work-on-book-translation-path-pattern "~/src/repo/")

作業再開時には以下のコマンドを実行する。

M-x my-work-on-book-translation

実行すると、翻訳プロジェクトのファイルで最近開いたものを選択するUIが表示される。ファイルを選択すると前回の位置でファイルが開かれる。

実装の詳細

この実装では、以下の実装をしている。

カスタマイズ可能なフィルタリング

defcustom を使って my-work-on-book-translation-path-pattern を定義している。これにより、ユーザーは自分のプロジェクトパスを設定でき、翻訳作業に関係のないファイルを除外できる。

対話的なファイル選択

completing-read を使うことで、候補から対話的にファイルを選択できる。 recentf-list をそのまま使うのではなく、 seq-filter でパターンマッチするファイルのみに絞り込んでいる。

標準機能の活用

独自のタイマーやフックを実装せず、Emacsの標準機能に任せている。 recentf-modesave-place-mode はEmacsが自動的にファイルの開閉を監視し、適切なタイミングで情報を保存してくれる。

まとめ

翻訳作業のような長期間に渡って地道に進める必要のある作業では、作業を分割して進める必要があるため、作業の再開コストをできるだけ下げたい。

今回はその方針で、Emacsの標準機能である recentf-modesave-place-mode を活用し、前回の作業位置でバッファを開くための簡単なEmacs Lispを書いた。 M-x my-work-on-book-translation を実行すれば、前回の作業位置でファイルを開くため、多少は作業の再開コストを下げられたと思う。

いずれアイドルタイマーを仕込んで、半ば強制的にタスクに戻らせるような仕組みにもしてみたいが、今回はここまでとする。