Saf vimscript ile değiştir (`: s` olmadan)


12

Benim vimrc aşağıdaki var:

func! AddSpaceBeforeEqual()
  s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc

Vimrc'imi havlamak için vint kullanıyorum ve aşağıdaki uyarıyı aldım:

ProhibitCommandWithUnintendedSideEffect İstenmeyen yan etkileri olan komutlardan kaçının. İmleci hareket ettirip hata mesajları yazdırırken: s [ubstitute] kullanmaktan kaçının. Komut dosyalarına daha uygun işlevleri (arama () gibi) tercih edin. Birçok vim komutu için, aynı şeyi daha az yan etki ile yapan işlevler vardır. Yerleşik işlevlerin listesi için bkz. Yardım işlevleri (). Google Vimscript Stil Kılavuzu

Ancak, :skomutu kullanmadan oyuncu değişikliği yapmanın bir yolu olduğunu düşünmüyorum .

Örneğin, search()işlev bir desenle eşleşen çizgileri verir, ancak ikame yapmanın bir yolu yoktur. substitute()İşlev bir dize çalışır ve bir bütün dosya üzerinde yerine geçmez.

Yedek bir yöntemi kendim mi uygulamalıyım yoksa işlevimi yeniden yazmanın daha akıllı bir yolu mu?

Yanıtlar:


10

İşte fonksiyonunuzun basit bir uygulaması substitute():

function! AddSpaceBeforeEqualInWholeBuffer()
    let l = 1
    for line in getline(1,"$")
        call setline(l, substitute(line, '\([^= ]\)=', '\1 =', "g"))
        let l = l + 1
    endfor
endfunction

Arama desenini zevkinize göre ayarlayın.


10

İstenmeyen yan etkiler hakkında sizi uyarmasının nedeni :substitute, imleci hareket ettirmesi ve önceki aramanın üzerine yazmasıdır (bir işlev dışında kullanılıyorsa) . Bununla birlikte, bu, yan etkilerini tersine çevirebileceğiniz için kullanmamanız gerektiği anlamına gelmez :substitute. Örneğin, burada sondaki boşluğu soymak için substitute komutunu kullanan bir işlev var:

function! StripTrailingWhitespace()
    " Save cursor position
    let l:save = winsaveview()
    " Remove trailing whitespace
    %s/\s\+$//e
    " Move cursor to original position
    call winrestview(l:save)
    echo "Stripped trailing whitespace"
endfunction

:markİmlecin konumunu kaydetmek için komutu da kullanabileceğinizi unutmayın , ancak bu aynı zamanda kullanmaya karar verdiğiniz işaretin üzerine yazacağınız anlamına gelir. Daha önce vint kullanmadım, ancak linterlerin bir ipucu, uyarılarını bir tuz tanesi ile alabilmenizdir. Bu durumda, :substituteyan etkileri olduğu doğrudur , ancak önlenebilecek yan etkilerdir. Ayrıca, gerçekten bir dosyada arama yapmanın ve değiştirmenin daha iyi bir yolu yoktur.


6
Son kullanılan arama terimi, bir işlevden ayrıldıktan sonra otomatik olarak geri yüklenir, bu nedenle bir işlev içinde kullanılırken gerekli olmayan kaydetme ve geri yükleme. Bakınız:help function-search-undo
Martin Tournoij

1
imleç () yerine winsaveview () / winrestview () kullanın
Christian Brabandt

1

:sKomut saf Vimscript yaklaşımdır.

Benim tahminim sadece uyarıdır, imlecin büyük olasılıkla kullanımından sonra yanlış konumlandırılacağı anlamına gelir (önceki winsaveview()işlevi ve winrestview()kullanımından sonra kommandı kullanarak atlayabilirsiniz). Ayrıca meydana gelebilecek olası hatalara dikkat etmeniz gerekir. Bu genellikle ebayrak kullanılarak yapılır . Ayrıca gdefault, gbayrağın anlamını tersine çeviren ayar gibi bazı ayarlarla ilgilenmek gerekir .

Kişinin bu özelliklere dikkat etmesi gerekir ve muhtemelen bu uyarıların temel nedeni budur. Ancak bu, :skomutun kullanılmasından kaçınmak anlamına gelmez . :sGeçerli arabellekteki bir şeyi değiştirmek istiyorsanız, komutu kullanmak mükemmeldir .

(Tabii ki, tüm satırlar arasında döngü yapılabilir ve bir search () / getline () / setline () yaklaşımı kullanılabilir. Ancak bu genellikle daha yavaştır.)

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.