El comando :w estaba haciendo crash cuando no había nombre de archivo asociado al buffer.
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.
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)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
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
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
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 ✅)
swift run Fas
# Presionar 'i'
# Escribir algo
# ESC
# Escribir ':w'
# Verificar mensaje de error (no crash)
# :q!swift run Fas
# Presionar 'i'
# Escribir "test content"
# ESC
# Escribir ':w /tmp/test.txt'
# Verificar mensaje "written"
# :q
# cat /tmp/test.txt (verificar contenido)swift run Fas
# Escribir ':e /tmp/test.txt'
# Hacer cambios
# ESC
# Escribir ':w'
# Verificar mensaje "written"
# :q✅ Fix completado ✅ Build exitoso (2.47s) ✅ 0 errores, 0 warnings
swift build
# Build complete! (2.47s)