Microsoft Build 2019 termino hace poco y se hicieron muchos anuncios emocionantes entre uno de ellos está la nueva Terminal de Windows las cual es descrita como:

una nueva, moderna, rápida, eficiente, poderosa, y productiva aplicación de terminal para usuarios de herramientas de linea de comando y shells como Command Prompt, PowerShell, y WSL.

Incluso crearon un video que es todo un esfuerzo de mercadeo y tengo que admitirlo se ve bastante bien.


Puedes ver la presentación en Microsoft Build(en ingles) aquí: Windows Terminal: Building a better command line experience for developers y puedes ver más detalles en este post(también en ingles): Introducing Windows Terminal

¿Muy poco, muy tarde?

No hay duda acerca de que es muy tarde porque no hemos tenido una terminal decente integrada en Windows, todo lo que hemos tenido es el command prompt el cual ya tiene alrededor de 30 años de antigüedad y aunque cumple con su función, no es una herramienta donde quieres pasar tu tiempo. El equipo trabajando en ella ha agregado algunas mejorar básicas pero aun le falta mucho en comparación a otras terminales especialmente las que están disponibles para los sistemas basados en UNIX y ciertamente no podemos personalizarla tanto a como es posible en UNIX y si has usado algo como oh my zsh sabes que el cmd de Windows esta lejos de eso. Pero ¿esta nueva terminal ira a ser muy poco? Solo estaremos seguro cuando hagan el lanzamiento oficial alrededor de junio.

También tenes Powershell como opción y aunque es la favorita de muchos administradores de sistema de Windows para los desarrolladores no ha sido la gran cosa. ¿Por que será que este no había sido una prioridad para Microsoft? bueno no puedo decirlo con certeza pero en el pasado los desarrolladores de .Net han estado usando principalmente un IDE(Visual Studio) para el desarrollo y normalmente tienes todo lo que necesitas ahí.

¿Necesitamos una buena aplicación de consola en Windows?

Con tantas herramientas populares que existen hoy en día que normalmente requieren una CLI para trabajar, la necesidad de una buena consola se ha vuelto clara incluso .Net Core se ha movido a usar más y más funciones en la linea de comandos y aunque podrías integrar todo esto en Visual Studio para que los scripts se ejecuten automáticamente cuando compilas o corres la solución desde Visual Studio, la verdad es que muchas personas están dejando la experiencia de usar estos grandes IDE y están comenzando a usar más los editores de texto livianos tales como Visual Studio Code y comandos en la terminal y si están desarrollando en otros lenguajes tales como python, javascript o ruby no puedes escapar de la necesidad de una mejor consola.

Ese fue mi caso cuando comencé a desarrollar en Django, viniendo de un trasfondo de principalmente desarrollo en .Net opte por quedarme en Windows para hacer desarrollo en Django. Todo iba bien excepto por cmd, estaba haciendo mis pip installs, creando ambientes virtuales, generando y corriendo migraciones e incluso corriendo la aplicación desde la consola y cmd no era lo suficientemente buena. Entonces decidí que tenia que encontrar una consola decente para Windows que me proveyera de una mejor experiencia.

Aplicaciones de consola disponibles para Windows

Si haces una búsqueda en google para alternativas en Windows vas a encontrar muchas opciones disponibles y una que probablemente ya tenes si sos desarrollador de software es git bash la cual normalmente es incluida en Instalador de Git para Windows y sin dudas es una mejora muy buena te permite ejecutar comandos estilo Unix y también provee comandos como ssh, scp, cat, etc. Y adicionalmente tiene un excelente auto-completado para los comandos de git, sin embargo le faltan algunas cosas.

  1. 1. Pestañas y Vistas divididas.
  2. 2. Mejor soporte para atajos de teclado.
  3. 3. Mejores opciones para personalizar la consola.

Entonces ¿que opciones tenemos? de hecho, muchas ya que muchas personas sintieron la necesidad de una mejor aplicación de consola en Windows, solo para mencionar algunas tomado de Slant.co

cmder-must-have-windows-console
Puedes leer las reseñas en el enlace a Slant si querés saber más acerca de cada opción.

Mi elección

Yo estoy de acuerdo con los resultados en Slant ya que desde hace tiempo mi elección fue cmder -- pronunciado “Commander” en ingles provee exactamente lo que quería. Me gusta bastante los estilos por defecto y si a ti no te gustan, puedes personalizarlos, también provee Vistas divididas, pestañas y excelentes atajos de teclado

Pestañas y Vistas divida

cmder-must-have-windows-console

Excelentes atajos de teclado

cmder-keyboart-shortcuts

Altamente personalizable

cmder-settings

Puedes leer más acerca de cmder aquí Wiki y aquí About cmder pero Yo te voy a dar un resumen de las características que más ocupo personalmente.

Comandos Estilo Unix

Estos de hecho son un regalo de git para windows y no de cmder sin embargo cmder puede tomar ventaja de ellos y usarlos, y en caso que seas nuevo al mundo de las consolas en Windows quiero que estés al tanto de las bondades disponibles
  • ls para listar todos las carpetas y archivos en el directorio actual y lo puedes usar con toda su variedad de flags disponibles
    cmder-ls
  • touch ¿alguna ves has intentado crear un archivo en Windows llamado .someName? puede ser problemático pero puedes usar touch para rápidamente crear archivos vacíos, y actualizar la fecha de modificación en archivos existentes ej: touch .editorconfig
  • cat para concatenar y rápidamente poder ver el contenido de un archivo en la consola.
    cmder-cat
  • rm para borrar archivos y carpetas usalo con -r para borrar recursiva mente subcarpetas y -f para forzar el borrado. Mi uso más típico de este comando es rm -rf node_modules 😅
  • ssh, ssh-keygen y ssh-add para acceder a servidores remotos, la falta de poder usar ssh tal como se puede en Linux es probablemente la mayor razón por la cual he maldecido Windows, haber tenido que lidiar con PuTTY y sus utilidades fue una pesadilla para mí en comparación a usar ssh en Linux, y para mi sorpresa muchas personas aún creen que PuTTY es la única manera de usar ssh en Windows, pero de hecho tenemos dos maneras de usar ssh ahora just como en Linux, uno que viene junto con git para Windows y un cliente de open ssh que viene ahora por defecto en Windows 10 así que Putty no es tú única opcion si necesitas usar ssh. Si quieres verificar cuales tenes disponibles para ti puedes usar los comandos where y which
    cmder-ssh
    Como puedes ver yo tengo ambas opciones disponibles pero estoy utilizando open ssh que viene por defecto en Windows 10.

Atajos de teclado

  • Ctrl + t probablemente estés familiarizado con este atajo ya que es el mismo que se utiliza para abrir una nueva pestaña en los navegadores y en cmder hace exactamente lo mismo así que es fácil acostumbrarse a él.
  • Ctrl + w cierra la pestaña actual.
  • Alt + Enter pantalla completa.
  • Ctrl + Alt + u Lo mismo que ejecutar cd .. en la consola te permite rápidamente subir un nivel en la estructura de directorios.
  • Ctrl + r ¿Alguna ves has usado un comando con muchos parámetros que es difícil de recordar y no lo guardaste? este atajo me ha salvado varias veces ya que te permite hacer una búsqueda de los comandos ejecutados.
    cmder-search

Copy & Paste

  • Copiar solo selecciona el texto que te gustaría copiar
  • Pegar simplemente usa click derecho para pegar el texto o usa Ctrl + shift + v

Git

  • Git auto completado solamente escribe algo como git co y presiona tab y se va a auto completar git commit incluso puede sugerir comandos disponibles cuando hay más de una posibilidad de auto completado prueba algo como git che y presiona tab dos veces
    cmder-git-autocomplete
  • Información de Git disponible en la consola
    cmder-git

Alias

Esta probablemente es la característica que más me gusta porque ha incrementado mi productividad y es muy simple de usar. Los siguientes son una lista de unos cuantos comandos que use casi diario.
  • python manage.py runserver
  • python manage.py makemigrations
  • python manage.py migrate
  • dotnet run
  • cd source/repos/somerepo
  • rm -rf node_module && npm install
  • git fetch && git checkout somebranch
  • git commit -m "my commit comment"

Puedes ver que algunos de ellos son un poco largo, con Alias puedo crear atajos para todos ellos y es tan simple como alias djrun=python manage.py runserver donde djrun es el alias que quiero usar, para mí dj de django y run de correr el servidor así que ahora puedo simplemente escribir djrun lo cual es más corto que python manage.py runserver e incluso te funciona el auto completado para tus alias también!.

cmder-alias-django-run

Puedo hacer algo similar para mis otros comando, uno que encuentro muy útil es crear un alias para acceder a mis repositorios ej: alias gotopesite=cd C:\Users\LuisPalacios\source\repos\personal-site de esta manera sin importar donde este en mi estructura de directorio puedo simplemente escribir gotopesite presionar enter en inmediatamente estaré en mi repositorio.

cmder-alias-navigation

¿Que tal cuando necesitas un alias que requiere soporte para argumentos? tal como git commit -m "esto debería ser un argumento" puedes fácilmente lograr esto usando $* donde quieres que tu alias ponga el argumento que recibe así que en mi caso seria algo como esto alias gtcommit=git commit -m "$*" y asi lo puedo usar de esta forma gtcommit this my example comment

cmder-alias-git-commit

Hay mucho más que puedes hacer con alias y puedes encontrar más detalles en la documentación oficial en los enlaces que compartí antes, pero espero esto sea suficiente para que comiences a definir tus propios alias.

Tareas de arranque

Estas también ayudan mucho a ser más productivo porque puedes crear tus propias taras de arranque, miremos como ejemplo lo que normalmente tengo que hacer cuando trabajo en mi sitio personal el cual está en .Net Core pero también usa herramientas en Nodejs para compilar el front-end tales como Webpack.

  1. 1. Una pestaña de linea de comando para mis comandos git
  2. 2. Una pestaña de linea de comando correr mi aplicación dotnet run
  3. 3. Una pestaña de linea de comando para vigilar y compilar los cambios en mis archivos de front-end npm run watch

Sin mencionar que también en cada una necesito navegar al directorio donde esta mi repositorio para poder ejecutar estos comandos. Entonces los pasos manuales que tendría que hacer cada ves que quiero trabajar en mi repositorio se ven algo así:

  1. 1. Abrir cmder y navegar al directorio donde esta mi repositorio
    open-cmder
  2. 2. Abrir una nueva pestaña divida a la derecha, navegar a mi repositorio y correr dotnet run
    cmder-open-tab-right
    cmder-run-dotnerun
  3. 3. Abrir una nueva pestaña divida abajo, navegar a mi repositorio y correr npm run watch
    cmder-open-tab-bottom
    cmder-run-npmwatch

Esto es bastante trabajo repetitivo, aun usando alias es bastante molesto, cmder tiene una opción tal como los navegadores de internet que pueden guardar y reabrir todas las pestañas que tenias cada ves que cierras y abres cmder.

cmder-autorestore-tab

Eso podría ser suficiente si te toca trabajar solamente en un repositorio, pero si eres como yo y necesitas trabajar en múltiples repositorios en el día, esto no es lo suficientemente bueno porque si intentas mantener todas las pestañas para todos los repositorios que necesitas, la navegación a través de las pestañas se vuelve más difícil sin mencionar el hecho que vas a desperdiciar RAM.

Así que seria genial si le pudiera decir a cmder "Abre todo lo que necesito para trabajar en mi sitio personal" Y puedo hacer exactamente eso a través de las Tareas de arranque, Voy a definir mi propia Tarea de arranque para trabajar en mi sitio personal.

  1. 1. Abre cmder y ve a la configuración Win + alt + p después ve a Startup -> Tasks y da click en el botón "+".
    cmder-add-newtask
  2. 2. Ahora necesito decirle a cmder exactamente que quiero que haga mi tarea, hay mucho que se puede hacer aquí y puedes aprender más al respecto aquí ConEmu’s Tasks sin embargo esto puede resultar abrumador si eres nuevo en este mundo de emuladores de consola, cmder tiene una maravillosa funcion que te permite decirle "Guarda todas mis pestañas activas como una nueva tarea" así que lo único que tengo que hacer es definir el nombre de mi tarea y dar click en el botón Active tabs.
    cmder-add-newtask-name
  3. 3. Esto va a crear una tarea que va a abrir todas las pestañas que necesito con la vista divida que definí antes y en los directorios donde las necesito, sin embargo, no va a ejecutar ningún comando cuando inicie pero agregar eso es bastante sencillo simplemente agrego al final de cada comando && mycommand y tambien necesito definir el campo de "task parameter" que en mi caso simplemente lo copio y pego de la tarea cmd::Cmder Recuerda dar click en el botón "Save Settings".
    cmder-add-newtask-config
  4. 4. Ahora cada vez que quiera abrir cmder puedo usar ctrl + t para abrir una nueva pestaña y veras que mi nueva tarea aparece en el listado y si la selecciono, debería abrir todas las pestañas y ejecutar los comandos que quiero para poder trabajar en mi repositorio.
    cmder-start-newtask
    cmder-ready-togo

Esa es una mejora significativa sin embargo, podemos dar un paso más, De hecho puedo anclar mí tarea a la barra de tareas de Windows. Yo ya tengo anclada mi aplicación de cmder en mi barra de tareas pero le doy click derecho todo lo que veo es la opción de abrir cmder o desanclar de la barra de tareas.

cmder-taskbar-default

Para poder agregar mi nueva tarea a la barra de tareas necesito seguir los siguientes pasos.

  1. 1. Abrir la configuración y seleccionar mi tarea y asegurarme que el checkbox Taskbar Jump list este activa, también puedes ver a través de la lista de tareas y remover el check de las tares que no quisieras que aparezcan.
    cmder-add-newtask-taskbar
  2. 2. Ahora en la configuración ve a General -> Taskbar y asegurate que los checkboxs Add ComEmu Task y AutoUpdate estén activos y después da click en el botón Update now y despues en Save Settings
    cmder-taskbar-update
  3. 3. Ahora el último paso, ejecuta el comando ConEmu.exe /updatejumplist en cmder.
    cmder-taskbar-complete

Con esto, estoy listo para abrir todo lo que necesito en mí línea de comando para trabajar en mi repositorio con solamente un click derecho y un click.

cmder-taskbar-ready

¿Hay alguna desventaja?

cmder justo como muchas otras opciones para una mejor consola en Windows es un emulador esto significa que el rendimiento podria verse afectado, en versiones más antiguas yo si note que el tiempo de arranque era más lento que iniciar cmd o PowerShell pero también tenia un hardware más antiguo, ahora que tengo un hardware mejor(i7 and SSD) No noto ningún problemas de rendimiento.

¿Que piensas? ¿Estas emocionado por la nueva terminal de Windows? ¿Crees que cmder es una excelente opción mientras esperamos por ella? Puedes compartir el la sección de comentarios abajo.