Ich gerate oft in Situationen wie diese:
title : Jekyll Bootstrap
tagline: Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner : feedname
Wenn die Argumente nicht gut ausgerichtet sind, gibt es eine Standardmethode, vim
um sie so zu formatieren, dass jedes der entsprechenden Argumente am nächsten Einzug ausgerichtet ist (wobei ein Einzug als 2 Leerzeichen definiert ist), ohne dass man Zeile für Zeile bis zum nächsten Einzug durchgehen muss, wie im Folgenden:
title : Jekyll Bootstrap
tagline : Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner: feedname
AKTUALISIEREN:
Ich glaubetabellarisch.vimist das Plugin, das ich suche, aber ich habe Schwierigkeiten, einen regulären Ausdruck zu bilden, der die Anzahl der Leerzeichen am Zeilenanfang berücksichtigt, wenn entschieden wird, dass etwas Teil eines Blocks sein soll, d. h. Folgendes Tabularize/:
erzeugt:
title : Jekyll Bootstrap
tagline : Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner: feedname
Das ist ein Beispiel indie Dokumentationwobei über einen regulären Ausdruck folgendes erreicht wird:
abc,def,ghi
a,b
a,b,c
:Tabularisieren /^[^,]*\zs,/r0c0l0
abc,def,ghi
a,b
a,b,c
Ich bin mir jedoch nicht sicher, wie ich dies formulieren soll, wenn ich jede Zeile mit der gleichen Anzahl von Leerzeichen vor dem gleichen Block betrachte und gleichzeitig den Unterblock auswerte, wie im Folgenden, das komplexer ist als mein ursprüngliches Beispiel:
comments :
provider : disqus
disqus :
short_name : jekyllbootstrap
livefyre :
site_id : 123
intensedebate :
account : 123abc
facebook :
appid : 123
num_posts : 5
width : 580
colorscheme : light
würde umgewandelt werden tabularize\some_regular_expression_I_cant_figure_out
in:
comments :
provider : disqus
disqus :
short_name : jekyllbootstrap
livefyre :
site_id : 123
intensedebate :
account : 123abc
facebook :
appid : 123
num_posts : 5
width : 580
colorscheme : light
Antwort1
DerTabellierenPlugin für vim kann genau das tun, was Sie wollen. Es kommt darauf an,Tabularize /:
Dadurch bleibt die Einrückung auf der linken Seite jedoch wahrscheinlich nicht erhalten.
Bearbeiten Sie Ihre aktualisierte Frage: Mit Tabular konnte ich das nicht direkt machen, aber mit einem zweiten Befehl, bei dem es sich um eine Suche und Ersetzung in einem Bereich handelt:
:%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/\0\1/
Dadurch wird nach einer bestimmten Anzahl von Leerzeichen vor dem gesucht :
und diese direkt vor diesem Semikolon eingefügt.
Antwort2
Also, schlechte und gute Nachrichten. Die schlechte Nachricht ist, dass Tabular nicht wirklich das tun kann, was Sie verlangen, ohne ein wenig Arbeit – das vorliegende Problem erfordert mehr Kontext, als Tabular normalerweise zur Verfügung steht. Die gute Nachricht ist, dass Tabular so konzipiert ist, dass es als äußerst flexibles allgemeines Textbearbeitungstool verwendet werden kann, und in diesem Kontext ist es nicht allzu schwierig, Tabular dazu zu bringen, das zu tun, was Sie wollen.
Erstellen Sie eine Datei ~/.vim/after/plugin/TabularizeRecord.vim
mit diesem (hoffentlich ausreichend kommentierten) Inhalt:
" Create a new tabular pipeline named 'record' that includes all adjacent
" lines containing a : in its default range, and manipulates those lines by
" passing them through the TabularizeIndentedRecord function
AddTabularPipeline! record /:/ TabularizeIndentedRecord(a:lines)
function! TabularizeIndentedRecord(lines)
" A list containing each of the lines with leading spaces removed
let text = map(copy(a:lines), 'substitute(v:val, "^ *", "", "")')
" A list containing just the leading spaces for each line
let spaces = map(copy(a:lines), 'substitute(v:val, "^ *\\zs.*", "", "")')
" Tabularize only the text, not the leading spaces. This pattern is more
" complicated than just /:/ to handle lines with multiple colons.
call tabular#TabularizeStrings(text, '[^:]*\zs:', 'l1')
" Tack the spaces back on to the beginning of each line, and store the
" resulting lines back in the a:lines list
call map(a:lines, 'remove(spaces, 0) . remove(text, 0)')
endfunction
Sobald die Datei existiert, starten Sie vim neu. Anschließend sollten Sie mit folgendem Befehl die gewünschte Einrückung erhalten:
:Tab record
Soweit ich das beurteilen kann, ist das Endergebnis genau das, was Sie suchen. Wenn es aus irgendeinem Grund nicht klappt oder ich die Anforderungen falsch verstanden habe, sagen Sie mir bitte Bescheid.