一個 Dired 緩衝區中存在多個不相關的目錄

一個 Dired 緩衝區中存在多個不相關的目錄

如何將多個不相關(非子目錄)目錄插入到一個 dired 緩衝區中?就我而言,我想準備一個包含具有多個文件更改的不相關目錄的dired 緩衝區(例如,在具有多個重命名和更改的“wdired”模式下,或者簡單地在不同目錄之間具有多個標記),直觀地仔細檢查它們,然後只需按一下鍵即可執行它們。

答案1

提供字串列表,而不是目錄名稱,作為 function 的(第一個)參數dired

  • 清單中的第一個元素是 Dired 緩衝區的名稱。

  • 清單中的其他元素是目錄或檔案名稱。

產生的 Dired 緩衝區將為清單中的每個元素佔一行。

當然,可以透過i在 Dired 緩衝區中使用列出的任何目錄來插入(即擴展到其檔案清單)。

例如,評估這個:

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

其中DIRN是目錄名(字串),FILEN是檔案名稱(字串)。您可以使用絕對名稱或相對於 的目前值的名稱default-directory

這裡的結果是 Dired buffer my dired buffer,其中包含目錄DIR1DIR2以及文件FILE1, FILE2, 和 的行FILE3

不確定我是否遵循了你問題的其餘部分。但上面產生的 Dired 緩衝區是一個普通的 Dired 緩衝區。您可以使用wdired允許更改等。


更新#1,在您發表評論後—

好點子。是的,Dired 的i( dired-maybe-insert-subdir) 要求所有插入的子目錄都屬於同一目錄樹。我不知道為什麼。也許某些程式碼(並且有很多程式碼需要考慮),也許涉及 的處理ls,取決於此。或者也許這是一個不真正必要的限制。

處理(解決)此限制的一種方法是從清單中包含的所有子目錄的共同祖先目錄開始。 IOW 首先M-x cd在建立 Dired 緩衝區之前對公共祖先目錄進行操作。在極端情況下,這意味著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「bug」#18421:讓 Dired 容納不來自同一樹的目錄清單。


* 更新 #2 *

我已將此功能新增至迪雷德+

我修改了定義C-x d( dired),C-x 4 ddired-other-window), 和C-x 5 d( dired-other-frame) 因此,如果您使用非正前綴 arg(例如C-- C-x d),則系統會提示您(1) Dired 緩衝區名稱(任何您喜歡的名稱,不一定是目錄名稱)和(2) 所需的單一檔案或目錄。

非負前綴 arg 仍會提示您要ls使用的開關。 (C-0兩者也是如此:提示輸入開關以及緩衝區名稱和要列出的檔案。)

我解決了i( dired-maybe-insert-subdir) 以便它適用於任意目錄。當然,您仍然可以使用前綴 arg 來i指定ls用於插入的子目錄清單的不同開關。

相關內容