{"id":261,"date":"2022-09-25T18:11:11","date_gmt":"2022-09-25T17:11:11","guid":{"rendered":"https:\/\/specnext.dev\/es\/?p=261"},"modified":"2022-09-25T20:21:13","modified_gmt":"2022-09-25T19:21:13","slug":"compilando-que-es-gerundio","status":"publish","type":"post","link":"https:\/\/specnext.dev\/es\/2022\/09\/25\/compilando-que-es-gerundio\/","title":{"rendered":"Compilando que es gerundio"},"content":{"rendered":"<p>En art\u00edculos anteriores hemos visto c\u00f3mo preparar el ambiente de trabajo a partir de NextBuild con Visual Studio Code (VSC), pero en algunos casos queremos, o necesitamos, un poco m\u00e1s de \u201clibertad\u201d, y acabamos creando un archivo .bat para compilar y ejecutar nuestro c\u00f3digo.<\/p>\n<p>En este art\u00edculo veremos algunos truquillos para personalizar Visual Studio Code con el fin de que programar para Next sea un poco m\u00e1s sencillo, aunque tambi\u00e9n se puede aplicar a los proyectos para ZX Spectrum \u201ccl\u00e1sico\u201d.<\/p>\n<p>&nbsp;<\/p>\n<h1>Antes de empezar<\/h1>\n<p>En este art\u00edculo asumo que ya tienes instalado Visual Studio Code y NextBuild, si no es as\u00ed te recomiendo que te mires antes el art\u00edculo \u201c<a href=\"https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/\" target=\"_blank\" rel=\"noopener\">Preparando el ambiente para programar para Next con Boriel ZX Basic y NextBuild<\/a>\u201d, y tambi\u00e9n \u201c<a href=\"https:\/\/specnext.dev\/es\/2022\/09\/03\/compilar-y-ejecutar-con-f5-en-visual-studio-code\/\" target=\"_blank\" rel=\"noopener\">Compilar y ejecutar con F5 en Visual Studio Code<\/a>\u201d.<\/p>\n<p>As\u00ed que partiendo de esta base, la carpeta donde se encuentra el compilador \u201cBoriel ZX Basic\u201d asumiremos que es \u201c<strong>C:\\ZXNext\\NextBuildv7\\zxbasic<\/strong>\u201d, y el emulador \u201cCSpect\u201d se encuentra en la carpeta \u201c<strong>C:\\ZXNext\\NextBuildv7\\emu\\CSpect<\/strong>\u201d<\/p>\n<p>&nbsp;<\/p>\n<h1>Objetivos<\/h1>\n<p>En este art\u00edculo pretendo ayudar al lector a personalizar sus proyectos de Visual Studio. No es una biblia de la personalizaci\u00f3n de VSC, ya que es una herramienta con muchas opciones de configuraci\u00f3n y personalizaci\u00f3n.<\/p>\n<p>Si encontr\u00e1is alguna inexactitud u omisi\u00f3n, dejadlo en los comentarios, o acudid a los canales habituales:<\/p>\n<ul>\n<li>Canal de Telegram: Boriel ZX Basic<\/li>\n<li>Twitter de Duefectu: @Duefectu <a href=\"https:\/\/twitter.com\/Duefectu\">https:\/\/twitter.com\/Duefectu<\/a><\/li>\n<li>Foro de Boriel: <a href=\"https:\/\/www.boriel.com\/forum\/index.php\">https:\/\/www.boriel.com\/forum\/index.php<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>\u00c1reas de trabajo en Visual Studio Code<\/h1>\n<p>VSC trabaja con \u00e1reas de trabajo, que se equiparan a directorios de nuestro disco duro. El detalle es que VSC, al abrir un \u00e1rea de trabajo o una carpeta, busca un subdirectorio que se llama \u201c.vscode\u201d, y si existe, lo utiliza como ubicaci\u00f3n de los archivos de configuraci\u00f3n del proyecto.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-262 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-Carpetas.png\" alt=\"\" width=\"208\" height=\"268\" \/><\/p>\n<p>Vamos a ver las carpetas que necesitamos, y las que os sugiero yo, para gestionar vuestros proyectos:<\/p>\n<ul>\n<li><strong>.vscode:<\/strong> Contiene los archivos de configuraci\u00f3n del proyecto.<\/li>\n<li><strong>data:<\/strong> Contiene el resultado de nuestro proyecto. Por llamarlo de alguna forma, el \u201cmaster\u201d con el resultado final.<\/li>\n<li><strong>Scripts:<\/strong> Contiene los archivos .bat de compilaci\u00f3n y ejecuci\u00f3n, aparte de otros archivos auxiliares que necesitemos para esta labor.<\/li>\n<\/ul>\n<p>El resto de contenido y carpetas lo dejo a vuestro gusto, aunque a mi personalmente me gusta utilizar una carpeta \u201c_Recursos\u201d donde tengo mis archivos de trabajo, como pueden ser las im\u00e1genes .png a partir de las que genero los sprites o los fondos de pantalla, archivos de sonido, mapeado, etc\u2026<\/p>\n<p>Y en la ra\u00edz ponemos nuestro fichero .bas principal, es decir, el que compilaremos. En este caso, y con un gran alarde de originalidad, le he llamado \u201cEjemplo.bas\u201d.<\/p>\n<p>&nbsp;<\/p>\n<h1>La carpeta .vscode<\/h1>\n<p>En esta carpeta se colocan una serie de archivos de configuraci\u00f3n, en formato .json, que Visual Studio Code utiliza para personalizar nuestro proyecto. En los ejemplos que se adjuntan a este art\u00edculo podemos ver los siguiente:<\/p>\n<h2>extensions.json<\/h2>\n<p>Contiene las extensiones que nos recomienda VSCode al abrir el proyecto. Aunque nosotros ya tenemos esas extensiones instaladas, cuando otro usuario abra nuestro c\u00f3digo fuente, su VSCode le sugerir\u00e1 las extensiones que debe instalar para poder trabajar de forma correcta.<\/p>\n<p><code>{<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"recommendations\": [<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"em00k.nextbuild\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"eliverlara.andromeda\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"maziac.nex-fileviewer\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"maziac.asm-code-lens\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"alefragnani.bookmarks\"<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 ]<\/code><br \/>\n<code>}<\/code><\/p>\n<p>En este caso, es una copia del archivo extensions.json de NextBuild en el que se nos recomienta la extensi\u00f3n NextBuild y algunas otras que nos ayudan en la edici\u00f3n.<\/p>\n<h2>settings.json<\/h2>\n<p>Este archivo contiene opciones de configuraci\u00f3n relacionadas con los colores, el tipo de cursor, el lenguaje por defecto y el formateador (lo que da color al c\u00f3digo) a utilizar. Tambi\u00e9n lo hemos copiado de NextBuild.<\/p>\n<p><code>{<\/code><br \/>\n<code>\u00a0 \"editor.cursorSmoothCaretAnimation\": true,<\/code><br \/>\n<code>\u00a0 \"editor.cursorStyle\": \"block\",<\/code><br \/>\n<code>\u00a0 \"files.defaultLanguage\": \".bas\",<\/code><br \/>\n<code>\u00a0 \"telemetry.enableCrashReporter\": false,<\/code><br \/>\n<code>\u00a0 \"telemetry.enableTelemetry\": false,<\/code><br \/>\n<code>\u00a0 \"[bas]\": {<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"editor.defaultFormatter\": \"em00k.nextbuild\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"editor.formatOnSave\": true<\/code><br \/>\n<code>\u00a0 },<\/code><br \/>\n<code>\u00a0 \"editor.tokenColorCustomizations\": {<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"comments\": \"#2ccf2c\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"numbers\": \"#e06565\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"keywords\": \"#f1db14\",<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 \"functions\": \"#13ad34\"<\/code><br \/>\n<code>\u00a0 }<\/code><br \/>\n<code>}<\/code><\/p>\n<h2>tasks.json<\/h2>\n<p>Este es el archivo de configuraci\u00f3n m\u00e1s importante, ya que permite personalizar las tareas de compilaci\u00f3n y ejecuci\u00f3n. Y en este caso\u2026 tambi\u00e9n lo hemos tomado prestado de NextBuild, pero le hemos hecho una peque\u00f1a modificaci\u00f3n.<\/p>\n<p>B\u00e1sicamente hemos modificado la tareas \u201cCompile ZXbasic\u201d para que ejecute el archivo \u201cScripts\/Compile.bat\u00bb.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-263 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.1.png\" alt=\"\" width=\"881\" height=\"727\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.1.png 881w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.1-300x248.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.1-768x634.png 768w\" sizes=\"auto, (max-width: 881px) 100vw, 881px\" \/><\/p>\n<p>Tambien hemos modificado la tarea \u201cRun in CSpect\u201d para que ejecute el archivo \u201cScripts\/Run.bat\u201d, dejando el resto como estaba, aunque se puede personalizar sin problema.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-264 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.2.png\" alt=\"\" width=\"892\" height=\"727\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.2.png 892w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.2-300x245.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-tasks.2-768x626.png 768w\" sizes=\"auto, (max-width: 892px) 100vw, 892px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h1>La carpeta Scripts<\/h1>\n<p>En esta carpeta vamos a colocar los archivos que hemos referenciado en el tasks.json, aparte de los que necesitemos para poder realizar las tareas de compilaci\u00f3n y ejecuci\u00f3n.<\/p>\n<h2>El archivo Compile.bat<\/h2>\n<p>Este archivo se va a ejecutar cuando se compile el proyecto, y dependiendo del tipo de proyecto, lo personalizaremos a nuestro gusto.<\/p>\n<p>Por ejemplo, para compilar nuestro programa para Spectrum cl\u00e1sico, el fichero \u201cCompile.bat\u201d ser\u00eda algo as\u00ed:<\/p>\n<p><code>@echo off<\/code><\/p>\n<p><code>echo Limpiando ficheros antiguos...<\/code><br \/>\n<code>del *.tap \/Q &gt;nul<\/code><br \/>\n<code>del data\\*.* \/Q &gt;nul<\/code><\/p>\n<p><code>:COMPILAR<\/code><br \/>\n<code>echo Compilando...<\/code><br \/>\n<code>C:\\ZXNext\\NextBuildv7\\zxbasic\\zxbc.exe Ejemplo.bas --org $6000 --heap-size 2048 --tap -B -a<\/code><br \/>\n<code>if ERRORLEVEL 1 goto compilerError<\/code><br \/>\n<code>echo Copiando el resultado a la carpeta data...<\/code><br \/>\n<code>copy Ejemplo.tap data\\Ejemplo.tap<\/code><br \/>\n<code>goto endNow<\/code><\/p>\n<p><code>:compilerError<\/code><br \/>\n<code>echo -----------------------------------------------------------------------<\/code><br \/>\n<code>echo - ERROR AL COMPILAR ---------------------------------------------------<\/code><br \/>\n<code>echo -----------------------------------------------------------------------<\/code><br \/>\n<code>exit 1<\/code><\/p>\n<p><code>:endNow<\/code><br \/>\n<code>echo Compilado correctamente!<\/code><\/p>\n<p>El fichero est\u00e1 dividido en cuatro secciones:<\/p>\n<p>En la primera eliminamos los archivos resultantes de compilaciones anteriores. Esto es \u00fatil para evitar confusiones. M\u00e1s de una vez os habr\u00e1 pasado que el compilador da un error y est\u00e1is ejecutando un archivo antiguo en el emulador.<\/p>\n<p>La segunda secci\u00f3n es la que compila el programa Ejemplo.bas y genera un archivo .tap con cargador y autorun, si todo ha ido bien.<\/p>\n<p>Si la compilaci\u00f3n no ha ido bien la variable \u201cERRORLEVEL\u201d coge el valor 1, y en este caso abortamos la operaci\u00f3n saltando a la tercera secci\u00f3n, donde se informa al usuario con un mensaje y sale con un \u201cexit 1\u201d que lo que hace es que esa misma variable \u201cERRORLEVEL\u201d valga 1, lo que hace que VSCode no ejecute el archivo \u201cScripts\\Run.bat\u201d<\/p>\n<p>Si la compilaci\u00f3n ha ido bien, se salta a \u201cendNow\u201d, que sencillamente regresa a VSCode, y este ejecuta el archivo \u201cScripts\\Run.bat\u201d.<\/p>\n<p>En este ejemplo estamos generando un archivo .tap para Spectrum cl\u00e1sico, con el fin de no complicar demasiado el tema en el primer ejemplo, por lo que lo lanzaremos con el emulador ZXSpin, solo a modo de prueba, ya que al ser un .tap, CSpect no lo admite sin una imagen del NextOS, y no quiero complicarlo demasiado. As\u00ed que, en este primer ejemplo, el fichero \u201cRun.bat\u201d quedar\u00eda as\u00ed:<\/p>\n<p><code>start C:\\ZXSpectrum\\ZXSpin\\zxspin.exe .\\data\\Ejemplo.tap<\/code><\/p>\n<p>Una vez visto como funciona en cl\u00e1sico, vamos a complicarlo un poco m\u00e1s, y generaremos un archivo .nex con un recurso adicional que podemos cargar desde disco, y todo esto lo lanzaremos en CSpect.<\/p>\n<p>&nbsp;<\/p>\n<h2>Archivo compile.bat para Next<\/h2>\n<p>Compilar para Next es un pel\u00edn m\u00e1s complicado, ya que despu\u00e9s de compilar, hay que convertir el resultado al formato .nex:<\/p>\n<p><code>@echo on<\/code><\/p>\n<p><code>set PROGRAMA=Ejemplo<\/code><\/p>\n<p><code>echo Limpiando ficheros antiguos...<\/code><br \/>\n<code>del *.nex \/Q &gt;nul<\/code><br \/>\n<code>del *.bin \/Q &gt;nul<\/code><br \/>\n<code>del data\\*.nex \/Q &gt;nul<\/code><\/p>\n<p><code>:COMPILAR<\/code><br \/>\n<code>echo Compilando...<\/code><br \/>\n<code>C:\\ZXNext\\NextBuildv7\\zxbasic\\zxbc.exe %PROGRAMA%.bas --org $6000 --heap-size 2048 \u2013mmap %PROGRAMA%.map --output %PROGRAMA%.bin --zxnext --arch=zxnext<\/code><br \/>\n<code>if ERRORLEVEL 1 goto compilerError<\/code><\/p>\n<p><code>:BUILDNEX<\/code><br \/>\n<code>echo Generando el archivo .nex...<\/code><br \/>\n<code>python C:\/ZXNext\/NextBuildv7\/zxbasic\/tools\/nextcreator.py .\/Scripts\/nex.cfg %PROGRAMA%.nex<\/code><br \/>\n<code>if ERRORLEVEL 1 goto compilerError<\/code><br \/>\n<code>echo Copiando el resultado a la carpeta data...<\/code><br \/>\n<code>copy %PROGRAMA%.nex data\\%PROGRAMA%.nex<\/code><br \/>\n<code>goto endNow<\/code><\/p>\n<p><code>:compilerError<\/code><br \/>\n<code>echo -----------------------------------------------------------------------<\/code><br \/>\n<code>echo - ERROR AL COMPILAR ---------------------------------------------------<\/code><br \/>\n<code>echo -----------------------------------------------------------------------<\/code><br \/>\n<code>exit 1<\/code><\/p>\n<p><code>:endNow<\/code><br \/>\n<code>echo Compilado correctamente!<\/code><\/p>\n<p>Lo primero que a\u00f1adimos en el .bat es una variable llamada \u201cPROGRAMA\u201d, a la que asignaremos el nombre del fichero principal que compilamos. En nuestro ejemplo, el fichero principal se llama \u201cEjemplo.bas\u201d, as\u00ed que asignaremos el valor a la variable con la siguiente l\u00ednea:<\/p>\n<p><code>set PROGRAMA=Ejemplo<\/code><\/p>\n<p>Esto nos permite utilizar la variable dentro del .bat de forma repetida sin tener que cambiar demasiadas cosas en cada proyecto.<\/p>\n<p>En esta versi\u00f3n, le pedimos al compilador que genere un archivo .bin (&#8211;output %PROGRAMA%.bin) para Next (&#8211;zxnext &#8211;arch=zxnext).<br \/>\nEste archivo .bin lo convertimos a .nex con la utilidad \u201cnextcreator.py\u201d incluida en Boriel ZX Basic. Esta utilidad utiliza un archivo \u201cnex.cfg\u201d donde definimos como queremos \u201cmontar\u201d el archivo .nex<\/p>\n<h2>El archivo nex.cfg<\/h2>\n<p>Este archivo contiene la configuraci\u00f3n para que la utilidad \u201cnextcreator\u201d componga el fichero .nex que ejecutaremos en CSpect:<\/p>\n<p><code>; Minimum core versi\u00f3n<\/code><br \/>\n<code>!COR3,0,0<\/code><br \/>\n<code>!MMU.\/Scripts\/sysvars.inc,10,$1C00<\/code><br \/>\n<code>!PCSP$6000,$5ffe<\/code><br \/>\n<code>.\\programa.bin,5,$2000<\/code><\/p>\n<p>El primer detalle es que, tal como se define en la tercera l\u00ednea, el .nex va a incluir el archivo \u201csysvars.inc\u201d en el banco 10, direcci\u00f3n $1c00. Este archivo contiene las variables de configuraci\u00f3n del Spectrum, las t\u00edticas que empiezan en la direcci\u00f3n de memoria 23552. Sin estas variables, es posible que nuestro programa no funcione de forma correcta.<\/p>\n<p>En la siguiente l\u00ednea le indicamos que el programa se ejecutar\u00e1 en la direcci\u00f3n $6000, y que el stack se coloca en la direcci\u00f3n par inmediatamente inferior: $5ffe<\/p>\n<p>Y por \u00faltimo, le indicamos que queremos que nuestro programa se coloque en el banco de memoria 5, a partir de la direcci\u00f3n relativa $2000, que se corresponde con la direcci\u00f3n absoluta $6000.<\/p>\n<p>Ser\u00e1 necesario reconfigurar este archivo en base a las necesidades de nuestro proyecto, pero para empezar con algo b\u00e1sico nos vale.<\/p>\n<h2>El archivo run.bat<\/h2>\n<p>Una vez se haya compilado y generado el archivo .nex, que se coloca en la carpeta \u201cdata\u201d, podemos lanzar CSpect.<\/p>\n<p>CSpect puede funcionar de dos maneras b\u00e1sicas: Con unidades mapeadas en nuestro disco duro, o con una tarjeta SD virtual que contiene el sistema operativo NextZXOS.<\/p>\n<p>El caso m\u00e1s sencillo, que se basa en el mapeado de la carpeta data, en el que el archivo run.bat quedar\u00eda as\u00ed:<\/p>\n<p><code>start C:\\ZXNext\\NextBuildv7\\emu\\CSpect\\CSpect.exe -w3 -16bit -brk -tv -zxnext -r -mmc=.\\data\\ .\\data\\Ejemplo.nex<\/code><\/p>\n<p>Atenci\u00f3n al par\u00e1metro \u201cmmc\u201d, tiene dos valores asignados: la carpeta \u201cdata\u201d, y el archivo \u201c.nex\u201d. Esto hace que ejecute el archivo .nex, y que el contenido de la carpeta data est\u00e9 disponible en el emulador, por ejemplo para cargar sprites, im\u00e1genes, datos, c\u00f3digo adicional, etc\u2026<\/p>\n<p>Para copiar hacia una SD virtual, podemos utilizar la utilidad \u201chdfmonkey\u201d, que pod\u00e9is encontrar en <a href=\"https:\/\/github.com\/gasman\/hdfmonkey\">https:\/\/github.com\/gasman\/hdfmonkey<\/a>, a\u00f1adiendo al .bat de compilaci\u00f3n o al de ejecuci\u00f3n, algunas l\u00edneas del tipo:<\/p>\n<p><code>C:\\ZXNext\\NextBuildv7\\emu\\CSpect\\hdfmonkey.exe mkdir C:\\ZXNext\\NextBuildv7 \\emu\\CSpect\\SDCard.img \\Ejemplo<\/code><br \/>\n<code>C:\\ZXNext\\NextBuildv7\\emu\\CSpect\\hdfmonkey.exe put C:\\ZXNext\\NextBuildv7 \\emu\\CSpect\\SDCard.img data\\*.* \\Ejemplo\\<\/code><br \/>\n<code>start C:\\ZXNext\\NextBuildv7\\emu\\CSpect\\CSpect.exe -r -w3 -16bit -brk -tv -zxnext -nextrom -mmc=\" C:\\ZXNext\\NextBuildv7\\emu\\CSpect\\SDCard.img\"<\/code><\/p>\n<p>Estas dos l\u00edneas crear\u00e1n una carpeta \u201cEjemplo\u201d en la ra\u00edz del disco, copiar\u00e1 todo el contenido de la carpeta \u201cdata\u201d dentro de ese directorio y ejecutar\u00e1 el emulador cargando la imagen del sistema operativo.<\/p>\n<p>En este caso, asumimos que el programa \u201chdfmonkey\u201d se encuentra en la carpeta \u201cC:\\ZXNext\\NextBuildv7\\emu\\CSpect\\\u201d, y que la imagen del NextZXOS se llama \u201cSDCard.img\u201d<\/p>\n<p>&nbsp;<\/p>\n<h1>Recursos<\/h1>\n<p>El c\u00f3digo de ejemplo se puede descargar desde <a href=\"https:\/\/1drv.ms\/u\/s!ArCJF44YRdJrl7Z2wzu-l5Qg7LMTLw?e=04aPdd\" target=\"_blank\" rel=\"noopener\">aqu\u00ed<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h1>Todo puede salir mal<\/h1>\n<p>En ese caso, recordad que pod\u00e9is conseguir soporte en:<\/p>\n<ul>\n<li>Canal de Telegram: Boriel ZX Basic<\/li>\n<li>Twitter de Duefectu: @Duefectu <a href=\"https:\/\/twitter.com\/Duefectu\">https:\/\/twitter.com\/Duefectu<\/a><\/li>\n<li>Foro de Boriel: <a href=\"https:\/\/www.boriel.com\/forum\/index.php\">https:\/\/www.boriel.com\/forum\/index.php<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Menciones y agradecimientos<\/h1>\n<p>Especial agradecimiento a David Saphier (@em00k) por su excelente NextBuild, que me ha servido como inspiraci\u00f3n y punto de partida. Sin su ayuda no habr\u00eda sabido por d\u00f3nde empezar.<\/p>\n<p>A Boriel por su excelente compilador y su trabajo diario.<\/p>\n<p>Y a toda la comunidad de aficionados por alentarme a seguir con mi trabajo de difusi\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En art\u00edculos anteriores hemos visto c\u00f3mo preparar el ambiente de trabajo a partir de NextBuild con Visual Studio Code (VSC), pero en algunos casos queremos, o necesitamos, un poco m\u00e1s de \u201clibertad\u201d, y acabamos creando un archivo .bat para compilar y ejecutar nuestro c\u00f3digo. En este art\u00edculo veremos algunos truquillos para personalizar Visual Studio Code [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":262,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[13,3,14],"tags":[7,10,19],"class_list":["post-261","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-boriel-zx-basic","category-desarrollo","category-herramientas","tag-boriel-zx-basic","tag-compiladores","tag-visual-studio-code"],"jetpack_featured_media_url":"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/09\/12-Carpetas.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/comments?post=261"}],"version-history":[{"count":3,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/261\/revisions"}],"predecessor-version":[{"id":267,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/261\/revisions\/267"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media\/262"}],"wp:attachment":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media?parent=261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/categories?post=261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/tags?post=261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}