it-swarm-eu.dev

Tabulatoren und Leerzeichen in vim

Wie verhindere ich, dass vim Leerzeichen durch Tabulatoren ersetzt, wenn die automatische Einrückung aktiviert ist?

Ein Beispiel: Wenn ich zwei Tabulatoren und 7 Leerzeichen am Zeilenanfang habe und tabstop=3, und ich drücke die Eingabetaste, die nächste Zeile hat am Anfang vier Tabulatoren und 1 Leerzeichen, aber das möchte ich nicht ...

71
RQ

Es ist vielleicht eine gute Idee, überhaupt keine Tabulatoren zu verwenden.

:set expandtab

Wenn Sie alle Registerkarten in Ihrer Datei durch drei Leerzeichen ersetzen möchten (das sieht ungefähr so ​​aus wie tabstop=3):

:%s/^I/   /

(wo ^I ist der TAB Charakter)

In der VIM Online-Hilfe:

'tabstop' 'ts'      number  (default 8)
        local to buffer
Number of spaces that a <Tab> in the file counts for.  Also see
|:retab| command, and 'softtabstop' option.

Note: Setting 'tabstop' to any other value than 8 can make your file
appear wrong in many places (e.g., when printing it).

There are four main ways to use tabs in Vim:
1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
   will use a mix of tabs and spaces, but typing <Tab> and <BS> will
   behave like a tab appears every 4 (or 3) characters.
2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
   'expandtab'.  This way you will always insert spaces.  The
   formatting will never be messed up when 'tabstop' is changed.
3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
   |modeline| to set these values when editing the file again.  Only
   works when using Vim to edit the file.
4. Always set 'tabstop' and 'shiftwidth' to the same value, and
   'noexpandtab'.  This should then work (for initial indents only)
   for any tabstop setting that people use.  It might be Nice to have
   tabs after the first non-blank inserted as spaces if you do this
   though.  Otherwise aligned comments will be wrong when 'tabstop' is
   changed.
78
user11211

Sie können alle TAB in SPACE konvertieren

:set et
:ret!

oder konvertiere alle SPACE nach TAB

:set et!
:ret!
42
kev

ich möchte nur, dass die automatisch eingerückte Zeile genau die gleichen Einrückungszeichen aufweist wie die vorherige Zeile.

:help copyindent

'copyindent''ci'boolean (Standard aus); lokal zu puffern; {nicht in Vi}

Kopieren Sie die Struktur der vorhandenen Zeileneinrückung, wenn Sie eine neue Zeile automatisch einrücken. Normalerweise wird der neue Einzug durch eine Reihe von Tabulatoren rekonstruiert, denen nach Bedarf Leerzeichen folgen (es sei denn, 'expandtab' ist aktiviert, in diesem Fall werden nur Leerzeichen verwendet). Wenn Sie diese Option aktivieren, kopiert die neue Zeile alle Zeichen, die zum Einrücken in die vorhandene Zeile verwendet wurden. Wenn der neue Einzug größer ist als in der vorhandenen Zeile, wird der verbleibende Platz auf die normale Weise gefüllt.

HINWEIS: 'copyindent' wird zurückgesetzt, wenn 'compatible' eingestellt ist.
Siehe auch 'preserveindent' .

:help preserveindent

'preserveindent''pi'boolean (Standard aus); lokal zu puffern; {nicht in Vi}

Behalten Sie beim Ändern des Einzugs der aktuellen Zeile so viel wie möglich von der Einzugsstruktur bei. Normalerweise wird der Einzug durch eine Reihe von Tabulatoren gefolgt von Leerzeichen ersetzt (es sei denn, 'expandtab' ist aktiviert, in diesem Fall werden nur Leerzeichen verwendet). Wenn Sie diese Option aktivieren, werden beim Einrücken so viele Zeichen wie möglich beibehalten und nur die erforderlichen zusätzlichen Tabulatoren oder Leerzeichen hinzugefügt.

HINWEIS: Bei mehrmaliger Verwendung von ">>" ist der resultierende Einzug eine Mischung aus Tabulatoren und Leerzeichen. Das könnte dir nicht gefallen.
HINWEIS: 'preserveindent' wird zurückgesetzt, wenn 'compatible' eingestellt ist.
Siehe auch 'copyindent' .
Verwenden Sie: retab, um Leerstellen zu entfernen.

41

Hier ist ein Teil meines .vimrc:

set autoindent
set expandtab
set softtabstop=4
set shiftwidth=4

Das funktioniert gut für mich, weil ich absolut keine Tabs in meinem Quellcode haben möchte. Aus Ihrer Frage geht hervor, dass Sie in der nächsten Zeile zwei Tabulatoren und sieben Leerzeichen beibehalten möchten, und ich bin mir nicht sicher, ob es eine Möglichkeit gibt, vim beizubringen, diesem Stil gerecht zu werden.

25
Greg Hewgill

Vielleicht kann dir der Grund helfen?

Standard vi interpretiert die Tabulatortaste wörtlich, aber es gibt beliebte vi-abgeleitete Alternativen, die schlauer sind, wie vim. Gehen Sie wie folgt vor, um vim zu veranlassen, tab als Einrückungsbefehl anstatt als Befehl zum Einfügen eines Tabulators zu interpretieren:

set softtabstop=2
1
svrist

Wenn Sie alle Tabulatoren basierend auf der Einstellung von 'ts' durch Leerzeichen ersetzen möchten, können Sie Folgendes verwenden: retab. Es kann auch umgekehrt verfahren werden.

1
graywh