Warum funktioniert die Rücktaste im Einfügemodus nicht?


146

Der Versuch, Zeichen im Einfügemodus mit der backspaceTaste zu löschen, scheint manchmal nicht zu funktionieren. Ich kann backspace manchmal , aber manchmal tut es nichts; Der Cursor bewegt sich nicht nach links und es scheint absolut nichts zu passieren.

Ich habe das mit gVim in Windows bemerkt. Das backspacescheint bei der Verwendung von Vim vom Terminal in den meisten Linux-Systemen jedoch wie erwartet zu funktionieren.

  1. Warum passiert das?
  2. Wie kann ich die backspaceTaste wie gewohnt zum Löschen von Zeichen bringen?
  3. Ist dieses Verhalten als Feature gedacht? Mit anderen Worten: Gibt es bessere Alternativen backspacezum Löschen von Zeichen im Einfügemodus?

Während die Antwort unten Ihr Problem richtig löst, habe ich festgestellt, dass das Deaktivieren von Tasten wie Pfeiltasten oder Rücktaste Ihnen dabei hilft, sich an die richtige Vorgehensweise zu gewöhnen. Die Rücktaste in vim wird mit X(und das Löschen mit x) ausgeführt. Oft wollten Sie jedoch nur dbdas Löschen bis zum Wortanfang oder dawdas Löschen des gesamten Wortes usw. ausführen. Wenn Sie die Rücktaste verwenden, riskieren Sie dies suboptimaler Schlüssel in mehr Fällen als notwendig.
Shahbaz,

5
@ Shahbaz Ich bin anderer Meinung: Im Einfügemodus ist es sinnvoll, kleinere Korrekturen mit der Rücktaste vorzunehmen. Ich bin damit einverstanden, dass man lernen sollte, wie man die Befehle im normalen Modus verwendet, aber es ist nicht unangebracht, die Rücktaste im Einfügemodus für kleinere Korrekturen zu verwenden.
Karl Yngve Lervåg

3
@ KarlYngveLervåg, im Fall von Rücktaste stimme ich zu (eigentlich habe ich es selbst nicht deaktiviert). Es sieht jedoch so aus, als ob das OP das Standardverhalten der Rücktaste hat, das beispielsweise nicht mit dem Zeilenanfang funktioniert, sondern innerhalb der Zeile. Trotzdem hat das OP bessere Optionen als die Rücktaste. Beispielsweise kann anstelle des Zurücksetzens auf die vorherige Zeile auch ein JLeerzeichen verwendet werden. Kurz gesagt, die Rücktaste ist in Ordnung, um Tippfehler während des Schreibens schnell zu beheben. Ansonsten gibt es bessere Alternativen.
Shahbaz,

1
Das Problem vieler Leute ist nicht, dass sie mit der Funktion per se nicht einverstanden sind, sondern dass dies nicht der einzige Editor ist, den sie verwenden. Da sie mehrere Editoren verwenden, ist es nicht intuitiv, Paradigmen im Zusammenhang mit der Rücktaste zu wechseln, sodass sie eine Teilmenge der vim-Funktionen bevorzugen.
j riv

Wenn Sie vim-faq installiert haben , können Sie dort eine Offline-Antwort erhalten: :h vim-faqund suchen /backspace. Das schwer zu merkende Tag ist :h faq-12.26.
Hotschke

Antworten:


178

tl; dr: Fügen Sie dies zu Ihrem vimrc hinzu, damit die Rücktaste wie in den meisten anderen Programmen funktioniert:

set backspace=indent,eol,start

Längere Antwort

Auch wenn das Standardverhalten überraschend sein mag, kann die Rücktaste "funktioniert nicht" als Feature betrachtet werden . Dies kann verhindern, dass Sie versehentlich Einrückungen entfernen und zu viel Text entfernen, indem Sie ihn auf die aktuelle Zeile und / oder den Anfang der Einfügung beschränken.

:help 'backspace' sagt uns:

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.

Was bedeuten diese Werte genau?

Einzug
Vim fügt für viele Dateitypen einen automatischen Einzug hinzu. Standardmäßig dürfen Sie darüber keine Rücktaste drücken. Die Regeln für das, was als "Autoindentation" bezeichnet wird, sind etwas subtil, wenn wir beispielsweise Folgendes eingeben würden (wobei █ der Cursor ist):

if :; then
    █

Backspacing funktioniert nicht.

Aber wenn wir dann einen Befehl hinzufügen , und die fi, und gehen wieder nach oben, wir sind die Vertiefung zu entfernen erlaubt:

if :; then
    █:
fi

Dies liegt daran, dass Vim im ersten Beispiel festgelegt hat, dass 1 Einrückungsstufe hinzugefügt werden soll, wenn Sie die Eingabetaste gedrückt haben. aber im zweiten Beispiel hat Vim nichts automatisch eingezogen, es sind nur Tabulatorzeichen oder ein paar Leerzeichen.

Siehe auch :help 'autoindent'

eol
Dies sollte am offensichtlichsten sein. Durch Drücken der Rücktaste werden auch die EOL-Markierungen ( \noder \r\n) entfernt. Wenn diese Option deaktiviert ist, führt die Rücktaste nichts aus, wenn Sie versuchen, einen EOL-Marker zu löschen.

start
Das heißt, Sie können nur Text löschen, den Sie seit dem Start des Einfügemodus eingefügt haben, und Sie können keinen Text löschen, der zuvor eingefügt wurde.

Also, was ist die Standardeinstellung?

Ich habe dies mit GVIM in Windows bemerkt. Die Rücktaste scheint jedoch bei Verwendung von VIM über das Terminal in den meisten Linux-Systemen wie erwartet zu funktionieren.

Der Grund dafür ist, dass viele Linux-Distributionen vorgefertigte vimrc-Dateien enthalten, die einige allgemeine Optionen festlegen. Zum Beispiel auf meinem Arch Linux System /usr/share/vim/vimfiles/archlinux.vimmit:

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

Wenn Sie Vim unter Windows installieren, wird standardmäßig das Standard-Vimrc und -gvimrc verwendet, mit denen Vim ausgeliefert wird.

Der Vim- Standardwert ist ein leerer Wert für backspace. Das Arch Linux, Debian, CentOS oder die $other_distroStandardeinstellung können unterschiedlich sein.

Normaler Modus

Bei dieser Frage geht es um die Rücktaste im Einfügemodus, aber lassen Sie mich auch einige kurze Bemerkungen zur Rücktaste im normalen Modus hinzufügen.

Im normalen Modus verhält sich die Rücktaste so h, als würde sie nur nach links gehen.

Standardmäßig springt die Rücktaste zum Anfang einer Zeile (als wäre sie eolin backspace). Sie können dieses Verhalten mit der 'whichwrap'Option über das bFlag steuern (standardmäßig aktiviert).

Sie können die Rücktaste auch zum Löschen von Zeichen verwenden, indem Sie sie dem XBefehl zuordnen:

nnoremap <BS> X

1
Ich denke das "_Xwäre "natürlicheres" Verhalten für <BS>.
Hauleth

2
Bemerkenswert ist, dass fast keine Distribution mit dem Standardverhalten ausgeliefert wird. Das Einzige, was mir aufgefallen ist, war msys2 und das war wahrscheinlich keine Entscheidung, aber es liegt in der Natur der Unterentwicklung.
j riv

5

Nur für den Fall, dass bei der <BS>Verwendung von ConEmu unter Windows Probleme auftreten, müssen Sie den <BS>Schlüssel möglicherweise neu zuordnen für:

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

Mehr Informationen


1
set backspace=2

wird mit v5.4 und früher verwendet. arbeitete für mich auf dem Mac.

sieht aus wie auf dem Mac, den ich v3.2 habe:

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

Alle Versionen nach 3.2 verwenden die GNU General Public License v3 (GPLv3), die Apple nicht unterstützt. Eine Diskussion darüber gibt es hier .

Sie können auf den neuesten Bash upgraden mit:

brew install bash

Dies ermöglicht es, die hier hervorgehobene programmierbare Vervollständigung zu nutzen .


0

Wenn dies set backspace=indent,eol,startIhre letzte Zeile ist vimrc, funktioniert keine der Lösungen.

Fügen Sie danach eine weitere Regel hinzu, zB:

set ruler

4
Das erscheint mir ziemlich seltsam. Können Sie erklären, warum das Hinzufügen eines weiteren Befehls zu Ihrem vimrc dazu führen würde, dass der vorherige Befehl funktioniert?
statox
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.