Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions README.es-ES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@


# tmux-flash

Navegación estilo [flash.nvim](https://github.com/folke/flash.nvim) para tmux
modo copia: búsqueda incremental multicaracter sobre el **texto visible del panel**,
con etiquetas de salto. Escribe algunos caracteres, las coincidencias se filtran en vivo, presiona la
etiqueta junto a la que deseas y el cursor del modo copia saltará allí, **extendiendo
tu selección si hay una activa**.

<!-- TODO: add screenshot / recording here -->


https://github.com/user-attachments/assets/58507484-3bcd-491c-b8d8-9e422079160d


## Por qué

El flujo de trabajo de flash.nvim en modo visual: inicia una selección con `v`, presiona
`s`, escribe una cadena, presiona la etiqueta y tu selección terminará exactamente
donde la querías. Nada en el ecosistema de tmux replicaba eso:

- [tmux-jump](https://github.com/schasse/tmux-jump) solo lee un **único**
carácter (una limitación de `tmux command-prompt -1`, su mecanismo de entrada)
y cancela el modo copia antes de saltar, destruyendo cualquier selección activa.
- [tmux-thumbs](https://github.com/fcsonline/tmux-thumbs) /
[tmux-fingers](https://github.com/Morantron/tmux-fingers) sugieren patrones predefinidos (URLs, rutas, hashes) para _copiar_, no para _navegación_ de texto libre.
- La búsqueda integrada del modo copia de tmux (`/`) busca en todo el historial de desplazamiento,
no solo en lo que estás viendo, y no tiene etiquetas.

## Cómo funciona

tmux no puede pasar a un script un flujo de pulsaciones de teclas en vivo: `command-prompt` te da
una tecla por invocación. tmux-flash evita esto con la técnica del panel réplica (pionera por tmux-fingers):

1. La tecla de activación ejecuta [`flash.sh`](flash.sh), que toma una instantánea del texto
visible del panel, su geometría, cursor y posición de desplazamiento.
2. Ejecuta [`flash.py`](flash.py) en una ventana desconectada y la intercambia con `swap-pane`
sobre el panel real. La réplica tiene su propio tty, por lo que puede leer pulsaciones de teclas en bruto
en un bucle y renderizar coincidencias/etiquetas con estilos ANSI. Tu
panel real permanece intacto en la ventana de fondo, aún en modo copia,
con la selección y el desplazamiento intactos.
3. Cuando eliges un destino, la réplica se intercambia de nuevo y posiciona
el cursor del modo copia del panel real usando movimientos simples de cursor
(`top-line` / `cursor-down` / `cursor-right`). Estos movimientos, a diferencia de cualquier tipo
de "ir a", **extienden una selección activa**, lo que hace que el
flujo `v` → búsqueda → etiqueta se comporte exactamente como flash.nvim.

El comportamiento replica deliberadamente los valores predeterminados de flash.nvim:

| flash.nvim | tmux-flash |
| ------------------------------------------------- | ---------- |
| modo de búsqueda de coincidencia exacta | igual |
| smartcase (minúsculas = insensible a mayúsculas) | igual |
| etiquetas mostradas desde el primer carácter escrito | igual |
| etiqueta dibujada _después_ de la coincidencia | igual |
| se omiten las etiquetas que podrían continuar la búsqueda | igual |
| coincidencias etiquetadas primero por cercanía al cursor | igual |
| oscurecimiento del fondo | igual |
| el salto aterriza en el inicio de la coincidencia | igual |

## Instalación

### TPM

```tmux
set -g @plugin 'AndreVicencio/tmux-flash'
```

Luego `prefix + I` para instalar.

### Manual

```sh
git clone https://github.com/AndreVicencio/tmux-flash ~/.config/tmux/tmux-flash
```

```tmux
# en tmux.conf
run-shell ~/.config/tmux/tmux-flash/flash.tmux
```

## Uso

| Tecla | Acción |
| ----------------- | ----------------------------------------- |
| `prefix + [` | entrar en modo copia (integrado en tmux) |
| `s` | iniciar búsqueda flash |
| _escribir caracteres_ | filtrar coincidencias en vivo |
| _tecla de etiqueta_ | saltar a esa coincidencia |
| `Enter` | saltar a la coincidencia más cercana |
| `Backspace` | editar el patrón |
| `Esc` / `Ctrl-C` | cancelar, dejando el estado del modo copia sin cambios |

El flujo de selección: `prefix + [` → `v` → `s` → escribir → etiqueta →
la selección ahora abarca desde tu ancla hasta el destino → `y` para copiar.

## Opciones

Configura en `tmux.conf` (se muestran los valores predeterminados):

```tmux
set -g @flash-key 's' # tecla de activación en copy-mode-vi
set -g @flash-labels 'asdfghjklqwertyuiopzxcvbnm' # alfabeto de etiquetas, en orden
```

## Requisitos

- tmux ≥ 3.1 (necesita los formatos `copy_cursor_x/y`; desarrollado y probado en 3.6)
- Python 3 (preinstalado en macOS con las herramientas de desarrollo, y en
prácticamente todas las distribuciones de Linux; no se usan paquetes de terceros)
- `mode-keys vi` (`set-window-option -g mode-keys vi`) — la vinculación está en
la tabla de teclas `copy-mode-vi`

**Sin dependencias de ningún otro plugin de tmux.** TPM es opcional (ver instalación
manual). Convive perfectamente con tmux-yank, vim-tmux-navigator, catppuccin,
resurrect/continuum, etc.

## Limitaciones

- Busca solo en el área visible — por diseño, como la ventana actual de flash.nvim. Desplázate primero, luego usa flash.
- Mientras la búsqueda está activa, existe una ventana transitoria llamada `flash` en la
sesión (la mitad oculta del intercambio de paneles). Desaparece en el momento
en que termina la búsqueda.
- En líneas que contienen caracteres de ancho doble (CJK), la etiqueta puede renderizarse
visualmente desplazada; el salto en sí mismo aún aterriza en el carácter correcto.

## Créditos

- [flash.nvim](https://github.com/folke/flash.nvim) de @folke — el comportamiento
que este plugin replica.
- [tmux-fingers](https://github.com/Morantron/tmux-fingers) — origen de la
técnica del panel réplica.