Usuń nową linię w Vimie


271

Czy istnieje sposób na usunięcie nowej linii na końcu linii w Vimie, aby kolejna linia została dołączona do bieżącej linii?

Na przykład:

Evaluator<T>():
    _bestPos(){
}

Chciałbym umieścić to wszystko w jednym wierszu bez kopiowania wierszy i wklejania ich do poprzedniego. Wygląda na to, że powinienem umieć kursor na końcu każdej linii, nacisnąć klawisz i sprawić, aby następna linia przeskoczyła na tę samą, na której znajduje się kursor.

Wynik końcowy:

Evaluator<T>(): _bestPos(){ }

Czy jest to możliwe w Vimie?


Del na końcu linii w trybie wstawiania używanym przez vima. Jednak nie w każdym terminalu.
Victor Sergienko

Odpowiedzi:


584

Jeśli jesteś w pierwszej linii, naciśnięcie (wielkie litery) Jpołączy tę linię i następną linię razem, usuwając nową linię. Możesz również połączyć to z liczbą, więc naciśnięcie 3Jpołączy wszystkie 3 linie razem.


29
Jak zauważono w innej odpowiedzi, gJuniknie dodawania spacji, które Vim może dodać, używając J.
Michael Mior

5
Możesz także wybrać wszystkie linie, które chcesz połączyć, używając V(Visual Line Mode), a następnie naciśnij JlubgJ
Sbu

Jeśli chcesz zachować wykorzystanie pozycji kursora :joini :join!że dołączy do linii utrzymując pozycję kursora, a nie trzymać każdą przestrzeń w miejscu łączenia. możesz również zmapować go w następujący sposób: nnoremap <Leader>j :joing<cr>i nnoremap <Leader>gj :join!<cr>.
SergioAraujo,

82

Na pewno. Vim rozpoznaje znak \ n jako nowy wiersz, więc możesz po prostu wyszukać i zamienić. W trybie poleceń wpisz:

:%s/\n/

1
Dzięki, ale nie chcę globalnego wyszukiwania i wymiany.
derekerdmann

16
usunięcie% zajmuje się tym. Wtedy stanie się to tylko w linii, na której znajduje się kursor. Alternatywnie możesz podać zakres, taki jak: 11,15s / \ n / (wiersze 11-15) lub:, + 7s / \ n / (ten wiersz i kolejne siedem) lub: -3, s / \ n / (poprzednie trzy wiersze i ten) ... masz pomysł
Tristan

1
Lub możesz wybrać Vblok -isual i zastąpić go.
Victor Sergienko

51

W górnej linii w trybie normalnym naciśnij Shift+ j.

Możesz także dodać liczbę, aby 3Jw górnym wierszu połączyć wszystkie te linie razem.


34

Jak wspomniano w innych odpowiedziach, (duże litery) Ji wyszukiwanie + zamień na \nmogą być ogólnie używane do usuwania znaków nowego wiersza i łączenia wierszy.

Ale aby pozbyć się końcowego znaku nowej linii w ostatniej linii , musisz to zrobić w Vimie:

:set noendofline binary
:w

1
Pytanie dotyczy połączenia dwóch linii w środku pliku - ta odpowiedź usuwa nowy wiersz na końcu pliku, o co nie pytałem.
derekerdmann

3
To zadziałało dla mnie. Próbowałem pozbyć się nowej linii na końcu pliku jednowierszowego z vimem.
Locane,

Dlaczego :set noendoflinenie działa bez binary?
darw

32

Jusuwa dodatkowe odstępy wiodące (jeśli występują), łącząc linie pojedynczą spacją. (Z pewnymi wyjątkami: po /[.!?]$/można wstawić dwie spacje; wcześniej /^\s*)/nie wstawiono spacji).

Jeśli nie chcesz tego zachowania, gJpo prostu usuwasz nowy wiersz i nie robi nic sprytnego ze spacjami.


10

Wszystkie poniższe zakładają, że kursor znajduje się w pierwszym wierszu:

Używając normalnych mapowań:

3Shift+J

Korzystanie z poleceń Ex:

:,+2j

Który jest skrótem od

:.,.+2 join

Które można również wprowadzić za pomocą następującego skrótu:

3:j

Jeszcze krótsze polecenie Ex:

:j3

2
Bez odstępów między nimi:j!3
SergioAraujo,

10
set backspace=indent,eol,start

w twoim .vimrc pozwoli ci używać backspacei deleteon \n(nowa linia) w trybie wstawiania.

set whichwrap+=<,>,h,l,[,]

pozwoli ci usunąć poprzedni LF w trybie normalnym za pomocą X(gdy w kolumnie 1).


2

Prawdopodobnie zależy to od twoich ustawień, ale zwykle robię to z A<delete>

Gdzie Ajest dołączony na końcu linii. Prawdopodobnie wymaga nocompatibletrybu :)


3
„Zwykle robię to z A <delete>” Tak, właśnie dlatego tu przybyłem; znaleźć lepszy sposób;). Cały punkt vima nie przesuwa rąk z rzędu domu.
Luc

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

kursor w pierwszym wierszu

TERAZ, w TRYBIE NORMALNYM

shift+v
2j
shift+j

lub

V2jJ

: normalny V2jJ


1

Po prostu nacisnąłbym A (dołącz do końca linii, wprowadza cię w tryb wstawiania) na linii, w której chcesz usunąć nową linię, a następnie naciśnij klawisz Delete.


Niestety wydaje mi się, że to nie działa; może to być ustawienie PuTTY, które przegapiłem.
derekerdmann

2
prawdopodobnie opcja backspace vi::help 'backspace'
glenn jackman

1

jeśli nie masz nic przeciwko użyciu innych narzędzi powłoki,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
To rodzaj przesady, nie sądzisz?
derekerdmann

nie, nie jest. jak myślisz, dlaczego to przesada? Robienie tego w Vimie jest ręczne. Zależy to od tego, czy chcesz to zrobić ręcznie ręcznie za każdym razem, czy po prostu wykonaj te jeden linijki, aby zrobić to w mgnieniu oka. Vim jest redaktorem. A wszelkie narzędzia, które mogą przetwarzać pliki, są w zasadzie „edytorami” w przebraniu.
ghostdog74

5
Nadal łatwiej jest po prostu otworzyć plik w vimie i używać ggVGJ.
za dużo php

jasne, jeśli łatwiej ci to zrobić ręcznie za każdym razem, gdy potrzebujesz danych zmienionych w ten sposób. Śmiało. Spróbuj także zrobić to na dużym pliku.
ghostdog74

Nie przetwarzam wielu plików; Pracuję tylko ze skondensowaniem kilku wierszy kodu.
derekerdmann

1

Problem polega na tym, że wielokrotności char 0A (\ n), które są niewidoczne, mogą się kumulować. Załóżmy, że chcesz posprzątać od linii 100 do końca:

Wpisywanie ESC i: (dowódca terminala)

:110,$s/^\n//

W skrypcie vim:

execute '110,$s/^\n//'

Objaśnienie: od 110 do końca wyszukaj linie rozpoczynające się od nowej linii (są puste) i usuń je

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.