Abre arquivos no emacs por nome de arquivo ao invés do caminho completo

4

Suponha que eu tenha um monte de diretórios e possa garantir que não haja dois diretórios com um nome de arquivo comum (ou seja, se foo/bar existir, então bar não existe em nenhum dos outros diretórios). Como posso configurar o emacs de tal forma que, dada uma lista codificada em .emacs dos diretórios para pesquisa, eu posso dizer para ele abrir bar e ele descobre que está em foo em vez de eu precisar dizer isso foo/bar todas as vezes? Seria ainda melhor se lidasse com colisões de nome de alguma forma (por exemplo, uma lista de possíveis correspondências), mas isso não é obrigatório, pois tenho certeza de que, nesse caso, os diretórios não têm nomes de arquivos em comum

    
por Michael Mrozek 17.04.2011 / 23:47

3 respostas

4

Enquanto escrevo isto, descubro ifind-mode , que parece bem no local.

(setq workspace-dir "/path/to/dir1 /path/to/dir2")
(require 'ifind-mode)
;; maybe change 'ifind-command' as well

Em seguida, digite M-x ifind-mode para encontrar um arquivo nos diretórios especificados (e subdiretórios por padrão), com conclusão bacana.

O que geralmente faço é e **/bar de zsh (onde e é um alias para emacsclient ). Mas isso é perturbador se você já estiver no Emacs. Além disso, se houver um arquivo específico que eu edito com frequência, deixo-o aberto (e salvo minha sessão).

Fora da caixa, você pode executar M-x find-dired e especificar argumentos para find . Mas isso é desajeitado, pelo menos para o caso quando você tem um único jogo. ifind torna isso menos desajeitado.

ido tem vários recursos que podem ser úteis, especialmente Use ido para encontrar qualquer arquivo do projeto .

    
por 18.04.2011 / 00:20
2

Acabei de descobrir o filecache , que é perfeito para os meus propósitos. Existem várias funções no formulário file-cache-add-directory-X para adicionar arquivos ao cache e, no meio da digitação de um nome de arquivo em find-file , você pode clicar em C-Tab para completar automaticamente o caminho usando o cache (acertando múltiplos ciclos através de partidas)

A postagem do EmacsWiki inclui funções para salvar / restaurar o cache. Eu escrevi um cron job para gerar o arquivo de cache automaticamente todas as noites; o arquivo se parece com isso:

(("filename" "/path/to/that/file/") ("other filename" "/different/path/"))

Então eu automaticamente carrego do cache quando o emacs começa a usar a função mencionada no EmacsWiki:

(require 'filecache)
(defun file-cache-read-cache-from-file (file)
  "Clear 'file-cache-alist' and read cache from FILE.
The file cache can be saved to a file using
'file-cache-save-cache-to-file'."
  (interactive "fFile: ")
  (file-cache-clear-cache)
  (let ((buf (find-file-noselect file)))
    (setq file-cache-alist (read buf))
    (kill-buffer buf)))

(file-cache-read-cache-from-file "~/.file-cache")
    
por 07.06.2012 / 20:55
0

Existem algumas alternativas, por exemplo: recentf-mode e ido-find-file do pacote ido .

    
por 18.04.2011 / 07:43