AGGIORNAMENTO : ho creato il pacchetto Semantic Refactor che risolve completamente questo problema e altro ancora. Puoi guardare le demo per vedere come funziona. Il testo rimanente di questa risposta, dopo questa frase, è vecchio e messo lì solo per motivi storici.
VECCHIA RISPOSTA :
È possibile utilizzare senator-copy-tag
per copiare accuratamente la firma della funzione, quindi incollarla nuovamente nel file di origine. senator-copy-tag
e i comandi Senator sono disponibili quando si abilita semantic-mode
:
(semantic-mode 1)
Semantic è un pacchetto integrato di Emacs.
È possibile combinare Semantic Senator con Projectile in un comando per inserire il prototipo di funzione in un altro file (file con lo stesso nome ma con estensione diversa) da qualsiasi parte del progetto. Se c'è solo un altro file, il comando si inserisce immediatamente in quel file; se più di uno, viene richiesto di selezionare un file; in caso contrario, vengono richiesti tutti i file nel progetto. Dopo aver selezionato un file, un prompt offre un elenco di tag semantici nel buffer corrente che è possibile scegliere di inserire dopo.
Ho inviato una PR a Emacs Refactor . Codice completo se si desidera provare senza attendere il PR: fare clic qui .
Ecco una demo (inizia quando vedi START DEMO
in basso):
Puoi anche usare solo Senator per copiare e far funzionare il prototipo. Fintanto che point è in qualsiasi punto all'interno della firma della funzione o del corpo della funzione, esegui senator-copy-tag
, che è associato per C-c , M-w
impostazione predefinita, copia l'intera funzione: sia la firma che il corpo. Tuttavia, è possibile incollare solo la firma se lo si desidera eseguendo il comando senator-yank-tag
, che è associato per C-c , C-y
impostazione predefinita. Premendo C-y
incolla l'intera firma della funzione insieme al suo corpo. senator-copy-tag
funziona anche con la firma della funzione espansa su più righe come questa:
void
func(int a,
int b,
int c)
{
.....
}
Sebbene questo approccio non venga inserito direttamente nel buffer con lo stesso nome, è più applicabile in altri casi. Il tuo caso d'uso funziona solo se hai due file nella stessa directory e con lo stesso nome ma con estensioni diverse. Cosa succede se la dichiarazione di funzione e la definizione di funzione devono rimanere in file diversi con nomi diversi?
EDIT2 : ecco un esempio per l'inserimento intelligente del prototipo di funzione usando i tag semantici. Attualmente, puoi inserire solo in base alle posizioni relative ("prima" e "dopo") dei tag semantici di livello superiore. Vi aggiornerò all'utente fare per essere in grado di inserire in qualsiasi luogo in cui sono disponibili i tag semantici, con più posizioni (vale a dire quando un tag è una Class
, dovrebbe offrire ulteriori posizioni: public
, projected
e private
). La demo inizia quando vedi START DEMO
in basso:
Bonus : se si desidera generare un elenco di definizioni di funzioni vuote in un .cpp
file da un file di intestazione, utilizzare member-Functions.el . Ma presto lo sostituirò con Semantic + Projectile.