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? |
|---|---|---|
cat | bat | which bat |
ls / ll | eza | which eza |
find | fd | which fd |
grep | rg | which rg |
sed | sd | which sd |
ping | gping | which gping |
man | tldr | which 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 (
lessintegrado) bat --plainobat -ppara 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
gitque muestra estado de cada archivo (M, A, ?, etc.) - Colores distinguen ejecutables, symlinks, directorios, archivos ocultos
- Vista árbol integrada (
eza -T) - Soporte para
--time-styley 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,.gitautomá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
.gitignorey.rgignoreautomá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 usacode.
Tabla resumen
| Herramienta | Lenguaje | Reemplaza | Ventaja principal |
|---|---|---|---|
bat | Rust | cat | Syntax highlighting + git diff |
eza | Rust | ls | Iconos + git status en columna |
fd | Rust | find | Respeta .gitignore, ergonómico |
ripgrep | Rust | grep | El más rápido disponible |
sd | Rust | sed | Regex estándar, cross-platform |
starship | Rust | prompt zsh | Contextual, rápido, configurable |
gping | Rust | ping | Gráfica de latencia en terminal |
tlrc | Rust | man | Ejemplos prácticos inmediatos |
zed | Rust | VS Code / editores | GPU-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,rgysdno se alían sobrefind,grepysedporque 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:
- Sin runtime: binario único, instalable con
brew, sin dependencias en el PATH. - Determinismo: mismos resultados en macOS y Linux — sin quirks entre versiones de
sedde BSD vs GNU. - Velocidad:
ripgrepyfdusan paralelismo automático; notoriamente más rápidos en repos de más de 100k archivos. - Seguridad en memoria: sin comportamientos indefinidos que puedan causar outputs inesperados en scripts de CI.
Referencias
- herramientas-por-rol — lista completa de herramientas por rol
- configuracion-zsh — dónde van los alias de estas herramientas
- gestion-herramientas-brew-mise — filosofía de instalación