Satırları virgülle (veya başka bir karakterle) birleştirebilir miyim?


19

Vim'deki hatlara Jve bunların çeşitli varyantlarına ( gJvb.) Katılabileceğimi biliyorum ; Jolacak "girinti çıkarın ve iki boşluk kadar insert" .

Ancak iki boşluk yerine başka bir karakter eklemenin kolay bir yolu var mı? Örneğin, virgül ( ,) veya virgül ve boşluk ( ,)?

Verilen:

8
9
10
32

Şununla bitirmek istiyorum:

8, 9, 10, 32

veya:

8,9,10,32

Ayrıca github.com/sk1418/Join (test edilmedi) gibi olabilir .
VanLaser

Yanıtlar:


5

Bir Join eklentisi yazdım, ne istersen yapabilirim ve çok daha fazlası.

Yerleşik: join komutu tarafından sağlanan tüm özellikler dışında Join şunları yapabilir:

  • Çizgileri ayırıcı (dize) ile birleştirme
  • Satırları önde gelen / sondaki boşlukları kırparak veya kırpmadan birleştirin
  • Negatif sayıya sahip satırlara katıl (geriye doğru katıl)
  • Çizgileri tersine birleştir
  • Çizgileri birleştirin ve birleştirilen çizgileri koruyun (birleştirilmiş çizgileri kaldırmadan)
  • Yukarıdaki seçeneklerin herhangi bir kombinasyonuyla çizgilere katılın

daha fazla ayrıntı ve ekran görüntüsü:

https://github.com/sk1418/Join


23

Bunun basit bir yolu şudur: satırlarınızı (sonuncusu hariç tümü) seçin - veya kullanın %- ve çalıştırın:

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

veya

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

(tabii ki, '<,'>bölüm :seçimi hedeflemek için Vim tarafından zaten eklenmişti )


(2.) Güncelleme:

Yukarıdakilere (ve Sato Katsura'nın yorumuna) dayanarak, sayı ve isteğe bağlı tekrar desteği ile olası bir "etkileşimli birleştirme" uygulaması:

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

Ve gerçek bir harita:

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

Bu tür (*) gibidir J, ancak interaktiftir - ayırıcı dizeyi ister. Varsayılan dize bir alandır - bu nedenle, örneğin, ayırıcısız satırları birleştirmek, Backspaceistendiğinde vurmak , varsayılan boşluk karakterini kaldırmak Enterve (şimdi) boş ayırıcıyı kabul etmek için kullanılır. Saymak, örneğin 3J, de çalışır. Eğer tpope/vim-repeateklenti yüklendikten ile yinelenen '' son ayırıcıyı ve (değiştirilmediyse - örneğin 10.) son sayımı veya görsel çizgi aralığını yeniden kullanarak da çalışır .


(*) Tam olarak böyle değil J: girintiyi kaldıracak olsa da .!?, bir tane yerine 2 boşluk eklemeyi (cümlenin sonu) kontrol etmeyecek veya sadece eksikse bir boşluk ekleyecek (gibi bir şey yapmak zor) bu, ayırıcı dize şimdi herhangi bir şey olabilir). Ayrıca arka boşlukları da kaldıracaktır (daha mantıklı).

Bence bu sınırlı operatörlerin mektup alanını aşırı yüklemenin güzel bir yolu olabilir :)

Teknik Jolarak bir operatör değil, bir taneye yakın - örneğin, Jaw"bir kelimeye" katılmak için yapamazsınız .

(önerilerinizi bekliyoruz)

resim açıklamasını buraya girin


2
Daha da iyisi: :'<,'>-1s/\n/, /işaretli çizgiler veya :1,$-1s/\n/, /tüm dosya için.
Sato Katsura

Gerçekten de, bu daha da iyi :)
VanLaser

@SatoKatsura açıklayabilir misiniz -1?
alxndr

1
@alxndr - aralıktaki / dosyadaki son satırı atlamak için kullanılır: örneğin OP örneğinde, 32'den sonra virgül istemezsiniz ve ayrıca varsa bir sonraki satıra katılmak istemezsiniz . Hatta kullanabilir '<,'>-s/\n/, /veya 1,$-s/\n/, /olarak -aynıdır -1.
VanLaser

1
Bir l:sepise &, değiştirme işleminde yanlış &olduğu için yedeklemeniz yanlış çalışır . \=Değişmez bir dize kullanmak için - komutunu kullanmak daha iyi olabilir let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/".
jamessan

3

Harici komut kullanan örnek:

:%!paste -sd,

burada %!geçerli arabelleği (dosyanın içeriği) şu komutla değiştirir: paste -sd,(parametreler -sbirden çok satırı birleştirmek için kullanılır ve -dayırıcı karakteri olarak ayarlar ,).


3

Birisinin Regex yazmayı ve daha fazla Eklenti Ex Komutunu ezberlemesini sevmemesi durumunda:

Görsel Blok Ekleme

Görsel-blok Ekleme Görsel Blok modu (mevcuttur <C-v>) ve bir blok yapabilir A ppend (ve bloke ben başına ekleme için nsert). (ref: :help v_b_A, :help v_b_I)

Ve Görsel Engelleme Modundaki son hareket ise $, ekleme tüm seçimlerin sonunda yapılacaktır; yoksa, eklediğiniz metnin önüne boşluklar eklenir ( )koddaki birkaç yöntem çağrısının sonunda kapanmayı hizalayın ).

Aşağıdaki örnek metin ve imleç açıkken 8:

8
9
10
12

<C-v>}$A,<C-c>. Normal moda döndükten sonra, ,seçilen tüm satırlara eklendiğini görebiliriz . (Olmadan deneyin $)

Sonra gvalanı yeniden seçmek için ve Jya gJ. Bir izimiz var ,: 8,9,10,12,ve $xişimiz bitti.

Sondaki Yok için Ekle Kullan ,

Metnimizi geri alalım (ister uu..ufantezi ister fantezi :ea 1d<cr>:lat 1) ve Visual Insert'u deneyelim:

j<C-v>}I, <C-c>ve sonra satırlara gJboşluk bırakmadan katılabiliriz .

Bekle bekle bekle, bir şey eksik. Tüm "dizi" nasıl yeniden seçilir? Bu sefer ilk satırı seçmedik ... bu yüzden gvyardımcı olmuyor.

- Veya yardımcı olabilir gvok, yeniden seçin ( gv), opposite köşe ve kyukarı.

PS Benim pembemsi hızlı ve doğru yazmak için yeterli değildir /\için /\nI yüzden Vim yerleşik operasyonlar ve hareketler birleştirmek gibi Regex kullanmaktan kaçının. Ancak bunu yeterince sık yaparsam, bir eşleme kullanarak - belki de eklentilere eşlenenler daha iyi olmalıdır.


1

Eklentileri veya harici komutları olmadan, join ( J) öğesini bir boşluktan istediğiniz karaktere yeniden eşlemenin çok daha basit bir yolu . Örneğin, virgül ve boşlukla katılmak için:

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

Sondaki ( ^M) özel karakteri için ( ) tuşuna Ctrl-Vve ardından Return / Enter tuşuna basın . Eğer bir sekme ile değiştirmek isterseniz aynı gider ( ^I) yazın Ctrl-Isonra Tab.

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

Bunun yaptığı, bir satırsonunu geçerli satırdaki bir sekmeyle değiştirmek ve bu davranışı J karakterine yeniden eşlemektir.

Bu 4J, sonraki 4 satıra katılmak için olduğu gibi kombinasyonlarla da çalışır .


0

Çizgileri virgülle birleştirmek için makro kaydedebilirsiniz. Bu, nadir veya tek seferlik bir görevse yararlıdır ve görevi yerine getirmek için nasıl yedek komut ve normal ifade yazacağınızı hatırlayamazsınız, ancak bir makroyu nasıl kaydedeceğinizi ve çalıştıracağınızı hatırlarsınız.

Satırları virgülle birleştirmek qjgJi,Escqiçin makroyu kayıt defterine kaydetmek için yazın j. Sonra makroyu ile çalıştırabilirsiniz @j. Makroyu @@, bir satırda birden çok kez çalıştırırken yazmaya tasarruf ederek yeniden çalıştırabilirsiniz; @katılmak istediğiniz satırların sonuna yaklaşana kadar basılı tutabilirsiniz . Ayrıca , belirli bir sayıda önek üzerinde @jveya @@üzerinde yineleme yapmak için sayısal bir önek kullanabilirsiniz . Bu, öndeki ve sondaki alanı sağlam bırakır, bu nedenle orijinal metninizde boşluklar varsa, virgülden önce veya sonra boşluklar olacaktır.

Virgül ve boşlukla birleştirmek için , makroyu kaydederken ve Spacearasına yerleştirin .,Esc

Ayrıca , genellikle virgül ve boşluk içeren satırları birleştirecek olan makroyu kaydetmek Jyerine de kullanabilirsiniz gJ. Ancak, geçerli satırın sonundaki boşluk varsa, virgül boşluktan sonra onu izleyen boşluk olmadan görünür. Sonraki satır ile başlarsa Ayrıca, boşluk içermez )ve eğer virgülden sonra iki boşluk koyar joinspacesayarlanır ve mevcut hat uçları ., !ya ?. Bu uyarılar aşağıda açıklanmaktadır :help J.

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.