Lo que sim hace hoy

Lo que sim hace hoy, agrupado según su propósito. Cada función indica los ID de requisitos de la especificación del proyecto que la respaldan. Las funciones previstas aparecen solo en la hoja de ruta.

Muestra lo oculto

La idea central: un archivo se muestra tal como es.

  • Se muestran los caracteres invisibles y bidireccionales

    Una anulación de derecha a izquierda, un espacio de ancho cero o un carácter de control se dibuja como <U+202E>, <U+200B> o ^[ sobre un bloque magenta, en cualquier estado en que pueda estar una celda: seleccionada, buscada, en la línea del cursor, dentro de un cambio externo, en la niebla de una fila lejana. Ninguno se envía nunca en bruto a la terminal. El texto literal <U+202E> de un archivo no recibe bloque, así que ambos se distinguen.

    Especificación: SAFE-8, UI-15

  • Se marcan los espacios que parecen no estar

    Los espacios finales se dibujan como ·, un espacio de no separación como ⍽ y un tabulador como »: marcas que ningún código usa, dibujadas sobre el texto y nunca parte de él. No hay marca al final de la línea, y no se usan - ni %, porque son caracteres normales del código.

    Especificación: UI-6

  • Se marcan las escrituras externas

    sim vigila el archivo abierto. Cuando otro proceso lo reescribe (una compilación, un formateador, una herramienta), las líneas cambiadas se marcan en el texto, el recuadro indica cuántos cambios hay en disco, la pestaña muestra ↯ y el árbol marca el archivo. Un guardado compara primero el hash del archivo y no escribe nada si cambió desde que se leyó. Una escritura en el mismo instante exacto de esa comprobación aún puede colarse (véase Seguridad).

    Especificación: DISK-1, DISK-2, DISK-6, SAFE-5, UI-4, MARK-1

  • Cambios frente a git HEAD de un vistazo

    Signos en el margen para las líneas añadidas, cambiadas y eliminadas, una letra de estado en cada archivo del árbol (M, A, U, D, R) y, en una carpeta, la letra del estado más fuerte que haya debajo, la rama y +n ~n -n en la línea de estado. Provienen de git, se ejecutan en segundo plano y nunca en el camino de una tecla.

    Especificación: UI-3, UI-5, UI-10

  • La configuración propia de un repositorio no puede hacer que git ejecute un comando

    Antes de ejecutar git, sim le pregunta la configuración propia del repositorio. Lo que una línea de comandos puede detener se desactiva: un monitor del sistema de archivos, los hooks, los filtros, un diff externo y una conversión de texto no ejecutan nada, y el árbol dice cuántos ajustes se desactivaron (2 git settings off). Si la configuración aún podría ejecutar un comando que nada detiene (core.sshCommand, un include que podría traer uno, y más), no se ejecuta git: el árbol no muestra marcas de git y dice git not run, y la línea de estado indica la clave y el archivo. git se ejecuta sin shell, sin bloqueos opcionales y sin forma de descargar nada.

    Especificación: MARK-1, GIT-1, GIT-2, GIT-3, GIT-5

  • Todo lo que no se dibuja se muestra

    Además de la anulación de derecha a izquierda y del espacio de ancho cero, sim muestra los caracteres de etiqueta (la forma de colar una instrucción a un asistente de IA), los selectores de variación (la forma en que se escondió código en extensiones publicadas), los rellenos hangul, los guiones suaves, los separadores de línea y todo punto de código sin asignar como <U+E0041>, en cualquier lugar donde dibuja texto: el archivo, la línea de estado, los mensajes y los nombres del árbol y de las pestañas. Las secuencias de emoji, las teclas con marco, las banderas de Inglaterra, Escocia y Gales y los iconos de Nerd Font se quedan como están. Un kanji seguido de un selector de variación ideográfica muestra el selector.

    Especificación: SAFE-10, SAFE-11

  • El bloque de alerta marca más que caracteres

    El magenta significa que algo merece una segunda mirada. Además de los caracteres ocultos, un enlace de Markdown cuyo texto parece una dirección que su destino no es ([https://good.example](https://evil.example)) tiene su destino dibujado sobre el bloque, y el árbol dice git not run sobre él en un repositorio donde no se ejecutó git por seguridad.

    Especificación: UI-15, MD-10, GIT-5

Rechaza lo que debe y conserva el texto

Nadie pierde texto sin una acción explícita, y los archivos no pueden reconfigurar el editor.

  • Sin modelines, sin archivos de configuración, sin plugins

    Los ajustes y comandos nunca se leen del contenido de un archivo, así que un archivo no puede reconfigurar el editor. No hay archivo de configuración que cargar desde un repositorio, ni API de plugins, y sim no abre conexiones de red. Lo único que recuerda es la apariencia, el icono y la vista de Markdown elegidos, una palabra cada uno.

    Especificación: SAFE-9

  • Guardados que no pueden quedar a medias

    Un guardado escribe un archivo temporal junto al original (creado con modo 0600 y O_EXCL), le hace fsync, lo renombra sobre el original y hace fsync del directorio, de modo que se ve el archivo antiguo o el nuevo, nunca una mezcla. Un archivo que pertenece a otra persona, que tiene enlaces duros o que está en un directorio de solo lectura se guarda en el sitio tras crear una copia de recuperación. sim se niega a escribir a través de un enlace que pertenezca a otra persona. Abrir y guardar sin editar produce una salida idéntica byte a byte.

    Especificación: SAFE-1, SAFE-2, SAFE-3, SAFE-5

  • No se pierde nada en un fallo

    Los cambios sin guardar se capturan en una instantánea como máximo una vez por segundo en un directorio de estado privado (0700). Tras un fallo, un kill -9 o una terminal cerrada, al volver a abrir el archivo se ofrecen de nuevo como un solo paso de deshacer. Se pierde como mucho un segundo de trabajo.

    Especificación: SAFE-6

  • La búsqueda nunca ejecuta lo que controla el repositorio

    sim localiza ripgrep por sí mismo en las entradas absolutas de PATH y lo ejecuta con un entorno vacío y --no-config, nunca con --pre, de modo que un repositorio no puede hacer que una búsqueda ejecute su código. Una búsqueda nunca escribe nada ni sigue un enlace simbólico fuera del proyecto.

    Especificación: GREP-7, GREP-8

  • Los archivos que no son texto se abren en solo lectura

    Un archivo que no es UTF-8 válido, o que tiene un NUL en sus primeros 8 KB, se abre en solo lectura con el motivo a la vista, y los bytes no válidos se dibujan como U+FFFD. Se rechazan las ediciones y las escrituras, porque el texto en pantalla no sería el archivo.

    Especificación: SAFE-4

  • Un guardado en conflicto conserva ambas versiones

    Cuando un guardado detecta que el archivo cambió en disco, no se pierde nada de ninguna de las dos partes. :w! conserva la versión propia tras copiar la ajena al directorio de estado, y :e! toma la ajena tras una instantánea de la propia.

    Especificación:

  • --plain: sin procesos externos

    sim --plain es solo el núcleo: la apariencia calm, un solo archivo, sin panel y sin ejecutar programa alguno por su cuenta: ni git, ni ripgrep, ni filtro, ni hook. Es el modo predeterminado como root y como editor de sudoedit, y la línea de estado dice plain.

    Especificación:

Alcance y velocidad

Los menos pasos posibles desde «ese archivo» hasta leerlo.

  • Un árbol de proyecto que nunca se mueve

    sim se abre con el árbol del directorio actual. Primero van los directorios y luego los archivos, cada grupo por nombre, siempre en el mismo orden, y la expansión queda como se dejó, de modo que los archivos se encuentran por su lugar y no leyendo. Los directorios se leen en segundo plano: las entradas aparecen al llegar, sin mover nada de lo que tienen encima.

    Especificación: TREE-1, TREE-3, TREE-4, TREE-5

  • Búsqueda de archivos y texto en una ventana flotante

    Ctrl-p busca archivos por coincidencia aproximada en la ruta, ordenados por la calidad de la coincidencia y por la probabilidad de que se abra cada uno. Ctrl-f busca en el contenido de todos los archivos mientras se escribe (con ripgrep si está en PATH), con los resultados agrupados por archivo y una vista previa de la línea seleccionada. Esc lo deja todo como estaba.

    Especificación: FIND-2, FIND-4, GREP-1, GREP-5, PICK-1

  • Los archivos probables se marcan donde están

    sim recuerda qué archivos se abren y los ordena combinando recencia y frecuencia. Los cinco más probables se marcan con • en el árbol. Una tecla, ., reduce el árbol a los archivos que cambiaron, están abiertos o se abrieron hace poco.

    Especificación: MARK-2, MARK-3

  • Varios archivos, un editor completo para cada uno

    Cada archivo abierto tiene su propio historial de deshacer, sus instantáneas, su vigilancia y sus guardados. Una barra de pestañas los muestra, con un ● en negrita para los cambios sin guardar. Tab y Shift-Tab cambian de pestaña.

    Especificación: BUF-1, BUF-2, UI-4

  • Tan rápido que no se nota

    En el benchmark del proyecto (compilación release, un archivo de 100.000 líneas, panel abierto, resaltado activado), una tecla tarda como máximo 1 ms en el percentil 99, en pantallas de 80×24 a 240×60. En un repositorio de 100.000 archivos el primer fotograma se dibuja antes de leer la lista de archivos: se midieron de 1,8 a 8,7 ms, frente a un requisito de 20 ms. Todo lo lento (recorrer un árbol, consultar a git, analizar para el resaltado) se ejecuta en un hilo en segundo plano.

    Especificación: SPEED-1, SPEED-2

  • Un solo binario: sim

    El binario independiente si se integra en sim: un solo comando para instalar y uno para ejecutar. El núcleo es una biblioteca, sim-editor-core, sobre la que se construye sim. sim --version y sim --help imprimen su salida y terminan sin tocar la terminal.

    Especificación:

  • Elegir una pestaña por letra

    <Space>bp pone una letra en cada pestaña, y la letra salta a su archivo. <Space>bc hace lo mismo para cerrar una, y nunca cierra un archivo modificado. Una pista nombra Tab y Shift-Tab la primera vez que hay un segundo archivo abierto, hasta que se han usado tres veces.

    Especificación:

  • Un árbol de cambios respecto a git HEAD

    <Space>ge muestra el árbol solo con los archivos que difieren de HEAD, con cambios preparados, sin preparar y sin seguimiento, cada uno con su letra de estado y +n −n, y cada carpeta con las sumas. Enter abre la versión de HEAD de un archivo, en solo lectura.

    Especificación: GIT-1, GIT-2, GIT-3, GIT-4, DIFF-1, DIFF-3, DIFF-4

Lectura cómoda

Colores y diseño calculados, no adivinados.

  • Colores de sintaxis a partir de la paleta de la terminal

    Los colores salen de la paleta de la terminal (leída con OSC 4). Conservan el tono, pero se desplazan en luminosidad hasta que el texto alcanza |Lc| 75 respecto al fondo. Las palabras clave son rojas, las cadenas y los números verdes, los tipos amarillos, las funciones cian y los comentarios gris en cursiva; el azul y el magenta nunca se usan para código. El lenguaje se deduce del nombre del archivo, la extensión o la primera línea, con el conjunto de sintaxis de bat. zh desactiva los colores.

    Especificación: SYN-1, SYN-2, SYN-4

  • Una vista de lectura de Markdown

    En un archivo Markdown, cada línea salvo la del cursor se dibuja como se lee: los marcadores de énfasis y de código no se dibujan, las tablas se alinean por ancho de pantalla y los avisos (> [!NOTE]) muestran la palabra de su tipo. Solo se ocultan esos marcadores, nunca un #, un corchete, una URL ni un carácter del texto, y <Space>um muestra el texto sin transformar.

    Especificación: UI-8, MD-1, MD-10, MD-11

  • Tres apariencias

    Calm es la más sobria: cuatro estilos y un fondo cromático. Flat muestra un diff en verde y rojo con filas teñidas. Depth, la predeterminada, añade recuadros, una regla de visión general y una niebla que atenúa el texto según su distancia al cursor. zl las recorre en ciclo. Calm es la apariencia para quien no distingue el rojo del verde.

    Especificación: LOOK-1, LOOK-2, LOOK-3

  • Legible por medición

    El texto tiene |Lc| 90 y el texto secundario |Lc| 60 (APCA), calculados a partir del fondo de la terminal. En calm, el único color de cambio sigue siendo distinguible con visión del color protán, deután y tritán. Un tono significa una sola cosa en toda la interfaz: gris para la estructura, azul para donde se actúa, verde, ámbar y rojo para el cambio, y magenta solo para lo oculto o peligroso.

    Especificación: VIS-4, VIS-5, COLOR-1, UI-12

  • Un editor en el que se puede vivir

    Iconos en el árbol (hace falta una Nerd Font; zi los desactiva), una barra de pestañas, una ruta de navegación como título del editor (src › sim.rs › leader_key), una línea de estado con el modo, la rama, los cambios frente a HEAD y la posición (la codificación y el fin de línea solo aparecen si no son UTF-8 o LF), números de línea relativos, guías de sangría, una barra de desplazamiento con marcas y un destello sobre lo que se acaba de copiar con yank.

    Especificación: UI-2, UI-5, UI-6, UI-10, UI-11

  • Texto japonés y otros CJK

    Los caracteres anchos ocupan dos columnas, la prosa se ajusta con las reglas japonesas de kinsoku, los movimientos por palabra dividen el texto CJK donde cambia la escritura y, con un IME activo, las teclas de ancho completo funcionan como comandos.

    Especificación: VIS-7, VI-10

  • Funciona sin color y nunca solo por color

    Con NO_COLOR y en las terminales con menos de 8 colores, sim dibuja solo con grosor, subrayado y vídeo inverso, y no pide colores a la terminal. El significado nunca depende solo del color: una línea cambiada es ┆ en la columna de signos, las carpetas muestran la letra del estado de git más fuerte y una pestaña muestra ↯ cuando un archivo cambió en disco. Con los iconos desactivados no se dibuja ningún glifo del área de uso privado.

    Especificación:

  • Los iconos empiezan activados donde es probable que haya una Nerd Font

    Los iconos necesitan una Nerd Font, y una terminal no puede decir si la tiene. Empiezan activados en Ghostty, kitty y WezTerm y desactivados en el resto, con una pista que se muestra una sola vez en la línea de estado: zi: icons (needs a Nerd Font). Siempre prevalece lo que zi eligió por última vez.

    Especificación:

  • Lo copiado se ilumina, en cualquier apariencia

    Lo que acabas de copiar con yank se ilumina durante 150 ms. Calm, la apariencia sobria, también lo ilumina ahora: con el gris de una selección, o subrayado donde no hay ninguna. Una línea que otro proceso acaba de escribir en el archivo abierto se ilumina durante 400 ms.

    Especificación: UI-13, UI-19

Teclas

La gramática de vi, sin los accidentes de vi.

  • Las teclas de vi que las manos ya conocen

    Movimientos, operadores, objetos de texto, contadores, ., modo Visual, búsqueda con smartcase, :s y rangos, sin los accidentes de vi: Y copia hasta el final de la línea, U rehace, Ctrl-s guarda y q sale. Las flechas, Home, End y Delete funcionan en todas partes.

    Especificación: VI-1, VI-2, VI-3, VI-4, VI-5, VI-6, VI-7

  • Lo copiado llega al portapapeles del sistema

    Cada yank sin nombre de registro va también al portapapeles del sistema mediante OSC 52, incluso dentro de tmux. Borrar y cambiar solo llenan el registro, así que x y dd nunca sobrescriben lo que se copió.

    Especificación: VI-8

  • El ratón, sin sorpresas

    Clic para abrir un archivo o colocar el cursor, rueda para desplazarse, arrastrar para seleccionar. El ratón nunca edita, guarda ni crea instantáneas por sí mismo.

    Especificación: PTR-1, PTR-2

  • Space es la tecla líder, con una ventana which-key

    Una pausa sobre un prefijo (Space, g, z, Z, [, ] o un operador como d) abre una pequeña ventana que lista las teclas que pueden venir a continuación. Seguir escribiendo funciona exactamente igual que sin la ventana.

    Especificación:

  • La búsqueda indica dónde se está

    Mientras las coincidencias de una búsqueda están resaltadas, la línea de estado indica en cuál está el cursor y cuántas hay: [3/12].

    Especificación:

  • Registros de Vim

    "a a "z guardan texto y "A a "Z lo añaden; "0 es el último yank, "1 a "9 los últimos borrados y "_ acepta cualquier cosa y no guarda nada. :registers los lista. Viven solo en memoria y todos los archivos abiertos los comparten. Un yank sin nombre sigue yendo al portapapeles del sistema mediante OSC 52; un borrado, no.

    Especificación: VI-15

  • Marcas

    ma a mz ponen una marca en el archivo; 'a va a su línea y la tecla del acento grave a su lugar exacto, también con un operador (d'a). '' vuelve a donde estaba el cursor antes del último salto. Una marca sigue a su texto a través de ediciones, deshacer y cambios desde fuera, y :marks las lista. Las marcas viven solo en memoria.

    Especificación: VI-17

  • :tutor

    Unos quince minutos de lecciones cortas en un búfer temporal, en el idioma de tu configuración regional (English, 日本語, 简体中文, 繁體中文, 한국어, Español, Português, Français, Deutsch o Русский; English para cualquier otro). Los ejercicios se marcan solos con ✗ y ✓ mientras escribes.

    Especificación: TUTOR-1, TUTOR-2, TUTOR-3, TUTOR-4

Hoja de ruta

Previsto, no publicado. Nada de esta lista está disponible todavía y el orden no es una promesa.

  • Macros

    Previsto

    Grabar y reproducir teclas. Hoy sim no tiene ninguna.

  • Integración con el portapapeles

    Previsto

    Más que el yank actual mediante OSC 52.

  • Servidores de lenguaje en un sandbox

    Previsto

    Un cliente de servidores de lenguaje cuyo servidor se ejecuta en un sandbox, y un indicador en la línea de estado de si se confía en la raíz del proyecto.

  • Una GUI con profundidad real

    Previsto

    Un front end gráfico con sombras y elevación reales. Ha empezado como prototipo; no hay nada que instalar.

  • Más formas de instalar

    Previsto

    Los paquetes para AUR y crates.io llegarán próximamente.