Então, fiz esta pergunta sobre atalhos de diretório em um shell. A idéia é que eu gostaria de poder abrir um arquivo /home/Documents/foo
digitando C-x C-f ~foo/file
.
Então, existe uma maneira de emular os "diretórios nomeados" do zsh no buffer do emacs?
Aliás, as definições de atalho que eu quero usar já estão no meu .zshrc, se houver uma solução que as leia diretamente, que receba pontos de bônus.
Respostas:
O componente Emacs responsável pela expansão dos
~
nomes dos arquivos éexpand-file-name
. Infelizmente, está escrito em C, e no fundo de seu intestino está o código que assume que o que vem depois~
é um nome de usuário. Felizmente, o Emacs tem uma maneira genérica de adicionar um wrapper às funções, para que você possa fazer o que quiser se não se importar em repetir parte da lógica na função interna.Aqui está um código completamente não testado que deve ajudá-lo. Consulte “Orientando as funções do Emacs Lisp” no manual do Emacs Lisp para obter mais informações; a idéia básica é que
defadvice
adicione algum código para executar antes do código real deexpand-file-name
. Por favor, indique os erros que cometi inevitavelmente nos comentários (se você sabe como corrigi-los ou não).Vou deixar de analisar os atalhos
.zshrc
para preencherexpand-file-name-custom-tilde-alist
(ou qualquer outra técnica que você escolher para manter os aliases sincronizados) como um exercício.fonte
(defun my/add-to-tilde-alist (hash) (let* ((tilde:dir (split-string hash "=")) (tilde (car tilde:dir)) (dir (cadr tilde:dir))) (push (cons tilde dir) expand-file-name-custom-tilde-alist))) (mapc #'my/add-to-tilde-alist (split-string (with-output-to-string (call-process "zsh" nil standard-output nil "-ic" "hash -d")) "\n" t))
Basta usar em
$foo
vez de~foo
no minibuffer. O Emacs trataráfoo
como o nome de uma variável de ambiente e usará seu valor.fonte