Terminal

El panel del terminal (`Ctrl+``) ejecuta tu shell dentro del editor, con las pestañas y divisiones que esperarías y unas cuantas cosas que solo un editor puede hacer.

Divisiones y pestañas

Una pestaña contiene uno o varios terminales uno al lado del otro. Ctrl+\`` abre el panel, el+` de su cabecera abre otra pestaña, y los comandos de división (Dividir en vertical, Dividir a la izquierda, Dividir a la derecha, Intercambiar divisiones) dividen la pestaña en la que estás. Cada terminal tiene su propia shell, su propio historial de desplazamiento y su propia barra de búsqueda.

Hacer clic en lo que imprimió una herramienta

Cmd/Ctrl y un clic sobre una ruta abre el fichero, en la línea y la columna si la herramienta las imprimió. Se entienden los formatos de cargo, clang, go, eslint (src/main.rs:12:5), tsc y msbuild (src/a.ts(3,5)), las trazas de Python (File "app.py", line 12), las URL file:// y las rutas sueltas; las direcciones web se abren en el navegador. Una ruta solo es un enlace si el fichero existe de verdad, resuelto respecto a la carpeta del terminal y después respecto al proyecto.

Buscar en el historial

Cmd/Ctrl+F con el foco en el terminal abre una barra de búsqueda encima. Busca en todo lo que el terminal ha imprimido, no solo en lo que hay en pantalla: cada coincidencia se resalta, la actual se distingue, y Enter / Shift+Enter las recorren, desplazando la cuadrícula hasta cada una y dando la vuelta en cualquiera de los extremos. Esc cierra la barra. Lo que esté seleccionado en el terminal al abrirla es lo que busca, y la búsqueda no distingue mayúsculas salvo que la consulta lleve alguna. Es texto, no una expresión regular: a.rs:12 encuentra eso mismo.

Integración con la shell

Un terminal solo ve bytes, así que no puede distinguir un prompt de la salida. Las shells pueden decirlo, y GraphoOS imprime el script que les enseña a hacerlo:

# ~/.zshrc
eval "$(graphoos shell-integration zsh)"

# ~/.bashrc
eval "$(graphoos shell-integration bash)"

# ~/.config/fish/config.fish
graphoos shell-integration fish | source

Envía las marcas de la convención OSC 133 (dónde empieza el prompt, qué se escribió, dónde empieza la salida y el código de salida) y OSC 7 (la carpeta en la que está la shell). No imprimen nada, y una shell sin ellas se comporta exactamente igual que antes.

Con ella puesta, el editor sabe:

  • Dónde está la shell. Una ruta impresa por un programa que se ejecuta en otra carpeta se resuelve respecto a esa carpeta, así que sus enlaces funcionan.
  • Qué se ejecutó y cómo acabó. Terminal: repetir un comando reciente lista los comandos del terminal activo, del más reciente al más antiguo, con el código de salida de los que fallaron, y ejecuta el que elijas.

Aspecto

terminal.font-family, terminal.font-size y terminal.line-height toman por defecto los del editor. terminal.letter-spacing añade píxeles entre las letras, terminal.cursor-blinking hace parpadear el cursor mientras la terminal tiene el foco y terminal.font-ligatures deja que una fuente con ligaduras una =>, != o -> (apagado por defecto, porque cambia cómo se ven las letras).

Una fuente no tiene por qué estar instalada en el sistema: ponla en la carpeta fonts de la carpeta de datos (junto a settings.toml) y estará la próxima vez que arranque el editor, solo para este editor.

La pestaña enseña una campana unos segundos cuando un programa la hace sonar, y cuánto lleva un programa cuando lo dice con la secuencia de progreso (OSC 9;4, como winget y systemd): 42 %, ✕ si falló, ⏸ en pausa, … si no se sabe cuánto falta. Se quita al terminar el comando.

Lo que los programas le pueden pedir

Lo que un programa escribe en la terminal y lo que la terminal hace con ello (comprobado en la app: tools/terminal_mouse_smoke.py, tools/terminal_bell_progress_smoke.py, tools/terminal_osc52_smoke.py, tools/terminal_flood_measure.py, los estilos en tools/terminal_styles_look.py).

Secuencia Qué pide Qué pasa
CSI 3 m, 4 m (y 4:2–4:5), 9 m, 8 m cursiva, subrayado (simple, doble, ondulado, punteado, discontinuo), tachado, oculto se pinta
CSI ? 1000/1002/1003 h con 1006 h o sin él el ratón: clics, arrastre, cualquier movimiento; forma SGR o la antigua se le envía al programa (vim, htop, less, tmux); con Mayús seleccionas tú
CSI ? 1007 h (desplazamiento alternativo) la rueda como flechas en programas a pantalla completa less y man se desplazan con la rueda
CSI ? 1004 h entrar y salir del foco se envía ESC [I / ESC [O
CSI n SP q la forma del cursor (bloque, barra, subrayado) se pinta como pide (vim: barra al insertar)
BEL la campana 🔔 en la pestaña unos segundos
OSC 0 / OSC 2 el título el título de la pestaña (gana el nombre que le hayas dado)
OSC 7 el directorio las divisiones y enlaces nuevos empiezan ahí
OSC 8 un enlace Cmd+clic (Ctrl+clic) lo abre: solo ficheros, web y correo
OSC 9;4 progreso 42 %, ✕, ⏸ o … junto al nombre de la pestaña
OSC 52 copiar al portapapeles se copia; leer el portapapeles no se contesta
OSC 133 / OSC 633 las marcas de la shell marcas verde/roja, Cmd+↑/↓ de comando en comando, la línea exacta del comando
salida sin fin (yes 10 s, cat de 100 MB, 3 M de líneas) — el editor sigue respondiendo en 0,02–0,03 s; 100 MB en 1,2 s

Perfiles

[terminal.profiles] en los ajustes nombra las shells que se ofrecen, y [terminal.default-profile] elige una por sistema operativo. Open a New Terminal con un perfil está en la paleta, en Terminal Profile.

Fuente: docs/es/terminal.md