it-swarm.com.de

Wie füge ich einen Block von Leerzeichen ein, der an der Cursorposition in vi beginnt?

Angenommen, ich habe den Text unten, wobei sich der Cursor derzeit auf der ersten A befindet.

AAAA
BBB
CC
D

Wie kann ich Leerzeichen vor jeder Zeile hinzufügen, um sie so zu gestalten, und es wäre großartig, wenn die Anzahl der Spalten von Leerzeichen spontan angegeben werden könnte, z. B. zwei hier.

  AAAA
  BBB
  CC
  D

Ich könnte mir vorstellen, dass es eine Möglichkeit gibt, dies schnell im visuellen Modus zu tun, aber irgendwelche Ideen?

Derzeit kopiere ich die erste Textspalte zweimal im visuellen Modus und ersetze die gesamte zwei Spalte durch Leerzeichen, was> 5 Tastatureingaben erfordert, was zu umständlich ist.

Einschränkung:

Es tut mir leid, dass ich die Frage nicht klar formuliert habe und einige Verwirrungen verursachen könnte.

Das Ziel ist nur Teil einer größeren Datei. Daher wäre es großartig, wenn die Anzahl der Zeilen und Spalten, die mit der ersten A beginnen, angegeben werden kann.

Bearbeiten:

Vielen Dank an @DeepYellow und @Johnsyweb, anscheinend sind >} und >ap alle guten Tipps, von denen ich keine Kenntnis hatte, und beide könnten gültige Antworten sein, bevor ich die konkrete Anforderung für die Antwort auf meine Frage präzisierte, aber auf jeden Fall @ Die Antwort von luser droog ist die einzig mögliche Antwort. Danke euch allen!

23
nye17

Ich würde :%s/^/ / verwenden

Sie können auch einen Zeilenbereich angeben :10,15s/^/ /

Oder ein relativer Bereich :.,+5s/^/ /

Oder verwenden Sie reguläre Ausdrücke für die Speicherorte :/A/,/D/>.

Zum Kopieren von Code zum Einfügen auf SO verwende ich normalerweise sed vom Terminal sed 's/^/ /' filename


Abkürzung

Ich habe gerade gelernt ein neuer Trick dafür. Sie rufen den visuellen Modus v auf, wählen die Region ( mit regulären Bewegungsbefehlen ) aus und drücken dann :. Dies gibt Ihnen Folgendes:

:'<,'>

sie können nur den Befehlsteil der obigen Befehle eingeben, wobei die Markierungen '< und '> automatisch an die Grenzen der visuellen Auswahl gesetzt werden.

So wählen Sie den aktuellen Absatz aus und rücken ihn ein:

vip>

oder

vip:>

gefolgt von enter.

Bearbeiten:

Wie in den Kommentaren angefordert, können Sie auch Leerzeichen in die Mitte einer Zeile einfügen, indem Sie einen regulären Quantifizierer \{n} für ein beliebiges Metazeichen . verwenden.

:%s/^.\{14}/& /

Dies fügt ein Leerzeichen von 14 Zeichen von links in jede Zeile ein. Natürlich könnte % durch eine der oben genannten Optionen zum Angeben des Bereichs eines ex - Befehls ersetzt werden.

46
luser droog

Beim ersten A würde ich in den visuellen Blockmodus ctrl-v wechseln, die Zeilen auswählen, die geändert werden sollen, I drücken (Einfügemodus mit Großschreibung i) und die gewünschten Änderungen für die erste Zeile vornehmen. Wenn Sie den visuellen Modus esc verlassen, werden alle Änderungen in der ersten Zeile auf alle Zeilen angewendet.

Wahrscheinlich nicht die effizienteste Anzahl von Tastenanschlägen, bietet Ihnen jedoch alle Freiheiten, die Sie benötigen, bevor Sie den visuellen Modus verlassen. Ich mag es nicht, wenn ich den Zeilen- und Spaltenbereich in einem Regex-Befehl von Hand angeben muss.

21
Nigu

Io userei>}.

Taube...

  • > : Si sposta a destra e
  • } : Bedeutet, dass alles in Ordnung ist

Spero che questo ti aiuti.

14
Johnsyweb
  1. Strg + v (Eingabe im visuellen Modus)
  2. Verwenden Sie die Pfeiltasten, um die Zeilen auszuwählen
  3. Umschalt + i (bringt Sie in den Einfügemodus)
  4. Drücken Sie die Leertaste oder was immer Sie vor den ausgewählten Zeilen eingeben möchten.
  5. Speichern Sie die Änderungen (Use: w). Nun sehen Sie die Änderungen in allen ausgewählten Zeilen.
11
Jubi

Sie können die Zeilen im visuellen Modus auswählen und > eingeben. Dies setzt voraus, dass Sie Ihre Tabs so eingerichtet haben, dass Leerzeichen eingefügt werden, z.

setl expandtab
setl shiftwidth=4
setl tabstop=4

(ersetzen Sie 4 durch Ihre Präferenz in Einzug)

Wenn die Zeilen einen Absatz bilden, wird >ap im normalen Modus den gesamten Absatz über und unter die aktuelle Position verschieben.

4

Ich würde gerne Nigu tun. Eine andere Lösung ist, :normal zu verwenden:

  1. <S-v>, um den Modus VISUAL-LINE zu aktivieren
  2. 3j oder jjj oder /D<CR>, um die Zeilen auszuwählen
  3. :norm I<Space><Space>, der korrekte Bereich ('<,'>) wird automatisch eingefügt

:normal ist für diesen speziellen Fall wahrscheinlich ein wenig übertrieben, aber manchmal möchten Sie eine Reihe komplexer Operationen in einer Reihe von Zeilen ausführen. 

4
romainl

Angenommen, Sie möchten einen Codeblock verschieben:

  • richten Sie die Anzahl der von jedem Schichtbefehl verwendeten Leerzeichen ein (:set shiftwidth=1). Die Standardeinstellung ist 8.
  • drücken Sie an der entsprechenden Stelle Ctrl+v und bewegen Sie den Cursor nach oben k oder unten j, um einen Bereich auszuwählen.
  • drücken Sie >, um den Block zu verschieben, und ., um die Aktion bis zur gewünschten Position zu wiederholen (falls der Cursor fehlt, drehen Sie ihn mit h oder b zurück).

move block of code

1
Purkhalo Alex

Eine andere Sache, die Sie versuchen könnten, ist ein Makro. Wenn Sie es nicht bereits wissen, starten Sie ein Makro mit q und wählen Sie das Register aus, um das Makro zu speichern. Um Ihr Makro in Register a zu speichern, geben Sie im normalen Modus qa ein.

An der Unterseite sollte etwas stehen, das Aufnahme sagt. Jetzt machen Sie einfach Ihre Bewegung, wie Sie möchten.

In diesem Fall wollten Sie also 2 Leerzeichen vor jeder Zeile haben. Gehen Sie also mit dem Cursor bereits am Anfang der ersten Zeile in den Einfügemodus und drücken Sie zweimal die Leertaste. Drücken Sie nun die Escape-Taste, um zum Normalmodus zu gelangen, dann zur nächsten Zeile, dann zum Anfang dieser Zeile und drücken Sie q. Dies endet und speichert das Makro

(Damit sich alles an einem Ort befindet, ist dies die vollständige Liste der Tastenkombinationen, die Sie ausführen würden, wobei <esc> beim Drücken der Escape-Taste steht und <space> die Stelle ist, an der Sie die Leertaste drücken: qai<space><space><esc>j0q Dies speichert das Makro im Register a )

Um das Makro wiederzugeben, machen Sie @ gefolgt von der Registrierung, in der Sie es gespeichert haben ... also in diesem Beispiel @a. Jetzt hat die zweite Zeile auch 2 Leerzeichen vor sich.

Makros können auch mehrmals ausgeführt werden. Wenn ich [email protected] hätte, würde das Makro 3 mal ausgeführt, und Sie wären damit fertig.

Ich mag es, Makros für dieses Beispiel zu verwenden, weil es für mich intuitiver ist, weil ich genau das tun kann, was ich möchte, und es einfach nur mehrmals wiederholen.

1
Steven Hall