tl; dr: agregue esto a su vimrc para que el espacio de retroceso funcione como en la mayoría de los otros programas:
set backspace=indent,eol,start
Respuesta más larga
Aunque el comportamiento predeterminado puede ser sorprendente, el retroceso "no funciona" puede considerarse una característica ; puede evitar que elimine accidentalmente la sangría y que elimine demasiado texto al restringirlo a la línea actual y / o al inicio de la inserción.
:help 'backspace'
Cuéntanos:
Influences the working of `<BS>`, `<Del>`, `CTRL-W` and `CTRL-U` in Insert
mode. This is a list of items, separated by commas. Each item allows
a way to backspace over something:
value effect
indent allow backspacing over autoindent
eol allow backspacing over line breaks (join lines)
start allow backspacing over the start of insert; CTRL-W and CTRL-U
stop once at the start of insert.
Entonces, ¿qué significan exactamente estos valores?
sangría
Vim agrega sangría automática para muchos tipos de archivos; de forma predeterminada, no
puede retroceder sobre esto; las reglas de lo que se considera 'autoindentación' son algo sutiles, por ejemplo, si escribiéramos esto (donde █ es el cursor):
if :; then
█
El retroceso no funcionará.
Pero si queremos a continuación, añadir un comando y el fi
, y volver a subir, nos estamos
autorizados a retirar la muesca:
if :; then
█:
fi
Esto se debe a que en el primer ejemplo, Vim determinó que debería agregar 1 nivel de sangría cuando presionó Enter; pero en el segundo ejemplo, Vim no autoindentó nada, solo son caracteres Tab o algunos espacios.
Ver también :help 'autoindent'
eol
Esto debería ser lo más obvio, al presionar Retroceso también se eliminan los marcadores EOL ( \n
o \r\n
); si está desactivado, Retroceso no hará nada si intenta eliminar un marcador EOL.
inicio
Esto significa que solo puede eliminar el texto que ha insertado desde que comenzó el modo de inserción, y no puede eliminar ningún texto que se haya insertado previamente.
Entonces, ¿cuál es la configuración predeterminada?
Me di cuenta de esto usando GVIM en Windows. Sin embargo, el retroceso parece funcionar según lo esperado mientras se usa VIM desde el terminal en la mayoría de los sistemas Linux.
La razón de esto es porque muchas distribuciones de Linux se envían con archivos vimrc prefabricados que establecen algunas opciones comunes. Por ejemplo, en mi sistema Arch Linux que tengo /usr/share/vim/vimfiles/archlinux.vim
con:
set nocompatible
set backspace=indent,eol,start
" ... and a few more...
Si instala Vim en Windows, el valor predeterminado es usar los valores predeterminados vimrc y gvimrc con los que se incluye Vim.
El valor predeterminado de Vim es un valor vacío para backspace
. Arch Linux, Debian, CentOS o el $other_distro
predeterminado pueden ser diferentes.
Modo normal
Esta pregunta es sobre Retroceso en modo de inserción, pero permítanme agregar algunas breves observaciones sobre Retroceso en modo normal.
En modo normal, el Retroceso actúa como h
, solo va hacia la izquierda.
Por defecto, el retroceso irá a la línea anterior si al comienzo de una línea (como si eol
estuviera en backspace
); Puede controlar este comportamiento con la 'whichwrap'
opción a través del b
indicador (habilitado de forma predeterminada).
También puede hacer que los caracteres de eliminación de retroceso se asignen al X
comando:
nnoremap <BS> X
X
(y eliminar conx
), pero a menudo lo que realmente quería hacer era,db
por ejemplo, eliminar hasta el comienzo de la palabra, odaw
eliminar la palabra completa, etc. Si tiene retroceso disponible, corre el riesgo de usar esto clave subóptima en más casos de los necesarios.