Vim'de küçük farklar olan tekrarlayan metinler nasıl eklenir?


11

Bunun gibi metin eklemek istiyorum:

similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...

Metni birçok kez yapıştırabilirim, sonra her satır için tek kelimeyi değiştirmek için ikameyi kullanabilirim, ancak yine de bu yöntemi çok rahatsız edici buluyorum.

Bir kelimeyi veya kelime listesini bir "değişken" e kaydetmenin ve bu metni benzer metin üretmek için kullanmanın bir yolu var mı?


EDIT Orijinal soruda belirsiz bir şey yaptım, aslında bazı çok benzer işlev tanımları yapmaya çalışıyorum, bu yüzden wordA wordB... her metin klonunda birçok kez görünebilir ve metin birçok satır içerebilir. desen aynen şöyle:

similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...

(metin yeni satırlar içerebilir ve wordA, wordB ... birçok kez bulunabilir)


2. DÜZENLEME Böyle bir işi her yaptığımda "benzer_metin" bölümleri farklı olabilir, bu nedenle bu iş için çözüm yeniden kullanılabilir olmak daha iyidir. Çünkü çok benzer fonksiyon tanımları yapmaya çalışıyorum ya da fonksiyon eşleme tablosuna bir dize.

Cevapları ve bazı uygulamaları okuduktan sonra, bu işi bir tür ikame olarak düşünmenin daha uygun olduğunu düşünüyorum, çünkü yeni satırlar içerebilecek ayrı "part1", "part2" ... "partN" yazmak zor, bu yüzden yazın önce bir şablon:

similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )

Sonra metnin klonlarını koymaya çalışmak, ancak $ WORD kelimelerini bir kelime listesiyle değiştirmek daha düz bir düşünce.

Yani benim sorunum "bir metin bloğunu birçok kez klonlamak, ama her seferinde içindeki bir anahtar kelimeyi listeden bir sözcükle değiştirerek" olarak değişti.


Bu nedenle kayıtlar kullanılır. Metni bir kayıt defterine çekebilir ve kopyalayabilirsiniz. Makrolar benzer ve tekrarlayan görevleri yapmak için kullanılabilir.
SibiCoder

Yanıtlar:


7

Aşağıdaki işlevi kullanabilirsiniz:

function! GenerateLines()
    let firstpart="similar text part 1"
    let secondpart="similar text part 2"

    let words=["wordA","wordB","wordC","wordD","wordE"]

    for word in words
        let line = firstpart . word . secondpart
        call append(line('.')+1, line)
        normal j
    endfor
endfunction

Değişkenlerde firstpartve secondpartmetni kelimelerin önüne ve arkasına tekrarlamak için ve listeye wordsdeğişmesi gereken kelimeleri koyun.

Daha sonra döngü, listenin her kelimesi için satırın içeriğini oluşturur, satırı arabelleğe ekler ve bu yeni satıra gider.

Daha sonra sadece işlevini çağırabilirsiniz: call GenerateLines().


Düzenle İşlemeyi kolaylaştırmak için farklı parçaları bağımsız değişken olarak da iletebilirsiniz, işlev şu şekilde görünmelidir:

function! GenerateLines(firstpart, secondpart, words)
    for word in a:words
        call append(line('.')+1, a:firstpart . word . a:secondpart)
        normal j
    endfor
endfunction

Ve şöyle diyebilirsiniz:

call GenerateLines("first part", "second part", ["wordA","wordB","wordC","wordD","wordE"])

Sen ile döngü önlemek olabilir call map(a:words, 'a:firstpart . v:val . a:secondpart')ve call append(line('.'), a:words).
Antony

Sıklıkla çok uzun "birinci bölüm" ve "ikinci bölüm", hatta "üçüncü bölüm" ile bu tür bir düzenleme yaptığım ve bu bölümler yeni satırlar içerebileceğinden, komut modunda bu kadar çok şey yazmak çok uzun gibi görünüyor, belki daha rahat metni kayıtlara çekmek için, sonra kayıtlardan metin oluşturmak için işlevleri kullanın.
social_loser

Soruyu düzenledim, çok değişiyor, rahatsızlıktan dolayı özür dilerim.
social_loser

5

Bu gibi durumlarda stratejim değişecektir, ancak genellikle aşağıdaki adımları izler:

  1. Benzersiz kelimeleri yazın, ör.

    wordA
    wordB
    ...
    wordK
    
  2. ya

    a) bir arama yapın ve değiştirin, ör.

    :%s/\w\+/similar text \0 similar text .../
    

    b) veya görsel blok modunu kullanın, bkz :h blockwise-visual. Özellikle, kelimeleri seçip Iöndeki Abenzer metni eklemek veya sonra benzer metni eklemek için kullanacağım.

Bu tür bir düzenleme görevini nispeten nadiren yaptığınızda bu stratejinin mantıklı olduğunu iddia ediyorum. Ancak, bunu sık sık yapmanız gerektiğini fark ederseniz, o zaman kelime listesini genişleten bir işlevle @ statox'un önerisini izlemelisiniz.


Çözüm, kelime listesinin nereden geldiğine bağlı olduğunu düşünüyorum. Bir dosyadan geliyorsa :read, yerine koymanızın ardından çok mantıklı geliyor.
Antony

Çözümü yapmak kolaydır ve orijinal soruda sorduğum sorunu kolayca çözebilirsiniz. Ancak orijinal
yazımda

@social_loser Bu çözümü, oyuncu değişikliğinin yeni bölümünde yer almak için "\ r" kullanarak uyarlayabilirsiniz
frangio

2

Bunun görsel blok ( Ctrl+ v) için bir iş olduğunu savunacağım . İlk önce tüm farklı kelimeleri yazarım:

wordA
wordB
wordC
wordD
wordE

İlk önce imleç ile başlayarak wdaha sonra gerçekleştirmek:

<c-v>5j$yA <esc>pA <esc>p

İstediğim sayıda düğmeye basarak kaç tane sütuna ihtiyacım olduğunu kontrol edebilirim A <esc>p. Yukarıdaki komutun gösterdiği gibi üç sütuna ihtiyacım olduğunu varsayalım. Şimdi buna sahibiz:

wordA wordA wordA
wordB wordB wordB
wordC wordC wordC
wordD wordD wordD
wordE wordE wordE

Ve imleç wordAilk satırda 3'ün başında . Daha sonra geriye gidip aradaki metni ekleyerek sütunlar arasındaki boşluk sütununu seçmeyi engellerdim. Geçerli imleç konumundan:

h<c-v>5jI similar text 3<esc>

Bu sonuç (%, imleç konumunu işaretler):

wordA wordA%similar text 3 wordA
wordB wordB similar text 3 wordB
wordC wordC similar text 3 wordC
wordD wordD similar text 3 wordD
wordE wordE similar text 3 wordE

Sonraki sütun için tekrarlayın:

bh<c-v>5jI similar text 2<esc>

Ve son / ilk (sol taraftaki) sütunu:

b<c-v>5jIsimilar text 1 <esc>

Sonunda sonuç:

similar text 1 wordA similar text 2 wordA similar text 3 wordA
similar text 1 wordB similar text 2 wordB similar text 3 wordB
similar text 1 wordC similar text 2 wordC similar text 3 wordC
similar text 1 wordD similar text 2 wordD similar text 3 wordD
similar text 1 wordE similar text 2 wordE similar text 3 wordE

Güncelleme: ekran görüntüsü eklendi

resim açıklamasını buraya girin


Bu çok yazmak gibi görünüyor ama aslında alışmak çok kolaydır. Size kelime sayısını, sütun sayısını ve hatta sütunlar arasındaki boşluğu değiştirme özgürlüğü sağlar.

Dezavantajı, kullandığınız farklı kelime sayısını bilmeniz gerektiğidir . 5Komutların üzerinde çalıştığı satır sayısı olduğu için yukarıdaki tüm komutlarda bir sabit kod var .

Hata ayıklama notu: tüm komutlar normal modda başlar ve biter, kendinizi bir komutun sonunda görsel veya ekleme modunda bulursanız yanlış bir şey yapıyorsunuz.

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.