No sin mi prompt

Prompt de PowerShell en Windows y de bash en WSL, como un señor

Como dice el refrán, “No solo hay que serlo, sino parecerlo”, así que en este post veremos como configurar el prompt de PowerShell en Windows y de bash en Ubuntu para que sean más amigables.

El propósito es guardar una buena chuleta de los pasos a seguir, porque siempre que me toca hacerlo me da cierta pereza volver a investigarlo.

La idea está sacada de un post de Scott Hanselman https://www.hanselman.com/blog/my-ultimate-powershell-prompt-with-oh-my-posh-and-the-windows-terminal e incluso también tiene un vídeo en YouTube si te gusta más.

Lo primero es elegir consola/terminal y parece claro, que hoy en día, la opción preferida es la de Windows Terminal que puedes instalar desde la Windows Store y seguir su desarrollo desde su repositorio en GitHub. Instalándola desde la tienda de Windows te aseguras que tendrás siempre la versión más actualizada.

En este otro post (ya desde la documentación oficial de Microsoft) también explican bien como configurar la terminal.

Los pasos a seguir son:

Instalar una fuente con glifos (porque queremos iconos chulos en el prompt), por ejemplo Caskaydia Cove Nerd Font y seleccionarla en Windows Terminal para el shell de PowerShell. Adicionalmente, también podrías establecer esta fuente para la terminal de VSCode, con la propiedad terminal.integrated.fontFamily.

Instalar oh-my-posh con Install-Module oh-my-posh -Scope CurrentUser.

También convendría instalar Terminal-Icons con Install-Module Terminal-Icons -Scope CurrentUser para mostrar iconos conocidos de ficheros y directorios con el comando dir o ls.

Después edita tu fichero de perfil con code $PROFILE y agrega lo siguiente:

Import-Module oh-my-posh
Import-Module -Name Terminal-Icons
Set-PoshPrompt -Theme agnoster

Yo no los uso, pero también puedes probar posh-git y PSReadLine si quieres auto-completado e incluso completado predictivo de tus comandos.

Hasta aquí todo bien, pero ahora tendrás que elegir que tema te gusta más, yo he puesto agnoster inicialmente simplemente para que veas que funciona.

Puedes ver una preview de todas los temas disponibles con Get-PoshThemes y establecer uno con Set-PoshPrompt -Theme <nombre del tema>.

Después de estar un buen rato eligiendo el tema, y aquí es importante que te muevas a un directorio con un repositorio de git, con un fichero .csproj de .net, con un entorno virtual de Python o algo similar porque la preview te mostrará como quedaría… he llegado a la conclusión de que lo mejor es crearte tu propio prompt y entender como funciona oh-my-posh.

Realmente es muy sencillo y la parte que hay que entender son los segments que son las distintas partes en las que se divide el prompt. Además, como los ficheros <tema>.omp.json incluyen un esquema JSON, funcionará el autocompletado en VSCode y eso hará la tarea más sencilla.

Puedes empezar copiando el fichero <tema>.omp.json y editarlo según tus preferencias. La ruta donde está guardados estos ficheros te la da el comando Get-PoshThemes.

En mi caso, este es mi prompt:

{
    "$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
    "final_space": true,
    "osc99": true,
    "console_title": true,
    "console_title_style": "folder",
    "blocks": [
        {
            "type": "prompt",
            "alignment": "left",
            "segments": [
                {
                    "type": "path",
                    "style": "diamond",
                    "foreground": "black",
                    "background": "lightBlue",
                    "leading_diamond": "\ue0b6",
                    "trailing_diamond": "\ue0b0",
                    "properties": {
                        "prefix": " \ue5ff ",
                        "style": "folder"
                    }
                },
                {
                    "type": "git",
                    "style": "powerline",
                    "powerline_symbol": "\ue0b0",
                    "foreground": "#193549",
                    "background": "#fffb38"
                },
                {
                    "type": "dotnet",
                    "style": "powerline",
                    "powerline_symbol": "\ue0b0",
                    "foreground": "#000000",
                    "background": "#00ffff",
                    "properties": {
                        "prefix": " \ue70c "
                    }
                },
                {
                    "type": "python",
                    "style": "powerline",
                    "powerline_symbol": "\ue0b0",
                    "foreground": "#000000",
                    "background": "#00ffff",
                    "properties": {
                        "prefix": " \ue235 ",
                        "display_mode": "environment"
                    }
                }
            ]
        }
    ]
}

Que quedaría así para proyectos de .net

net

Y así para proyectos de Python

python

Algo que me ha resultado útil durante la edición ha sido cambiar la fuente de VSCode a Caskaydia Cove Nerd Font y usar la extensión Native-ASCII Converter para cambiar entre caracteres en notación Unicode y su representación real.

Es decir, en vez de ver "prefix": " \ue70c ", ver el símbolo de Visual Studio.

visual_studio

En cuando a WSL, y puesto que tarde o temprano acabarás usandolo, vamos a ver como configurar bash en Ubuntu y que luzca igual que el prompt de PowerShell de Windows.

Lo primero es que yo asumo (es mi caso) que estarás usando Ubuntu como OS y bash como shell.

Puedes ejecutar los siguientes comandos para confirmarlo:

cat /etc/shells  # View all installed shells
echo $SHELL  # View current shell
lsb_release -a  # View OS information

En relación a la instalación de oh-my-posh en Linux, lo mejor es seguir las instrucciones del sitio oficial. Al final acabarás con un fichero <tema>.omp.json en tu carpeta de inicio y tendrás que editar el fichero .bashrc (cosa que puedes hacer con el comando code .bashrc, sin tener que usar vim, nano o similar) para agregar la siguiente instrucción:

eval "$(oh-my-posh --init --shell bash --config ~/YOUR_THEME.omp.json)"

Como ahora vas a querer usar la fuente CaskaydiaCove NF tanto en el prompt de PowerShell como en el de bash, lo mejor sería editar la configuración de Windows Terminal y establecer la fuente en la sección Profiles > Defaults, así el cambio será efectivo para todos los perfiles.

Además, para que la consola de Ubuntu parezca todavía más genuina, podrías editar el fichero de configuración de Windows Terminal (fíjate que ahora sí tendrás que editarlo a mano… y eso se hace pulsando la tecla Shift cuando hagas click en la opción Settings del menú) y agregar el scheme de Raspberry, que es lo más cercano en colores que he logrado encontrar a la consola nativa de Ubuntu. A continuación, selecciona este nuevo tema para Ubuntu en la configuración de Windows Terminal y parecerá (casi) que estás en un Ubuntu de verdad.

ubuntu

Puesto que ahora estamos usando oh-my-post tanto en Windows como en Ubuntu, quizás sea útil agregar un segmento de OS:

    {
        "type": "os",
        "style": "diamond",
        "foreground": "#000",
        "background": "#16c60c",
        "leading_diamond": "\ue0b6",
        "trailing_diamond": "\ue0c6",
        "properties": {
            "wsl": "",
            "wsl_separator": ""
        }
    },

Por último, si trabajas también con PyCharm, la terminal integrada no mostrará bien las Nerd Fonts, lo cual es bastante molesto. Yo he acabado por detectar si la shell está o no dentro de PyCharm para hacer un graceful degradation de la mejor forma que se me ha ocurrido.

if (Test-Path 'env:IDEA_INITIAL_DIRECTORY') {
    function Prompt() {
        $prompt = "PS "
        if (Test-Path 'env:VIRTUAL_ENV') {
            $prompt = "(" + (($env:VIRTUAL_ENV -split "\\")[-1] -split "-")[0] + ") "
        }      
        $prompt += $pwd.Path
        Write-Host $prompt -NoNewline
        "> "
    }
}
else {
    Import-Module oh-my-posh
    Set-PoshPrompt -Theme panicoenlaxbox    
}
Import-Module -Name Terminal-Icons

pycharm

Un saludo!


Ver también