Integração ClangFormat e Notepad ++

ClangFormat é uma das melhores ferramentas para formatar automaticamente códigos-fonte em C, C ++, Java, JavaScript, Objective-C, C #. Existem plugins para ambientes populares de desenvolvimento (IDEs), mas geralmente é necessário formatar rapidamente um arquivo ou parte de um arquivo de origem sem iniciar um IDE pesado, experimentar configurações de formatação e diferentes versões do ClangFormat com a capacidade de desfazer alterações rapidamente. Usar a versão do console do ClangFormat para essa finalidade é inconveniente. Uma solução possível é chamar ClangFormat a partir de um editor de texto. O site oficial descreve como se integrar ao Vim, Emacs e alguns outros, mas não há informações sobre a integração com o Notepad ++. A seguir, é apresentada uma instrução simples para o Notepad ++ (para Windows).

Requisitos iniciais


  • formatar um arquivo aberto no Notepad ++ com ClangFormat;
  • formatar o fragmento selecionado no arquivo;
  • descartar alterações;
  • mudança de formatação de estilo (conjunto de regras);
  • Mudando para outra versão do ClangFormat
  • use ferramentas padrão sempre que possível, sem reconstruir o ClangFormat e sem escrever um novo plug-in para o Notepad ++.

Instalação e configuração


1. Se o Notepad ++ ainda não estiver instalado, faça o download e instale-o


https://notepad-plus-plus.org

2. No Notepad ++, instale o plug-in NppExec


O NppExec permite chamar aplicativos de terceiros do Notepad ++ e interagir com os componentes da biblioteca Scintilla, com base nos quais o Notepad ++ está gravado.

Plugins –> Plugin Admin... –> NppExec –> Install
O Notepad ++ será reiniciado, após o qual o <Notepad++>/plugins/NppExec/ e o item de menu Plugins –> NppExec serão Plugins –> NppExec

3. Baixe o executável ClangFormat


Para fazer isso, na página https://llvm.org/builds/ , encontramos e LLVM-XXX-rYYYYYY-win64.exe o arquivo de instalação do Windows, por exemplo, LLVM-XXX-rYYYYYY-win64.exe . Você não pode instalar o pacote inteiro, apenas extraia o arquivo clang-format.exe pelo clang-format.exe . Você pode usar o 7-zip: exclua a extensão .exe do .exe , abra-o com 7-zip e extraia o clang-format.exe do bin/ subdiretório. clang-format.exe no clang-format.exe <Notepad++>/plugins/NppExec/clang-format/ .

4. Adicione arquivos de configuração para ClangFormat


Os arquivos de configuração devem ter o nome .clang-format _clang-format ou .clang-format _clang-format . Eles contêm um conjunto de regras de formatação (estilos), cujo formato é descrito no guia Opções de estilo ClangFormat .

Por exemplo, usamos arquivos dos projetos Linux Kernel e Qt .

Os arquivos no .clang-format baixados do GitHub são colocados nos diretórios apropriados:
<Notepad++>/plugins/NppExec/clang-format/LINUX_KERNEL/
<Notepad++>/plugins/NppExec/clang-format/QT/


5. Crie um script para NppExec


Abra a janela para editar e executar scripts NppExec Plugins –> NppExec –> Execute... ou pressione F6 . Copie e cole o texto do script abaixo na janela e salve o script chamado clang-format com o botão Save...

Script NppExec
 // Hide console NPP_CONSOLE 0 //------------------------------------------------------------------------------ // Uncomment a line to select a style //set style = LINUX_KERNEL set style = QT //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ set clangformatexe = $(CWD)\plugins\NppExec\clang-format\clang-format.exe set clangformatcfgdir = $(CWD)\plugins\NppExec\clang-format set tmpdir = $(SYS.TEMP) set clangformatcfgfile = $(clangformatcfgdir)\$(style)\.clang-format set srcfiletmp = $(tmpdir)\~src.tmp //------------------------------------------------------------------------------ cmd.exe /c if exist "$(clangformatexe)" (exit 0) else (exit 1) if $(EXITCODE) != 0 then NPP_CONSOLE 1 echo ERROR: "$(clangformatexe)" not found exit endif cmd.exe /c if exist "$(clangformatcfgfile)" (exit 0) else (exit 1) if $(EXITCODE) != 0 then NPP_CONSOLE 1 echo ERROR: "$(clangformatcfgfile)" not found exit endif // Copy $(clangformatcfgfile) to $(tmpdir)\.clang-format if their temestamps are different cmd.exe /v /c " for %i in ("$(clangformatcfgfile)") do set date1="%~ti" && for %i in ("$(tmpdir)\.clang-format") do set date2="%~ti" && if not "!date1!"=="!date2!" ( echo !date1! != !date2! && echo COPYING $(clangformatcfgfile) to $(tmpdir)\ && copy "$(clangformatcfgfile)" "$(tmpdir)\" /Y )" if $(EXITCODE) != 0 then NPP_CONSOLE 1 echo ERROR copying "$(clangformatcfgfile)" to "$(tmpdir)" exit endif // Get selected text length sci_sendmsg SCI_GETSELTEXT // If nothing is selected - select the current line if $(MSG_RESULT) == 1 then sci_sendmsg SCI_VCHOMEWRAP sci_sendmsg SCI_LINEENDWRAPEXTEND endif // Save selected text to $(srcfiletmp) sel_saveto "$(srcfiletmp)" :a cmd.exe /c if exist "$(srcfiletmp)" (exit 0) else (exit 1) if $(EXITCODE) != 0 then NPP_CONSOLE 1 echo ERROR: "$(srcfiletmp)" not found exit endif // Run ClangFormat $(clangformatexe) -i -style=file "$(srcfiletmp)" if $(EXITCODE) != 0 then NPP_CONSOLE 1 echo ERROR running "$(clangformatexe)" exit endif // Replace selected text with $(srcfiletmp) sel_loadfrom "$(srcfiletmp)" // Delete $(srcfiletmp) file cmd.exe /c del "$(srcfiletmp)" 


Depois de iniciar o script, com base no estilo de formatação selecionado especificado na variável style , seleciona o arquivo no .clang-format desejado, verifica a data de sua alteração e, se necessário, copia-o para um diretório temporário. Lá, o fragmento selecionado do código-fonte é copiado para o arquivo temporário, após o qual o clang-format.exe . O fragmento formatado é copiado de volta para a janela do Notepad ++. Em seguida, o arquivo temporário é excluído.

No ClangFormat, não há como especificar o caminho para o arquivo de configuração no .clang-format . O ClangFormat irá procurá-lo no diretório do arquivo formatado e, se não o encontrar, irá procurar nos diretórios pai. Após a .clang-format do script .clang-format arquivo no .clang-format permanecerá no diretório temporário para não copiá-lo sempre que a formatação for iniciada.

Em todos os estágios do script, os erros são verificados e, quando ocorrem, a janela do console NppExec é aberta, na qual uma mensagem é exibida.

6. No Notepad ++, adicione um novo item de menu para executar o script


Abra Plugins –> NppExec –> Advanced Options... , na lista suspensa Associated script , selecione o nome do script no clang-format e clique no botão Add/Modify .

Reiniciaremos o Notepad ++, após o qual o item de menu Plugins –> NppExec –> clang-format será exibido.

imagem

7. No Notepad ++, configure o atalho do teclado para executar o script


Usaremos a combinação Ctrl + I por analogia com o QtCreator. Abra Settings –> Shortcut Mapper .

Por padrão, a combinação Ctrl + I ocupada, portanto, você deve liberá-la com o botão Clear na guia Main Menu (linha 38 Split Lines na versão atual do Notepad ++). Depois disso, na guia Plugin commands do Plugin commands - Plugin commands , atribua a combinação Ctrl + I ao script no clang-format .

Feito, podemos usá-lo!

Instrução de uso


Abra o arquivo de origem no Notepad ++, selecione o fragmento desejado ou todo o texto e pressione Ctrl + I Se nada for selecionado, a linha atual será formatada.

imagem

Para desfazer alterações, use as ferramentas padrão do editor ( Ctrl + Z ).
Para alterar as regras de formatação, edite os arquivos de configuração no .clang-format no diretório <Notepad++>/plugins/NppExec/clang-format/
Se você precisar usar outra versão do ClangFormat, altere o caminho para o arquivo executável no script
set clangformat = "\path\to\clang-format.exe"
Para selecionar um estilo de formatação diferente, pressione F6 e, no texto do script de clang-format selecione o estilo desejado descomentando uma das linhas
set style = STYLE_NAME .

Todos os arquivos necessários estão no arquivo morto .

Boa formatação!

Source: https://habr.com/ru/post/pt457972/


All Articles