Existe uma maneira de imprimir a definição de uma função existente no Emacs?

10

Eu quero ver a definição de uma função existente no Emacs. Isso é possível?

Eu tentei C-h d function-name RET, mas ele retorna apenas a string de documentação para a função, não a função real em si.

Estou pensando em algo semelhante ao typecomando bash , que retornará toda a definição de uma função.

(Backstory Embaraçoso: Eu acidentalmente escreveu mais de uma função trabalhar no meu .emacsarquivo com uma versão não-trabalho A função original ainda está na memória e ele funciona, mas eu não posso para a.! Vida de me lembrar como eu fiz isso.)

Micah R Ledbetter
fonte
11
Se você manteve .emacsaberto em um buffer, tente desfazer como um louco.
Gilles 'SO- stop be evil' (

Respostas:

10

Se você digitar C-h f function-name RET, obterá a documentação da função, com um link para a fonte da função, se disponível.

Eu não acho que exista uma função fácil do Lisp que você possa chamar para recuperar a localização da fonte de uma função; a pesquisa está bastante entrelaçada com o resto do sistema de ajuda. find-lisp-object-file-nameé a principal função que tenta descobrir onde está a fonte de uma função.

A menos que function-nameseja um primitivo (definido na fonte C do Emacs), você pode ver seu código com (symbol-function 'function-name), ou mais geralmente (função indireta 'nome da função). No entanto, se a função foi compilada em bytes, tudo o que você verá é seu código de bytes.

Gilles 'SO- parar de ser mau'
fonte
11
Obrigado! (symbol-function 'function-name)é exatamente o que eu estava procurando! Além disso, parece que, se você realmente precisa da fonte para as funções C, pode obtê-la usando informações da resposta de Oleg.
Micah R Ledbetter
Obrigado! Além disso, se a função for carregada automaticamente, você precisará chamá-la uma vez antes de poder obter o código-fonte.
Gerhard Burger
3

M-x find-function retorna a definição da função perto do ponto.

A partir da documentação:

Localiza o arquivo de origem que contém a definição do ponto próximo da função (selecionado por `função denominada no ponto ') em um buffer e coloca o ponto antes da definição. Defina a marca antes de mover, se o buffer já existir.

Se você deseja incluir também funções implementadas em C, adicione o seguinte ao seu arquivo .emacs:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Oleg Pavliv
fonte
Hmm. É bom saber, mas acho que funciona apenas para funções internas, que não é o que eu estava procurando.
Micah R Ledbetter
11
Ele funciona para funções definidas pelo utilizador, bem
Oleg Pavliv