Ich weiß, dass ich Linien in Vim mit J
und mehreren Varianten davon ( gJ
usw.) verbinden kann. J
wird "den Einzug entfernen und bis zu zwei Leerzeichen einfügen" .
Aber gibt es auch eine einfache Möglichkeit, anstelle der beiden Leerzeichen ein anderes Zeichen einzufügen? Zum Beispiel ein Komma ( ,
) oder Komma & Leerzeichen ( ,
)?
Gegeben:
8
9
10
32
Ich möchte am Ende mit:
8, 9, 10, 32
oder:
8,9,10,32
line-breaks
Martin Tournoij
quelle
quelle
Antworten:
Ich habe ein Join-Plugin geschrieben, kann machen was du willst und vieles mehr.
Weitere Details und Screenshots:
https://github.com/sk1418/Join
quelle
Ein einfacher Weg ist: Wählen Sie einfach Ihre Zeilen aus (alle bis auf die letzte) - oder verwenden Sie
%
- und führen Sie Folgendes aus:oder
(wo natürlich das
'<,'>
Teil schon:
von Vim nach eingefügt wurde, um die Auswahl anzuvisieren)(2.) Update:
Aufbauend auf den obigen Ausführungen (und Sato Katsuras Kommentar) ist hier eine mögliche "interaktive Join" -Implementierung mit Zählung und optionaler Wiederholungsunterstützung:
Und ein aktuelles Mapping:
Dies ist ein bisschen (*) ähnlich
J
, aber interaktiv - es wird nach der Trennzeichenfolge gefragt. Die Standardzeichenfolge ist ein Leerzeichen.Backspace
Um beispielsweise Zeilen ohne Trennzeichen zu verbinden, drücken Sie, wenn Sie dazu aufgefordert werden, um das Standardzeichen für das Leerzeichen zu entfernen undEnter
das (jetzt) leere Trennzeichen zu akzeptieren. Zählen3J
funktioniert zB auch. Wenn dastpope/vim-repeat
Plugin installiert ist, wiederholen Sie dies mit '.' funktioniert auch, indem das letzte Trennzeichen und (falls nicht geändert - z. B.10.
) der letzte Zählwert oder der visuelle Linienbereich wiederverwendet werden.(*) Es ist jedoch nicht genau so
J
: Während Einrückungen entfernt werden, wird nicht geprüft, ob.!?
2 Leerzeichen anstelle von einem (Ende des Satzes) oder nur dann ein Leerzeichen eingefügt werden, wenn es fehlt (es ist schwierig, so etwas zu tun) dies, da die Trennzeichenfolge jetzt alles sein kann). Es werden auch nachfolgende Leerzeichen entfernt (was sinnvoller ist).Ich denke, dies könnte eine gute Möglichkeit sein, den begrenzten Buchstabenraum der Operatoren zu überlasten :)
Nun, technisch gesehen
J
ist es nicht ganz ein Operator, aber in der Nähe von einem - zum Beispiel kann man nicht tunJaw
, um sich "einem Wort" anzuschließen.(Vorschläge sind willkommen)
quelle
:'<,'>-1s/\n/, /
für markierte Zeilen oder:1,$-1s/\n/, /
für die gesamte Datei.-1
?'<,'>-s/\n/, /
oder1,$-s/\n/, /
als-
das gleiche wie verwenden-1
.l:sep
ist ein&
, dann wird Ihr Ersatz nicht richtig funktionieren, da&
Magie im Ersatz ist. Vielleicht ist es besser,\=
einen Literal-String zu verwenden, als zulet l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
versuchen, mit dem Entkommen umzugehen.Hier ist ein Beispiel für die Verwendung eines externen Befehls:
Dabei wird
%!
der aktuelle Puffer (Inhalt der Datei) durch den folgenden Befehl ersetzt:paste -sd,
(Parameter-s
werden verwendet, um mehrere Zeilen zu verbinden und-d
das Begrenzungszeichen auf festzulegen.,
)quelle
Nur für den Fall, dass jemand Regex nicht gerne schreibt und mehr Plugin-Ex-Befehle auswendig lernt:
Visual-Block Anhängen
Visuell-Block anhängen ist in der Visual Block - Modus (
<C-v>
) und kann einen Block tun A PPEND (und Block I nsert für prepend). (Ref::help v_b_A
,:help v_b_I
)Und wenn die letzte Bewegung im visuellen Blockmodus ist
$
, wird das Anhängen am Ende aller Auswahlen ausgeführt. Andernfalls werden Leerzeichen vor dem angehängten Text eingefügt (stellen Sie sich vor, Sie richten das Schließen)
am Ende mehrerer Methodenaufrufe im Code aus).Mit Beispieltext unten und Cursor an
8
:<C-v>}$A,<C-c>
. Nachdem Sie in den normalen Modus zurückgekehrt sind, sehen Sie, dass,
an alle ausgewählten Zeilen ein Anhang angehängt ist. (Versuchen Sie es ohne$
)Wählen Sie
gv
dann den Bereich undJ
oder erneut ausgJ
. Wir haben einen Rückstand,
:8,9,10,12,
und$x
wir sind fertig.Verwenden Sie Insert for No Trailing
,
Machen wir unseren Text rückgängig (sei es
uu..u
oder etwas Besonderes:ea 1d<cr>:lat 1
) und versuchen Sie Visual Insert:j<C-v>}I, <C-c>
und dann können wir die ZeilengJ
ohne Leerzeichen verbinden.Warte, warte, warte, etwas fehlt. Wie wähle ich das gesamte "Array" neu aus? Diesmal haben wir nicht die erste Zeile ausgewählt ...
gv
hilft also nicht weiter.- Oder es kann helfen,
gvok
ist erneut auswählen (gv
),o
gegenüber Ecke und nachk
oben.PS Mein kleiner Finger ist nicht schnell und präzise genug , um geben
/\
für/\n
, so dass ich wie die Kombination von Vim eingebauten Operationen und Bewegungen mit Regex zu vermeiden. Wenn ich dies jedoch häufig genug mache, verwende ich ein Mapping - vielleicht sollten solche, die Plugins zugeordnet sind, besser sein.quelle
Eine viel einfachere Möglichkeit, ohne Plugins oder externe Befehle join (
J
) von einem Leerzeichen zu einem beliebigen Zeichen neu zuzuordnen . Zum Beispiel, um mit einem Komma und einem Leerzeichen zu verbinden:Für das Sonderzeichen Newline am Ende (
^M
) drücken SieCtrl-V
und dann Return / Enter. Das Gleiche gilt , wenn Sie mit einer Lasche (ersetzen möchten^I
), geben SieCtrl-I
dannTab
.Dazu wird eine neue Zeile durch einen Tabulator in der aktuellen Zeile ersetzt und dieses Verhalten dem J-Zeichen neu zugeordnet.
Dies funktioniert auch mit Kombinationen,
4J
um die nächsten 4 Zeilen zu verbinden.quelle
Sie können ein Makro aufzeichnen, um Zeilen mit einem Komma zu verbinden. Dies ist nützlich, wenn es sich um eine seltene oder einmalige Aufgabe handelt und Sie sich nicht erinnern können, wie Sie einen Ersatzbefehl und einen regulären Ausdruck schreiben, um die Aufgabe auszuführen, aber Sie wissen nicht, wie Sie ein Makro aufzeichnen und ausführen.
Um Zeilen mit einem Komma zu verbinden, geben Sie ein qjgJi,Escq, um das Makro im Register aufzuzeichnen
j
. Dann können Sie das Makro mit ausführen @j. Sie können das Makro mit erneut ausführen. Dies @@erspart das Eingeben, wenn Sie es mehrmals hintereinander ausführen. Sie können sogar so lange gedrückt halten, @bis Sie sich dem Ende der Zeilen nähern, die Sie verbinden möchten. Sie können auch ein numerisches Präfix verwenden @joder @@es eine festgelegte Anzahl von Malen wiederholen. Das führende und nachfolgende Leerzeichen bleibt dabei intakt, sodass vor oder nach dem Komma Leerzeichen stehen, wenn der ursprüngliche Text dort Leerzeichen enthielt.Fügen Sie beim Aufzeichnen des Makros Spacezwischen ,und ein Komma und ein Leerzeichen ein Esc.
Sie können auch Janstelle von gJbeim Aufzeichnen des Makros verwenden, das normalerweise Zeilen mit einem Komma und einem Leerzeichen verbindet. Wenn in der aktuellen Zeile jedoch ein nachgestelltes Leerzeichen steht, wird das Komma nach dem Leerzeichen ohne Leerzeichen angezeigt. Auch ist es nicht enthalten , den Raum , wenn die nächste Zeile beginnt mit
)
, und es setzt zwei Leerzeichen nach dem Komma , wennjoinspaces
festgelegt wird und die Stromleitungsende mit.
,!
oder?
. Diese Vorsichtsmaßnahmen werden unter beschrieben:help J
.quelle