Vim'de, eşleşen parantez / parens için geriye doğru arama yapın


10

Çoğunuzun bildiği gibi, bir %sonraki eşleştirilmiş ayracı / braket / paren'i bulmak ve eşleşen ortağına geçmek için satırda ileriye doğru arama yapmak için kullanabilirsiniz :

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Satırda geriye doğru arama benzer bir anahtar, örneğin:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

Çoğu vim komutunun hem geri hem de ileri vardır, bu yüzden böyle olması gerekir. Ortağı yok mu? Eğer öyleyse, bu kadar bir kez olmalarındandır üzerinde eşleştirilmiş karakteri aynı hareket edeceğini?


Sadece %aynı satırdaki eşleştirilmiş köşeli parantezleri değil, aynı zamanda dosyayı daha da aşağıya doğru aradığına dikkat edilmelidir . Özellikle herhangi bir program dilinde döngüler vb.
Bernhard

1
@ Bernardhard Evet, ama sadece hatta parantezlerden birini bulduğunda.
Kevin

Eklenti komut dosyalarına karşı değilseniz, matchit eklentisig% aradığınıza benzer görünen bir komut sağlar .
jw013

Aptalca, ama sorunuz, neden ortak olmadığını bilmek istediğinizi belirtiyor. Şunu mu demek istediniz: "Bilmediğim bir ortak var mı?" :)
rjewell

@rjewell Tamam, bölüyorum, bu yüzden artık teknik olarak sormuyor.
Kevin

Yanıtlar:


4

Eğer varsa gerçekten ortak eşleştirme karakterleri için geriye doğru aramak istediğiniz, bunlardan birini kullanabilirsiniz vime özgü komutlar:

  • [(... (eşleşmemiş önceki (karaktere git)
  • [{... (eşleşmemiş önceki {karaktere git)

Bu iki komutun eşleşen ortakları vardır:

  • ])... (bir sonraki eşsiz )karaktere git)
  • ]}... (bir sonraki eşsiz }karaktere git)

#ifdefC yorumları için ve benzer yorumlar için başka komutlar da vardır .

vimKomutu kullanarak daha fazla bilgi bulabilirsiniz :help %.


Bunları biliyorum, sorun eşsiz çiftleri bulmaları, eşleşen çiftleri bulmam gerekiyor .
Kevin

@Kevin: Dokümanları yanlış anladım (iç çekme). Tabii ki, kullandıktan %sonra her iki yönde de gider - eşleşen ortağı bulmak. Ayrıca, bir bloğun içindeyse, yukarıdaki komutlar uygun eşleşmeyi bulur.
Mei

4

% eşleşen ayracı bul. Yani açıksanız (veya {ileriye doğru arayacaktır).

Bir} veya) üzerindeyseniz geriye doğru arama yapar.

% yönlü değildir, sadece eşleşen braketi bulur.


Bir çiftin bir tarafının arkasında kalırsam,% onun ortağı olduğunu görür. Eğer bir hattın sonundaysam, çifti daha önce satırda bulamaz.
Kevin

Bu doğru cevap seçilmemeli mi?
Jack

2

Sadece denedim :map ^] ^%%( ^]= Ctrl+ v Ctrl+ 5ile, %= Shift+ ile bir benzetme olarak 5).

Verilen belirli vaka için çalışır, ancak imleçten geriye doğru arama yapmadığından, her zaman satırdaki ilk açık parantezleri seçer ve herhangi bir eşleşme bulamazsa imlecinizi satırın başında bırakır. .


Bu daha iyi bir çözümdür; bu çirkin ve muhtemelen basitleştirmek için çok yer var, ama semantik tam olarak doğru olduğunu düşünüyorum (açık paren yoksa imleci hareket ettirmez ve geçerli sütundan önce ilk açık paren taşır ).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

için

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

Bir hatta iç içe olmayan iki çift varsa bu tamamen aynı olmayacaktır, ancak şimdiye kadar kesinlikle en iyi öneri, teşekkürler.
Kevin

Bu sadece bir blok içinde çalışacak, değil mi? Eğer öyleyse, o [(zaman da iyi çalışır ve bir gerektirmez map.
Mei

Geçerli satırdan başlayan bir blok olmalı , evet. Yine de daha eksiksiz bir çözüm buldum, düzenleme geliyor ...
Yararsız
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.