Navegue para o código fonte das funções e variáveis ​​incorporadas

9

Durante todo o dia, estou constantemente usando C-h fou C-h v( describe-functione describe-variable) para procurar documentação para funções e variáveis. Frequentemente, se não obtiver todas as informações necessárias, clicarei no link do arquivo no final de:

some-random-command is an interactive compiled Lisp function in `some-mode.el'.

e navegue até o código fonte. Isso funciona para pacotes instalados, mas não parece funcionar para pacotes internos. Por exemplo, na parte superior da página de ajuda do comando, describe-functiontudo o que recebo é:

describe-function is an interactive compiled Lisp function.

sem link para o código fonte. Existe alguma maneira de navegar rapidamente para o código-fonte de um pacote incorporado?

Sei que posso encontrar o código-fonte em, por exemplo, /usr/share/emacs/24.5/lispe apresentar várias maneiras de acessar esse diretório rapidamente, mas estou curioso para saber se existe uma maneira rápida e fácil de navegar para uma função interna / definição de variável no diretório Código fonte. Obrigado!

elethan
fonte
5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. Eu sempre uso uma instalação completa do Emacs para ter acesso a tudo, e logo após criar o meu próprio Emacs copio o código-fonte C e defino sua localização para encontrar também as definições do código C-fonte. Consulte a variável find-function-C-source-directorypara definir o local do código-fonte C depois de copiá-lo.
lawlist
11
Usando a ramificação principal do Emacs, recebo o seguinte com M-x describe-function: description-function é uma função Lisp compilada e interativa, carregada automaticamente, em 'help-fns.el'. E a partir daí eu posso clicar (ou pressionar enter) help-fns.ele depois ser transportado para a seção aplicável do código. Talvez você tenha várias versões do Emacs, e a que você está usando no momento não possui todo o código-fonte instalado?
lawlist
Se você tiver esse comportamento ao iniciar o Emacs usando emacs -Q(sem arquivo init), ou se puder reproduzi-lo com uma receita que comece com emacs -Q(por exemplo, dizendo quais bibliotecas você carrega e como as carrega etc.), considere registrar um bug informar: M-x report-emacs-bug.
Drew
4
No IIRC, os pacotes Emacs para Debian (talvez também outros sistemas operacionais) separam os .elarquivos (tratados como opcionais) dos .elcarquivos (obrigatório), de forma que você precisa instalar um ou mais pacotes adicionais para obtê-los. Se você obteve o Emacs do seu gerenciador de pacotes do sistema operacional, talvez isso explique.
phils
11
Você pode fazer um grep (ou outro utilitário de pesquisa) para o nome dos binários (com permissões de executáveis) - emacs ou emacsclient - e ver onde eles estão no disco rígido. Eu guardo o meu inteiramente separadamente em sua própria pasta dedicada. Por exemplo, tenho a versão que acompanha o meu sistema operacional - /usr/bin/emacse /usr/bin/emacsclienttenho uma versão bem compactada em uma pasta de aplicativo OSX que termina em .app - ou seja, /Applications/Emacs.app(dentro desse Emacs.app, estão os binários e todos os arquivos de código-fonte).
lawlist

Respostas:

7

Às vezes, você vê a “função Lisp compilada interativa” (ou da mesma forma para variáveis) sem nome de arquivo, porque a função foi carregada de um arquivo compilado em bytes e o arquivo de origem Elisp correspondente não está presente. Para mostrar o código fonte, o Emacs deve ser capaz de encontrar o código fonte.

Muitas distribuições enviam os arquivos de origem Lisp em um pacote separado, porque nem todo usuário os deseja e eles são volumosos. Por exemplo, no Debian e derivados, instale emacs24-el. Se você criar o Emacs a partir da fonte, make installcopia as fontes Elisp.

Se você deseja ver o código fonte das primitivas (sub-rotinas e formas especiais), o Emacs precisa ser capaz de encontrar as fontes C. Normalmente, eles não estão disponíveis, a menos que você tenha instalado a partir da fonte.

O Emacs procura as fontes Lisp nos diretórios em load-path. Para uma função ou variável carregada do foo.elc,arquivo pode ser foo.elou foo.el.gz. O Emacs procura fontes C em source-directorye solicita um diretório diferente se não encontrar o arquivo de origem.

Gilles 'SO- parar de ser mau'
fonte
Embora eu pudesse jurar que construí esta versão do Emacs a partir do código-fonte, quando a chamo de M-x emacs-version"modificado pelo Debian" no final, o que indica que estou usando uma versão do gerenciador de pacotes do meu sistema operacional (Ubuntu), certo?
elethan
@elethan Se aparecer “modificado pelo Debian”, você instalou ou pelo menos construiu o pacote Ubuntu. Você pode ter construído a partir da fonte (talvez porque desejasse uma versão mais nova que a do seu lançamento do Ubuntu). Você está correndo /usr/bin/emacsou /usr/local/bin/emacs?
Gilles 'SO- stop be evil'
1

Se você estiver procurando maneiras de pular rapidamente para o código-fonte, também existem find-function-at-pointe find-variable-at-pointquais irão pular para a definição do símbolo sob o cursor - você pode vinculá-las ao Ch Cf e Ch Cv, por exemplo.

Ou você pode tentar elisp-slime-nav , que usa M-. para pular para a definição de um símbolo e M- para retornar - ele navega para variáveis, funções, bibliotecas e faces - https://github.com/purcell/elisp-slime-nav/

Brian Burns
fonte