Vários diretórios não relacionados em um buffer Dired

Vários diretórios não relacionados em um buffer Dired

Como posso inserir vários diretórios não relacionados (não subdiretórios) em um buffer direcionado? No meu caso, eu gostaria de preparar um buffer dired contendo diretórios não relacionados com múltiplas alterações de arquivo (por exemplo, no modo 'wdired' com múltiplas renomeações e alterações, ou simplesmente com múltiplas marcas em diferentes diretórios), verificá-los visualmente e então execute-os com um toque de tecla.

Responder1

Forneça uma lista de strings, em vez de um nome de diretório, como o (primeiro) argumento para function dired.

  • O primeiro elemento da lista é o nome do buffer Dired.

  • Os outros elementos da lista são nomes de diretórios ou arquivos.

O buffer Dired resultante terá uma linha para cada elemento da lista.

Qualquer diretório listado pode, obviamente, ser inserido (ou seja, expandido para sua listagem de arquivos) usando- io no buffer Dired.

Por exemplo, avalie isto:

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

onde DIRNsão nomes de diretórios (strings) e FILENsão nomes de arquivos (strings). Você pode usar nomes absolutos ou nomes relativos ao valor atual de default-directory.

O resultado aqui é Dired buffer my dired buffer, com linhas para diretórios DIR1e DIR2e arquivos FILE1, FILE2, e FILE3.

Não tenho certeza se sigo o resto da sua pergunta. Mas o buffer Dired resultante acima é um buffer Dired normal. Você pode usar wdiredpara permitir alterações, etc.


Atualização nº 1, depois do seu comentário -

Bom ponto. Sim, o i( dired-maybe-insert-subdir) do Dired exige que todos os subdiretórios inseridos pertençam à mesma árvore de diretórios. Eu não sei por quê. Talvez parte do código (e há muito a considerar), talvez lidar com o tratamento de ls, dependa disso. Ou talvez seja uma restrição que não é realmente necessária.

Uma maneira de lidar (contornar) essa restrição é começar em um diretório ancestral comum para todos os subdiretórios incluídos na listagem. IOW comece fazendo M-x cdisso no diretório ancestral comum, antes de criar seu buffer Dired. No extremo, isso significaria M-x cdo diretório raiz. Isso definitivamente funcionará em todos os casos. Provavelmente, você precisará usar nomes de arquivo absolutos para os diretórios e arquivos que você passa diredpara a listagem.

Mas como você disse, se você usa o MS Windows e os diretórios estão em letras de unidade diferentes, isso não é uma solução.

Abaixo está outra coisa que você pode tentar. Não sei se isso pode causar problemas em outro lugar. (Eu estaria interessado em saber quais problemas você encontra, se isso acontecer. Veja o cabeçalho do arquivo da bibliotecadired+.elpara informações de contato.)

Copie o código-fonte dessas duas funções do arquivo dired-aux.el: dired-insert-subdire dired-insert-subdir-newpose modifique as cópias da seguinte maneira:

  • Para dired-insert-subdir, comente esta linha:

    (dired-insert-subdir-validate dirname switches)
    
  • Para dired-insert-subdir-newpos, altere o código para este:

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

Em seguida, carregue seu código modificado após carregar o código Vanilla Dired, substituindo efetivamente as funções originais. (Como alternativa, você poderia aconselhar essas funções.)

Isso parece fazer as coisas funcionarem conforme o esperado, evitando a necessidade de começar a partir de um diretório ancestral comum. Mas, como eu disse, não sei se algumas outras partes do código Dired (ou Wdired) podem ser incomodadas por tal mudança. Apenas experimente um pouco.

Observe, entretanto, que dired-insert-subdir-validatena verdade verifica duas coisas, das quais apenas uma deve ser removida, talvez (?). Além de verificar se o subdiretório a ser inserido está na mesma árvore de diretórios, verifica se lsas opções para ele são compatíveis com as da listagem geral. Não notei nenhum problema com a remoção dired-insert-subdir-validatecompleta, mas se essa verificação de opções for realmente importante, você pode tentar apenas remover esta parte do dired-insert-subdir-validatecódigo, que verifica a árvore dir:

  (or (dired-in-this-tree dirname (expand-file-name default-directory))
      (error  "%s: not in this directory tree" dirname))

Se parecer que tais alterações de código não têm efeitos colaterais indesejados que não possam ser corrigidos facilmente, considerarei adicioná-las aoDirecionado+.

Obrigado por trazer isso à minha atenção. Acho que normalmente crio essas listagens a partir de um ancestral comum, então não percebi essa limitação antes.


A propósito - registrei o "bug" # 18421 do Emacs para esta solicitação de melhoria: deixe o Dired acomodar listagens de diretórios que não são da mesma árvore.


*ATUALIZAÇÃO #2*

Eu adicionei esse recurso aoDirecionado+.

Eu modifiquei as definições deC-x d( dired),C-x 4 d( dired-other-window), eC-x 5 d( dired-other-frame) para que se você usar um prefixo não positivo arg (por exemplo, C-- C-x d), então você será solicitado a fornecer (1) o nome do buffer Dired (qualquer coisa que você quiser, não necessariamente um nome de diretório) e (2) os arquivos ou diretórios individuais que você deseja listado.

Um prefixo não negativo arg ainda solicita as lsopções a serem usadas. (O mesmo C-0acontece com ambos: solicita opções e nomes de buffer e arquivos para listar.)

Eu conserteii( dired-maybe-insert-subdir) para que funcione com diretórios arbitrários. E é claro que você ainda pode usar um prefixo arg with ipara especificar diferentes lsopções a serem usadas na listagem de subdiretórios inserida.

informação relacionada