2009-08-22 12 views
10

Wie kann ich am Ende einer oder mehrerer Zeilen wiederholt ein Zeichen hinzufügen und die Zeile (n) auf eine bestimmte Spalte auffüllen?Vim: Ausfüllen von Zeilen mit einem Zeichen

Zum Beispiel:
('x' für Spalte 40, nicht um ein Zeichen auf der Zeile, und es ist keine Leerzeichen oder Tabulatoren nach dem Text)

line one        x 
line two        x 
line three        x 
line eleventy-billion     x 

wird

line one ------------------------------x 
line two ------------------------------x 
line three ----------------------------x 
line eleventy-billion -----------------x 

Antwort

18

Eine Kombination aus \=, submatch() und repeat():

:%s/\v^.*$/\= submatch(0) . " " . repeat("-", 39 - len(submatch(0))) 
+0

+1 Ich las das Ding und dachte 'das wird nicht funktionieren', aber sicher genug ... – bmb

+0

O_o. Nicht genau die Lösung mit drei Tastenschlägen, auf die ich gehofft hatte;) Ich bekomme meistens, was du hier machst, aber was macht das am Anfang? Warum führt das Ausführen dieser Substitution auch zu einer Syntaxfärbung? –

+3

\ v am Anfang einer Regex macht alle Satzzeichen besonders; Ich mache es aus Gewohnheit, damit ich mich nicht erinnern muss, was besonders ist und was nicht. Es sollte die Syntaxhervorhebung nicht aufheben, es sei denn, die zusätzlichen Bindestriche sind ungültige Syntax? Versuchen Sie Strg-L, um den Bildschirm neu zu zeichnen. – Eevee

2

Nur für den Fall, dass jemand in Zukunft darüber stolpert, habe ich einen alternativen Weg, den ich benutze, der (ich denke) ist leichter zu erinnern, in dem seltenen Fall, dass man manuell einige Zeilen auffüllen müsste.

Eingabetext:

Here are some words 
They do not have equal length 
I want to insert characters after them until column 40 
How to do? 

Was Sie eingeben:

gg    // Position cursor anywhere on first line you want to pad 
q1$40A-<Esc>d40|q // Looks more complex than it is. 
        // Here, in English: 
        // 1. Record a macro in slot 1 
        // 2. Go to the end of the line, then *A*ppend a '-' 40 times 
        // 3. Delete from cursor position (which is still at the end of the line) to column 40 
        // 4. Stop recording 
:1,4normal @1  // Repeat macro "1" for every line 

Output Text:

Here are some words----------------- 
They do not have equal length------- 
I want to insert characters after t- 
How to do?-------------------------- 

Hoffentlich können Sie herausfinden, wie die verschiedenen Teile des Befehls anpassen zu mach es genau was du willst. Hinweis, dass Text, der länger als Ihre gewünschte Spaltenspanne ist, wird abgeschnitten (in Zeile 3 demonstriert).