Vim'de otomatik olarak eşleşen parantezler oluşturun


17

Vim'de otomatik olarak eşleşen parantezleri nasıl oluştururum?

Aşağıdaki gibi çalışmalıdır: Açık bir küme ayracı girersem, kapanış otomatik olarak görünmeli ve imleç arasına yerleştirilmelidir. Küme ayracı çiftinden atlamak için kombinasyon Ctrl-jkullanılır.

Otomatik destek yerleştirmeyi sağlayan birçok eklenti vardır. Ama onlar

  • farklı bir tuş kombinasyonu kullanın Ctrl-jküme ayracı çiftinden atlamaktan veya
  • UltiSnips'e müdahale etmek anahtar bağlantılarına .

Beklendiği gibi aşağıdaki işler

:inoremap ( ()<Esc>:let leavechar=")"<CR>i
:imap <C-j> <Esc>:exec "normal f" . leavechar<CR>a

Ancak bu ayarlarla UltiSnips snippet'leri artık çalışmıyor. Bu yüzden kapanış ayracı eklemek için UltiSnips kullandım:

inoremap ( (<C-R>=UltiSnips_Anon('($1)$0', '(')<CR>

Bu neredeyse işe yarıyor. Eşleşen küme ayracı yerleştirildi ve kapanış olanını atlayabilirim Ctrl-j. Ancak bu yalnızca açık desteğin önünde bir boşluk varsa işe yarar.

main () // works, the closing parentheses is added
main(   // fails without a space

Çözümlerim, ya kapama ayracı üzerinden atlamak için farklı bir anahtar ciltleme gerektirir ya da açık olanın önünde bir boşluk gerektirir. Bunu nasıl düzeltirim?

Not: Örnek olarak parantez kullandım. Parantez, kaşlı ayraçlar, köşeli ayraçlar ve küçük işaretlerle çalışmalı ve UltiSnips eklentisine müdahale etmemelidir.


1
Otomatik kapanmayı denediniz mi? Sen ile çiftler dışarı atlayabilir )remapping, c-jo kudreti işe.
Kevin

Yanıtlar:


4

Vim'de otomatik olarak eşleşen parantezleri nasıl oluştururum?

Gördüğünüz gibi bu sorun önemsiz değil. Cevap basittir: Sadece bir eklenti gibi AutoClose veya smartinput . Sadece [] tuşlarını saf bir şekilde yeniden eşleştirmek size birkaç satırda edgecases sunacaktır, bu yüzden bu eklentiler yapılır ve neden genellikle oldukça karmaşıktırlar (eğer iyi ise).

Bu yüzden kapatma desteğini takmak için UltiSnips kullandım

Bunun yerine deneyebilirsiniz (orijinal önerimden farklıdır):

inoremap ( ()<CR>=UltiSnips_Anon('$1)$0', ')')<CR>

Burada UltiSnips maçta yer almak (yerine çizgiyi böler main. Bunun için bir snippet eklentisi kullanmayla ilgili sorun, (genellikle) iç içe geçirmeyi desteklememesidir, bu nedenle sonraki (iç içe) snippet yerleştirildiğinde atlama konumlarını unutacaktır.

Küme ayracı çiftinden atlamak için kombinasyon Ctrl-jkullanılır.

Ctrl-jUltiSnips veya çakışan eklenti için yeniden eşleme yapabilirsiniz . Eşlemeler belgelerde listelenmiyorsa :map/imap/nmap <key>, eşlemeyi göstermek için kullanabilirsiniz . Her Ctrl-jiki eklentiyi de seçmek ve seçmek ve yapmak istiyorsanız, şunları istersiniz:

  1. düşündüğünden şüphelendiğimden çok daha gelişmiş bir şey
  2. gerçekten istemediğinden şüphelendiğim bir şey

Bu bash döngüsünü düşünün:

while (( ${arr1[i]} < ${arr2[i<CURSOR>]} )); do
  [next_snippet_position_marker]
done

Bu durumda, Ctrl-jdöngü gövdesine ulaşmak için 5 kez basmanız gerekir . Karşılık gelen çiftin üstünden atlamak için kapanış parantezlerini kullanmak, imlecin hareket etmesini istediğiniz yeri çok daha fazla kontrol etmenizi sağlar. Eklenen çiftleri takip etmek ve kullanmak için bir yığın uygulayabilirsinizCtrl-j etmek ve pop ile taşımak için üzere , ancak parantezleri yığından kaldırmadan manuel olarak silmeye başlarsanız sorun yaşarsınız. Böylece destek eklentilerinin çözmeye çalıştığı sorunları çözmeye başlayacaksınız. Bu yeniden icat etmek zor bir tekerlek.

Bunu genişleterek, Ctrl-jparantez ve snippet'lerden atlamak için başlangıçta istediğinizi alabilirsiniz . Parçacıklar konumlarını temsil etmek için kukla bir değer kullanırsanız ve Ctrl-jparçacıkların veya parantezlerin ele alınmasına karşılık gelen dinamik yeniden eşleme ile bunları kapama parantezlerine ek olarak yığına doğru iterseniz. Ancak, o zaman sihirbazın ne olması gerektiğini anlamak için oldukça gelişmiş bir sezgisel tarama uygulamanız gerekir, çünkü şu anda snippet ekleme eklentilerinin yaratıcıları ve eşleşen eklentileri ayrı ayrı destekleyen şu anda iki sorunu ele alıyorsunuz ve bu sorunları tekrar çözerek , , iyi, büyü kolaylık sağlamak ve, çözümleri.

Konfor ve rahatlığı kontrol altına alır. Bu durumda kontrolün size daha iyi hizmet edeceğini düşünüyorum, yani bu sorunları ve bunlarla ilişkili eklentileri ve tuş eşlemelerini ayrı tutmalısınız. Hala kolaylık istiyorsanız, yapılabilir, ancak zor.


1

Sanırım delimitMate ihtiyacınız olanı yapıyor.

Parantezleri veya tırnak işaretlerini otomatik olarak kapatır ve imlecinizi araya getirir. Parantez çiftinden (ekleme modundayken) atlamak için Ctrl-g+ yapardınız, gancak bunu aşağıdakilere Ctrl-jekleyerek yeniden eşleyebilirsiniz vimrc:

% Jump out of a block of parentheses (uses delimitMate)
imap <C-j> <C-g>g

Burada daha fazla ayrıntı sağlamak ve bağlantıyı daha fazla okuma için referans olarak kullanmak daha iyidir. Bu şekilde, bağlantı geçersiz hale geldiğinde cevabınız tüm değerini kaybetmez.
Anthon

1

Autoclose'ın biraz gecikme eklediğini ve kurulumuma (Ultisnips ve Supertab) müdahale ettiğini gördüm, ancak Eclipse CDT'yi taklit etme yaklaşımını beğendim.

Kullandığım delimitMate aynı sonuçları almaya çalışırken, navigasyon ve girinti yardım için aşağıdaki haritalarla:

imap <C-F> <C-G>g           " To jump out brackets in same line.
inoremap <C-K> <ESC>ki<TAB> " To move and insert an indent on the line before the current cursor (assuming empty line)

Bunu şu şekilde kullanıyorum: { <CR><CR><C-K>girintili iç satıra açma ve yazmaya başlayın


Ben de küçük bir gecikme ekleyerek delimitMate bulundu
icc97

1

Şahsen ben braketleri ve tırnakları otomatik olarak eklemek için smartinput kullanıyorum . Örneğin, {herhangi bir yere yazmak {}imleciniz ortada olacak şekilde üretilir. {Köşeli ayraç grubundan ayrılmak }için, eklenen grubun yanındaki zamanı yazmanız yeterlidir }.

Ancak bu, tablalar ve braketin dışına atlama gereksiniminizi destekler. Ayrıca parantezleriniz arasında yeni bir şey oluşturmaz, ancak bunun için sadece bir ekstra anahtara ihtiyacınız vardır -<CR> .

Bir <C-J>sonraki satıra atlamak için harita oluşturabilirsiniz:

:inoremap <C-J> <C-O>j

veya bir sonraki satırın başına geçmek isterseniz:

:inoremap <C-J> <C-O>+

0

Bunun gibi bir şey sizin için işe yarayabilir.

inoremap {      {}<Left>
inoremap {<CR>  {<CR>}<Esc>O
inoremap {{     {
inoremap {}     {}

Önerdiğiniz şey, kapama ayracı üzerinden atlamaya izin vermeyen basit bir eşlemedir.
Marco

0

Aslında, Ultisnips bunu neredeyse mükemmel yapabilir (bu yeni olabilir). Yukarıda verilen cevapları biraz değiştirerek,

inoremap () ()<C-R>=UltiSnips#Anon('($1)$0', '()', 'double parentheses', 'i')<CR>

Bir türe sahip ()iyi bulmak ama bu şekilde değiştirilebilir (de. Ardından, isteğe bağlı ek bağımsız değişkenler UltiSnips#Anonbir açıklama ve isözcük içi genişlemeye izin veren değiştiricidir .

Parantezlerden <c-j>eserler ile atlamak , diğer parçacıklar içinde de yuvalanmış. Bununla birlikte, iç içe geçmiş ()parantezleri çağırmak, bu özelliği bozmaz gibi görünüyor, ki bu çok önemli değil.

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.