Passa al codice sorgente delle funzioni e delle variabili integrate


9

Durante tutto il giorno utilizzo costantemente C-h fo C-h v( describe-functione describe-variable) per cercare documentazione per funzioni e variabili. Più spesso, se non ottengo tutte le informazioni di cui ho bisogno, farò clic sul collegamento al file alla fine di:

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

e vai al codice sorgente. Funziona con i pacchetti installati, ma non sembra funzionare con quelli integrati. Ad esempio, nella parte superiore della pagina di aiuto per il comando describe-functionottengo solo:

describe-function is an interactive compiled Lisp function.

senza collegamento al codice sorgente. Esiste un modo per passare rapidamente al codice sorgente di un pacchetto integrato?

So di poter trovare il codice sorgente in eg, /usr/share/emacs/24.5/lispe trovare un numero qualsiasi di modi per accedere rapidamente a quella directory, ma sono curioso di sapere se esiste un modo semplice e veloce per navigare verso una funzione integrata / definizione variabile nella codice sorgente. Grazie!


5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. Uso sempre un'installazione completa di Emacs in modo da avere accesso a tutto, e subito dopo aver creato il mio Emacs copio il codice C-source e imposto la sua posizione in modo da poter trovare anche le definizioni del codice C-Source. Vedere la variabile find-function-C-source-directoryper impostare la posizione del codice C-source dopo averlo copiato.
elenco delle leggi

1
Usando il ramo master di Emacs, ottengo quanto segue con M-x describe-function: descrivi-funzione è una funzione Lisp compilata interattiva caricata automaticamente in "help-fns.el". E da lì posso fare clic su (o premere invio su) help-fns.ele sono quindi trasportato nella sezione applicabile del codice. Forse hai più versioni di Emacs e quella che stai utilizzando al momento non ha installato tutto il codice sorgente?
elenco delle leggi

Se ottieni questo comportamento quando avvii Emacs usando emacs -Q(nessun file init), o se riesci a riproporlo con una ricetta che inizia con emacs -Q(es. Dicendo quali librerie carichi e come le carichi ecc.), Allora considera di presentare un bug segnalare: M-x report-emacs-bug.
Drew

4
nb IIRC, i pacchetti Emacs per Debian (forse anche altri SO) separano i .elfile (trattati come opzionali) dai .elcfile (obbligatori), in modo tale che è necessario installare uno o più pacchetti aggiuntivi per ottenerli. Se hai ottenuto Emacs dal gestore dei pacchetti del tuo sistema operativo, forse questo lo spiega.
phils,

1
Potresti fare un grep (o altra utility di ricerca) per il nome dei binari (con permessi eseguibili) - emacs o emacsclient - e vedere dove si trovano sul tuo disco rigido. Conservo il mio interamente separatamente nella sua cartella dedicata. Ad esempio, ho la versione fornita con il mio sistema operativo - /usr/bin/emacse /usr/bin/emacsclient, e ho una versione ben confezionata in una cartella dell'applicazione OSX che termina in .app - cioè, /Applications/Emacs.app(all'interno di Emacs.app, ci sono i binari e tutti i file di codice sorgente).
elenco delle leggi

Risposte:


7

La ragione per cui a volte vedi "funzione Lisp compilata interattiva" (o similmente per variabili) senza nome file è che la funzione è stata caricata da un file compilato in byte e il corrispondente file sorgente Elisp non è presente. Per mostrarti il ​​codice sorgente, Emacs deve essere in grado di trovare il codice sorgente.

Molte distribuzioni spediscono i file sorgente Lisp in un pacchetto separato, perché non tutti gli utenti li vogliono e sono ingombranti. Ad esempio, su Debian e derivati, installa emacs24-el. Se costruisci Emacs dalla fonte, make installcopia le fonti Elisp.

Se vuoi vedere il codice sorgente delle primitive (subroutine e forme speciali), Emacs deve essere in grado di trovare le fonti C. Questi non sono normalmente disponibili a meno che non sia stato installato dal sorgente.

Emacs cerca le fonti Lisp nelle directory in load-path. Per una funzione o variabile caricata dal foo.elc,file può essere foo.elo foo.el.gz. Emacs cerca i sorgenti C in source-directorye ti richiede una directory diversa se non trova il file sorgente.


Anche se avrei giurato di aver creato questa versione di Emacs dal sorgente, quando la chiamo M-x emacs-versiondice "modificato da Debian" alla fine, il che indicherebbe che sto usando una versione dal gestore di pacchetti del mio sistema operativo (Ubuntu), giusto?
elethan

@elethan Se dice "modificato da Debian", allora hai installato o almeno creato il pacchetto Ubuntu. Potresti averlo creato dal sorgente (forse perché volevi una versione più recente di quella nella tua versione di Ubuntu). Corri /usr/bin/emacso /usr/local/bin/emacs?
Gilles 'SO- smetti di essere malvagio' il

1

Se stai cercando modi per saltare rapidamente al codice sorgente, ci sono anche find-function-at-pointe find-variable-at-pointche salteranno alla definizione del simbolo sotto il cursore - potresti legarli a Ch Cf e Ch Cv, per esempio.

Oppure potresti provare elisp-slime-nav , che usa M-. per passare alla definizione di un simbolo e M-, per tornare - naviga verso variabili, funzioni, librerie e facce - https://github.com/purcell/elisp-slime-nav/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.