ОБНОВЛЕНИЕ : Я создал пакет Semantic Refactor , который полностью решает эту проблему и многое другое. Вы можете посмотреть демоверсии, чтобы увидеть, как это работает. Оставшийся текст этого ответа после этого предложения является старым и помещен там только по исторической причине.
СТАРЫЙ ОТВЕТ :
Вы можете использовать senator-copy-tag
для точного копирования подписи функции, а затем вставить обратно в исходный файл. senator-copy-tag
и команды Senator доступны при включении semantic-mode
:
(semantic-mode 1)
Semantic - это встроенный пакет Emacs.
Вы можете объединить Semantic Senator с Projectile в команду, чтобы вставить прототип функции в другой файл (файл с тем же именем, но с другим расширением) из любой точки вашего проекта. Если есть только один другой файл, команда сразу вставляет в этот файл; если их больше одного, вам будет предложено выбрать файл; если их нет, вас попросят указать все файлы в вашем проекте. После выбора файла в подсказке будет предложен список семантических тегов в текущем буфере, который вы можете добавить после.
Я отправил пиар в Emacs Refactor . Полный код, если вы хотите попробовать, не дожидаясь пиара: нажмите здесь .
Вот демонстрация (она начинается, когда вы видите START DEMO
внизу):
Вы также можете использовать только Senator для копирования и функционирования прототипа. Пока точка находится где-нибудь внутри сигнатуры функции или тела функции, запустите ее senator-copy-tag
, что связано C-c , M-w
по умолчанию, она копирует всю функцию: и сигнатуру, и тело. Тем не менее, вы можете вставить только подпись, если хотите, запустив команду senator-yank-tag
, с которой связан C-c , C-y
по умолчанию. Нажатием C-y
вставьте всю подпись функции вместе с ее телом. senator-copy-tag
даже работает с сигнатурой функции, развернутой в несколько строк, например:
void
func(int a,
int b,
int c)
{
.....
}
Хотя этот подход не вставляется непосредственно в буфер с тем же именем, он более применим в других случаях. Ваш вариант использования работает, только если у вас есть два файла в одном каталоге и с одинаковым именем, но с разными расширениями. Что если объявление функции и определение функции должны находиться в разных файлах с разными именами?
РЕДАКТИРОВАТЬ 2 : Вот пример для умной вставки прототипа функции с использованием семантических тегов. В настоящее время вы можете вставлять только на основе относительных позиций («до» и «после») семантических тегов верхнего уровня. Я буду обновлять , чтобы сделать пользователь , чтобы иметь возможность вставить в любом месте , где семантические теги доступны, с большим количеством позиций (то есть , когда тег является Class
, он должен предложить дополнительные позиции: public
, projected
а private
). Демо начинается, когда вы видите START DEMO
внизу:
Бонус : если вы хотите создать список пустых определений функций в .cpp
файле из файла заголовка, используйте member-functions.el . Но скоро я заменю его на Semantic + Projectile.