ATUALIZAÇÃO : Criei o pacote Semantic Refactor que resolve completamente esse problema e muito mais. Você pode ver as demos para ver como elas funcionam. O texto restante desta resposta, após esta frase, é antigo e o coloca apenas por razões históricas.
RESPOSTA ANTIGA :
Você pode usar senator-copy-tag
para copiar com precisão a assinatura da função e colar novamente no arquivo de origem. senator-copy-tag
Os comandos Senator e estão disponíveis quando você ativa semantic-mode
:
(semantic-mode 1)
Semântico é um pacote interno do Emacs.
Você pode combinar o Senador Semântico com o Projétil em um comando para inserir o protótipo de função em outro arquivo (arquivo com o mesmo nome, mas com extensão diferente) de qualquer lugar do seu projeto. Se houver apenas um outro arquivo, o comando será inserido imediatamente nesse arquivo; se mais de um, você será solicitado a selecionar um arquivo; se não houver, você será solicitado a fornecer os arquivos inteiros no seu projeto. Depois de selecionar um arquivo, um prompt oferece uma lista de tags semânticas no buffer atual que você pode optar por inserir depois.
Enviei um PR para o Emacs Refactor . Código completo, se você quiser experimentar sem esperar pelo PR: clique aqui .
Aqui está uma demonstração (começa quando você vê START DEMO
na parte inferior):
Você também pode usar apenas o Senador para copiar e funcionar o protótipo. Desde que point esteja em qualquer lugar dentro da assinatura da função ou do corpo da função, run senator-copy-tag
, que é vinculado C-c , M-w
por padrão, ele copia toda a função: a assinatura e o corpo. No entanto, você pode colar apenas a assinatura se desejar executando o comando senator-yank-tag
, que está vinculado C-c , C-y
por padrão. Pressionar C-y
cole toda a assinatura da função junto com seu corpo. senator-copy-tag
funciona mesmo com a assinatura da função expandida em várias linhas como esta:
void
func(int a,
int b,
int c)
{
.....
}
Embora essa abordagem não seja inserida diretamente no buffer com o mesmo nome, é mais aplicável em outros casos. Seu caso de uso funcionará apenas se você tiver dois arquivos no mesmo diretório e com o mesmo nome, mas com extensões diferentes. E se a declaração e a definição da função precisarem permanecer em arquivos diferentes com nomes diferentes?
EDIT2 : Aqui está um exemplo para inserção inteligente do protótipo de função usando tags semânticas. Atualmente, você só pode inserir com base nas posições relativas ("antes" e "depois") das tags semânticas de nível superior. Vou atualizar para o usuário fazer para ser capaz de inserir em qualquer lugar onde tags semânticas estão disponíveis, com mais posições (ou seja, quando uma tag é um Class
, ele deve oferecer posições adicionais: public
, projected
e private
). A demonstração começa quando você vê START DEMO
na parte inferior:
Bônus : se você deseja gerar uma lista de definições de funções vazias em um .cpp
arquivo a partir de um arquivo de cabeçalho, use member-functions.el . Mas em breve, substituirei por Semantic + Projectile.