Boşluk oluşturmadan çizgilere nasıl katılır?


72

JSatırları birleştirmek için standart komut, yeni satır karakterlerini bir boşlukla değiştirir. 'Literatürü' düzenlerken kullanışlıdır, ancak gereksiz alanı kaldırmayı unutursam, el ile bir hex dökümü düzenlediğim için sıkıntılı olabilir.

Aralarında boşluk bırakmadan iki çizgiyi birleştirmenin hızlı ve kolay bir yöntemi var mı?

Yanıtlar:


86

gJKombinasyon yapar; from :help gJ:

En az iki satırla [say] satırlarını birleştirin. Boşluk eklemeyin veya çıkarmayın.

JBir tuş vuruşunu kaydetmek istiyorsanız, onu yeniden bağlayabilirsiniz :

:nnoremap J gJ

Bunun herhangi bir boşluğu kaldırmayacağını unutmayın; bu nedenle mevcut satır boşlukla bitiyorsa veya sonraki satır bir veya daha fazla boşlukla başlıyorsa , olduğu gibi bırakılır .

Yani:

Hello
    world

Oluyor:

Hello    world

Biz olabilir kullanmak Jxo zaman olacak, bu durumda Helloworld, ama bu her durumda işe yaramaz; yardımdan:

Vurgulanan çizgilere, en az iki çizgiyle birleştirin. Girintiyi çıkarın ve iki alana kadar yerleştirin

[...]

Bu komutlar, "gJ" dışında, izleyen beyaz boşluk olmadıkça veya bir sonraki satır ')' ile başlamazsa yerine bir boşluk koyun.

Bu yüzden bazı durumlarda birden fazla boşluk eklenir veya boşluk konmaz. Görebildiğim kadarıyla, bu davranışı değiştirmenin kolay bir yolu yoktur; Her gJzaman boşluksuz katılmak için değiştirilecek bir işlev yarattım :

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

Ayrıca bakınız: :help J,:help 'joinspaces'


Bu işlevi kullanırken imleç konumunu korumak için bazı "Koru" işlevini kullanmak mümkün mü yoksa bu sonucu nasıl alabilirim?
SergioAraujo

8

Deneyebileceğiniz bir başka numara, yerine kullanmaktır. Bazen bu yararlı olabilir.

%s/$\n//g

Senaryo: Son karakteri silin ve bir sonraki satıra katılın:

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

Örneğin,

xxxx=
123

dönüşür:

xxxx123

3

Bir makro oluşturun ve yeniden kullanın:

qaJxq

Şimdi, boşluğa sahip olmayan iki satıra katılmak istediğiniz yeri akullanarak makroyu tekrar oynatın @a.

@@önceki makroyu tekrar edecektir. Böylece @birden fazla satıra katılmak için bekletebilirsiniz.


1
Ne @azaman yazabiliyorsunuz Jx? Aynı sayıda tuşa basma ve SHIFT basma!
Shahbaz

2
@Shahbaz Belki de son satırdan dolayı: "sadece tutabilirsin @"
muru

1
@muru, bu doğru!
Shahbaz

4
Ayrıca bunu tekrarlanabilir bir komut yapar, böylece 3@a3 satıra katılmak için kullanabilirsiniz , oysa 3Jx3 satıra boşluklu birleştirme ve ardından ikinci ve üçüncü satırlar arasındaki boşluğu silip diğer satırlar arasında boşluk bırakabilirsiniz.
Haegin

1

Her zaman tek bir boşlukla katılmak için:

nmap J gJi <ESC>ciW <ESC>

Hiç boşluk bırakmadan katılmak için (arkadaki + öndeki boşluğu kaldırır):

nmap <C-J> gJi <ESC>diW

1
Bu siteye hoşgeldiniz! Eşleştirmeleriniz bana göre biraz fazla tasarlanmış görünüyor, nasıl çalıştıkları hakkında biraz daha açıklama ekleyebilmeniz yararlı olabilir.
statox

1

Birleştirmek istediğiniz satırları seçin, normal modda bir sütun yazarak bir Ex komutu girin :. Sonra bu komutu yazın:

s/$\n\s*//gc

Komutun tamamı aynı şekilde görünmelidir:

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

Bu aslında @ insidepower komutunun boşluk girintilerinin yanı sıra yeni satır karakterlerinin yerine geçen ince bir versiyonudur .

Açıklama:

  • '<,'> sadece görsel modda seçilen çizgileri değiştirdiğimiz anlamına gelir.

  • /$\n\s*bir regex kalıbıdır. $Yeni bir çizgi karakteriyle biten \nve daha *sonra belirlenmemiş sayıda beyaz alana sahip bir eşleşme arıyoruz .

  • s/pattern//gcher deseni bulmak ve onaylamak için boş bir karakterle değiştirmek için yerine kullanılan bir komuttur .

Vim'de normal ifadeler için bayraklar ve meta karakterler hakkında daha fazla bilgi edinmek için Vim Reference'ın bu bölümüne göz atın .


2
Merhaba ubique, Vi ve Vim'e hoş geldiniz ! Orada oldukça iyi yazılmış bir cevabınız var; Bunun için şeref. Bir nitpick'im, vim normal ifadelerin = / = python normal ifadeler olduğu ve bazen kullanıcılar için kafa karıştırıcı olduğu. Belki Vim regex yardım belgesine link?
D. Ben Knoble

2
İkinci nit: referans verdiğiniz cevap @ insidepower tarafından yazılmış ve Peter tarafından düzenlenmiştir.
D. Ben Knoble
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.