tl; dr: aggiungi questo al tuo vimrc per far funzionare il backspace come nella maggior parte degli altri programmi:
set backspace=indent,eol,start
Risposta più lunga
Sebbene il comportamento predefinito possa essere sorprendente, il backspace "non funzionante" può essere considerato una caratteristica ; può impedire di rimuovere accidentalmente il rientro e di rimuovere troppo testo limitandolo alla riga corrente e / o all'inizio dell'inserto.
:help 'backspace'
ci dice:
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.
Cosa significano esattamente questi valori?
rientro
Vim aggiunge un rientro automatico per molti tipi di file; per impostazione predefinita, non è
consentito eseguire il backspace su questo; le regole di quella che è considerata "autoindentazione" sono in qualche modo sottili, per esempio, se dovessimo scrivere questo (dove █ è il cursore):
if :; then
█
Backspacing non funzionerà.
Ma se volessimo aggiungere un comando e la fi
, e tornare su, noi siamo
autorizzati a rimuovere il rientro:
if :; then
█:
fi
Questo perché nel primo esempio, Vim ha determinato che dovrebbe aggiungere 1 livello di rientro quando si preme Invio; ma nel secondo esempio, Vim non ha autoindentato nulla, sono solo i caratteri Tab o alcuni spazi.
Vedi anche :help 'autoindent'
eol
Questo dovrebbe essere il più ovvio, premendo Backspace si rimuovono anche i marker EOL ( \n
o \r\n
); se disabilitato, Backspace non farà nulla se si tenta di eliminare un marcatore EOL.
start
Ciò significa che puoi eliminare solo il testo che hai inserito da quando è stata avviata la modalità di inserimento e non puoi eliminare alcun testo che è stato precedentemente inserito.
Quindi qual è l'impostazione predefinita?
Ho notato questo usando GVIM in Windows. Il backspace sembra funzionare come previsto mentre si utilizza VIM dal terminale nella maggior parte dei sistemi Linux.
Il motivo di ciò è dovuto al fatto che molte distro Linux sono dotate di file vimrc predefiniti che impostano alcune opzioni comuni. Ad esempio sul mio sistema Arch Linux che ho /usr/share/vim/vimfiles/archlinux.vim
con:
set nocompatible
set backspace=indent,eol,start
" ... and a few more...
Se installi Vim su Windows, il valore predefinito è utilizzare vimrc e gvimrc predefiniti con cui Vim viene fornito.
Il valore predefinito di Vim è un valore vuoto per backspace
. Arch Linux, Debian, CentOS o l' $other_distro
impostazione predefinita potrebbero essere diversi.
Modalità normale
Questa domanda riguarda Backspace in modalità inserimento, ma vorrei anche aggiungere alcune brevi osservazioni su Backspace in modalità normale.
In modalità normale, Backspace si comporta come h
, va solo a sinistra.
Per impostazione predefinita, il backspace andrà alla riga precedente se all'inizio di una riga (come se eol
fosse in backspace
); puoi controllare questo comportamento con l' 'whichwrap'
opzione tramite il b
flag (abilitato per impostazione predefinita).
Puoi anche fare in modo che backspace elimini i caratteri mappandolo al X
comando:
nnoremap <BS> X
X
(ed elimina conx
), ma spesso ciò che volevi veramente fare eradb
ad esempio eliminare fino all'inizio della parola odaw
eliminare l'intera parola ecc. Se hai backspace disponibile, rischi di utilizzare questo chiave non ottimale in più casi del necessario.