Bir makroda ekleme modu tamamlamayı nasıl kullanabilirim?


11

Hızla rasgele-ish kelimelerin bir listesini üreten bir makro tanımlamak çalışıyorum.
Makroyu böyle bir listeye dönüştürmek istiyorum

a
b
c
d
e

bunun içine

arezzo
bywords
czars
détente
eyrie

Şimdiye kadar ne var:

  • imleci harf üzerine koy a
  • makro kaydetmeye başla qq
  • a ekleme moduna gir
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the lettera`
  • <C-p>görünen tamamlama listesindeki son öğeyi seçin, sistemimde sözcük arezzo. (Not : Tamamlama sırasında bu şekilde çalışmak için gerekli olan ayarıma longestdahil ettim 'completeopt':) .<C-p>'set completeopt=longest,menuone,preview'
  • <C-y> tamamlamayı kabul et
  • ^[^[ ekleme modundan çık
  • j bir sonraki satıra geç, bir sonraki satıra aynı işlemi yapmaya hazır
  • q Kaydetmeyi bırak

Ben makro oluşturmak ve adımları el ile gidin, her şey iyi çalışıyor, ancak makroyu yürüttüğümde, komut satırında yanıp sönen bir ileti görüyorum:

sözlük dosyasını tarama

ve hiçbir şey olmaz, yalnızca makrodaki komutlar jçalıştırılır, yani imleç satırdan aşağı hareket eder, ancak tamamlama komutlarının hiçbiri çalışmaz.
Bir makroda ekleme modu tamamlamalarını kullanmak mümkün mü ve eğer öyleyse, bunu nasıl yapabilirim?


<C-p>Adımınızı anlamıyorum ... vimimde yaptığımda, sadece mesajı veriyor back at original- son öğeyi seçmiyor .. Son kelimeyi (benim durumum azures) seçmek için yukarı ok tuşunu iki kez kullandım , enter ve sonra Esc+j+q.. makro yürütmede gayet iyi çalışıyor
Sundeep

1
@spasic ah iyi bir nokta, bahsetmeliydim, ama set completeopt=longest,menuone,previewonun hemen eklemek longestneden olan seçeneği kullanıyorum <C-p>. Dizeden kaldırırsam longest, completeoptsizinle aynı davranışı alırım. Ayrıca, evet ok tuşları çalıştı! teşekkürler (tamamlama listesinde gezinmek için bunları kullanabileceğinizi unuttum)
the_velour_fog

Belki açılır menü karışıyor olabilir. Belki denemek :set completeopt=ve a<c-x><c-k><esc>jMakronuz olarak.
Antony

@Antony <Cp> 'nin neden çalışmadığından emin değilim, ancak yön ok tuşları işe yaradı.
the_velour_fog

Yanıtlar:


2

EDIT : Gerçekten sözlük tamamlandıktan sonra; bunu yapmak için mutlaka ekleme moduna (Ctrl + X modu) ihtiyacınız yoktur. Keşfettiğiniz gibi, makrolarla çalışmayı gerçek bir acı haline getirir. Aşağıdaki komut dosyası, ekleme modu olmadan sözlük tamamlamayı yapmak için kullanılabilir, böylece bir makronun içinde kolayca tekrarlayabilirsiniz.

Aşağıdaki kodu .vimrcdosyanıza ekleyin , yeni işlevi kaynaklamak için vim pencerelerini kapatın ve yeniden açın ve ardından <C-k>tamamlamayı jyapmak ve bir sonraki satıra geçmek için sırayla kendinizi kaydedin . longestSeçenek için bir kontrol ekledim ve devre dışı bırakılmışsa, sistem rastgele zamanını kullanarak rastgele bir giriş seçer. longestSeçeneği bulursa, sözlükten eşleşen en uzun girdiyi manuel olarak arar ve ekler.

<C-k>Eşlemeyi sevmiyorsanız, uygun gördüğünüz gibi değiştirmekten çekinmeyin. İstediğiniz herhangi bir eşleme ile çalışmalıdır.

Ayrıca, değerlendirmek üzere eşlemenin ifadesini döndürme komutu \<esc>sonuna bir karakter ekler , böylece her ekleme işleminden sonra ekleme modunu otomatik olarak bırakırız 0cwve önden başlamak için ekleme moduna girmek ve tüm kelimenin üzerine yazdığımızdan emin olmak için doğru şekilde. Tam istediğiniz davranışa bağlı olarak (kelimeleriniz her satırın önünde iyi değilse) bcwgerçek kelime başlangıcını bulmak için kullanabilirsiniz . Ancak, o zaman satır başlayan sözcüklere geri döndüğünüzde bazı tuhaflıklar göreceksiniz. Muhtemelen satır sonunu yoksaymak ve her ikisini birden yapmak için daha gelişmiş bir komut var, ama bir tane bulamadım.

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

Ayrıca, ekleme modunun sağladığı herhangi bir işlevi yerine getiren alternatif eşlemeler (örneğin işlev parametreleri kullanarak) oluşturmak için mantığı burada genişletmek zor olmayacaktır. Bu tür gereksinimlere yardımcı olmaktan ve zamanım olduğu için bu komut dosyasını güncellemekten mutluluk duyacağım.


Bu, sorunun makul bir açıklaması gibi görünüyor, ancak hem önerilen çözümlerinizi denedim, hem de yardımcı olmadı.
Zengin

sleepKomutu da denedin mi?
Tim

Evet, ancak önerilen 5 saniye değerinde olsa da. İki çözümden birini işe almayı başardınız mı? Adımların tam bir listesini gönderebilir misiniz?
Zengin

Soruyu yazan kişi ben değilim. Ancak, ben yapabilirsiniz sorunu yeniden: Eklemek gerekir en uzun için completeopt(değil bana göre tekrar) açıklamalarda belirtildiği gibi. edit : Hata: adım 'longest'için gereklidir ctrl-p: değil ctrl-y. Yine adımlar benim için soru-asker çalışması tarif vim -Nu NONEile completeoptdüzenlenebilir.
Zengin

Sanırım bir çözüm buldum, cevabımı güncellemem için bana birkaç dakika verin.
Tim
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.