
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- i
o no buffer Dired.
Por exemplo, avalie isto:
(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3))
onde DIRN
são nomes de diretórios (strings) e FILEN
sã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 DIR1
e DIR2
e 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 wdired
para 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 cd
isso no diretório ancestral comum, antes de criar seu buffer Dired. No extremo, isso significaria M-x cd
o 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 dired
para 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+.el
para informações de contato.)
Copie o código-fonte dessas duas funções do arquivo dired-aux.el
: dired-insert-subdir
e dired-insert-subdir-newpos
e 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-validate
na 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 ls
as 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-validate
completa, mas se essa verificação de opções for realmente importante, você pode tentar apenas remover esta parte do dired-insert-subdir-validate
có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 ls
opções a serem usadas. (O mesmo C-0
acontece 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 i
para especificar diferentes ls
opções a serem usadas na listagem de subdiretórios inserida.