Perché la chiave backspace non funziona in modalità inserimento?


146

Cercare di eliminare caratteri in modalità inserimento con il backspacetasto a volte non sembra funzionare. A backspace volte posso , ma altre volte non fa nulla; il cursore non si sposta a sinistra e non sembra assolutamente accadere nulla.

Ho notato questo usando gVim in Windows. La backspacesembra funzionare come previsto durante l'uso Vim dal terminale nella maggior parte dei sistemi Linux però.

  1. Perché succede?
  2. Come posso fare in modo che la backspacechiave elimini i caratteri come al solito?
  3. Questo comportamento è inteso come una funzionalità? In altre parole: esistono alternative migliori backspaceper eliminare i caratteri in modalità inserimento?

Mentre la risposta di seguito risolve correttamente il tuo problema, ho scoperto che disabilitare i tasti come i tasti freccia o il backspace ti aiuta ad abituarti a fare le cose in modo più corretto. Backspace in vim viene eseguito con X(ed elimina con x), ma spesso ciò che volevi veramente fare era dbad esempio eliminare fino all'inizio della parola o daweliminare l'intera parola ecc. Se hai backspace disponibile, rischi di utilizzare questo chiave non ottimale in più casi del necessario.
Shahbaz,

5
@Shahbaz Non sono d'accordo: in modalità di inserimento ha senso essere in grado di apportare correzioni minori usando il tasto backspace. Sono d'accordo che si dovrebbe imparare come usare i normali comandi di modalità, ma non è consigliabile usare backspace mentre si è in modalità di inserimento per correzioni minori.
Karl Yngve Lervåg,

3
@ KarlYngveLervåg, in caso di backspace sono d'accordo (in realtà non l'ho disabilitato da solo). Tuttavia, sembra che l'OP abbia il comportamento predefinito di backspace che non funziona ad esempio con l'inizio della linea, ma funziona all'interno della linea. Tuttavia, l'OP ha opzioni migliori rispetto al backspace. Ad esempio, invece di eseguire il backspacing alla riga precedente, si può usare anche quello Jche si occupa degli spazi bianchi. In breve, backspace va bene per veloci correzioni di battitura durante la scrittura, ma a parte questo ci sono alternative migliori.
Shahbaz,

1
Il problema di molte persone non è in disaccordo con la funzionalità in sé, ma non è l'unico editor che usano. Dal momento che usano più editor è controintuitivo cambiare i paradigmi relativi al backspace in modo da preferire un sottoinsieme delle funzionalità di VIM.
j riv,

Se hai installato vim-faq , puoi ottenere una risposta offline lì: :h vim-faqe cerca /backspace. Il tag difficile da memorizzare è :h faq-12.26.
Hotschke,

Risposte:


178

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

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_distroimpostazione 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 eolfosse in backspace); puoi controllare questo comportamento con l' 'whichwrap'opzione tramite il bflag (abilitato per impostazione predefinita).

Puoi anche fare in modo che backspace elimini i caratteri mappandolo al Xcomando:

nnoremap <BS> X

1
Penso che "_Xsarebbe un comportamento "più naturale" per <BS>.
Hauleth

2
Vale la pena notare che quasi nessuna distribuzione viene fornita con il comportamento predefinito. L'unico che ho notato era msys2 e probabilmente non era una decisione, ma la sua natura di sottosviluppo.
j riv,

5

Nel caso in cui qualcuno stia sperimentando un <BS>comportamento non spiegabile usando ConEmu su Windows, potrebbe essere necessario rimappare la <BS>chiave per:

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

Maggiori informazioni


1
set backspace=2

viene utilizzato con v5.4 e precedenti. ha funzionato per me su mac.

sembra che su mac ho v3.2:

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

Tutte le versioni precedenti alla 3.2 utilizzano la GNU General Public License v3 (GPLv3), che Apple non supporta. Una discussione su reddit su questo è qui .

Puoi aggiornare al nuovissimo Bash con:

brew install bash

ciò consente di sfruttare il completamento programmabile evidenziato qui .


0

Se set backspace=indent,eol,startè l'ultima riga della tua vimrc, nessuna delle soluzioni funzionerà.

Aggiungi un'altra regola dopo questo, ad esempio:

set ruler

4
Mi sembra abbastanza strano, potresti spiegare perché l'aggiunta di un altro comando al tuo vimrc farebbe funzionare quello precedente?
statox
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.