“Yapılacaklar” grubuna bir işaret atamak mümkün mü?


9

Satır bir Yapılacaklar grubu (Yapılacaklar, FIXME ...) olduğunda işaretler sütununda görüntülenecek bir işaret eklemek mümkün müdür?

Renklerimden bahsetmişken Todo grubunun vurgulamasını değiştirdim, ancak işaretler sütununda Sintastik hatalar ve uyarılar gibi bir gösterge olmasını istiyorum.

Yanıtlar:


9

Bu işlevi deneyin:

function! SignKeyword()

    silent! sign undefine todo

    sign define todo text=>> texthl=Search

    g/\v\C(<TODO>|<FIXME>)/execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

    nohlsearch

endfunction

Şimdi komut satırındaki işlevi çağırın:

:call SignKeyword()

Veya ~/.vimrcaramak için bir eşleme ekleyin :

nnoremap <your mapping> :call SignKeyword()<cr>

Veya bir autocmd ekleyin. Örneğin, dosya türü işaretleme olan bir dosyayı açarken işlevin otomatik olarak çağrılmasını istiyorsanız:

autocmd FileType markdown call SignKeyword()

İşlevin ilk satırı silent! sign undefine todozaten varsa işaret todo'yu siler, böylece işaretleriniz bir çizgi sildikten veya eklendikten sonra yanlış yerleştirilirse, hemen düzeltmek için işlevi geri çağırabilirsiniz.


İkinci satır, adı yapılacak olan, metni olan >>(tercihlerinize uyacak şekilde değiştirebilirsiniz) ve Arama vurgulama grubunu (aynı şey) kullanan bir işareti tanımlar .


Üçüncü satır global komutu kullanır:

:g/pattern/command

Global komut, bir kalıpla eşleşen her satırda bir komut yürütür.

Burada desen \v\C(<TODO>|<FIXME>), yani TODO veya FIXME kelimesini içeren herhangi bir satır anlamına gelir . Normal ifade
atomu içerir, \Cböylece arama duruma göre değişir ('ignorecase' seçeneğiniz ne olursa olsun). Aramanın davaya saygı göstermemesini istiyorsanız, olarak değiştirin \c.

Böyle bir satır bulunduğunda aşağıdaki satır fonksiyon tarafından yürütülür:

execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

:executeAşağıdaki dizenin içeriğini (komutla) yürütür :

"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')

Dize iki adet vim yerleşik işlev içerir: line()ve bufnr().
line('.')global komut tarafından bir eşleşme bulunduğunda geçerli satırın bufnr('.')numarasını ve geçerli arabellek sayısını döndürür.

Örneğin, global komut, arabellekteki 5 satır 10'da bir eşleşme bulursa, şunu verecektir:

"sign place 9999 line=" . 10 . " name=todo buffer=" . 5

Noktalar dizeleri birleştirir ve sonunda şunları değerlendirir:

"sign place 9999 line=10 name=todo buffer=5"

Bu, :signtampon 5'teki satır 10 üzerine bir işaret yerleştirme komutudur.
9999, işaret için seçilen rastgele bir kimliktir (başka bir tane seçebilirsiniz).


İşlevin dördüncü satırı :nohlsearcheşleşen desenlerin vurgulanmasını devre dışı bırakır.

Düzenleme: Normal ifadeyi düzelttim, orijinal yanlıştı. Ben yazdım ^[TODO|FIXME]ama bunun yerine olması gerektiğini düşünüyorum \v\C(<TODO>|<FIXME>). Rahatsızlık için özür dilerim, hala vimscript öğreniyorum.


1
TODOyorum kaldırıldıktan sonra işaret nasıl kaldırılır?

1
beklediğim bu değil, çünkü bu tüm todoişaretleri kaldırmak , ama sadece işaret kaldırıldı işareti kaldırıldı fark, bu yüzden sorun yok

1
Tamam, işlevi başında bu satırı ekledim: silent! sign undefine todo. Zaten varsa işaret todo'yu siler, böylece TODO veya FIXME anahtar sözcüğünü içeren bir satırı sildikten sonra işaretleriniz yanlış yerleştirilirse, bunları hemen düzeltmek için işlevi geri çağırabilirsiniz.
saginaw

2
Normal ifade yanlıştı, ben yazdım ^[TODO|FIXME]ama bunun yerine olması gerekirdi \v(TODO|FIXME). Yeni normal ifade, anahtar kelimelerden birini içeren bir satırla eşleşecek ancak satırın başlangıcını eşleştirmeyecektir, çünkü bir satırın, örneğin böyle bir yorumdan önce bazı kodlar içerebileceğini varsayalım some code # FIXME this line needs to be fixed. Bir önceki regex tamamen yanlış olduğunu, üzgünüz, hala öğreniyorum vimscript ...
saginaw

1
Bu yaklaşımla ilgili sorun, tamponu değiştirirseniz, örneğin bir TODO satırının üstüne başka bir satır eklerseniz, senkronizasyondan hızlı bir şekilde çıkacaktır.
Christian Brabandt

6

DynamicSigns eklentimi kullanabilirsiniz . Bu, fold ifadesine benzeyen "SignExpression" ifadesine izin verir.

Böylece sadece :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

Nelerin mümkün olduğuna dair daha fazla örnek için yardımı okuyun.

Eklentimi kullanmanın avantajı, tampondaki değişiklikleri izlemesi ve işaretleri buna göre ayarlamasıdı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.