AKTUALIZACJA : Stworzyłem pakiet Semantic Refactor , który całkowicie rozwiązuje ten problem i jeszcze więcej. Możesz obejrzeć dema, aby zobaczyć, jak to działa. Pozostały tekst tej odpowiedzi, po tym zdaniu, jest stary i umieściłem go tylko ze względów historycznych.
STARA ODPOWIEDŹ :
Możesz użyć senator-copy-tag
do dokładnego skopiowania podpisu funkcji, a następnie wkleić go z powrotem do pliku źródłowego. senator-copy-tag
Komendy Senator są dostępne po włączeniu semantic-mode
:
(semantic-mode 1)
Semantic to wbudowany pakiet Emacsa.
Możesz połączyć Semantic Senator z Projectile w komendę, aby wstawić prototyp funkcji do innego pliku (pliku o tej samej nazwie, ale z innym rozszerzeniem) z dowolnego miejsca w projekcie. Jeśli istnieje tylko jeden inny plik, polecenie wstawia natychmiast do tego pliku; jeśli więcej niż jeden, pojawi się monit o wybranie pliku; jeśli nie ma, zostanie wyświetlony monit o podanie wszystkich plików w projekcie. Po wybraniu pliku, monit wyświetla listę znaczników semantycznych w bieżącym buforze, po których można wstawić.
Przesłałem PR do Emacs Refactor . Pełny kod, jeśli chcesz spróbować bez oczekiwania na PR: kliknij tutaj .
Oto demo (zaczyna się, gdy zobaczysz START DEMO
na dole):
Możesz także użyć tylko Senatora do kopiowania i działania prototypu. Tak długo, jak punkt znajduje się gdziekolwiek w podpisie funkcji lub treści funkcji, uruchom senator-copy-tag
, który jest C-c , M-w
domyślnie związany, kopiuje całą funkcję: zarówno podpis, jak i treść. Możesz jednak wkleić tylko podpis, jeśli chcesz, uruchamiając polecenie senator-yank-tag
, które jest C-c , C-y
domyślnie powiązane . Naciśnięcie C-y
wklei całą sygnaturę funkcji wraz z jej ciałem. senator-copy-tag
działa nawet z sygnaturą funkcji rozwiniętą w wielu liniach, takich jak to:
void
func(int a,
int b,
int c)
{
.....
}
Chociaż to podejście nie wstawia bezpośrednio do bufora o tej samej nazwie, jest bardziej odpowiednie w innych przypadkach. Twój przypadek użycia działa tylko wtedy, gdy masz dwa pliki w tym samym katalogu i o tej samej nazwie, ale z różnymi rozszerzeniami. Co jeśli deklaracja funkcji i definicja funkcji muszą pozostać w różnych plikach o różnych nazwach?
EDYCJA 2 : Oto przykład inteligentnego wstawienia prototypu funkcji za pomocą znaczników semantycznych. Obecnie można wstawiać tylko na podstawie względnych pozycji („przed” i „po”) znaczników semantycznych najwyższego poziomu. Będę aktualizować, aby użytkownik mógł wstawić w dowolnym miejscu, w którym są dostępne znaczniki semantyczne, z większą liczbą stanowisk (tj gdy znacznik jest Class
, to powinien oferować dodatkowe pozycje: public
, projected
a private
). Demo rozpocznie się, gdy zobaczysz START DEMO
na dole:
Premia : Jeśli chcesz wygenerować listę pustych definicji funkcji w .cpp
pliku z pliku nagłówka, użyj member-functions.el . Ale wkrótce zastąpię go pociskiem Semantic +.