¿Por qué la tecla de retroceso no funciona en modo de inserción?


146

Intentar eliminar caracteres en modo insertar con la backspacetecla a veces no parece funcionar. A backspace veces puedo , pero otras veces no hace nada; el cursor no se mueve hacia la izquierda y no parece suceder absolutamente nada.

Me di cuenta de esto usando gVim en Windows. El backspaceparece funcionar como se espera durante el uso de Vim de la terminal en la mayoría de los sistemas Linux sin embargo.

  1. ¿Por qué pasó esto?
  2. ¿Cómo puedo hacer que la backspacetecla elimine caracteres como de costumbre?
  3. ¿Este comportamiento pretende ser una característica? En otras palabras: ¿hay mejores alternativas backspacepara eliminar caracteres en modo de inserción?

Si bien la respuesta a continuación resuelve correctamente su problema, descubrí que las teclas de desactivación, como las teclas de flecha o la tecla de retroceso, lo ayudan a acostumbrarse a hacer las cosas más correctamente. El retroceso en vim se realiza con X(y eliminar con x), pero a menudo lo que realmente quería hacer era, dbpor ejemplo, eliminar hasta el comienzo de la palabra, o daweliminar la palabra completa, etc. Si tiene retroceso disponible, corre el riesgo de usar esto clave subóptima en más casos de los necesarios.
Shahbaz

55
@Shahbaz No estoy de acuerdo: mientras está en modo de inserción, tiene sentido poder hacer correcciones menores usando la tecla de retroceso. Estoy de acuerdo en que uno debe aprender a usar los comandos del modo normal, pero no es inapropiado usar el retroceso mientras está en el modo de inserción para correcciones menores.
Karl Yngve Lervåg

3
@ KarlYngveLervåg, en el caso de retroceso, estoy de acuerdo (en realidad no lo tengo desactivado). Sin embargo, parece que el OP tiene el comportamiento predeterminado de retroceso que no funciona, por ejemplo, con el inicio de línea, sino que funciona dentro de la línea. Aún así, el OP tiene mejores opciones que la tecla de retroceso. Por ejemplo, en lugar de retroceder a la línea anterior, se puede usar el Jque también cuida los espacios en blanco. En resumen, el retroceso está bien para corregir errores tipográficos rápidamente durante la escritura, pero aparte de eso, hay mejores alternativas.
Shahbaz

1
El problema de muchas personas no es un desacuerdo con la función en sí, sino que no es el único editor que usan. Dado que usan varios editores, es contra-intuitivo cambiar los paradigmas relacionados con el espacio de retroceso, por lo que prefieren un subconjunto de las características de vim.
j riv

Si ha instalado vim-faq , puede obtener una respuesta sin conexión allí: :h vim-faqy buscar /backspace. La etiqueta difícil de memorizar es :h faq-12.26.
Hotschke

Respuestas:


178

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 ( \no \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.vimcon:

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_distropredeterminado 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 eolestuviera en backspace); Puede controlar este comportamiento con la 'whichwrap'opción a través del bindicador (habilitado de forma predeterminada).

También puede hacer que los caracteres de eliminación de retroceso se asignen al Xcomando:

nnoremap <BS> X

1
Creo que "_Xsería un comportamiento "más natural" <BS>.
Hauleth

2
Vale la pena señalar que casi ninguna distribución se envía con el comportamiento predeterminado. El único que noté fue msys2 y probablemente no fue una decisión, sino su naturaleza de subdesarrollo.
j riv

5

En caso de que alguien tenga experiencia que no sea un <BS>comportamiento explicable al usar ConEmu en Windows, es posible que deba reasignar la <BS>clave para:

inoremap <Char-0x07F> <BS>
nnoremap <Char-0x07F> <BS>

Más información


1
set backspace=2

se usa con v5.4 y versiones anteriores. funcionó para mí en mac.

Parece que en Mac tengo v3.2:

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

Todas las versiones anteriores a la 3.2 usan la GNU General Public License v3 (GPLv3), que Apple no está a favor de admitir. Una discusión sobre reddit sobre esto está aquí .

Puede actualizar al Bash más nuevo con:

brew install bash

Esto permite aprovechar la finalización programable resaltada aquí .


0

Si set backspace=indent,eol,startes la última línea de su vimrc, ninguna de las soluciones funcionará.

Agregue una regla más después de esto, por ejemplo:

set ruler

44
Eso me parece bastante extraño, ¿podría explicar por qué agregar otro comando a su vimrc haría que el anterior funcionara?
statox