Ersetzen Sie die Registerkarten durch Leerzeichen in vim


358

Ich möchte Tab in Leerzeichen in gVim konvertieren. Ich habe die folgende Zeile zu meiner hinzugefügt _vimrc:

set tabstop=2

Es funktioniert, um an zwei Stellen anzuhalten, aber es sieht immer noch so aus, als wäre eine Tabulatortaste eingefügt (ich habe versucht, die Zahl h zu verwenden, um anschließend Leerzeichen zu zählen).

Ich bin nicht sicher, was ich tun soll, damit gVim Tabulatoren in Leerzeichen konvertiert.


1
Persönlich würde ich tabstop = 2 als zu kleinen Einzug empfinden; Ich verwende ts = 4 und verstehe, warum Leute (wie das Linux-Kernel-Team) ts = 8 verwenden (und sie verwenden nicht expandtab - das tue ich).
Jonathan Leffler

4
Gibt es eine Möglichkeit, Leerzeichen in Tabs in vim zu konvertieren?
CWD

2
@cwd das Ersetzen der Leerzeichen durch Tabulatorzeichen ( ^Idie von Ctrl-vdann kommen Tab) würde funktionieren, zum Beispiel wenn Ihre aktuellen Tabulatoren 4 Leerzeichen sind::%s/ /^I/g
Indra Ginanjar

Antworten:


381

IIRC, so etwas wie:

set tabstop=2 shiftwidth=2 expandtab

sollte den Trick machen. Wenn Sie bereits Tabulatoren haben, fügen Sie anschließend eine schöne globale RE hinzu, um sie durch doppelte Leerzeichen zu ersetzen.


25
Ups, das ist ":%! Expand -t2"
Paul Tomblin

368
oder Sie können einfach verwenden: retab
rampion

Was ist, wenn ich es mit Leerzeichen speichern möchte? im Moment, wenn ich: wq und die Datei wieder öffne, bin ich zurück zu den Registerkarten
Gorkem Yurtseven

1
@ Gorkem fügt diese Befehle in Ihre .vimrc ein, so dass vim diese Einstellungen jede Sitzung verwendet
Krakkos

5
Was dies alles bedeutet, wird im Vim-Wiki gut erklärt .
Serge Stroobandt

824

Sobald Sie expandtab gemäß den anderen Antworten aktiviert haben, können Sie vorhandene Dateien äußerst bequem gemäß Ihren neuen Einstellungen konvertieren:

:retab

Es funktioniert mit dem aktuellen Puffer.


Aber wie können wir Retab bitten, jedes Auftreten von TAB zu bestätigen?
Oculus Dexter

8
Und als Vim funktioniert es auch in visuell ausgewählten Regionen :)
Andy

2
Danke, dass du mir etwas Neues beigebracht hast. Ich benutze das mühsame :%s/\t/ /gseit Jahren, bevor ich Ihren Kommentar sehe .
Tai Le

Sie können sogar :args retab | walle in der Befehlszeile geöffneten Dateien bearbeiten, z vim *.txt.
JakeD

Weiß jemand, welche Version von vim hat: retab? Mein 7.3.322 nicht.
Bitmaker

114

Versuchen

set expandtab

für weiche Tabs.

So reparieren Sie bereits vorhandene Registerkarten:

:%s/\t/  /g

Ich habe zwei Leerzeichen verwendet, da Sie Ihren Tabstop bereits auf 2 Leerzeichen gesetzt haben.


5
Bei dieser Korrektur werden zwei Leerzeichen eingefügt, für die nur eines erforderlich ist.
Jonathan Leffler

8
Anstatt die Substitution durchzuführen, können Sie das tun, was Nick oben vorgeschlagen hat - dh Retab. Dadurch werden alle vorhandenen Registerkarten als die in Ihrem Tabstop festgelegte Anzahl von Leerzeichen neu markiert.
Gowri

Super Tipp! Vim zeigte mir eine perfekt identifizierte Datei, während cat (linux cmd) eine unregelmäßige Identifizierung zeigte. Ich habe gerade die 2 Leerzeichen in 4 geändert, wie ich es in Vim verwende set ts = 4.
Karlphillip

60

Das hat bei mir funktioniert:

Sie können Registerkarten sehen, wenn Sie dies zuerst tun:

:set list

Um das Austauschen von Registerkarten zu ermöglichen, gehen Sie wie folgt vor:

:set expandtab

dann

:retab

Jetzt wurden alle Registerkarten durch Leerzeichen ersetzt. Sie können dann wie folgt zur normalen Anzeige zurückkehren:

:set nolist

1
:set listist einfach wunderschön.
Amir A. Shabani

44

gg=G wird die gesamte Datei erneut einbinden und die meisten, wenn nicht alle Registerkarten entfernen, die ich in Dateien von Kollegen erhalte.


1
Ersetzt es Tabulatoren durch Leerzeichen?
Likejudo

1
Genial! Hat auch für mich gearbeitet.
Nawaz

1
Können Sie erklären, was gg = G tut? Das hat genau das getan, wonach ich gesucht habe. Ich habe HTML auf sublime und als ich es in vim einfügte, wurde es wahnsinnig eingerückt. Das sieht jetzt sauber aus.
jes516

3
@ jes516 ggbewegt den Cursor an den Anfang des Puffers. =ist formatiert und nimmt einen Bewegungsbefehl entgegen. GBewegt den Cursor an das Ende des Puffers, sodass vim angewiesen wird, vom Anfang bis zum Ende des aktuellen Puffers zu formatieren.
Jake Sellers

40

Fügen Sie Ihrer .vimrc folgende Zeilen hinzu

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Öffnen Sie eine Datei in vim und drücken Sie F2. Die Registerkarten werden in 4 Leerzeichen konvertiert und die Datei wird automatisch gespeichert.


Es ist wahrscheinlich erwähnenswert, dass der qaktuelle Puffer der Datei ebenfalls geschlossen wird. Dies kann erwünscht sein oder nicht.
Willem van Ketwich

14

Wenn Sie \t8 Leerzeichen beibehalten möchten, sollten Sie folgende Einstellungen vornehmen:

   set softtabstop=2 tabstop=8 shiftwidth=2

Dies gibt Ihnen zwei Leerzeichen pro <TAB>Druck, aber der tatsächliche Wert \tin Ihrem Code wird weiterhin als 8 Zeichen angezeigt.


Vielen Dank für die Erwähnung softtabstop, eines der Killer-Features, denke ich.
Martin Ueding


4

Suchen Sie zuerst nach Registerkarten in Ihrer Datei: / ^ I: set expandtab: retab

wird funktionieren.


Der erste Teil könnten Sie bitte erklären, dass
Serup

3

Dieser Artikel enthält ein hervorragendes vimrc-Skript zum Behandeln von Tabulatoren + Leerzeichen und zum Konvertieren zwischen diesen.

Diese Befehle werden bereitgestellt:

Space2Tab Konvertiert Leerzeichen in Tabulatoren, nur in Einrückungen.

Tab2Space Konvertiert Tabulatoren in Leerzeichen, nur in Einrückungen.

RetabIndent Führen Space2Tab (wenn 'expandtab' festgelegt ist) oder Tab2Space (andernfalls) aus.

Jeder Befehl akzeptiert ein Argument, das die Anzahl der Leerzeichen in einer Tabulatorspalte angibt. Standardmäßig wird die Einstellung "Tabstop" verwendet.

Quelle: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Dies hat mir ein bisschen mehr geholfen als die Antworten hier, als ich zum ersten Mal nach einer Lösung suchte.


3

expandist ein Unix-Dienstprogramm zum Konvertieren von Tabulatoren in Leerzeichen. Wenn Sie setin vim nichts möchten, können Sie einen Shell-Befehl von vim verwenden:

:!% expand -t8

1
Wenn Sie nur einen Teil des Codes erweitern möchten: Wählen Sie diesen Teil zuerst im visuellen Modus aus und drücken Sie dann :. Jetzt wird die vim-Befehlszeile angezeigt :'<,'>. Geben Sie dann !expand -t4für die Registerkarte 4 Leerzeichen ein. (Die resultierende Befehlszeile ist wie :'<,'>!expand -t4)
Penghe Geng
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.