Dlaczego klawisz Backspace nie działa w trybie wstawiania?


146

backspaceWydaje się, że próba usunięcia znaków w trybie wstawiania za pomocą klawisza nie działa. backspace Czasami mogę , ale innym razem nic nie robi; kursor nie przesuwa się w lewo i absolutnie nic się nie dzieje.

Zauważyłem to za pomocą gVim w Windows. backspaceWydaje się działać zgodnie z oczekiwaniami podczas korzystania z Vima z terminalu w większości systemów Linux jednak.

  1. Dlaczego to się dzieje?
  2. Jak mogę sprawić, aby backspaceklawisz usuwał znaki jak zwykle?
  3. Czy to zachowanie ma być funkcją? Innymi słowy: czy są lepsze alternatywy backspacedla usuwania znaków w trybie wstawiania?

Chociaż poniższa odpowiedź poprawnie rozwiązuje problem, zauważyłem, że wyłączenie klawiszy, takich jak klawisze strzałek lub backspace, pomaga przyzwyczaić się do robienia rzeczy w bardziej prawidłowy sposób. Klawisz Backspace w vimie jest wykonywany za pomocą X(i usuwanie za pomocą x), ale często to, co naprawdę chciałeś zrobić, to dbna przykład usunięcie do początku słowa lub dawusunięcie całego słowa itp. Jeśli masz wolne miejsce, ryzykujesz użycie tego klucz nieoptymalny w większej liczbie przypadków niż to konieczne.
Shahbaz

5
@Shahbaz Nie zgadzam się: W trybie wstawiania sensowne jest wprowadzanie drobnych poprawek za pomocą klawisza Backspace. Zgadzam się, że należy nauczyć się korzystać z poleceń trybu normalnego, ale nie jest niewłaściwe używanie backspace w trybie wstawiania w celu drobnych poprawek.
Karl Yngve Lervåg

3
@ KarlYngveLervåg, w przypadku backspace zgadzam się (właściwie sam nie wyłączam go). Wygląda jednak na to, że OP ma domyślne zachowanie backspace, które nie działa na przykład na początku linii, ale działa w obrębie linii. Mimo to OP ma lepsze opcje niż backspace. Na przykład, zamiast cofania do poprzedniej linii, można użyć, Jktóry dba również o białe spacje. Krótko mówiąc, backspace jest odpowiedni do szybkich poprawek literówek podczas pisania, ale poza tym istnieją lepsze alternatywy.
Shahbaz

1
Problemem wielu ludzi nie jest brak zgody co do samej funkcji, ale to, że nie jest to jedyny edytor, którego używają. Ponieważ używają wielu edytorów, intuicyjne jest przełączanie paradygmatów związanych z backspace, więc wolą podzbiór funkcji vima.
j riv

Jeśli zainstalowałeś vim-faq , możesz tam uzyskać odpowiedź offline: :h vim-faqi wyszukać /backspace. Trudno zapamiętać tag :h faq-12.26.
Hotschke

Odpowiedzi:


178

tl; dr: Dodaj to do swojego vimrc, aby backspace działał jak w większości innych programów:

set backspace=indent,eol,start

Dłuższa odpowiedź

Chociaż zachowanie domyślne może być zaskakujące, „niedziałający” backspace można uznać za funkcję ; może zapobiec przypadkowemu usunięciu wcięcia i usunięciu zbyt dużej ilości tekstu, ograniczając go do bieżącej linii i / lub początku wstawki.

:help 'backspace' Powiedz nam:

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.

Co dokładnie oznaczają te wartości?

wcięcie
Vim dodaje automatyczne wcięcie dla wielu typów plików; Domyślnie, jesteś nie wolno Backspace nad tym; reguły tego, co uważane jest za „autoindentację”, są nieco subtelne, na przykład, jeśli wpisalibyśmy to (gdzie █ jest kursorem):

if :; then
    █

Odstępy nie będą działać.

Ale jeśli będzie następnie dodać polecenie i tym fi, i wrócić się, że dopuszczone do usunięcia wcięcia:

if :; then
    █:
fi

Wynika to z faktu, że w pierwszym przykładzie Vim stwierdził, że po naciśnięciu klawisza Enter należy dodać 1 poziom wcięcia; ale w drugim przykładzie Vim nic nie autoindentował, tylko znaki Tab lub kilka spacji.

Zobacz także :help 'autoindent'

eol
Powinno to być najbardziej oczywiste, naciśnięcie Backspace usuwa również znaczniki EOL ( \nlub \r\n); jeśli wyłączone, Backspace nic nie zrobi, jeśli spróbujesz usunąć znacznik EOL.

start
Oznacza to, że możesz usunąć tylko tekst, który wstawiłeś od czasu uruchomienia trybu wstawiania, i nie możesz usunąć żadnego wcześniej wstawionego tekstu.

Jakie jest ustawienie domyślne?

Zauważyłem to za pomocą GVIM w Windows. Jednak backspace wydaje się działać zgodnie z oczekiwaniami podczas używania VIM z terminala w większości systemów Linux.

Powodem tego jest fakt, że wiele dystrybucji Linuksa jest dostarczanych z gotowymi plikami vimrc, które ustawiają niektóre typowe opcje. Na przykład w moim systemie Arch Linux mam /usr/share/vim/vimfiles/archlinux.vim:

set nocompatible
set backspace=indent,eol,start
" ... and a few more...

Jeśli zainstalujesz Vima w systemie Windows, domyślnie jest używane domyślne vimrc i gvimrc, z którymi Vim jest dostarczany.

Vim domyślnie jest pusta wartość backspace. Arch Linux, Debian, CentOS lub $other_distrodomyślne mogą być inne.

Tryb normalny

To pytanie dotyczy Backspace w trybie wstawiania, ale dodam też kilka krótkich uwag na temat Backspace w trybie normalnym.

W trybie normalnym Backspace działa jak h, po prostu idzie w lewo.

Domyślnie, backspace przejdzie do poprzedniej linii, jeśli na początku linii (tak jakby eolbył w backspace); możesz kontrolować to zachowanie za pomocą 'whichwrap'opcji poprzez bflagę (domyślnie włączone).

Możesz także usunąć znaki backspace, mapując je na Xpolecenie:

nnoremap <BS> X

1
Myślę, że "_Xbyłoby to „bardziej naturalne” zachowanie <BS>.
Hauleth

2
Warto zauważyć, że prawie żadna dystrybucja nie ma domyślnego zachowania. Jedyne, co zauważyłem, to msys2 i prawdopodobnie nie była to decyzja, ale z natury słabo rozwinięta.
j riv

5

Na wypadek, gdyby ktoś doświadczył niemożliwego do wyjaśnienia <BS>zachowania przy użyciu ConEmu w systemie Windows, konieczne może być ponowne mapowanie <BS>klucza, aby:

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

Więcej informacji


1
set backspace=2

jest używany z wersją 4.4 i wcześniejszą. pracował dla mnie na komputerze Mac.

wygląda na Mac mam v3.2:

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

Wszystkie wersje wcześniejsze niż 3.2 korzystają z Powszechnej Licencji Publicznej GNU v3 (GPLv3), której Apple nie popiera. Dyskusja na temat reddit na ten temat jest tutaj .

Możesz uaktualnić do najnowszej wersji Bash za pomocą:

brew install bash

pozwala to skorzystać z podświetlonego tutaj programowalnego zakończenia .


0

Jeśli set backspace=indent,eol,startjest to ostatni wiersz vimrc, żadne z rozwiązań nie będzie działać.

Dodaj jeszcze jedną regułę, np .:

set ruler

4
Wydaje mi się to dość dziwne, czy możesz wyjaśnić, dlaczego dodanie kolejnego polecenia do vimrc sprawiłoby, że poprzednie zadziałałoby?
statox
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.