Jak łączyć linie bez tworzenia spacji?

72

Standardowe Jpolecenie łączenia linii zastępuje znaki nowego wiersza spacją. Jest to przydatne podczas edytowania „literatury”, ale może być kłopotliwe, jeśli, powiedzmy, edytuję zrzut heksowy ręcznie, jeśli zapomnę usunąć zbędne miejsce.

Czy istnieje szybki i łatwy sposób na połączenie dwóch linii bez tworzenia odstępu między nimi?

SF.
źródło

Odpowiedzi:

86

gJKombinacja to robi; z :help gJ:

Połącz [zlicz] linie z co najmniej dwoma liniami. Nie wstawiaj ani nie usuwaj spacji.

Możesz powiązać go ponownie J, jeśli chcesz zapisać naciśnięcie klawisza:

:nnoremap J gJ

Zauważ, że to nie usuwa żadnych spacji, więc jeśli bieżąca linia kończy się spacją lub następna linia zaczyna się od jednej lub więcej spacji, pozostaną one bez zmian .

Więc:

Hello
    world

Staje się:

Hello    world

My mogliśmy użyć Jxw tym przypadku, to będzie Helloworld, ale to nie będzie działać we wszystkich przypadkach; z pomocy:

Połącz podświetlone linie z co najmniej dwoma liniami. Usuń wcięcie i wstaw maksymalnie dwa spacje

[...]

Te polecenia, oprócz „gJ”, wstawiają jedną spację w miejsce, chyba że występują końcowe białe spacje lub następny wiersz zaczyna się od „)”.

Tak więc w niektórych przypadkach wstawiana jest więcej niż jedna spacja lub brak spacji. O ile widzę, nie ma łatwego sposobu na zmianę tego zachowania; Stworzyłem funkcję do modyfikacji, gJaby zawsze łączyć bez spacji:

" 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>

Zobacz również: :help J,:help 'joinspaces'

Martin Tournoij
źródło
Czy można użyć funkcji „Zachowaj”, aby utrzymać pozycję kursora podczas korzystania z tej funkcji lub jak uzyskać ten wynik?
SergioAraujo,
8

Inną sztuczką, którą możesz wypróbować, jest zastąpienie. Czasami może to być przydatne.

%s/$\n//g

Scenariusz: Usuń ostatni znak i dołącz do następnego wiersza:

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

Na przykład,

xxxx=
123

staje się:

xxxx123
insidepower
źródło
3

Utwórz makro i użyj go ponownie:

qaJxq

Teraz odtwórz makro, aużywając @agdziekolwiek chcesz połączyć dwie linie bez spacji.

@@powtórzy poprzednie makro. Możesz więc przytrzymać, @aby połączyć wiele linii.

pellucide
źródło
1
@aPo co pisać, kiedy można pisać Jx? Ta sama liczba naciśnięć klawiszy i SHIFT!
Shahbaz
2
@Shahbaz Może z powodu ostatniego wiersza: „możesz po prostu trzymać @”
muru
1
@muru, to prawda!
Shahbaz
4
To także sprawia, że ​​jest to powtarzalne polecenie, więc możesz użyć, 3@aaby połączyć 3 linie, podczas gdy wykonanie 3Jxspowoduje połączenie 3 linii ze spacjami, a następnie usunięcie spacji między drugą i trzecią linią, pozostawiając spacje między innymi liniami.
Haegin
1

Aby zawsze dołączać za pomocą jednej spacji:

nmap J gJi <ESC>ciW <ESC>

Aby dołączyć bez spacji (usuwa spację + spację wiodącą):

nmap <C-J> gJi <ESC>diW
phil
źródło
1
Witamy na tej stronie! Twoje odwzorowania wydają mi się nieco przeprojektowane, pomocne byłoby dodanie nieco więcej wyjaśnień na temat ich działania.
statox
1

Wybierz linie, które chcesz scalić, wprowadź polecenie Ex , wpisując dwukropek :w trybie normalnym. Następnie wpisz to polecenie:

s/$\n\s*//gc

Całe polecenie powinno wyglądać podobnie:

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

W rzeczywistości jest to poprawiona wersja polecenia @ insidepower, która zastępuje wcięcia spacji oraz znaki nowego wiersza.

Wyjaśnienie:

  • '<,'> oznacza, że ​​modyfikujemy tylko linie wybrane w trybie wizualnym.

  • /$\n\s*jest wzorem wyrażenia regularnego . Szukamy dopasowania, które kończy $się nowym znakiem linii, \na następnie ma nieokreśloną liczbę białych znaków *.

  • s/pattern//gcto polecenie zastępujące, aby znaleźć każdy wzór i zastąpić go pustym znakiem po potwierdzeniu.

Aby dowiedzieć się więcej na temat flag i metaznaków dla wyrażeń regularnych w Vimie, zapoznaj się z tym rozdziałem Vim Reference.

ubique
źródło
2
Cześć ubique, witaj w Vi i Vimie ! Masz tam dość dobrze napisaną odpowiedź; chwała za to. Mój jedyny nitpick jest taki, że vim wyrażenia regularne = / = python wyrażenia regularne, a czasem jest to mylące dla użytkowników. Może zamiast tego link do dokumentu pomocy dla wyrażenia regularnego Vim?
D. Ben Knoble,
2
Druga nitka: odpowiedź, do której się odwołujesz, została napisana przez @ insidepower i zredagowana przez Petera.
D. Ben Knoble,