Viết một hàm tùy chỉnh cho dired-initial-position-hook
. Trong chức năng này, bạn có thể sử dụng các chức năng được chuyển hướng khác nhau để tìm kiếm các tệp và cuối cùng gọi dired-goto-file
để di chuyển điểm đến tệp tin hay nhất
(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)
Sau đây tôi sẽ giải thích các khía cạnh cụ thể của chức năng này và nêu bật các tiện ích mở rộng tiềm năng.
Nhảy vào tập tin
dired-goto-file
trả về nil
nếu tệp không tồn tại trong bộ đệm được chuyển hướng hiện tại, vì vậy an toàn để gọi mà không cần kiểm tra trước. Tuy nhiên, dired-goto-file
yêu cầu một tên tệp tuyệt đối (do lỗi về tên tương đối), do đó expand-file-name
.
Tìm kiếm tập tin
Dired không cung cấp API chuyển tiếp để tìm kiếm tệp. Nói chung, bạn có thể lặp lại tất cả các tệp giống như bạn lặp lại trên tất cả các dòng trong bộ đệm:
(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
;; …
)
Tuy nhiên, sẽ thuận tiện hơn khi sử dụng các chức năng đánh dấu. Chỉ cần cẩn thận để sử dụng một ký tự đánh dấu khác thường của người Viking, để không làm mất các dấu tương tác hiện có:
(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))
Chế độ lưu địa điểm
Bạn cũng cần cẩn thận với Chế độ lưu địa điểm, trong trường hợp bạn đã bật nó. Trong bộ đệm được điều hướng, Chế độ lưu vị trí không nhớ giá trị điểm như trong các chế độ khác, nhưng thay vào đó, điểm tên tệp cuối cùng được bật. Nó khôi phục tên tệp này giống như chúng ta: Nó nối vào dired-initial-position-hook
và gọi dired-goto-file
(thực tế, đó là nơi tôi đã đánh cắp mã đó :)).
Nếu hook của chúng tôi xuất hiện trước vị trí lưu, Chế độ Save Place sẽ ghi đè lên vị trí của chúng tôi một cách vô điều kiện. Tuy nhiên, nếu nó xuất hiện trước hook của chúng tôi (như trường hợp Save Place được bật sau khi bạn thiết lập hook này) thì chức năng của chúng tôi sẽ thực sự ghi đè lên Save Place không mong muốn. Tuy nhiên, như trong bất kỳ bộ đệm nào, Save Place đặt biến cục bộ save-place
thành giá trị không phải là số không, vì vậy chúng ta chỉ cần kiểm tra và chỉ hành động nó Save Place không khôi phục tên tệp.
Nếu bạn muốn có Save Place ngay lập tức, hãy xóa kiểm tra save-place
và đảm bảo rằng hook của chúng tôi được chạy sau Save Place, bằng cách bật Chế độ lưu địa điểm trước , sau đó gọi add-hook
với giá trị không phải cho APPEND
đối số của nó .
bound-and-true-p
. :-)