Несколько несвязанных каталогов в одном буфере 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's 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, эффективно заменив оригинальные функции. (Альтернативно, вы можете посоветовать эти функции.)

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

Другие вопросы по тегам