Elisp를 사용하여 현재 Dired 버퍼의 모든 파일 이름 가져 오기


10

제목에서 알 수 있듯이 Elisp를 사용하여 Dired 버퍼의 모든 파일 항목을 가져 오려면 어떻게해야합니까?


1
이 질문이보기처럼 단순하다면 필요한 것은 directory-files입니다.
Jordon Biondo

@JordonBiondo 또 다른 일반적인 함수를 아는 것이 좋습니다. 원래 with-current-bufferDired 버퍼에서 파일 목록 또는 표시된 파일 을 사용하려고했습니다 . 모든 파일 목록을 위해 이제 사용할 수 있습니다 directory-files.
Tu Do

@JordonBiondo 다시 시도했습니다. 귀하의 방법은 "적절한"Dired 버퍼가있는 경우에만 작동합니다. 다른 디렉토리의 임의의 파일로 삽입 된 사용자 지정 Dired 버퍼가 directory-files있으면 옵션이 아닙니다.
Tu Do

답변:


7

마크 조작은 불필요하고 문제가 될 수 있습니다.

분명히 이러한 종류의 작업을 수행하기 위해 기능이 부족합니다 (문서화되지는 않았지만). 간단한 접근 방식은 다음과 같습니다.

;; 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 버전이 있습니까? CL을 좋아하지만 Projectile에서 CL 종속성을 사용할 수 없습니다.
Tu Do

cl-flet그냥 함수를 정의합니다. 코드를 더 깨끗하게 만들지 만 여전히 함수 일 뿐이므로 필요한 것을 정의하십시오. 또는 전혀 사용하지 말고 dired-map-dired-file-lines필요에 따라 코드를 복제하고 수정하십시오.
phils

네 말이 맞아 표시를 전환하면 기존 표시가 지워 지므로 문제가됩니다. 나는 당신의 대답이 정답이라고 생각합니다.
Tu Do

솔루션은 파일 만 검색하지만 디렉토리는 검색하지 않는 것 같습니다. 가능하면 업데이트하십시오.
Tu Do

네, 방금 모든 것을 얻기 위해 dired-get-filename부분적으로 수정했습니다 (dired-get-filename t t).
Tu Do

6

이 작업을 수행하는 단일 기능이 있는지 모르겠지만 이것이 효과가 있습니다.

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

때로는 다음과 같이 단순화 할 수 있습니다.

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

3

@ abo-abo의 답변 외에도 파일 (& dir) 이름 목록 을 얻는 방법을 알려줍니다 .

원하는 내용에 따라 대신을 dired-copy-filename-as-kill(를 w) 사용할 수 있습니다 dired-get-marked-files.

파일 이름을 공백으로 구분 된 단일 문자열 에 넣고 해당 문자열을로 푸시합니다 kill-ring.

(공백 분리는 물론 일부 파일 이름 자체에 공백 문자가 포함 된 경우에는 그렇게 유용하지 않음을 의미합니다. ;-))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.