Forward-sexp'in yalnızca parantezle değil, anahtar kelimelerle tanımlanan blokları tanımasını sağlayın


10

Bloklar gibi anahtar kelimeler ile tanımlanan bir dil (Julia) ise for..end, begin..endyanı sıra parantez, böyle bir bloğunun üzerine atlamak için iyi bir yolu nedir? Ayrıca, endyalnızca bir blok anahtar kelime değil, aynı zamanda başka yerlerde kullanılan geçerli bir tanımlayıcıdır.

Bunun bir yolu, blok başlatma / kapama regex'ini aramak ve tüm dizeleri, yorumları ve endleri vb. Atlamaktır, ancak bu biraz verimsiz ve biraz çirkin.

Emacs'ın kendi sözdizimi ayrıştırma işleminin bu tür blok anahtar kelimeleri tanımasını sağlamanın bir yolu var mı, böylece forward/backward-sexpotomatik olarak çalışacak ve böylece mevcut bloğun başlangıcından çıkışını hızlı bir şekilde anlatabilecek syntax-ppssmi , örneğin ?

[Not: Dosyayı kendim ayrıştırma umursamıyorum, ancak bu durumda ayrıştırıcının emac'ların geri kalanına nasıl takılması gerektiğini hala bilmek istiyorum.]


1
ruby-modeYakut için benzer bir şey yapan bir göz atabilirsiniz . Başka bir seçenek smartparens'e kanca yapmaktır , yakut modu için başlangıç ​​noktası olarak kullanabileceğiniz özel bir konfigürasyona sahiptir
Iqbal Ansari

Yanıtlar:


9

Yerleşik SMIE kütüphanesine bir göz atabilirsiniz (Simple-Minded Indentation Engine). İsme rağmen, girinti sağladığı özelliklerden sadece bir tanesidir. Bu, ruby-modesexp hareketi ve girinti sağlamak için birçok mod tarafından (bir yorumda bahsedilenler dahil) kullanılan yöntemdir .

SMIE'yi bir dil için dağıtmak kabaca iki adımlı bir iştir:

  • belirteçleri belirleyen bir lexer ile birlikte dilinizin dilbilgisini tanımlayın;
  • Girinti kurallarını tanımlar.

Amacınız için sadece ilk adım gerekli!

Genel olarak, ayrıştırıcı bu şekilde tanımladı emacs güzel takılır. Örneğin show-parens, SMIE dilbilgisinde tanımlanan en azından benzer ifadeleri vurgulayacaktır (en azından son emacs sürümlerinde).

syntax-ppssÇevreleyen ortam hakkında bilgi almak için hala kullanamayacağınızı unutmayın , çünkü bu yalnızca sözdizimi tablosu ayrıştırıcısının sonucunu verecektir. Ancak sexp hareket işlevleri (örneğin up-listonu takip eder backward-sexp) yerine geçebilir.


2

Ben yapılan kütüphane bunun için

Bir kez tanımlandıktan sonra, bir dizi komut kullanılabilir, ileri, geri, kopya vb.

--İn sözde kodunu tanımlama:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Tamamlandığında, kullanılabilir olmalı, yani kopyalanmalı ve bu şekilde iade edilmelidir.

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
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.