Inserir programaticamente arquivos no buffer Dired

10

Eu tenho uma lista de nomes de arquivos (com caminho completo) e quero criar um buffer Dired listando esse conjunto de arquivos. Como eu faria isso?

Como crio um buffer Dired a partir de uma lista de nomes de arquivos?

Sem usar dependências externas.

Tu Do
fonte
Por favor, esclareça. As strings da sua lista são: a) os nomes dos arquivos que você deseja criar ou b) o conteúdo do arquivo (a coisa para a qual você tem um caminho absoluto)?
Dan
@ Dan Uma lista de nomes de arquivos com caminhos absolutos. Apenas os nomes dos arquivos.
Tu Do
11
Se eu entendi corretamente, você pode usar apenas (find-file your-directory-path)para obter o diredbuffer relevante (por exemplo, (find-file "/tmp/")abrirá seu tmpdiretório em um diredbuffer).
Dan
11
Editei sua pergunta com base no que você disse nesses comentários. Sinta-se à vontade para reverter se eu entendi errado.
Malabarba
3
Se você deseja perguntar sobre objetos de arquivo no elisp, essa é uma pergunta totalmente diferente, com uma resposta muito curta: não há nenhuma. :-)
Malabarba 24/10

Respostas:

20

C-h f direddiz a resposta. Apenas passe para dired, como DIRNAMEargumento, uma lista que tenha como carro o nome do buffer direcionado que você deseja (qualquer string) e como cdr a lista de nomes de arquivos que você deseja listar no buffer. Geralmente, você deseja usar nomes de arquivos absolutos. Por exemplo:

(dired (list "My Dired Buffer Name*"     ; The Dired buffer name
             "/usr/foo/file1.el"         ; First file
             "/usr/bar/toto/some-file.c" ; Second file
             "/whatever/directory/"      ; Third is a directory
             "/a/file/somewhere.zzz"))   ; Fourth

Dependendo da sua plataforma, os nomes de arquivos e diretórios inexistentes inseridos podem ser ignorados (não listados) ou podem gerar um erro. O primeiro acontece se você usar ls-lisp.el(por exemplo, MS Windows). Você pode forçar o uso de ls-lispqualquer plataforma, se quiser (mas ls-lisptem menos lsopções), fazendo o seguinte:

(setq ls-lisp-use-insert-directory-program nil)
(require 'ls-lisp)

Se você usar a biblioteca Dired + ( dired+.el), poderá escolher interativamente arquivos e diretórios para listar: basta fornecer diredum argumento de prefixo não positivo (ou seja, <= 0). Em seguida, você será solicitado repetidamente os diretórios e nomes de arquivos que deseja listar. Você pode usar curingas com nome de arquivo (ou seja, *para globbing), para incluir os arquivos e diretórios correspondentes. Use C-gpara finalizar a entrada.

Em outras palavras, em vez de listar um único diretório, o buffer Dired pode listar qualquer número de diretórios e nomes de arquivos, que podem até pertencer a diferentes árvores de diretórios.

(Um prefixo não negativo arg (ou seja,> = 0) solicita as lsopções de listagem. Portanto, um prefixo zero arg solicita as opções e os arquivos / diretórios a serem listados: primeiro as lsopções e depois os arquivos / diretórios.)

Desenhou
fonte
Bem, eu quero fazê-lo no Elisp, não usando o comando. Eu só quero um trecho de código simples que transforme um nome de arquivo (com caminho completo) em uma entrada no buffer Dired, semelhante a como eu uso (insert ...)para inserir texto em um buffer.
Tu Do
11
@tudo: diredé uma função elisp. Apenas avalie isso: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))e você obtém um buffer direcionado contendo esses arquivos como o @Drew escreveu.
rekado
@rekado .Obrigado. Agora, reli a resposta corretamente, é como o que você disse. Eu só quero ver um trecho de código Elisp como o seu e achei que Drew me deu uma resposta de comando do usuário quando o vislumbrei.
Tu Do
@Drew Por favor, adicione o exemplo de rekado. Obrigado pela sua resposta.
Tu Do
Inicialmente, não achei que seria tão simples assim quando vejo conjuntos de arquivos . Eu pensei que devemos fazer o Dired reconhecer objetos de arquivo apropriados para que funcionem corretamente.
Tu Do
2

Aqui está um comando para fazer isso quando a lista de arquivos estiver em um buffer, com um arquivo por linha.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
killdash9
fonte