하나의 Dired 버퍼에 관련되지 않은 여러 디렉터리가 있습니다.

하나의 Dired 버퍼에 관련되지 않은 여러 디렉터리가 있습니다.

관련되지 않은(하위 디렉터리가 아닌) 여러 디렉터리를 하나의 디렉터리 버퍼에 삽입하려면 어떻게 해야 합니까? 내 경우에는 여러 파일 변경이 포함된 관련 없는 디렉터리가 포함된 디렉터리 버퍼를 준비하고 싶습니다(예: 여러 이름 바꾸기 및 변경이 포함된 'wdired' 모드 또는 단순히 여러 디렉터리에 걸쳐 여러 표시가 있음). 시각적으로 다시 확인한 다음 한 번의 키 입력으로 실행하십시오.

답변1

function 의 (첫 번째) 인수로 디렉터리 이름 대신 문자열 목록을 제공합니다 dired.

  • 목록의 첫 번째 요소는 Dired 버퍼의 이름입니다.

  • 목록의 다른 요소는 디렉터리 또는 파일 이름입니다.

결과 Dired 버퍼에는 목록의 각 요소에 대한 줄이 있습니다.

나열된 모든 디렉토리는 물론 iDired 버퍼에서 이를 사용하여 삽입(즉, 해당 파일 목록으로 확장)될 수 있습니다.

예를 들어 다음을 평가해 보세요.

(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3))

여기서 는 DIRN디렉터리 이름(문자열)이고 는 FILEN파일 이름(문자열)입니다. 절대 이름이나 현재 값에 상대적인 이름을 사용할 수 있습니다 default-directory.

여기서의 결과는 my dired buffer디렉터리 DIR1DIR2및 파일 FILE1, FILE2및 에 대한 행이 포함된 Dired 버퍼입니다 FILE3.

질문의 나머지 부분을 따르는지 잘 모르겠습니다. 그러나 위의 결과 Dired 버퍼는 일반 Dired 버퍼입니다. wdired변경 등을 허용하는 데 사용할 수 있습니다 .


업데이트 #1, 귀하의 의견 뒤에 --

좋은 지적. 예, Dired의 i( dired-maybe-insert-subdir)에서는 삽입된 모든 하위 디렉터리가 동일한 디렉터리 트리에 속해야 합니다. 이유를 모르겠습니다. 아마도 의 처리를 다루는 일부 코드(고려해야 할 코드가 많이 있음)는 ls이에 따라 달라질 수 있습니다. 아니면 실제로 필요하지 않은 제한일 수도 있습니다.

이 제한 사항을 처리(해결 방법)하는 한 가지 방법은 목록에 포함하는 모든 하위 디렉터리에 대한 공통 상위 디렉터리에서 시작하는 것입니다. IOW는 M-x cdDired 버퍼를 생성하기 전에 공통 조상 디렉터리를 처리하는 것부터 시작합니다. 극단적으로 이는 M-x cd루트 디렉터리를 의미합니다. 그것은 모든 경우에 확실히 작동할 것입니다. dired목록을 위해 전달하는 디렉터리 및 파일에 대해 절대 파일 이름을 사용해야 할 가능성이 높습니다 .

그러나 말씀하신 것처럼 MS Windows를 사용하고 디렉토리가 다른 드라이브 문자에 있는 경우 이는 해결책이 아닙니다.

다음은 시도해 볼 수 있는 또 다른 방법입니다. 다른 곳에서 문제가 발생할 수 있는지 여부는 알 수 없습니다. (만약 그렇다면 어떤 문제가 발생하는지 알고 싶습니다. 라이브러리의 파일 헤더를 참조하세요.dired+.el연락처 정보를 위해.)

dired-aux.el파일 및 dired-insert-subdir에서 이 두 함수의 소스 코드를 복사한 dired-insert-subdir-newpos후 다음과 같이 복사본을 수정합니다.

  • 의 경우 dired-insert-subdir다음 줄을 주석 처리합니다.

    (dired-insert-subdir-validate dirname switches)
    
  • 의 경우 dired-insert-subdir-newpos코드를 다음과 같이 변경합니다.

    (defun dired-insert-subdir-newpos (new-dir)
      ;; Find pos for new subdir, according to tree order.
      (let ((alist  dired-subdir-alist)
            elt dir new-pos)
        (while alist
          (setq elt    (car alist)
                alist  (cdr alist)
                dir    (car elt))
          (if (dired-tree-lessp dir new-dir)
              ;; Insert NEW-DIR after DIR
              (setq new-pos  (dired-get-subdir-max elt)
                    alist    ())
            (setq new-pos  (point-max))))
        (goto-char new-pos))
      ;; want a separating newline between subdirs
      (unless (eobp) (forward-line -1))
      (insert "\n")
      (point))
    

그런 다음 바닐라 Dired 코드를 로드한 후 수정된 코드를 로드하여 원래 기능을 효과적으로 대체합니다. (또는 해당 기능을 조언할 수도 있습니다.)

이렇게 하면 예상대로 작동하게 되어 공통 조상 디렉터리에서 시작할 필요가 없어집니다. 그러나 내가 말했듯이 Dired(또는 Wdired) 코드의 다른 부분이 그러한 변경으로 인해 방해를 받을 수 있는지 여부는 알 수 없습니다. 조금만 실험해보세요.

그러나 이는 dired-insert-subdir-validate실제로 두 가지를 확인하는데 그 중 하나만 제거해야 합니다(아마도(?)). 삽입할 하위 디렉터리가 동일한 디렉터리 트리에 있는지 확인하는 것 외에도 ls해당 스위치가 전체 목록의 스위치와 호환되는지 확인합니다. 완전히 제거하는 데 문제가 있다는 것을 발견하지 못했지만 이 스위치 확인이 정말 중요한 경우 디렉터리 트리를 확인하는 코드 dired-insert-subdir-validate의 이 부분을 제거해 볼 수 있습니다 .dired-insert-subdir-validate

  (or (dired-in-this-tree dirname (expand-file-name default-directory))
      (error  "%s: not in this directory tree" dirname))

그러한 코드 변경으로 인해 쉽게 고칠 수 없는 원치 않는 부작용이 없는 것으로 보인다면 해당 코드를 다음에 추가하는 것을 고려해 보겠습니다.다이레드+.

이 문제를 알려주셔서 감사합니다. 나는 보통 공통 조상으로부터 그러한 목록을 작성하는 것 같아서 이전에는 이러한 제한을 발견하지 못했습니다.


그런데 -- 이 개선 요청에 대해 Emacs "버그" #18421을 제출했습니다. Dired가 동일한 트리에 속하지 않는 디렉토리 목록을 수용하도록 허용했습니다.


* 업데이트 #2 *

이 기능을 추가했습니다.다이레드+.

의 정의를 수정했습니다.C-x d( dired),C-x 4 d( dired-other-window), 그리고C-x 5 d( dired-other-frame) 양수가 아닌 접두사 인수(예: C-- C-x d)를 사용하는 경우 (1) Dired 버퍼 이름(디렉터리 이름일 필요는 없지만 원하는 대로) 및 (2) 개별 파일 또는 디렉터리를 묻는 메시지가 표시됩니다. 당신이 나열하고 싶어.

음수가 아닌 접두사 arg는 ls사용할 스위치를 묻는 메시지를 계속 표시합니다. ( C-0둘 다 마찬가지입니다. 스위치와 버퍼 이름 및 나열할 파일을 묻는 메시지가 나타납니다.)

내가 고쳤어i( dired-maybe-insert-subdir) 임의의 디렉토리에서 작동하도록 합니다. 물론 접두사 arg를 사용하여 삽입된 하위 디렉터리 목록에 사용할 i다른 스위치를 지정할 수도 있습니다.ls

관련 정보