제목에서 알 수 있듯이 Elisp를 사용하여 Dired 버퍼의 모든 파일 항목을 가져 오려면 어떻게해야합니까?
with-current-buffer
Dired 버퍼에서 파일 목록 또는 표시된 파일 을 사용하려고했습니다 . 모든 파일 목록을 위해 이제 사용할 수 있습니다 directory-files
.
directory-files
있으면 옵션이 아닙니다.
제목에서 알 수 있듯이 Elisp를 사용하여 Dired 버퍼의 모든 파일 항목을 가져 오려면 어떻게해야합니까?
with-current-buffer
Dired 버퍼에서 파일 목록 또는 표시된 파일 을 사용하려고했습니다 . 모든 파일 목록을 위해 이제 사용할 수 있습니다 directory-files
.
directory-files
있으면 옵션이 아닙니다.
답변:
마크 조작은 불필요하고 문제가 될 수 있습니다.
분명히 이러한 종류의 작업을 수행하기 위해 기능이 부족합니다 (문서화되지는 않았지만). 간단한 접근 방식은 다음과 같습니다.
;; 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)))
편집하다:
주석에서 결과 목록에 디렉토리 경로와 파일 경로를 포함 시키길 원한다고 말합니다.
dired-map-dired-file-lines
디렉토리를 명시 적으로 제외하며 디렉토리를 포함 할 옵션이 없습니다. 그러나 단순히 원본을 복사하고 원치 않는 테스트를 생략하는 기능을 쉽게 정의 할 수 있습니다.
(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)))))
dired-map-dired-file-lines
초기 기능 대신에 이것을 사용하십시오 . 그런 다음 declare-function
통화를 제외 할 수도 있습니다.
물론, 새로운 함수를 추가로 수정하여 원하는 함수를 호출하는 대신 원하는 목록을 직접 작성할 수 있습니다. 실제로는 일반적인 접근 방식이 좋지만 모든 기능을 단일 함수로 묶는 아이디어를 선호 할 수 있습니다.
cl-flet
그냥 함수를 정의합니다. 코드를 더 깨끗하게 만들지 만 여전히 함수 일 뿐이므로 필요한 것을 정의하십시오. 또는 전혀 사용하지 말고 dired-map-dired-file-lines
필요에 따라 코드를 복제하고 수정하십시오.
dired-get-filename
부분적으로 수정했습니다 (dired-get-filename t t)
.
directory-files
입니다.