Atalhos de diretório no buffer do emacs

8

Então eu perguntei esta questão sobre atalhos de diretório em um shell. A idéia é que eu gostaria de poder abrir um arquivo em /home/Documents/foo , digamos, 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 há uma solução que as lê diretamente, que recebe pontos de bônus.

    
por Seamus 06.09.2010 / 11:48

2 respostas

7

O componente Emacs que é responsável por expandir ~ nos nomes dos arquivos é expand-file-name . Infelizmente, está escrito em C, e dentro de seus intestinos está o código que assume que o que vem depois de ~ é um nome de usuário. Felizmente, o Emacs tem uma maneira genérica de adicionar um wrapper em torno das 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 “Recomendando Funções Lisp do Emacs” no manual Emacs Lisp para mais informações; A idéia básica é que defadvice adiciona algum código para ser executado antes do código real de expand-file-name . Por favor, sinalize os erros que cometi inevitavelmente nos comentários (se você sabe como corrigi-los ou não).

(ad-define-subr-args 'expand-file-name '(name &optional default-directory))
(defvar expand-file-name-custom-tilde-alist
  '("foo" . "/home/Documents/foo"))
(defadvice expand-file-name (before expand-file-name-custom-tilde
                             activate compile)
  "User-defined expansions for ~NAME in file names."
  (save-match-data
    (if (string-match "\'\(\(.*/\)?~\([^:/]+\)\)/" name)
        (let ((replacement (assoc (match-string 2 name) expand-file-name )))
          (if replacement
              (setq name (replace-match replacement t t name 1)))))))

Deixarei de analisar os atalhos em .zshrc para preencher expand-file-name-custom-tilde-alist (ou qualquer técnica que você escolha para manter os aliases em sincronia) como um exercício.

    
por 07.09.2010 / 00:14
3

Basta usar $foo em vez de ~foo no minibuffer. O Emacs tratará foo como o nome de uma variável de ambiente e usará seu valor.

    
por 28.09.2011 / 11:36

Tags