3 puntos por GN⁺ 2024-11-09 | 1 comentarios | Compartir por WhatsApp
  • Delta es una herramienta que añade resaltado de sintaxis y funciones de visor paginado a la salida de Git, diff y grep para ayudar a leer los diff de forma más eficiente y agradable
  • En la mayoría de los gestores de paquetes, el nombre del paquete es git-delta, pero el ejecutable es delta, y se puede usar como pager de Git configurando core.pager = delta en ~/.gitconfig
  • Entre sus funciones principales están los mismos temas de resaltado de sintaxis que bat, resaltado de diff por palabra basado en inferencia de edición de Levenshtein, vista comparativa lado a lado, números de línea, navegación con n/N y una mejor visualización de conflictos de fusión
  • También resalta la salida de git blame, rg, git grep y grep, y con --hyperlinks puede generar hashes de commit en formato de enlace para proveedores de hosting como GitHub, GitLab, SourceHut y Codeberg
  • Puede mantenerse muy cerca de la salida predeterminada de Git/diff o cambiar mucho el diseño y el estilo, lo que permite ajustar con detalle el entorno de revisión de diff dentro de la terminal

Qué hace Delta

  • Delta es un visor paginado con resaltado de sintaxis para la salida de Git, diff y grep
  • Su objetivo es hacer que el tiempo dedicado a leer diff en entornos donde el código cambia constantemente sea más eficiente y agradable
  • Permite cambiar ampliamente el diseño y estilo de los diff, o si se prefiere, mantenerlos muy cerca de la salida predeterminada de Git/diff

Instalación y configuración básica

  • La documentación de instalación está disponible en Install it
  • En la mayoría de los gestores de paquetes, el nombre del paquete es git-delta y el nombre del ejecutable es delta
  • Puedes añadir la siguiente configuración a ~/.gitconfig para usarlo como pager de Git y como filtro de diff interactivo
[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    navigate = true  # use n and N to move between diff sections
    dark = true      # or light = true, or omit for auto-detection

[merge]
    conflictStyle = zdiff3
  • La misma configuración también se puede aplicar con el comando git config --global
git config --global core.pager delta
git config --global interactive.diffFilter 'delta --color-only'
git config --global delta.navigate true
git config --global delta.dark true  # or `delta.light true`, or omit for auto-detection
git config --global merge.conflictStyle zdiff3
  • La ayuda está disponible con delta -h, el manual completo con delta --help, y la documentación en línea en user manual

Funciones para leer diff

  • El resaltado de sintaxis usa los mismos temas de resaltado que bat
  • El resaltado de diff por palabra usa el algoritmo de inferencia de edición de Levenshtein
  • Soporta vista comparativa lado a lado y ajuste de línea
  • Soporta mostrar números de línea
  • Es posible moverse entre archivos en diff grandes y entre diff en vistas de log -p con las teclas n y N
    • Esta función se activa con --navigate
  • También procesa la salida tradicional de unified diff junto con la salida de Git
  • Puede detectar automáticamente fondos claros/oscuros en la terminal

Modos de visualización y temas

  • Los temas de resaltado de sintaxis disponibles en bat también pueden usarse en Delta
    • delta --show-syntax-themes --dark
    • delta --show-syntax-themes --light
  • La vista comparativa lado a lado está documentada en Side-by-side view user manual
[delta]
    side-by-side = true
  • La vista lado a lado activa por defecto los números de línea y aplica resaltado de sintaxis en los paneles izquierdo y derecho
  • La vista lado a lado ajusta automáticamente las líneas largas
  • La función de números de línea está documentada en Line numbers user manual
[delta]
    line-numbers = true

Soporte según tarea de Git

  • La visualización de conflictos de fusión se ofrece en un formato mejorado, y la documentación relacionada está en Merge conflicts user manual
  • La salida de git blame admite resaltado de sintaxis y, al usar --hyperlinks, puede convertir commits en enlaces con formato del proveedor de hosting
    • Proveedores de hosting compatibles: GitHub, GitLab, SourceHut, Codeberg
    • Documentación relacionada: Git blame user manual
  • También resalta la salida de grep como rg, git grep y grep
  • Soporta la función --color-moved de Git

Estilos y modo de compatibilidad

  • Se puede copiar código directamente desde el diff, y los marcadores -/+ se eliminan por defecto
  • Ofrece modos de emulación de diff-highlight y diff-so-fancy
  • Los hashes de commit pueden enlazarse a páginas del proveedor de hosting usando el formato de hyperlinks de la terminal
  • Las rutas de archivo también pueden convertirse en enlaces que el sistema operativo puede abrir
  • Se puede dar estilo a las decoraciones de caja/línea que llaman la atención sobre las secciones de encabezado de commit, archivo y hunk
  • Soporta cadenas de estilo con color de primer plano, color de fondo y atributos de fuente para más de 20 elementos de estilo
    • El lenguaje de estilos usa el mismo lenguaje de color/estilo que Git

1 comentarios

 
GN⁺ 2024-11-09
Comentarios en Hacker News
  • Delta era una de esas herramientas que configuras una vez y luego te olvidas; hace tiempo que no veo la salida “cruda” de git grep/diff/blame
    También la uso siempre para diffs comunes fuera de repositorios Git, y hoy me enteré de que también se puede usar con ripgrep
    https://dandavison.github.io/delta/grep.html
    Lo mismo con bat, que ya mencionaron: otra herramienta de configurar una vez y olvidarte; le puse el alias bat a cat, y dejé el cat “original” de /usr/bin/cat con el alias vcat
    https://github.com/sharkdp/bat

    • Para evitar la expansión de alias, puedes usar \cat
  • Sigo acordándome de una observación muy buena que vi hace tiempo: el resaltado de sintaxis actual está resaltando lo equivocado
    La sintaxis los humanos ya la distinguimos bien, así que en vez de colorear la gramática habría que resaltar los símbolos. Si cada nombre de variable y función tuviera un color distinto, el objetivo dejaría de ser “esto es un símbolo” y pasaría a ser “distinguir símbolos diferentes más rápido”
    Pero como esto es mucho más difícil que decorar la sintaxis, parece que las herramientas se quedan en lo fácil en vez de en lo más útil. El resaltado sintáctico ayuda bastante, claro, pero me gustaría ver si un motor de emparejamiento de símbolos realmente funciona bien
    No recuerdo dónde leí el texto original, así que no puedo citar bien la fuente
    Buscando encontré este artículo: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...

    • En KDevelop a esto no le llamaban resaltado de sintaxis sino resaltado semántico
      Creo que existía incluso antes, pero la explicación más antigua que pude encontrar es de 2009: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
    • El autor de ese artículo también hizo difftastic, un “diff estructural que entiende la sintaxis” usando treesitter
      https://difftastic.wilfred.me.uk/
      https://github.com/Wilfred/difftastic
    • Totalmente de acuerdo. Al principio se veía raro, pero una vez que me acostumbré terminé prefiriendo este tipo de resaltado
      En lo personal uso color-identifiers-mode en Emacs
      https://github.com/ankurdave/color-identifiers-mode
    • También se distinguen bastante bien los nombres de variables. Sobre todo si la sintaxis en sí ya está resaltada, sabes exactamente qué tienes que mirar y qué no hace falta mirar
      No me convence del todo esa lógica, pero sí me da algo de curiosidad
      A veces resalto manualmente una variable para seguirle el rastro y comprobar si no me perdí algún uso, así que entiendo perfectamente ese caso. Lo que no sé es si habrá suficientes colores y contraste como para seguir varias variables al mismo tiempo, y también podría terminar ensuciando la pantalla
      Como punto medio, quizá podría servir un enfoque donde se coloreen manualmente hasta unas 3 variables. Aunque si hace falta esa ayuda, tal vez ya sea una señal de que el código de por sí no es muy legible. Claro, ayudar a lidiar con codebases desordenadas también es un uso totalmente válido
  • No es nada vistoso, pero si solo necesitas un diff por palabras decente usando git estándar, muchas veces esto basta
    git diff --color-words --word-diff-regex='\w+|.'

    • ¿Cómo se activa esto por defecto en .gitconfig?
  • Delta hace muy bien su trabajo, pero siempre me topaba con el problema de que cortaba las líneas largas
    Vi este artículo y revisé si eso había cambiado, y sí cambió. Ahora, si configuras git config --global --replace-all delta.max-line-length 0, ya no corta las líneas
    No entiendo muy bien por qué eso no es el valor por defecto. La discusión del cambio está en https://github.com/dandavison/delta/pull/290

    • Por qué no es el valor por defecto está explicado tal cual en ese PR
      Resaltar sintaxis en líneas muy largas, por ejemplo archivos .js minificados, puede volverse muy lento si no las corta
  • Ya que salió el tema de los diffs, algo de la salida diff de Git que me molesta es que imprime la ruta del archivo empezando con dos nombres de archivo, como el diff tradicional de Unix
    --- a/some/path/to/file.c
    +++ b/some/path/to/file.c
    En iTerm muchas veces abro archivos en el editor con cmd-clic, pero aquí no funciona por los prefijos a/ y b/. ¿Hay alguna forma de hacer que Git formatee mejor los nombres de archivo? Ni siquiera hacen falta esas dos líneas

    • git config --global diff.noprefix true
      Para otras opciones relacionadas con prefijos, revisa el manual
  • Uso delta y difftastic mezclados, y ambos son excelentes
    En especial difftastic: aunque es un poco lento, es muy bueno con la sintaxis AST de tree-sitter, y un diff que entiende el AST realmente se siente muy bien
    Delta es limpio y muy rápido

  • Buen tip para activar o desactivar la función side-by-side de Delta según el tamaño de la ventana. Aquí está en bash; para otros shells, adáptalo por tu cuenta
    function delta_sidebyside {
    if [[ COLUMNS -ge 120 ]]; then
    DELTA_FEATURES='side-by-side'
    else
    DELTA_FEATURES=''
    fi
    }
    trap delta_sidebyside WINCH

    • Falta el $ antes de COLUMNS, y probablemente también hace falta export antes de asignar DELTA_FEATURES
  • Uso tanto delta como difftastic, y por más que los recomiende se queda corto
    Si usas aunque sea un poco la terminal, vale la pena instalarlos

    • Difftastic y Delta no funcionan solo en terminal pura
      Ambos tienen soporte en Magit de Emacs, y también en Lazygit
    • Llevo un tiempo usando difftastic, y me da curiosidad cómo los usas juntos
  • También vale la pena revisar tig: https://jonas.github.io/tig/

  • Como llevo tiempo usando git diff normal con colores, quiero querer esto, pero se ve demasiado complejo

    • Puede que te guste diffr: https://github.com/mookid/diffr
      Aclaro que es mi proyecto
    • Me dejó la misma impresión. Nunca sentí que el git diff original tuviera un problema en particular