2010-07-29 6 views
24

Wie kann ich den Rest einer Zeile mit dem angegebenen Zeichen bis zu einer bestimmten Spalte mit Vim füllen? Angenommen, der Cursor befindet sich in Spalte vier und ich möchte den Rest der aktuellen Zeile mit Bindestrichen bis Spalte 80 füllen. Wie würde ich das tun?Wie fülle ich eine Zeile mit Zeichen x bis Spalte y mit Vim

+0

'76A- ' vielleicht? Es scheint so, als würde die Mathematik in deinem Kopf ziemlich schnell sein, relativ zu anderen Lösungen. – naught101

Antwort

18

Hier ist eine Funktion zu implementieren, was Sie fragen, und etwas mehr.

  • Es füllt die Linie von seinen aktuellen Zeilenende, anstatt die Cursor-Position
  • sie einen einzigen Raum zwingt zwischen dem, was auf der Linie zur Zeit ist und die wiederholten Zeichen
  • Es Ihnen eine beliebige Zeichenfolge angeben kann, den Rest der Zeile mit
  • Es verwendet Vims textwidth Einstellung zu füllen, um zu entscheiden, wie lange die Linie sein (und nicht nur 80 Zeichen vorausgesetzt) ​​

Die Funktion wird wie folgt definiert:

" fill rest of line with characters 
function! FillLine(str) 
    " set tw to the desired total length 
    let tw = &textwidth 
    if tw==0 | let tw = 80 | endif 
    " strip trailing spaces first 
    .s/[[:space:]]*$// 
    " calculate total number of 'str's to insert 
    let reps = (tw - col("$"))/len(a:str) 
    " insert them, if there's room, removing trailing spaces (though forcing 
    " there to be one) 
    if reps > 0 
     .s/$/\=(' '.repeat(a:str, reps))/ 
    endif 
endfunction 

Legen Sie die in Ihrem .vimrc und machen eine Zuordnung zu ihm, z.B.

map <F12> :call FillLine('-') 

Dann können Sie F12 drücken die Bindestriche auf die aktuelle Zeile

Hinweis anzuwenden: könnte dies wahrscheinlich leicht in VISUAL-Modus auf eine Auswahl handeln erweitert werden, funktioniert aber derzeit nur einzelne Linien . *

+0

Super, danke! –

+0

Wenn diese Funktion das tut, was sie vorgibt, macht sie so viel, wie Sie jemals verlangen können. Dies ist die Art von Post, die auf So stark belohnt werden sollte. Warum zeigt das "0" upvotes? +1! –

+1

Eine Möglichkeit, die Prägnanz für diejenigen zu erhöhen, denen der ternäre Operator egal ist, besteht darin, die beiden Zeilen der Zuweisung von tw zu kombinieren, also: let tw = & textwidth? & Textbreite: 80'. –

2

This answer beantwortet Ihre Frage. Ersetzen Sie einfach len Berechnung mit Ihrer gewünschten Spalte Nummer (+/- 1 kann sein, ich erinnere mich nie), und entfernen Sie die umschließenden Doppel-Anführungszeichen durch die Substitution hinzugefügt.

5

Wenn ich die Frage richtig verstehe, kann dies folgendermaßen erreicht werden: Im normalen Modus die aktuelle Spaltenposition des Cursors von der gewünschten Endspalte subtrahieren, dann das Ergebnis gefolgt von 'i' eingeben, dann das Zeichen eingeben Sie möchten den Raum mit füllen. Beenden Sie, indem Sie in den normalen Modus zurückkehren. Wenn Sie beispielsweise mit dem Cursor in Spalte 4 im Normalmodus den Rest der Zeile bis Spalte 80 mit Bindestrichen füllen möchten, tippen Sie 76-, dann Esc oder Strg- [, um zum normalen Modus zurückzukehren. Dies sollte dazu führen, dass 76 Bindestriche in Spalte 4 beginnen und in Spalte 79 enden.

0

Sie können zunächst Ihre Striche einfügen und dann auf das erste Zeichen gehen und Ihren Text in Ersetzungsmodus eingeben: 80i- Esc 0R

wenn Sie nicht wollen, um den Text zu schreiben, zuerst die Zeile mit 0D löschen, verwenden 80i- Esc, um die Striche und 0R CTRL +r "legen Sie die Inhalte der unamed einfügen im Register ersetzen Modus.

39

Sie können 80Ax<Esc>d80| für eine einfachere Lösung tun.

+2

Dies sollte die beste Antwort sein! '80A- d80 |'. Was macht die Pfeife? – d11wtq

+2

': help |' - es ist eine Bewegung zu einer bestimmten Spalte - in diesem Fall, Spalte 80. So verwendet 100Ax , um eine Anhängen an das Ende der Zeile 100 Mal und das angefügte Zeichen ist x. Dann löscht es alles in Spalte 80. – Conner

+0

Ich bekomme 'Kein Editor-Befehl.' Was mache ich falsch? –

2

Wenn Sie die virtualedit Option auf block oder all haben, können Sie eine visuelle Auswahl (auch über Leerraum) auf die gewünschte Spalte erstellen:
v80| (wenn virtualedit=all) oder
<c-v>80| (wenn virtualedit=block)

Dann den ausgewählten Bereich mit Bindestrichen ersetzen: r-

Es ist wahrscheinlich hilfreich visuellen Modus nach dem letzten Zeichen in der Zeile zu beginnen, indem l schlagen zu vermeiden Überschreiben des letzten Zeichens in der Zeile. Wenn Sie nicht virtualedit=all verwenden, müssen Sie virtualedit+=onemore einstellen, damit Sie im normalen Modus ein Zeichen über das Ende der Zeile hinaus verschieben können.

Verwandte Themen