Integración de ClangFormat y Notepad ++

ClangFormat es una de las mejores herramientas para formatear automáticamente los códigos fuente en C, C ++, Java, JavaScript, Objective-C, C #. Hay complementos para entornos de desarrollo populares (IDE), pero a menudo necesita formatear rápidamente un archivo o parte de un archivo fuente sin ejecutar un IDE engorroso, experimentar con opciones de formato y diferentes versiones de ClangFormat con la capacidad de deshacer cambios rápidamente. Usar la versión de consola de ClangFormat para este propósito es inconveniente. Una posible solución es llamar a ClangFormat desde un editor de texto. El sitio web oficial describe los métodos de integración con Vim, Emacs y algunos otros, pero no hay información sobre la integración con Notepad ++. La siguiente es una instrucción simple para Notepad ++ (para Windows).

Requisitos iniciales


  • formatear un archivo abierto en Notepad ++ con ClangFormat;
  • formatear el fragmento seleccionado en el archivo;
  • descartar cambios;
  • cambio de formato de estilo (conjunto de reglas);
  • Cambiar a otra versión de ClangFormat
  • use herramientas estándar siempre que sea posible, sin reconstruir ClangFormat y sin escribir un nuevo complemento para Notepad ++.

Instalación y configuración


1. Si Notepad ++ aún no está instalado, descárguelo e instálelo


https://notepad-plus-plus.org

2. En Notepad ++ instale el complemento NppExec


NppExec le permite llamar a aplicaciones de terceros desde Notepad ++ e interactuar con los componentes de la biblioteca Scintilla, en función de los cuales se escribe Notepad ++.

Plugins –> Plugin Admin... –> NppExec –> Install
Notepad ++ se reiniciará, después de lo cual <Notepad++>/plugins/NppExec/ y el elemento de menú Plugins –> NppExec

3. Descargue el ejecutable ClangFormat


Para hacer esto, en la página https://llvm.org/builds/ encontramos y descargamos el archivo de instalación para Windows, por ejemplo LLVM-XXX-rYYYYYY-win64.exe . No puede instalar el paquete completo, simplemente extraiga el archivo clang-format.exe por clang-format.exe . Puede usar 7-zip: elimine la extensión .exe del .exe , abra el archivo con 7-zip y extraiga clang-format.exe del bin/ subdirectorio. Ponemos clang-format.exe en el clang-format.exe <Notepad++>/plugins/NppExec/clang-format/ .

4. Agregar archivos de configuración para ClangFormat


Los archivos de configuración deben llamarse .clang-format o _clang-format . Contienen un conjunto de reglas de formato (estilos), cuyo formato se describe en la guía Opciones de estilo de ClangFormat .

Por ejemplo, usamos archivos de los proyectos Linux Kernel y Qt .

Los .clang-format descargados de GitHub se colocan en los directorios apropiados:
<Notepad++>/plugins/NppExec/clang-format/LINUX_KERNEL/
<Notepad++>/plugins/NppExec/clang-format/QT/


5. Crear un script para NppExec


Abra la ventana para editar y ejecutar scripts NppExec Plugins –> NppExec –> Execute... o presione F6 . Copie y pegue el texto del script a continuación en la ventana y guarde el script llamado clang-format con el botón 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)" 


Después de iniciar el script, en función del estilo de formato seleccionado especificado en la variable de style , selecciona el archivo de .clang-format deseado, verifica la fecha de su cambio y, si es necesario, lo copia en un directorio temporal. Allí, el fragmento seleccionado del código fuente se copia en el archivo temporal, después de lo cual se clang-format.exe . El fragmento formateado se copia de nuevo a la ventana Notepad ++. Luego se elimina el archivo temporal.

En ClangFormat no hay forma de especificar la ruta al archivo de configuración de .clang-format . ClangFormat lo buscará en el directorio del archivo formateado y, si no lo encuentra, irá a buscar en los directorios principales. Una vez que el script .clang-format permanecerá en el directorio temporal para no copiarlo cada vez que se inicia el formateo.

En todas las etapas de la secuencia de comandos, se verifican los errores y, cuando se producen, se abre la ventana de la consola NppExec, en la que se muestra un mensaje.

6. En Notepad ++, agregue un nuevo elemento de menú para ejecutar el script


Abra Plugins –> NppExec –> Advanced Options... , en la lista desplegable de Associated script , seleccione el nombre del script en clang-format y haga clic en el botón Add/Modify .

Reiniciamos Notepad ++, después de lo cual aparecerá el elemento de menú Plugins –> NppExec –> clang-format .

imagen

7. En Notepad ++, configure el método abreviado de teclado para ejecutar el script


Usaremos la combinación Ctrl + I por analogía con QtCreator. Abra Settings –> Shortcut Mapper .

De manera predeterminada, la combinación Ctrl + I ocupada, por lo que debe liberarla con el botón Clear en la pestaña Main Menu (línea 38 Split Lines en la versión actual de Notepad ++). Después de eso, en la pestaña Plugin commands del Plugin commands , asigne la combinación Ctrl + I a la secuencia de comandos de clang-format .

¡Listo, podemos usarlo!

Instrucciones de uso


Abra el archivo fuente en Notepad ++, seleccione el fragmento deseado o todo el texto y presione Ctrl + I Si no se selecciona nada, se formateará la línea actual.

imagen

Para deshacer cambios, use las herramientas de edición estándar ( Ctrl + Z ).
Para cambiar las reglas de formato, edite los archivos de configuración de .clang-format el .clang-format <Notepad++>/plugins/NppExec/clang-format/
Si necesita usar otra versión de ClangFormat, cambie la ruta al archivo ejecutable en el script
set clangformat = "\path\to\clang-format.exe"
Para seleccionar un estilo de formato diferente, presione F6 y en el texto de la secuencia de comandos de clang-format seleccione el estilo deseado descomentando una de las líneas
set style = STYLE_NAME .

Todos los archivos necesarios están en el archivo .

Buen formato!

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


All Articles