Nhận tất cả tên tệp trong bộ đệm Dired hiện tại với Elisp


10

Như tiêu đề cho thấy, làm cách nào để tôi có được tất cả các mục nhập tệp trong bộ đệm Dired bằng Elisp?


1
Nếu câu hỏi này đơn giản như vẻ ngoài của nó, tất cả những gì bạn cần là directory-files.
Jordon Biondo

@JordonBiondo Thật tốt khi biết một chức năng chung khác. Ban đầu tôi dự định sử dụng with-current-buffertrên bộ đệm Dired để lấy danh sách các tệp hoặc các tệp được đánh dấu. Đối với một danh sách tất cả các tập tin, bây giờ tôi có thể sử dụng directory-files.
Từ Đô

@JordonBiondo Tôi đã thử lại. Phương pháp của bạn chỉ hoạt động khi chúng tôi có bộ đệm Dired "thích hợp". Nếu chúng ta có bộ đệm Dired tùy chỉnh được chèn với các tệp tùy ý từ các thư mục khác nhau, thì đó directory-fileskhông phải là một tùy chọn.
Từ Đô

Câu trả lời:


7

Thao tác đánh dấu dường như không cần thiết, và có lẽ có vấn đề.

Rõ ràng là có chức năng trong dired để làm điều này (mặc dù không được ghi chép rõ ràng). Đây là một cách tiếp cận đơn giản:

;; Silence compile-time warning:
(declare-function dired-map-dired-file-lines "dired-aux")

(defun my-dired-files ()
  "Return a list of files (only) in the current dired buffer."
  (eval-when-compile (require 'cl-lib))
  (require 'dired-aux)
  (let (flist)
    (cl-flet ((fpush (fname) (push fname flist)))
      (dired-map-dired-file-lines #'fpush))
    (nreverse flist)))

Biên tập:

Trong các bình luận bạn nói rằng bạn muốn danh sách kết quả bao gồm các đường dẫn thư mục cũng như các đường dẫn tệp.

dired-map-dired-file-linesloại trừ rõ ràng các thư mục và không có tùy chọn để bao gồm chúng; nhưng thật dễ dàng để xác định một chức năng, đơn giản bằng cách sao chép bản gốc và bỏ qua bài kiểm tra không mong muốn:

(defun my-dired-map-over-files-and-dirs (fun)
  "Perform FUN with point at the end of each file or directory line.
FUN takes one argument, the absolute filename."
  (save-excursion
    (let (file buffer-read-only)
      (goto-char (point-min))
      (while (not (eobp))
        (save-excursion
          (and (not (eolp))
               (setq file (dired-get-filename nil t)) ; nil on non-file
               (progn (end-of-line)
                      (funcall fun file))))
        (forward-line 1)))))

Chỉ cần sử dụng này thay dired-map-dired-file-linescho chức năng ban đầu. Sau đó, bạn cũng có thể loại trừ declare-functioncuộc gọi.

Tất nhiên, bạn có thể sửa đổi thêm chức năng mới này để xây dựng danh sách mong muốn trực tiếp, thay vì gọi một chức năng để làm điều đó. Tôi cảm thấy cách tiếp cận tổng quát hơn là tốt trong thực tế, nhưng bạn có thể thích ý tưởng gói tất cả vào một chức năng duy nhất.


Có phiên bản không CL? Tôi thích CL, nhưng tôi không thể sử dụng phụ thuộc CL trong Projectile.
Từ Đô

cl-fletchỉ định nghĩa một hàm. Nó làm cho mã sạch hơn, nhưng nó vẫn chỉ là một hàm, vì vậy hãy xác định một mã theo cách bạn cần. Hoặc hoàn toàn không sử dụng dired-map-dired-file-lines, thay vào đó hãy sao chép và sửa đổi mã của nó khi cần.
phils

bạn đúng rồi. Dấu hiệu Toggling xóa các dấu hiệu cũ, đó là vấn đề. Tôi xem xét câu trả lời của bạn là chính xác.
Từ Đô

giải pháp của bạn dường như chỉ lấy các tập tin, nhưng không có thư mục. Hãy cập nhật nó khi có thể.
Từ Đô

Vâng, tôi vừa sửa đổi dired-get-filenamemột phần (dired-get-filename t t)để có được mọi thứ.
Từ Đô

6

Tôi không biết nếu có một chức năng duy nhất thực hiện việc này, nhưng điều này có thể làm việc cho bạn:

(let (r)
  (dired-unmark-all-files ?\r nil)
  (dired-toggle-marks)
  (setq r (dired-get-marked-files))
  (dired-toggle-marks)
  r)

Đôi khi bạn có thể đơn giản hóa nó thành:

(progn (dired-toggle-marks)
       (dired-get-marked-files))

3

Ngoài câu trả lời của @ abo-abo, nó còn cho bạn biết cách lấy danh sách tên tệp (& dir):

Tùy thuộc vào những gì bạn muốn, bạn có thể sử dụng thay thế dired-copy-filename-as-kill(ràng buộc w) thay vì dired-get-marked-files.

Nó đặt tên tệp thành một chuỗi , được phân tách bằng dấu cách và đẩy chuỗi đó sang chuỗi kill-ring.

(Tất nhiên, phân tách không gian có nghĩa là nó không hữu ích khi một số tên tệp chứa ký tự khoảng trắng.;))

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.