Aynı satır metnini otomatik vurgulama


13

Bir süre önce yetenekli bir vim ninjanın bunu yaptığını gördüm ama başlamak için hiçbir fikrim yok.

C) Aynı içerik içeren ardışık satırların vurgulanması için vims arka plan rengini ayarlamanın bir yolu var mı?

B) Birisi bunu nasıl yapacağını biliyorsa, bu güzel bir değişiklik, ardışık satırlarda vurgulamanın gerçekleşmesi olabilir, ancak sadece ilk kelimeyi (tüm satırı değil) düşünür.

Vurgulama, farklı renklere yapılandırılabiliyorsa, eşleşen satırların sayısına (veya AB'ye bağlı kelimeler etkin) göre ikinci bir ince ayar kullanılır. Yani sadece yeşil ile eşleşen iki ardışık çizgimiz var, 3-5 ardışık çizgi sonra turuncu, 6+ sonra kırmızı.


Benzer mesaj:
Normal ifade

Yanıtlar:


10

Aşağıdaki matchsetler (A) için işe yarıyor gibi görünüyor:

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

Burada düzen çok önemli görünüyor. Eğer Lowyoksa Mediummaçlar peşine Critical, o bunlardan gevşek gereksinimleri tarafından sahiplenildi ve benzer için alır Lowwrt Medium.

Vurgulama, diyelim ki 3. veya 6. bir dupe satırı ekledikten hemen sonra görünmez, ancak ekledikten sonra biraz hareket ettikten sonra. Tam olarak neyin tetiklediğinden emin değilim.

B için, normal ifadeyi aşağıdaki ile değiştirebileceğinizi hayal ediyorum:

/\v(\S+).*\n(\1.*\n)/

Genel olarak hepsini yerine (.*)sahip (\S+).*ve \1birlikte \1.*, ya da her türlü sizin için bir kelime oluşturur.


Bu cevabı kene verdim çünkü bana ihtiyacım olan vurgulamanın nasıl yapılacağı (soru tarafından ifade edildiği gibi). @ Düzenli ifade güzelleşir ama sordum asıl soruya cevap vermez (vurgulama değiştirme).
Martin York

8

Başlangıç ​​noktası olarak, yinelenen satırlarla eşleşen bir arama deseni (baştaki boşluktaki değişiklikleri yok sayıyor):

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern bunun gibi regex'lerin nasıl yapılacağı hakkında daha fazla bilgi sağlayacaktır

:help syntax bu düzenli ifadeyi nasıl alacağınızı ve sizin için vurgulanan bir şeye nasıl dönüştüreceğinizi gösterecektir

Sözdizimi komut dosyaları yazmayı öğrenmek zor olabilir, bu nedenle iyi bir kısa vadeli çözüm, 'incsearch'aramaların vurgulanacağı ve yukarıdaki aramayı yapmak için bir anahtarın eşleştirileceği şekilde ayarlandığından emin olarak bunu 'anında' yapmaktır.nnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


Normal ifadeyi böyle dağıtmanın otomatik bir yolu var mı? Böyle açık bir tasvir sağlar.
muru

1
Ben elle yapıyorum. Vim'deki en kolay hızlı yol yy10p, tam regex ile hatta benzer bir şey yapmak ve ardından kaldırmak ve vurmak istediğiniz parçaları seçmek olacaktır r<space>. Belki işleri biraz hızlandırmak için 'bu satırdaki seçim hariç her şeyi boşluklarla değiştir' komutunu ekleyeceğim.
Matt Boehm

Vaov! Bu biraz çaba!
muru

1
Bunu biraz daha hızlı yapmak için (gerçekten çirkin) bir vim işlevi yaptım : gist.github.com/mattboehm/da63a48eedf6f14375aa . Bir çizgi seçin, vurun ve ,rardından <space>normal / görsel modda satırlarla birleştirin .
Matt Boehm
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.