Einrücken der Mitte mehrerer Zeilen

Einrücken der Mitte mehrerer Zeilen

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, vimum 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_outin:

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.vimmit 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.

verwandte Informationen