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

553
user38983

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

1

1 ответ на вопрос

3
Drew

Предоставьте список строк вместо имени каталога в качестве (первого) аргумента функции 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 (что угодно, не обязательно каталог name) и (2) отдельные файлы или каталоги, которые вы хотите перечислить.

Неотрицательный префикс arg по-прежнему запрашивает использование lsключей. (Так C-0же, как: запрашивает переключатели, а также имя буфера и список файлов.)

Я исправил i( dired-maybe-insert-subdir), чтобы он работал с произвольными каталогами. И, конечно, вы все равно можете использовать префикс arg iдля указания различных lsключей, которые будут использоваться для вставленного списка subdir.

В Windows Emacs 23.1.1 нажатие клавиши «i» отказывается вставлять каталог, жалуясь на «: не в этом дереве каталогов ". Вы видите одно и то же? Поскольку каталоги, в которых я заинтересован, находятся под двумя разными буквами дисков, я не могу запустить dired в одном каталоге, который содержит оба подкаталога. user38983 10 лет назад 0
Справа - смотрите мое обновление к ответу. Дайте мне знать, что вы узнаете. Drew 10 лет назад 0
FWIW, я обновил Dired +, чтобы поддержать это. Не знаю, будут ли сообщены какие-либо проблемы с этим. Кажется, до сих пор работает нормально. Drew 10 лет назад 0
O-хорошо. Оставьте заявку и получите ответ и исправление. Скачайте исправление и узнайте, что * автор * библиотеки вставил исправление и отвечал на мои другие вопросы по emacs. Я попробовал это, и это удовлетворяло мои потребности больше месяца в этот момент. user38983 9 лет назад 0

Похожие вопросы