Trong bộ đệm được chuyển hướng, đặt điểm trên tệp quan trọng nhất của thư mục đó


14

90% thời gian tôi truy cập một thư mục trong Emacs, điều đầu tiên tôi làm là di chuyển điểm đến một tệp cụ thể và mở nó. Rất nhiều lần, tập tin tôi cần mở là rất dễ đoán. Ví dụ:

  • Nếu có .textập tin trong thư mục này, tôi thường đi thẳng đến master.tex.
  • Tại gốc của các dự án Android, nó phổ biến AndroidManifest.xml.
  • Trong thư mục nơi tôi phát triển gói emacs, hầu như luôn luôn là tệp nguồn chính của gói. Đó thường là, nhưng không phải luôn luôn, .eltập tin duy nhất trong thư mục này.

Có cách nào để tôi có thể định vị tự động điểm trên các tệp này khi tôi mở các thư mục này không?

Điều này sẽ cung cấp rất nhiều tiện lợi (vì tôi có thể mở chúng bằng cách chỉ cần nhấn RET), nhưng vẫn mang lại sự linh hoạt khi truy cập các tệp khác.

Câu trả lời:


16

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-filetrả về nilnế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-fileyê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-hookvà 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-placethà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-placevà đả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-hookvới giá trị không phải cho APPENDđối số của nó .


Câu trả lời chính xác. Bạn có thể muốn xác định bound-and-true-p. :-)
Malabarba

@Malabarba bound-and-true-plà một macro tích hợp từ bindings.el.
lunaryorn

Chúa ơi, tôi không làm điều gì khiến tôi cảm thấy tồi tệ hơn, thực tế là tôi không biết điều đó hoặc thực tế tôi thậm chí không kiểm tra.
Malabarba

@Malabarba Đừng bận tâm, tôi phải mất một năm (theo nghĩa đen) để khám phá sự tồn tại của chức năng này.
lunaryorn

Vâng, đó là một chức năng tuyệt vời mà tôi chưa bao giờ nghe thấy cho đến bây giờ!
sanityinc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.