2021-07-17 ,

指定した任意のorgファイルへエントリー(サブツリー)を移動する方法

org-refile (C-c C-w) でorg-modeのエントリー(サブツリー)を他の場所へ移動できるのだけど、デフォルトだとカレントバッファ内の第1レベルのエントリ内へしか移動できない。

移動先の候補は org-refile-targets 変数で変更できるのだけど、その場で好きなファイルを指定してその中へ移動というのは出来ないように見える。これまで org-refile-targets には (org-agenda-files :maxlevel . 2) を指定していたのでアジェンダ処理対象ファイルへは移動できるのだけど、特定のプロジェクト専用のorgファイル(あちこちのディレクトリにある)へ移動したい場合には困る。

やりたいことはシンプルに、C-c C-wの後にファイルを指定して、次に移動先のエントリーを指定したいだけなのだけど。

変数 org-refile-use-outline-path や org-outline-path-complete-in-steps を使うと最初にファイルを指定できるようにもなるけれど、やっぱり org-refile-targets の制限を受けてしまう。

これまではエントリーをカット&ペーストしていたのだけど、やはり C-c C-w で出来た方が便利だ。ちなみにペーストは任意のエントリーの子としてペーストする機能が見当たらずペーストしてからレベルを調整する必要があって手間がかかる。C-c C-x C-y (org-paste-special) は現在の場所と同一レベルにペーストするので M-right で一段下げなければならない。

どうにもならないのかと諦めかけたところ、次の記事を見た。

目にとまったのはこの部分。

org-refile-targets lets you control which files to consider, e.g.:

nil  ;; only the current file
'((org-agenda-files :maxlevel . 2)) ;; all agenda files, 1st/2nd level
'((org-files-list :maxlevel . 4)) ;; all agenda and all open files
'((my-org-files-list :maxlevel . 4)) ;; all files returned by `my-org-files-list'

org-refile-targets には任意の関数を指定できるのであった。その関数は移動候補となるファイル名のリストを返すことになっている。

(org-files-list) 関数はアジェンダファイルと現在開いているorgファイルを返すので、それを指定すればアジェンダファイルの他に現在開いているorgファイルへも移動できるようになる。

完全に任意のファイルとはいかないが、先にファイルを開いておけばいいだけなので当分これで我慢しておこうと思う。