C'è un modo per stampare la definizione di una funzione esistente in Emacs?


10

Voglio vedere la definizione di una funzione esistente in Emacs. È possibile?

Ho provato C-h d function-name RET, ma restituisce solo la stringa di documentazione per la funzione, non la funzione vera e propria.

Sto pensando a qualcosa di simile al typecomando di bash , che restituirà l'intera definizione di una funzione.

(Backstory imbarazzante: ho accidentalmente scritto su una funzione funzionante nel mio .emacsfile con una versione non funzionante. La funzione originale è ancora in memoria! E funziona! Ma non riesco a ricordare per la vita come l'ho fatto.


1
Se sei rimasto .emacsaperto in un buffer, prova a annullare come un matto.
Gilles 'SO- smetti di essere malvagio'

Risposte:


10

Se digiti C-h f function-name RET, otterrai la documentazione della funzione, con un link alla fonte della funzione, se disponibile.

Non credo che ci sia una semplice funzione Lisp che puoi chiamare per recuperare la posizione della sorgente di una funzione; la ricerca è piuttosto intrecciata con il resto del sistema di aiuto. find-lisp-object-file-nameè la funzione principale che tenta di capire dove si trova l'origine di una funzione.

A meno che non function-namesia una primitiva (definita nella fonte C di Emacs), puoi vedere il suo codice con (symbol-function 'function-name), o più in generale (nome funzione-funzione indiretta). Tuttavia, se la funzione è stata compilata in byte, tutto ciò che vedrai sarà il suo bytecode.


1
Grazie! (symbol-function 'function-name)è esattamente quello che stavo cercando! Inoltre, sembra che se hai davvero bisogno dell'origine delle funzioni C, puoi ottenerlo usando le informazioni della risposta di Oleg.
Micah R Ledbetter,

Grazie! Inoltre, se la funzione è caricata automaticamente, è necessario chiamarla una volta prima di poter ottenere il codice sorgente.
Gerhard Burger

3

M-x find-function restituisce la definizione della funzione vicino al punto.

Dalla documentazione:

Trova il file sorgente contenente la definizione della funzione vicino al punto (selezionato da `funzione chiamata al punto ') in un buffer e posiziona il punto prima della definizione. Impostare il segno prima di spostare, se il buffer esisteva già.

Se vuoi includere anche le funzioni implementate in C devi aggiungere quanto segue al tuo file .emacs:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))

Hmm. Questo è buono a sapersi, ma penso che funzioni solo per le funzioni integrate, che non è quello che stavo cercando.
Micah R Ledbetter,

1
Funziona anche per funzioni definite dall'utente
Oleg Pavliv,
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.