Skip to content

Latest commit

 

History

History
134 lines (112 loc) · 2.63 KB

FIX_CRASH_W.md

File metadata and controls

134 lines (112 loc) · 2.63 KB

Fix: Crash del comando :w

Problema

El comando :w estaba haciendo crash cuando no había nombre de archivo asociado al buffer.

Causa

El método saveCurrentBuffer() lanzaba un error (throw EditorError.noFileName), pero ese error no estaba siendo capturado en handleCommandModeKey(), causando que el error se propagara hasta el nivel superior y crasheara el editor.

Solución

Cambio en handleCommandModeKey()

Antes:

case .enter:
    // Ejecutar comando
    try executeCommand(commandLineBuffer)
    commandLineBuffer = ""
    state.enterMode(.normal)

Después:

case .enter:
    // Ejecutar comando
    do {
        try executeCommand(commandLineBuffer)
    } catch {
        // El error ya fue mostrado en el mensaje de estado
        // No necesitamos hacer nada más
    }
    commandLineBuffer = ""
    state.enterMode(.normal)

Comportamiento Actual

Caso 1: Buffer sin nombre de archivo

1. Presionar 'i'
2. Escribir "Hello World"
3. ESC
4. Escribir ':w'
5. Enter

Resultado:

  • ✅ Muestra mensaje: "Error: No file name (use :w <filename>)"
  • ✅ NO crashea
  • ✅ Vuelve a normal mode
  • ✅ El texto sigue en el buffer

Caso 2: Guardar con nombre

1. Presionar 'i'
2. Escribir "Hello World"
3. ESC
4. Escribir ':w test.txt'
5. Enter

Resultado:

  • ✅ Guarda el archivo
  • ✅ Muestra mensaje: "test.txt" written
  • ✅ Vuelve a normal mode

Caso 3: Buffer con nombre ya asignado

1. Escribir ':e README.md'
2. Hacer cambios
3. ESC
4. Escribir ':w'
5. Enter

Resultado:

  • ✅ Guarda el archivo
  • ✅ Muestra mensaje: "README.md" written
  • ✅ Vuelve a normal mode

Otros Comandos Afectados

El mismo patrón de do-catch previene crashes en todos los comandos que pueden lanzar errores:

  • :w - Error si no hay nombre (ahora manejado ✅)
  • :e <file> - Error si archivo no existe (ya manejado ✅)
  • :w <file> - Error si no se puede escribir (ya manejado ✅)

Testing Recomendado

Test 1: :w sin nombre

swift run Fas
# Presionar 'i'
# Escribir algo
# ESC
# Escribir ':w'
# Verificar mensaje de error (no crash)
# :q!

Test 2: :w con nombre

swift run Fas
# Presionar 'i'
# Escribir "test content"
# ESC
# Escribir ':w /tmp/test.txt'
# Verificar mensaje "written"
# :q
# cat /tmp/test.txt (verificar contenido)

Test 3: :w después de :e

swift run Fas
# Escribir ':e /tmp/test.txt'
# Hacer cambios
# ESC
# Escribir ':w'
# Verificar mensaje "written"
# :q

Estado

✅ Fix completado ✅ Build exitoso (2.47s) ✅ 0 errores, 0 warnings

Compilación

swift build
# Build complete! (2.47s)