Wie verschiebe ich den Zeileneinzug auf einen bestimmten Wert?

11

Oft stoße ich auf eine Situation, in der eine Linie nicht richtig eingerückt ist. Ether durch eine Paste, ein schlechtes / nicht bevorzugtes Einrückungs-Plugin oder meistens zusätzliche Leerzeichen, die den Einrückungswert ausgleichen. Normalerweise repariere ich das ein paar Mal durch <<oder über >>die Leitung, um es zu reparieren. Im Falle von zusätzlichen Leerzeichen mache ich für jede Einrückungsstufe, die ich eigentlich möchte, ein 100<<dann ein >>.

Die Frage ist, wie die |Bewegung, mit der Sie die Spalte nach Zahlen festlegen können, 10|den Cursor auf die 10. Spalte sendet. Wie kann ich die Einrückungsstufe angeben?

Ein Beispiel (dies funktioniert nicht) mit shiftwidth=4 expandtab:

The quick (indent level 0)
••••Brown Fox (indent level 1)
••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces)

In diesem Fall muss ich derzeit die Einrückungsstufe der letzten Zeile (2) zählen und eine für die zusätzlichen Leerzeichen hinzufügen, 3<<dann eingeben und die Einrückungsstufe dessen zählen, was ich dann 1>>(oder verwenden autoindentund ==befehlen).

Ich bitte um etwas 1==, um den Einzug auf Einrückungsstufe 1 zu zwingen. Oder in einigen Fällen, 0==um einen Einzug insgesamt zu entfernen.

Mir ist klar, dass das obige Beispiel das automatische Einrücken in 1 bzw. 0 Zeilen bewirkt und daher nicht das tut, was ich möchte, aber ich hoffe, es würde helfen, die Frage besser zu veranschaulichen.

Sukima
quelle

Antworten:

18

Sie können den folgenden :leftBefehl verwenden:

:[range]le[ft] [indent]
Linien links ausrichten [range]. Setzt den Einzug in den Zeilen auf [indent](Standard 0). {nicht in Vi}

Beachten Sie, dass :leftsetzt den Gedankenstrich n Leerzeichen und ist nicht bekannt , shiftwidthoder tabstopzu verwenden, da :left 8wird verwenden 8 Räume.

Wenn Sie die Einrückungsstufe festlegen möchten, können Sie einfach einen Befehl definieren:

command! -nargs=1 Left execute 'left ' . &sw * <args>

Mit Use :Left 2wird der Einzug auf 8 Leerzeichen gesetzt.

Um dies zuzuordnen <Leader>=, können Sie Folgendes verwenden:

noremap <expr> <Leader>= ':left ' . str2nr(nr2char(getchar())) * &sw . '<CR>'

Ich bin mir nicht sicher, ob dies der beste Weg ist, aber es ist der einzige Weg, den ich verwalten kann ... \=2wird die aktuelle Zeile auf 8 Leerzeichen und 5\=3die nächsten 5 Zeilen auf 12 Leerzeichen einrücken.


Ein verwandter Hinweis, der auch Ihr Problem löst, ist das Festlegen der shiftroundOption. Von:help 'shiftround'

Runder Einzug zu mehreren von 'shiftwidth'. Gilt für >und < Befehle. STRG-T und STRG-D im Einfügemodus runden den Einzug immer auf ein Vielfaches von 'shiftwidth'(dies ist Vi-kompatibel).

In Ihrem Beispiel <<"rundet" der erste auf 8 Felder. Damit ist Ihr Problem (mit 3<<und dann >>) gelöst. Und wie auf der Hilfeseite angegeben, können Sie auch den <C-d>Einfügemodus verwenden.

Martin Tournoij
quelle
Genial! Diese Lösungen funktionieren perfekt.
Sukima