Tabulatortaste == 4 Leerzeichen und automatischer Einzug nach geschweiften Klammern in Vim

1265

Wie mache ich vi - Vim verwendet niemals Tabulatoren (Konvertieren von Leerzeichen in Tabulatoren, schlecht!), Macht die Tabulatortaste == 4 Leerzeichen und rückt Code automatisch nach geschweiften Klammern ein, wie es Emacs tut?

Wie speichere ich diese Einstellungen, damit ich sie nie wieder eingeben muss?

Ich habe andere Fragen dazu gesehen, aber es scheint immer ein wenig von dem abzuweichen, was ich will.

mmcdole
quelle
3
Verwandte: Wie Tabulatoren durch Leerzeichen ersetzen? bei Vim SE
Kenorb

Antworten:

1882

Wie in den folgenden Antworten bereits erwähnt, besteht die bevorzugte Methode jetzt NICHT darin, smartindent zu verwenden, sondern Folgendes (in Ihrer .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

In Ihrer .vimrc: -Datei:

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Die Hilfedateien brauchen etwas Zeit, um sich daran zu gewöhnen, aber je mehr Sie lesen, desto besser wird Vim:

:help smartindent

Noch besser ist, dass Sie diese Einstellungen aus Gründen der Portabilität in Ihre Quelle einbetten können:

:help auto-setting

So zeigen Sie Ihre aktuellen Einstellungen an:

:set all

Wie greywh in den Kommentaren hervorhebt, wurde smartindent durch cindent ersetzt, das "klüger funktioniert", obwohl es immer noch hauptsächlich für Sprachen mit C-ähnlicher Syntax gilt:

:help C-indenting

Ken
quelle
4
Wenn Sie expandtab festgelegt haben, sollten Leerzeichen verwendet werden. Stellen Sie auch "kompatibel" ein? Das hat verschiedene Nebenwirkungen, einschließlich des Zurücksetzens von expandtab auf die Standardeinstellung "off"
Ken
60
Entschuldigung, aber smartindent wurde durch cindent ersetzt, was selbst nur für die Syntax im C-Stil geeignet ist. Das Einschalten in Ihrem vimrc kann ein Problem sein, wenn Sie mit anderen Sprachen arbeiten. Verwenden Sie stattdessen einfach "Dateityp Einzug ein".
Graywh
2
Nun, smartindent ist auch nur für die C-Syntax gedacht und im Wesentlichen veraltet.
Graywh
4
Wenn ich expandtab aktiviere, gibt es trotzdem eine Möglichkeit, das Tabulatorzeichen tatsächlich in den Text einzugeben?
Daniele Segato
3
@DanieleSegato <Strg v> <Tab> sollte im Einfügemodus funktionieren
Ken
236

Verwandte Themen, wenn Sie eine Datei öffnen, die sowohl Tabulatoren als auch Leerzeichen verwendet, vorausgesetzt, Sie haben

set expandtab ts=4 sw=4 ai

Sie können alle Registerkarten durch Leerzeichen in der gesamten Datei ersetzen

:%retab
netjeff
quelle
10
Zu Ihrer Information: Wenn Sie nicht möchten, dass Ihre Registerkarte durch Leerzeichen ersetzt wird, entfernen Sie die Zeile expandtab.
Eno
6
Sind Tabs keine Leerzeichen? ;-)
Rob Wells
11
@ Rob-Wells: Ich habe "Leerzeichen" in "Leerzeichen" geändert. Bist du jetzt glücklich? ;-)
Netjeff
Können Sie erklären, was diese erste Zeile bedeutet?
Fund Monica Klage
2
expandtab bestimmt, ob Registerkarten zu Leerzeichen erweitert werden. ts = tabstop = Anzahl der Leerzeichen, für die ein <Tab> in der Datei zählt. sw = shiftwidth = Anzahl der Leerzeichen, die für jeden Schritt des (automatischen) Einrückens verwendet werden sollen. ai = autoindent = Einzug aus der aktuellen Zeile kopieren, wenn eine neue Zeile gestartet wird.
mcmacerson
89

Der beste Weg, um einen filetypspezifischen Einzug zu erhalten, ist die Verwendung filetype plugin indent onin Ihrem vimrc. Dann können Sie Dinge wie beispielsweise set sw=4 sts=4 etin .vim / ftplugin / c.vim angeben , ohne diese für alle zu bearbeitenden Dateien global machen zu müssen, und andere Syntaxen vom Typ C werden ebenfalls korrekt eingerückt (sogar Lisps) .

greywh
quelle
9
IMHO, besser als die Antwort, die als richtig markiert wurde. Dateityp Einzug auf Ersetzt Cindent und Smartindent.
0fnt
62

Fügen Sie Folgendes in Ihre ~/.vimrcDatei ein , um in den meisten Dateien Registerkarten mit 4 Leerzeichen, in Makefiles echte 8-Zeichen-Zeichen und in verschiedenen Dateien, einschließlich C / C ++, automatisch einzurücken :

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.
Shervin Emami
quelle
Warum brauchst du keinen else? Es scheint mir, als ob die letzten Zeilen das Makefile-spezifisch in allen Fällen überschreiben
lucidbrot
6
Hallo @lucidbrot, die Anweisung "autocmd FileType make" weist vim grundsätzlich an, einige Einstellungen zu verwenden, wenn ein Makefile geöffnet wird. Während die Zeilen darunter die Standardeinstellungen festlegen. Mit anderen Worten, die Einstellungen für "tabstop = 8 ..." werden später beim Öffnen der Datei angewendet und überschreiben die Einstellungen für "tabstop = 4 ...", die bei der Initialisierung gelten.
Shervin Emami
56

Auf vielen Linux-Systemen wie Ubuntu ist die .vimrcDatei standardmäßig nicht vorhanden. Es wird daher empfohlen, sie zuerst zu erstellen.

Verwenden Sie nicht die .viminfoDatei, die im Home-Verzeichnis vorhanden ist. Es wird für einen anderen Zweck verwendet.

Schritt 1: Gehen Sie zu Ihrem Home-Verzeichnis

cd ~

Schritt 2: Erstellen Sie die Datei

vim .vimrc

Schritt 3: Fügen Sie die oben angegebene Konfiguration hinzu

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Schritt 3: Speichern Sie die Datei, indem Sie Shift+ drücken ZZ.

Erick
quelle
11
Dont verwenden Shift + ZZes .swp Datei erstellen. verwenden wq.
Shas
6
@shas: "ZZ" entspricht ": x" , was dasselbe ist wie ": wq", außer dass es nur gespeichert wird, wenn die Datei geändert wurde ... ( Ctrl-Zist eine andere Geschichte ...)
Gert van den Berg
1
@shas Das ist einfach falsch. Wenn Sie keine Auslagerungsdatei für eine Bearbeitungssitzung möchten, müssen Sie diese ausführen vim -n <file>. Eine Auslagerungsdatei wird nicht zur Speicherzeit generiert. Das würde seinen Zweck so gut wie zunichte machen, da Swap-Dateien nützlich sind, um abrupt abgebrochene Bearbeitungssitzungen wiederherzustellen.
Kaz
32

Die empfohlene Methode besteht darin, einen auf Dateitypen basierenden Einzug zu verwenden und nur dann smartindent und cindent zu verwenden, wenn dies nicht ausreicht.

Fügen Sie Ihrer .vimrc Folgendes hinzu

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Hoffe, es hilft als eine andere Antwort.

Chaudhry Junaid
quelle
12

Bearbeiten Sie Ihre ~ / .vimrc

$ vim ~/.vimrc

Fügen Sie folgende Zeilen hinzu:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
Yusuf Ibrahim
quelle
10

Aus dem VIM-Wiki :

:set tabstop=4
:set shiftwidth=4
:set expandtab
Benutzer
quelle
6

Der automatische Einzug basiert auf dem aktuellen Syntaxmodus. Ich weiß, wenn Sie Foo.java bearbeiten, dann geben Sie ein {und schlagenEnter Einzüge die folgende Zeile.

Für Registerkarten gibt es zwei Einstellungen. Geben Sie in Vim einen Doppelpunkt und dann "set tabstop = 4" ein, wodurch die Tabulatoren als vier Leerzeichen angezeigt werden. Drücken Sie erneut den Doppelpunkt und geben Sie "set expandtab" ein, um Leerzeichen für Tabulatoren einzufügen.

Sie können diese Einstellungen in einer .vimrc (oder _vimrc unter Windows) in Ihrem Home-Verzeichnis ablegen, sodass Sie sie nur einmal eingeben müssen.

Joey Gibson
quelle
0

Verwenden Sie den TabSchlüssel in Vim nicht zum manuellen Einrücken. Vim verfügt über zwei Befehle im Einfügemodus zum manuellen Erhöhen oder Verringern des Einrückungsbetrags. Diese Befehle sind Ctrl-Tund Ctrl-D. Diese Befehle beachten Sie die Werte von tabstop, shiftwidthundexpandtab , und halten die richtige Mischung von Leerzeichen und Tabulatoren (maximale Anzahl von Registerkarten gefolgt von notwendigen Anzahl).

Zweitens müssen diese manuellen Einrückungstasten ohnehin nicht sehr oft verwendet werden, wenn Sie die automatische Einrückung verwenden.

Wenn Ctrl-Tstatt Tabstört Sie, können Sie es neu zuordnen:

:imap <Tab> ^T

Sie können auch neu zuordnen Shift-Tab, um die Ctrl-DDeindent auszuführen:

:imap <S-Tab> ^D

Hier sind ^ T und ^ D Literalsteuerzeichen, die als eingefügt werden können Ctrl-VCtrl-T.

Mit dieser Zuordnung können Sie weiterhin Literal Tab in den Puffer eingeben Ctrl-VTab. Beachten Sie, dass Sie in diesem :set expandtabFall , auch wenn diese Option aktiviert ist, ein nicht erweitertes Tabulatorzeichen erhalten.

Ein ähnlicher Effekt wie bei der <Tab>Karte wird mit erzielt :set smarttab, wodurch sich auch die Rücktaste an der Vorderseite einer Linie intelligent verhält.

smarttabWenn im Modus Tabnicht am Zeilenanfang verwendet wird, hat dies keine besondere Bedeutung. Das unterscheidet sich von meiner obigen Zuordnung von Tabzu Ctrl-T, da eine Ctrl-Tirgendwo in einer Zeile verwendete (im Einfügemodus) die Einrückung dieser Zeile erhöht.

Andere nützliche Zuordnungen können sein:

:map <Tab> >
:map <S-Tab> <

Jetzt können wir beispielsweise einige Zeilen auswählen und Tabdrücken, um sie einzurücken. Oder schlagenTab zweimal auf eine Zeile (im Befehlsmodus), um die Einrückung zu erhöhen.

Wenn Sie die richtigen Vertiefung Management - Befehle zur Verfügung , dann wird alles durch die drei Parameter gesteuert: shiftwidth, tabstopund expandtab.

Der shiftwidthParameter steuert Ihre Einrückungsgröße. Wenn Sie vier Leerzeichen einrücken möchten, verwenden Sie :set shiftwidth=4oder die Abkürzung :set sw=4.

Wenn nur dies getan wird, wird der Einzug mit einer Mischung aus Leerzeichen und Tabulatoren erstellt, da dies noexpandtabdie Standardeinstellung ist. Verwenden:set expandtab . Dies führt dazu, dass Tabulatorzeichen, die Sie in den Puffer eingeben, in Leerzeichen erweitert werden und Vim-verwaltete Einrückungen nur Leerzeichen verwenden.

Wenn diese expandtabOption aktiviert ist und Sie Ihre Einrückung über alle geeigneten Vim-Mechanismen verwalten, ist der Wert von tabstopirrelevant. Es steuert, wie Registerkarten angezeigt werden, wenn sie in der Datei vorkommen. Wenn Sie set tabstop=8 expandtabeine feste Registerkarte haben und diese dann mit in die Datei schleichen Ctrl-VTab, wird wie gewohnt eine Ausrichtung zur nächsten 8-Spalten-basierten Registerkartenposition erstellt.

Kaz
quelle
Alle Ihre Zuordnungen sollten die nicht rekursiven Varianten verwenden. Mapping go <C-t>kann diese Syntax anstelle von Literalen verwenden. Schließlich wird bei der Zuordnung <Tab>im normalen Modus auch eine Zuordnung vorgenommen <C-i>(es handelt sich um dasselbe Zeichen). Daher empfehle ich dies nicht (Sie verlieren eine raffinierte Vim-Funktionalität
D. Ben Knoble,
@ D.BenKnoble Ich empfehle nichts davon; Ich benutze Strg-T, Strg-D und <> mich. Damit wird Vim wie vorgesehen verwendet. Leute, die Tab in anderen Editoren verwendet haben, mögen das vielleicht nicht, das ist alles.
Kaz