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.)


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.


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"))

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.