Несколько несвязанных каталогов в одном буфере Dired

Несколько несвязанных каталогов в одном буфере Dired

Как вставить несколько несвязанных (не подкаталогов) каталогов в один буфер dired? В моем случае я хотел бы подготовить буфер dired, содержащий несвязанные каталоги с несколькими изменениями файлов (например, в режиме 'wdired' с несколькими переименованиями и изменениями или просто с несколькими отметками в разных каталогах), дважды визуально проверить их, а затем выполнить одним нажатием клавиши.

решение1

Укажите список строк вместо имени каталога в качестве (первого) аргумента функции dired.

  • Первый элемент в списке — имя буфера Dired.

  • Остальные элементы в списке — это имена каталогов или файлов.

Полученный буфер Dired будет содержать строку для каждого элемента в списке.

Конечно, любой из перечисленных каталогов можно вставить (т.е. расширить до списка его файлов) с помощью использования iего в буфере Dired.

Например, оцените это:

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

где DIRN— имена каталогов (строки), а FILEN— имена файлов (строки). Вы можете использовать абсолютные имена или имена относительно текущего значения default-directory.

Результатом здесь является буфер Dired my dired bufferсо строками для каталогов DIR1и DIR2файлов FILE1, FILE2, и FILE3.

Не уверен, что понял остальную часть вашего вопроса. Но полученный буфер Dired из вышеприведенного — это обычный буфер Dired. Вы можете использовать его wdiredдля разрешения изменений и т. д.


Обновление №1, после вашего комментария --

Хороший момент. Да, Dired i( dired-maybe-insert-subdir) требует, чтобы все вставленные подкаталоги принадлежали одному и тому же дереву каталогов. Не знаю почему. Возможно, часть кода (а его много, чтобы рассмотреть), возможно, связанная с обработкой ls, зависит от этого. Или, возможно, это ограничение, которое на самом деле не нужно.

Один из способов обойти это ограничение — начать с общего родительского каталога для всех подкаталогов, которые вы включаете в листинг. Я бы начал с 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, фактически заменив исходные функции. (В качестве альтернативы вы можете рекомендовать эти функции.)

Кажется, это заставляет все работать так, как и ожидалось, устраняя необходимость начинать с общего предка dir. Но, как я уже сказал, я не знаю, могут ли какие-то другие части кода 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))

Если окажется, что такие изменения кода не имеют нежелательных побочных эффектов, которые нельзя легко исправить, я рассмотрю возможность их добавления вDired+.

Спасибо, что обратили на это мое внимание. Думаю, я обычно создаю такие списки от общего предка, поэтому раньше я не замечал этого ограничения.


Кстати, я отправил Emacs «bug» #18421 с просьбой об улучшении: разрешить Dired обрабатывать списки каталогов, которые не относятся к одному и тому же дереву.


* ОБНОВЛЕНИЕ №2 *

Я добавил эту функцию вDired+.

Я изменил определенияC-x d( dired),C-x 4 d( dired-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переключателей для использования в списке вставленных подкаталогов.

Связанный контент