1

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

1 ответ1

3

Предоставьте список строк вместо имени каталога в качестве (первого) аргумента для функции 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 , со строками для каталогов DIR1 и DIR2 и файлами FILE1 , FILE2 и FILE3 .

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


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

Хорошая точка зрения. Да, i (dired-maybe-insert-subdir) Dired требует, чтобы все вставленные подкаталоги принадлежали одному и тому же дереву каталогов. Я не знаю почему. Возможно, от этого зависит какой-то код (и его нужно учитывать), возможно, связанный с обработкой 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 , которая проверяет дерево dir :

  (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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .