Saltar al contenido principal

Herramientas Rust — Reemplazos modernos de GNU/Linux

Wiedii sustituye las herramientas clásicas de Unix/GNU por alternativas escritas en Rust. El criterio no es moda: son más rápidas (binarios nativos sin VM), más seguras (sin UB, sin buffer overflows), tienen salida con color por defecto, y respetan convenciones modernas como .gitignore.

Principio de preferencia

Siempre que una alternativa Rust esté instalada, debe usarse en lugar de la herramienta nativa del sistema.

Esto aplica tanto en el día a día en terminal como en scripts de CI, hooks de lefthook y cualquier automatización. Los aliases de .zshrc implementan esta preferencia automáticamente para el uso interactivo — para scripts, invocar el binario explícito (bat, rg, fd, eza, sd).

En lugar de...Usar...¿Instalado?
catbatwhich bat
ls / llezawhich eza
findfdwhich fd
greprgwhich rg
sedsdwhich sd
pinggpingwhich gping
mantldrwhich tldr

Si which <herramienta> no devuelve nada, instalar con brew install <herramienta> antes de usar la versión nativa.


Instalación de todas juntas

brew install bat eza fd ripgrep sd starship gping tlrc

Referencia completa

bat → reemplaza cat

Repositorio: sharkdp/bat

# Antes
cat archivo.ts

# Ahora
bat archivo.ts

Diferencias clave:

  • Syntax highlighting para +200 lenguajes
  • Muestra número de líneas
  • Integración con git diff (marca líneas cambiadas)
  • Paginador automático para archivos largos (less integrado)
  • bat --plain o bat -p para salida sin decoración (útil en pipes)
# Casos de uso en Wiedii
bat compose.yaml # ver config con colores
bat --diff HEAD~1 archivo.ts # ver diff con syntax highlight
git show HEAD:src/index.ts | bat # ver archivo en un commit anterior

Alias recomendado en .zshrc:

alias cat='bat'
alias catp='bat --plain' # sin numeración ni decoración

Después de editar .zshrc: exec zsh en cada terminal abierta para que tome efecto.


eza → reemplaza ls

Repositorio: eza-community/eza

# Antes
ls -la

# Ahora
eza -la --icons --git

Diferencias clave:

  • Iconos de archivo (requiere Nerd Font — font-jetbrains-mono-nerd-font)
  • Columna git que muestra estado de cada archivo (M, A, ?, etc.)
  • Colores distinguen ejecutables, symlinks, directorios, archivos ocultos
  • Vista árbol integrada (eza -T)
  • Soporte para --time-style y ordenamiento múltiple
# Casos de uso en Wiedii
eza # listado rápido con iconos
eza -la --icons --git # detallado con git status
eza -T --level=2 --icons # árbol de directorios (2 niveles)
eza -la --sort=modified # ordenado por fecha de modificación

Alias recomendados en .zshrc:

alias ls='eza --icons'
alias ll='eza -la --icons --git'
alias lt='eza -T --icons --level=2'
alias la='eza -la --icons'

Después de editar .zshrc: exec zsh en cada terminal abierta para que tome efecto.


fd → reemplaza find

Repositorio: sharkdp/fd

# Antes
find . -name "*.ts" -not -path "*/node_modules/*"

# Ahora
fd -e ts

Diferencias clave:

  • Ignora .gitignore, node_modules, .git automáticamente
  • Búsqueda por defecto insensible a mayúsculas
  • Sintaxis de patrones más intuitiva
  • Colores en la salida
  • Paralelismo automático (mucho más rápido en repos grandes)
# Casos de uso en Wiedii
fd -e ts src/ # todos los .ts en src/
fd -e yaml # todos los YAML del proyecto
fd -H ".env" # buscar archivos ocultos también
fd --type d migrations # solo directorios llamados migrations
fd -e ts --exec bat {} # ver contenido de cada .ts encontrado

ripgrep → reemplaza grep

Repositorio: BurntSushi/ripgrep

# Antes
grep -r "TODO" --include="*.ts" .

# Ahora
rg "TODO" -t ts

Diferencias clave:

  • Respeta .gitignore y .rgignore automáticamente
  • Busca en paralelo — el más rápido disponible para búsquedas en repos grandes
  • Muestra contexto con colores y número de línea
  • Soporta PCRE2 (lookahead, lookbehind, etc.) con --pcre2
  • -t <tipo> para filtrar por lenguaje (ts, js, yaml, json, py…)
# Casos de uso en Wiedii
rg "TODO|FIXME" # todos los pendientes del proyecto
rg "glab" -t md # ocurrencias en archivos Markdown
rg "process.env" -t ts -l # solo nombres de archivos (no contenido)
rg "import.*from" -t ts -c # contar imports por archivo
rg --hidden ".env" # buscar en archivos ocultos también

sd → reemplaza sed

Repositorio: chmln/sd

# Antes (sed — diferente sintaxis en macOS vs Linux)
sed -i '' 's/foo/bar/g' archivo.txt

# Ahora (mismo comando en cualquier OS)
sd 'foo' 'bar' archivo.txt

Diferencias clave:

  • Sintaxis de regex estándar (no ERE de POSIX)
  • Sin diferencias de comportamiento entre macOS y Linux
  • Reemplazo en múltiples archivos con glob nativo
  • Más legible para regexes complejos
# Casos de uso en Wiedii
sd 'gitlab.internal' 'gitlab.wiedii.co' **/*.md # reemplazar URL en docs
sd 'version: "old"' 'version: "new"' mise.toml # actualizar versión
sd '(\w+)@old\.com' '$1@wiedii.co' config/**/*.yaml # regex con grupos

starship → reemplaza el prompt de zsh

Repositorio: starship/starship

# Activar en ~/.zprofile
eval "$(starship init zsh)"

Información contextual en el prompt (solo lo relevante, nunca todo a la vez):

  • Directorio actual (abreviado)
  • Rama git + estado (ahead/behind, staged, unstaged)
  • Runtime activo por mise (bun, node, python…) con versión
  • Estado del último comando (✅ / ❌)
  • Contexto Kubernetes activo
  • Duración del último comando si fue largo

Configuración Wiedii — archivo ~/.config/starship.toml:

Tema Gruvbox Dark powerline con iconos de Nerd Font. Requiere font-jetbrains-mono-nerd-font (brew install font-jetbrains-mono-nerd-font).

"$schema" = 'https://starship.rs/config-schema.json'

# =====================================================================
# FORMATO PRINCIPAL — segmentos powerline de izquierda a derecha
# =====================================================================
format = """
[](color_orange)\
$os\
$username\
[](bg:color_yellow fg:color_orange)\
$directory\
[](fg:color_yellow bg:color_aqua)\
$git_branch\
$git_status\
[](fg:color_aqua bg:color_blue)\
$c\
$cpp\
$rust\
$golang\
$nodejs\
$php\
$java\
$kotlin\
$haskell\
$python\
[](fg:color_blue bg:color_bg3)\
$docker_context\
$conda\
$pixi\
[](fg:color_bg3 bg:color_bg1)\
$time\
[ ](fg:color_bg1)\
$line_break$character"""

# Performance — evitar timeouts en repos grandes
command_timeout = 1000
scan_timeout = 30
add_newline = true

# =====================================================================
# PALETA DE COLORES — Gruvbox Dark
# =====================================================================
palette = 'gruvbox_dark'

[palettes.gruvbox_dark]
color_fg0 = '#fbf1c7'
color_bg1 = '#3c3836'
color_bg3 = '#665c54'
color_blue = '#458588'
color_aqua = '#689d6a'
color_green = '#98971a'
color_orange = '#d65d0e'
color_purple = '#b16286'
color_red = '#cc241d'
color_yellow = '#d79921'

# =====================================================================
# SISTEMA OPERATIVO Y USUARIO
# =====================================================================
[os]
disabled = false
style = "bg:color_orange fg:color_fg0"

# Los valores son glifos Nerd Font (nf-md-*). Se ven como cuadrados en Obsidian
# porque el vault no carga JetBrains Mono Nerd Font. En el terminal es correcto.
[os.symbols]
Macos = "󰀵" # nf-md-apple
Linux = "󰌽" # nf-md-linux
Windows = "󰍲" # nf-md-microsoft_windows
Ubuntu = "󰕈" # nf-md-ubuntu
Debian = "󰣚" # nf-md-debian
Fedora = "󰣛" # nf-md-fedora
Arch = "󰣇" # nf-md-arch
Alpine = "" # nf-linux-alpine
Amazon = "" # nf-linux-amazon

[username]
show_always = true
style_user = "bg:color_orange fg:color_fg0"
style_root = "bg:color_orange fg:color_fg0"
format = '[ $user ]($style)'

# =====================================================================
# DIRECTORIO
# =====================================================================
[directory]
style = "fg:color_fg0 bg:color_yellow"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"

[directory.substitutions]
"Documents" = "󰈙 "
"Downloads" = " "
"Music" = "󰝚 "
"Pictures" = " "
"Developer" = "󰲋 "

# =====================================================================
# GIT
# =====================================================================
[git_branch]
symbol = ""
style = "bg:color_aqua"
format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)'

[git_status]
style = "bg:color_aqua"
format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)'

# =====================================================================
# RUNTIMES DE LENGUAJE (segmento azul)
# =====================================================================
[mise]
disabled = false # muestra el runtime activo según mise.toml del proyecto

[nodejs]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[rust]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[golang]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[python]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[java]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[kotlin]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[php]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[c]
symbol = " "
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[cpp]
symbol = " "
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

[haskell]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'

# =====================================================================
# CONTENEDORES Y ENTORNOS (segmento gris oscuro)
# =====================================================================
[docker_context]
symbol = ""
style = "bg:color_bg3"
format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)'

[conda]
style = "bg:color_bg3"
format = '[[ $symbol( $environment) ](fg:#83a598 bg:color_bg3)]($style)'

[pixi]
style = "bg:color_bg3"
format = '[[ $symbol( $version)( $environment) ](fg:color_fg0 bg:color_bg3)]($style)'

# =====================================================================
# HORA (segmento negro)
# =====================================================================
[time]
disabled = false
time_format = "%R"
style = "bg:color_bg1"
format = '[[ $time ](fg:color_fg0 bg:color_bg1)]($style)'

# =====================================================================
# SEGUNDA LÍNEA — carácter del prompt
# =====================================================================
[line_break]
disabled = false

[character]
disabled = false
success_symbol = '[](bold fg:color_green)'
error_symbol = '[](bold fg:color_red)'
vimcmd_symbol = '[](bold fg:color_green)'
vimcmd_replace_one_symbol = '[](bold fg:color_purple)'
vimcmd_replace_symbol = '[](bold fg:color_purple)'
vimcmd_visual_symbol = '[](bold fg:color_yellow)'

Para aplicar cambios en caliente sin reiniciar el shell:

exec zsh # recargar shell completo
starship explain # verificar módulos activos y su formato

gping → reemplaza ping

Repositorio: orf/gping

# Antes
ping google.com

# Ahora
gping google.com

Muestra latencia en tiempo real como gráfica ASCII en la terminal. Útil para detectar picos de latencia o comparar varias IPs simultáneamente.

# Comparar latencia a múltiples hosts
gping google.com cloudflare.com gitlab.wiedii.co

tlrc → reemplaza man

Repositorio: dbrgn/tealdeer (cliente Rust de tldr-pages)

# Antes (man — verbose, difícil de escanear)
man git

# Ahora (ejemplos prácticos directamente)
tldr git
tldr docker
tldr kubectl

tlrc es la implementación en Rust de tldr. Los "pages" son resúmenes mantenidos por la comunidad con ejemplos reales del comando.

# Actualizar base de datos de páginas
tldr --update

# Ver página de un comando
tldr bat
tldr fd
tldr glab

zed → reemplaza VS Code / editores clásicos

Repositorio: zed-industries/zed

brew install zed

Zed es el único editor de código del entorno Wiedii escrito en Rust. Diseñado desde cero para velocidad y colaboración en tiempo real.

Diferencias clave:

  • Arranca en milisegundos — no hay "warming up" ni JVM/Electron
  • Arquitectura GPU-native: el rendering va directo a Metal en macOS
  • Colaboración en tiempo real integrada (sin extensión, sin configuración)
  • Soporte LSP nativo (mismo protocolo que VS Code)
  • Terminal integrada, soporte de extensiones en WASM
# Abrir proyecto
zed .

# Desde CLI
zed archivo.ts
zed --wait archivo.ts # esperar a que se cierre el archivo (útil en git)

El editor por defecto de git en Wiedii es VS Code (code --wait). Zed puede usarse como alternativa personal, pero la configuración estándar del equipo usa code.


Tabla resumen

HerramientaLenguajeReemplazaVentaja principal
batRustcatSyntax highlighting + git diff
ezaRustlsIconos + git status en columna
fdRustfindRespeta .gitignore, ergonómico
ripgrepRustgrepEl más rápido disponible
sdRustsedRegex estándar, cross-platform
starshipRustprompt zshContextual, rápido, configurable
gpingRustpingGráfica de latencia en terminal
tlrcRustmanEjemplos prácticos inmediatos
zedRustVS Code / editoresGPU-native, colaboración en tiempo real

Aliases consolidados para .zshrc

Estos aliases hacen que los comandos nativos invoquen automáticamente las herramientas Rust cuando están disponibles. Copiar en ~/.zshrc tras la sección de inicialización de mise y starship:

# ── Herramientas Rust — preferencia sobre nativas ──────────────────────
# bat → cat
alias cat='bat'
alias catp='bat --plain' # sin numeración ni decoración (útil en pipes)

# eza → ls
alias ls='eza --icons'
alias ll='eza -la --icons --git'
alias lt='eza -T --icons --level=2'
alias la='eza -la --icons'

# fd → find (fd se usa directamente — la sintaxis es diferente)
# ripgrep → grep (rg se usa directamente — la sintaxis es diferente)
# sd → sed (sd se usa directamente — la sintaxis es diferente)
# gping → ping
alias ping='gping'

# tlrc → man
alias man='tldr'
alias tldr='tldr' # explícito para claridad en scripts
# ───────────────────────────────────────────────────────────────────────

fd, rg y sd no se alían sobre find, grep y sed porque su sintaxis es suficientemente distinta — usar el binario Rust directamente es más claro que enmascarar el nombre.

Después de editar .zshrc: exec zsh para aplicar sin reiniciar el terminal.

Ver configuracion-zsh para el .zshrc completo de Wiedii.

Por qué Rust en particular

Las herramientas escritas en Rust cumplen los criterios de la filosofía Wiedii:

  1. Sin runtime: binario único, instalable con brew, sin dependencias en el PATH.
  2. Determinismo: mismos resultados en macOS y Linux — sin quirks entre versiones de sed de BSD vs GNU.
  3. Velocidad: ripgrep y fd usan paralelismo automático; notoriamente más rápidos en repos de más de 100k archivos.
  4. Seguridad en memoria: sin comportamientos indefinidos que puedan causar outputs inesperados en scripts de CI.

Referencias