Bir hattı verimli bir şekilde birden çok satıra bölmek nasıl?


11

Günlük değerlerini bir metin dosyasında, her bir değerin boşlukla ayrılmış tek bir uzun satırda alıyorum. Bir satırı birden çok satıra ayıracak bir komut veya komut kümesi var mı?

Yanıtlar:


21

Komutu kullanarak satırdaki herhangi bir ardışık alanı bir satırsonu ile değiştirebilirsiniz :s/\s\+/\r/g. \s\+ortalama bir veya daha fazla boşluk karakterleri ve \rbkz satır olduğunu :help :substituteve :help regexpdetaylar için. Komutu aşağıdaki gibi bir satırda çalıştırırsanız:

foo bar baz

Şunları elde edersiniz:

foo
bar
baz

Eğer varsa hlsearchetkinse ve her yerde vurgulanır boşluklarla ekranınızı kalabalıklaştırmasını istemiyoruz, bunu önlemek için aşağıdaki gibi küçük bir fonksiyon yazabiliriz:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

"Ekranınızı her yerde vurgulanan alanlarla karıştırmak istemiyorsanız" bu, OP'nin kurulumu hakkında çok fazla şey varsayar.
romainl

@romainl Daha iyi?
toro2k

1
Evet, daha iyi IMO.
romainl

2
Öyle \r, bakın :help s/\r. Bunun yerine, yeni bir satırsonu yazımı uygulanabilir <c-v><cr>. Bu bağlamda \nboş bir karakter, bkz :help s/\n.
toro2k

1
replaces the content of the register- hangi kayıt?
stillanoob

5

vim'In yerine koymayı kullanmak muhtemelen görevinizi gerçekleştirmenin daha iyi yollarından biridir, ancak bir makro da kullanabilirsiniz. Farz edelim ki imleç satır 1'in bir yerinde olacak şekilde aşağıdaki verilerimiz var:

1 a b c d e f
~

Normal modda başlandığında, vurmak qq, üzerinden çağrılabilir bir makro kaydetmeye başlar @q. Sonra yazılanlar qqyukarıda belirtilen çağrı ile tekrarlanabilir. Amacımız, kesintisiz tekrarlamaya izin verecek kadar genel olacak normal komutları kaydetmektir.

Böylece, 0imleci satırın başına getirip sonra imleci fspaceilk boşluğa taşımak için yazabiliriz . Bu, daha sonra yazmamıza izin verir renterve sonuç olarak:

1 a
2 b c d e f
~

qTekrar kullanılabilir makronuz tekrarlamaya hazır olduğundan şimdi vurmak iyi bir fikirdir. Bir şekilde keyfi olarak, yeni satırlarla değiştirilecek 4 boşluk kaldığını not ediyoruz. Böylece, vurarak, makroyu 4 kez 4@qtekrarlıyoruz q:

1 a
2 b
3 c
4 d
5 e
6 f
~

Makroyu kurma şeklimiz nedeniyle, komutu sadece geçerli satırı etkileyeceğinden ve son veri girişinin sağında boşluk olmadığından, komutu 9000 kez tekrarlamanın güvenli fspaceolacağını unutmayın. 'güzel' başarısız olur ve verilerin yeni satırlarla değiştirilmesini önler.

Yani baştan tekrarlamak için:

qq0fspacerenterq9001@q

sonucumuzu verir.


1
9001Kullanıcı adınızı hızlı yazmak için klavyenizde bir tuşa sahip olmanızı seviyorum .
Zengin

5

Vim'deki satırları bölmenin en kolay yolu normal mod komutudur gq(normal veya görsel modda her iki harfi de hızlı bir şekilde arka arkaya yazın).

Görsel modda, seçilen her şeyi böler, normal modda gqbir hareket izlersiniz.

Örneğin, gqlbir satırı geçerli olarak ayarlanan genişliğe böler. Mevcut ayardan farklı olmasını bölünmüş hatlarının genişliğini ayarlamak için kullanabilirsiniz :set textwidth=n, nerede nbir çizgi, örneğin istediğiniz karakter sayısı vardır 10işiniz bittiğinde ve normal genişliğine değişiklik geri.

Bu bilgiyi, bir hareket kullanarak normal modda çizgilere nasıl katılacağını ve bölündüğünü gösteren bir Kholidfu Youtube videosundan aldım.

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.