Wie werden Linien verbunden, ohne ein Leerzeichen zu erzeugen?


73

Der Standardbefehl Jzum Verbinden von Zeilen ersetzt die Zeilenumbruchzeichen durch ein Leerzeichen. Es ist nützlich beim Bearbeiten von 'Literatur', kann aber problematisch sein, wenn ich beispielsweise einen Hex-Dump von Hand bearbeite, wenn ich vergesse, den überflüssigen Platz zu entfernen.

Gibt es eine schnelle und einfache Methode, um zwei Linien zu verbinden, ohne ein Leerzeichen zwischen ihnen zu erzeugen?

Antworten:


87

Die gJKombination macht das; von :help gJ:

Verbinden Sie [count] Zeilen mit mindestens zwei Zeilen. Fügen Sie keine Leerzeichen ein oder entfernen Sie sie nicht.

Sie können es erneut binden J, wenn Sie einen Tastendruck speichern möchten:

:nnoremap J gJ

Beachten Sie, dass dies nicht entfernen Sie alle Leerzeichen, so dass , wenn entweder die aktuelle Zeile mit einem Leerzeichen endet oder nächste Zeile beginnt mit einem oder mehreren Leerzeichen, werden sie bleiben wie .

Damit:

Hello
    world

Wird:

Hello    world

Wir konnten verwenden Jxin diesem Fall, dann wird es sein Helloworld, aber das wird nicht in allen Fällen arbeiten; aus der hilfe:

Verbinden Sie die hervorgehobenen Linien mit mindestens zwei Linien. Entfernen Sie den Einzug und fügen Sie bis zu zwei Leerzeichen ein

[...]

Diese Befehle, mit Ausnahme von "gJ", fügen anstelle des Leerzeichens ein Leerzeichen ein, es sei denn, es wird ein Leerzeichen nachgestellt oder die nächste Zeile beginnt mit einem ')'.

In einigen Fällen wird also mehr als ein Leerzeichen oder kein Leerzeichen eingefügt. Soweit ich sehen kann, gibt es keine einfache Möglichkeit, dieses Verhalten zu ändern. Ich habe eine Funktion zum Ändern erstellt, um gJimmer ohne Leerzeichen zu verbinden:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

Siehe auch: :help J,:help 'joinspaces'


Ist es möglich, eine "Preserve" -Funktion zu verwenden, um die Cursorposition bei Verwendung dieser Funktion beizubehalten, oder wie erhalte ich dieses Ergebnis?
SergioAraujo

8

Ein weiterer Trick, den Sie versuchen können, ist das Ersetzen. Manchmal kann dies nützlich sein.

%s/$\n//g

Szenario: Löschen Sie das letzte Zeichen und verbinden Sie es mit der nächsten Zeile:

%s/=$\n\(.\)/\1/g

Zum Beispiel,

xxxx=
123

wird:

xxxx123

3

Erstellen Sie ein Makro und verwenden Sie es erneut:

qaJxq

Spielen Sie nun das Makro aan einer @abeliebigen Stelle ab, an der Sie zwei Zeilen ohne Leerzeichen verbinden möchten.

@@wiederholt das vorherige Makro. Sie können also einfach gedrückt halten @, um mehrere Zeilen zu verbinden.


1
Warum tippen, @awenn Sie tippen können Jx? Gleiche Anzahl von Tasten- und UMSCHALTTASTEN!
Shahbaz

2
@ Shahbaz Vielleicht wegen der letzten Zeile: "Sie können einfach @ halten"
muru

1
@muru, das stimmt!
Shahbaz

4
Es ist auch ein wiederholbarer Befehl, mit dem Sie 3@a3 Zeilen verbinden können, während bei diesem Befehl 3Jx3 Zeilen mit Leerzeichen verbunden werden und dann das Leerzeichen zwischen der zweiten und dritten Zeile gelöscht wird, wobei Leerzeichen zwischen den anderen Zeilen verbleiben.
Haegin

1

So verbinden Sie sich immer mit einem einzelnen Leerzeichen:

nmap J gJi <ESC>ciW <ESC>

So verbinden Sie sich mit überhaupt keinem Leerzeichen (entfernt das abschließende + führende Leerzeichen):

nmap <C-J> gJi <ESC>diW

1
Willkommen auf dieser Seite! Ihre Zuordnungen sehen für mich etwas überarbeitet aus. Es wäre hilfreich, wenn Sie weitere Erklärungen zur Funktionsweise hinzufügen könnten.
statox

1

Wählen Sie die Zeilen aus, die Sie zusammenführen möchten, und geben Sie einen Ex- Befehl ein, indem Sie :im normalen Modus einen Doppelpunkt eingeben . Dann geben Sie diesen Befehl ein:

s/$\n\s*//gc

Der gesamte Befehl sollte ebenfalls aussehen:

:'<,'>s/$\n\s*//gc

Dies ist eine überarbeitete Version des @ insidepower-Befehls , die sowohl Leerzeichen als auch Zeilenumbrüche ersetzt.

Erläuterung:

  • '<,'> bedeutet, dass wir nur die im visuellen Modus ausgewählten Linien ändern.

  • /$\n\s*ist ein Regex- Muster. Wir suchen eine Übereinstimmung, die $mit einem neuen Zeilenzeichen endet \nund danach eine nicht festgelegte Anzahl von Leerzeichen aufweist *.

  • s/pattern//gcist ein Ersatzbefehl, mit dem jedes Muster gesucht und bei der Bestätigung durch ein leeres Zeichen ersetzt wird.

Weitere Informationen zu Flags und Metazeichen für reguläre Ausdrücke in Vim finden Sie in diesem Kapitel der Vim-Referenz.


2
Hallo Ubique, willkommen bei Vi und Vim ! Sie haben dort eine ziemlich gut geschriebene Antwort; ein großes Lob dafür. Mein einziger Trottel ist, dass vim reguläre Ausdrücke = / = reguläre Python-Ausdrücke, und manchmal ist das für Benutzer verwirrend. Vielleicht stattdessen einen Link zum Hilfedokument für Vim Regex?
D. Ben Knoble

2
Zweitens: Die Antwort, auf die Sie sich beziehen, wurde von @ insidepower geschrieben und von Peter bearbeitet.
D. Ben Knoble
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.