Kann ich Zeilen mit einem Komma (oder einem anderen Zeichen) verbinden?

19

Ich weiß, dass ich Linien in Vim mit Jund mehreren Varianten davon ( gJusw.) verbinden kann. Jwird "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
Martin Tournoij
quelle
Das könnte dir auch gefallen github.com/sk1418/Join (nicht getestet).
VanLaser

Antworten:

5

Ich habe ein Join-Plugin geschrieben, kann machen was du willst und vieles mehr.

Mit Ausnahme aller Funktionen, die vom Befehl build-in: join bereitgestellt werden, kann Join:

  • Zeilen mit Trennzeichen (String) verbinden
  • Verbinden Sie Zeilen mit oder ohne Trimmen der führenden / nachfolgenden Leerzeichen
  • Zeilen mit negativer Anzahl verbinden (Rückwärtsverbindung)
  • Zeilen in umgekehrter Reihenfolge verbinden
  • Linien verbinden und verbundene Linien behalten (ohne verbundene Linien zu entfernen)
  • Verbinden Sie Linien mit beliebigen Kombinationen der oben genannten Optionen

Weitere Details und Screenshots:

https://github.com/sk1418/Join

Kent
quelle
23

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:

:'<,'>s/\n/,/

oder

:'<,'>s/\n/, /

(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:

" ================ script ===============================================
" interactive 'J', 'gJ' replacement with optional 'vim-repeat' support
" The last used separator is automatically reused as:
" a. default choice
" b. when repeating (=> non-interactive repeats: same range, same separator)
let g:last_join_separator = " "
function! s:interactiveJoin(use_last_sep,...) range
    if (a:use_last_sep == 0) "interactive, ask for separator to use
        call inputsave()
        echohl Question
        let l:sep = input("Separator:", g:last_join_separator)
        echohl None
        call inputrestore()
        redraw!
        let g:last_join_separator = l:sep "update last separator value
    else "non-interactive (when repeating with '.')
        let l:sep = g:last_join_separator
    endif
    if (a:0 == 0) "with no argument, remove indentation *and trailing spaces*
        let l:subst = 's/\s*\n\+\s*/\=' . "'" . l:sep . "'/"
    else " don't remove indentation or trailing spaces (act like 'gJ')
        let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
    endif
    if a:firstline < a:lastline "join given range
        execute a:firstline . ',' . (a:lastline - 1) . l:subst
        let l:count = a:lastline - a:firstline + 1 "default count for repeat
    else "or join only with next line
        execute l:subst
        let l:count = 1 "default count for repeat
    endif
    "make command repeatable
    "(with the tpope/vim-repeat plugin: optional, recommended)
    if (a:0 == 0)
        silent! call repeat#set("\<Plug>(repeatJoin)", l:count)
    else
        silent! call repeat#set("\<Plug>(repeatGJoin)", l:count)
    endif
endfunction

noremap <silent> <Plug>(interactiveJoin)  :call <SID>interactiveJoin(0)<CR>
noremap <silent> <Plug>(interactiveGJoin) :call <SID>interactiveJoin(0,'g')<CR>
noremap <silent> <Plug>(repeatJoin)       :call <SID>interactiveJoin(1)<CR>
noremap <silent> <Plug>(repeatGJoin)      :call <SID>interactiveJoin(1,'g')<CR>

Und ein aktuelles Mapping:

"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)

Dies ist ein bisschen (*) ähnlich J, aber interaktiv - es wird nach der Trennzeichenfolge gefragt. Die Standardzeichenfolge ist ein Leerzeichen. BackspaceUm beispielsweise Zeilen ohne Trennzeichen zu verbinden, drücken Sie, wenn Sie dazu aufgefordert werden, um das Standardzeichen für das Leerzeichen zu entfernen und Enterdas (jetzt) ​​leere Trennzeichen zu akzeptieren. Zählen 3Jfunktioniert zB auch. Wenn das tpope/vim-repeatPlugin 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 Jist es nicht ganz ein Operator, aber in der Nähe von einem - zum Beispiel kann man nicht tun Jaw, um sich "einem Wort" anzuschließen.

(Vorschläge sind willkommen)

Bildbeschreibung hier eingeben

VanLaser
quelle
2
Besser noch: :'<,'>-1s/\n/, /für markierte Zeilen oder :1,$-1s/\n/, /für die gesamte Datei.
Sato Katsura
In der Tat ist das noch besser :)
VanLaser
@SatoKatsura kannst du das erklären -1?
Alxndr
1
@alxndr - Es wird verwendet, um die letzte Zeile im Bereich / in der Datei zu überspringen: Im OP-Beispiel möchten Sie kein Komma nach 32 und möchten es auch nicht mit der nächsten Zeile verbinden, falls vorhanden . Sie können auch '<,'>-s/\n/, /oder 1,$-s/\n/, /als -das gleiche wie verwenden -1.
VanLaser
1
Wenn l:sepist ein &, dann wird Ihr Ersatz nicht richtig funktionieren, da &Magie im Ersatz ist. Vielleicht ist es besser, \=einen Literal-String zu verwenden, als zu let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"versuchen, mit dem Entkommen umzugehen.
Jamessan
3

Hier ist ein Beispiel für die Verwendung eines externen Befehls:

:%!paste -sd,

Dabei wird %!der aktuelle Puffer (Inhalt der Datei) durch den folgenden Befehl ersetzt: paste -sd,(Parameter -swerden verwendet, um mehrere Zeilen zu verbinden und -ddas Begrenzungszeichen auf festzulegen. ,)

Kenorb
quelle
3

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:

8
9
10
12

<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 gvdann den Bereich und Joder erneut aus gJ. Wir haben einen Rückstand ,: 8,9,10,12,und $xwir sind fertig.

Verwenden Sie Insert for No Trailing ,

Machen wir unseren Text rückgängig (sei es uu..uoder etwas Besonderes :ea 1d<cr>:lat 1) und versuchen Sie Visual Insert:

j<C-v>}I, <C-c>und dann können wir die Zeilen gJohne 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 ... gvhilft also nicht weiter.

- Oder es kann helfen, gvokist erneut auswählen ( gv), ogegenüber Ecke und nach koben.

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.

Sunny Pun
quelle
1

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:

:nmap J :s/\n/, /^M

Für das Sonderzeichen Newline am Ende ( ^M) drücken Sie Ctrl-Vund dann Return / Enter. Das Gleiche gilt , wenn Sie mit einer Lasche (ersetzen möchten ^I), geben Sie Ctrl-Idann Tab.

:nmap J :s/\n/^I/^M

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, 4Jum die nächsten 4 Zeilen zu verbinden.

Wes Modi
quelle
0

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 , wenn joinspacesfestgelegt wird und die Stromleitungsende mit ., !oder ?. Diese Vorsichtsmaßnahmen werden unter beschrieben :help J.

Lithis
quelle