Bekleyen tüm parantezlerin kapatılması


15

Lisp kodları yazarken, bazen iç içe bir ifadede derinim ve tüm istediğim tüm eksik kapanış parantezini eklemektir. Şu anda bunları, uyumsuz bir paren elde edene kadar yerleştiriyorum, ancak çok verimli değil.
Tüm eksik parantezleri eklemek için herhangi bir komut var mı?

Bilginize, eşleşen parensleri otomatik olarak eklemek için smartparens kullanıyorum. Yine de, bazen bunu yapmam gerekiyor.


3
FWIW, Franz Lisp (CL'den önce), istediğiniz ]gibi tüm açık parensleri kapatan süper sağ paren gibi davranan bir özelliğe sahipti .
Drew

2
Geçmişte aynı metodolojiyi kullandım. O zamandan beri paredit kullanmaya başladım , bu da sorunu başlamadan önce durduruyor. Tek uyarı, kod yapıştırmanın aynı dengeleme tedavisini almamasıdır.
elarson

Yanıtlar:


6

İşte kapatılmamış tüm parantezleri ve diğer eşleşen çiftleri kapatan bir işlev. Emacs'ın seks ayrıştırma işlemine dayanır. Sadece tek karakterli eşleştirilmiş çiftleri destekler, bu yüzden böyle bir şey {-kapatılacak }, değil -}. Lisp için bu önemli değil.

(defun close-all-parentheses ()
  (interactive "*")
  (let ((closing nil))
    (save-excursion
      (while (condition-case nil
         (progn
           (backward-up-list)
           (let ((syntax (syntax-after (point))))
             (case (car syntax)
               ((4) (setq closing (cons (cdr syntax) closing)))
               ((7 8) (setq closing (cons (char-after (point)) closing)))))
           t)
           ((scan-error) nil))))
    (apply #'insert (nreverse closing))))

IIUC, Bu noktanın eşleşen herhangi bir parantez içinde olmasını gerektirmez. OQ'nun bir lisp ifadesinin içinden çalışması gereken izlenim altındaydım, burada yapılan parantezler eşleşmeyecek, ancak diğerleri olmayacak.
Malabarba

@Malabarba Bu noktadan sonra eşleşen kapanış parantezleri olsun ya da olmasın, önceden açılan tüm parantezleri kapatır. Soruyu bu şekilde anlıyorum, ancak bu noktada kuşkusuz net değil. Yorumunuz altında, kapanış sınırlayıcıları nereye eklenir? Örneğin ([-!-foo], herhangi bir ])noktaya veya )sonrasına ekliyor foo]musunuz?
Gilles 'SO- kötü olmayı bırak

benim anlayışımdan, eğer varsa ([-!-foo], )sonra eklerdim foo]. Ama tabii ki yanlış olabilirim. Belki @rlazo ayrıntılandırabilir.
Malabarba

kullanım durumum için, @Gilles haklı, sınırlayıcıların noktadan sonra kapatılıp kapatılmadığı umurumda değil, noktadan önce her şeyi kapatmak istiyorum.
rlazo

3

Balçık takılmışsa, bunu yapmak için bir komut olduğunu öğrendim, slime-close-all-parens-in-sexp


Hmm ... yani mevcut satırda kapanıyor gibi görünüyor. "Şu anki bloğu" kapatan bir yaklaşımın olması hoş olabilir. Bu, dosyanın sonuna gidip, hiçbir şey bulunamayana kadar sexp'i geriye doğru hareket ettirerek elde edilebilir.
Att Righ

1

Bunu yapmanın çok ilkel (ve kesinlikle yanlış) bir yolu

(defun buffer-needs-parens-fixing ()
  (save-excursion
    (condition-case nil
        (check-parens)
      (error (point)))))

(defun buffer-fix-parens ()
  (interactive)
  (while (buffer-needs-parens-fixing)
    (insert ")")))

Diğer sınırlamaların yanı sıra, yerleştirilmesi gereken tüm parantezlerin:

  • kapananlar
  • mevcut konumda gerekli

Sanırım özel kullanım durumunuz için faydalı olmak yeterli olabilir


Çok fazla kapanış paranteziniz varsa, bu sonsuz bir döngüde sıkışır.
Emil Vikström

@ EmilVikström evet, bu benim ilk belirtilen sınırlamamla uyumlu değil :)
Sigma
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.