ОНОВЛЕННЯ : Я створив пакет Semantic Refactor, який повністю вирішує цю проблему та інше. Ви можете подивитися демо, щоб побачити, як це працює. Текст цієї відповіді, що залишився після цього речення, є старим і розміщується там лише з історичної причини.
СТАРИЙ ВІДПОВІДЬ :
Ви можете senator-copy-tag
точно скопіювати підпис функції, а потім вставити назад у вихідний файл. senator-copy-tag
і команди Senator доступні, коли ви вмикаєте semantic-mode
:
(semantic-mode 1)
Semantic - це вбудований пакет Emacs.
Ви можете поєднати Semantic Senator з Projectile в команду, щоб вставити прототип функції в інший файл (файл з тим же ім'ям, але з різним розширенням) з будь-якого місця вашого проекту. Якщо є лише один інший файл, команда вставляється негайно у цей файл; якщо їх більше, вам буде запропоновано вибрати файл; якщо цього немає, вам буде запропоновано ввести всі файли у вашому проекті. Після вибору файлу підказка пропонує список семантичних тегів у поточному буфері, який ви можете вставити після.
Я подав PR в Emacs Refactor . Повний код, якщо ви хочете спробувати, не чекаючи PR: натисніть тут .
Ось демонстрація (вона починається, коли ви бачите START DEMO
внизу):
Ви також можете використовувати лише сенатор для копіювання та функціонування прототипу. Поки точка знаходиться де-небудь всередині функції підпису або тіла функції, запустіть 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)
{
.....
}
Хоча цей підхід не вставляється безпосередньо в буфер з такою ж назвою, він більше застосований в інших випадках. Ваш регістр використання працює лише в тому випадку, якщо ви маєте два файли в одному каталозі та з тим самим іменем, але різні розширення. Що робити, якщо декларація функції та визначення функції повинні знаходитись у різних файлах з різними іменами?
EDIT2 : Ось приклад розумної вставки прототипу функції за допомогою семантичних тегів. Наразі ви можете вставляти лише на основі відносних позицій ("до" та "після") семантичних тегів верхнього рівня. Я буду оновлювати , щоб зробити користувач , щоб мати можливість вставити в будь-якому місці , де семантичні теги доступні, з великою кількістю позицій (тобто , коли тег є Class
, він повинен запропонувати додаткові позиції: public
, projected
а private
). Демонстрація демонструється, коли ви бачите START DEMO
внизу:
Бонус : Якщо ви хочете сформувати список пустих визначень функцій у .cpp
файлі із заголовкового файлу, використовуйте member-функции.el . Але незабаром я заміню його на Semantic + Projectile.