のカスタム関数を作成しdired-initial-position-hook
ます。この関数では、さまざまな関数を使用してファイルを検索し、最終的にdired-goto-file
ポイントを移動して「最適な」ファイルに移動できます。
(defun my-dired-goto-important-file ()
"Go to an important file in the current dired buffer."
(unless (bound-and-true-p save-place)
(let ((candidates '("master.tex" "AndroidManifest.xml"))
candidate)
(while (and candidates
(not (dired-goto-file (expand-file-name (pop candidates)))))
nil))))
(add-hook 'dired-initial-position-hook #'my-dired-goto-important-file)
以下では、この機能の特定の側面を説明し、潜在的な拡張機能を強調します。
ファイルへのジャンプ
dired-goto-file
nil
現在のdiredバッファにファイルが存在しない場合に返されるため、事前のチェックなしで呼び出しても安全です。ただしdired-goto-file
、絶対ファイル名(相対名でエラー)が必要expand-file-name
です。
ファイルを検索する
Diredは、ファイルを検索するための簡単なAPIを提供していません。通常、バッファ内のすべての行を反復するのと同じように、すべてのファイルを反復できます。
(let (files)
(goto-char (point-min))
(while (not (eobp))
(let ((filename (dired-get-filename nil 'no-error)))
(when filename
(push filename files)))
(forward-line 1))
;; Now `files' is a list of files, which you can search for patterns
;; …
)
ただし、マーキング機能を使用する方が便利です。既存のインタラクティブマークを失わないように、「異常な」マーカー文字を使用するよう注意してください。
(unwind-protect
(when (dired-mark-files-regexp (rx ".tex" string-end) ?t)
(dired-goto-file (expand-file-name "master.tex")))
(dired-unmark-all-files ?t))
場所モードを保存
また、プレイスモードを有効にした場合は、保存モードについても注意する必要があります。Diredバッファーでは、Save Placeモードは他のモードのようにポイント値を記憶せず、最後のファイル名ポイントがオンでした。このファイル名は、私たちと同じように復元します:フックしdired-initial-position-hook
て呼び出しますdired-goto-file
(実際、そこからコードを盗みました:))。
フックが場所の保存の前に来る場合、場所の保存モードは無条件に位置を上書きします。ただし、(このフックをセットアップした後に場所の保存が有効になっている場合のように)フックの前に来ると、実際には関数は場所の保存を上書きしますが、これは望ましくありません。ただし、任意のバッファと同様に、Save Placeはローカル変数save-place
を非nil値に設定するため、単純に確認して、Save Placeはファイル名を復元しませんでした。
Save Placeを「ルーズ」にしたい場合は、のチェックを外し、Save Place Modeを最初に有効にしてから引数の非nil値で呼び出して、Save Placeの後にsave-place
フックが実行されることを確認します。add-hook
APPEND
bound-and-true-p
。:-)