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