eşleşen bir çift içinde olup olmadığını nasıl tespit edebilirim?


16

S: Noktanın eşleşen bir çift karakter içinde olup olmadığını tespit etmenin genel bir yolu var mı?

Yani, noktanın eşleşen bir çift veya keyfi olarak seçilmiş bazı karakterler arasında olup olmadığını belirleyebilecek genel bir yüklem işlevi (veya bir şey) var mı? tAşağıdaki senaryoları değerlendirmek !için bir noktaya değinerek , şu noktaya değiniyorum:

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

Düzenleme : syntax-ppssiyi bir başlangıç ​​noktası gibi görünüyor, ancak bir kişinin çok karakterli eşleştirilmiş çiftlere (örneğin, `` LaTeX tırnak işaretleri '', hatta eşleşen <b>html tags</b>) nasıl uyarlayacağı net değil . Genel bir çözüm olup olmadığını veya amaca yönelik bir ayrıştırıcı gerektirip gerektirmeyeceğini merak ediyorum.

Yanıtlar:


16

syntax-ppssburada yardımcı olabilir. Bu öğelere sahip bir liste döndürür :

  • element 0: parens cinsinden derinlik
  • eleman 3: bir dize içinde nil olmayan

Bu şekilde kullanabilirsiniz:

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

Tamponda doğru şekilde ayarlanmış bir sözdizimi tablosu ile (dizeler ve eşleşen parenler için) işlev beklediğinizi yapmalıdır. Eğer modun sözdizimi tablosunu kullanmak mümkün değilse kullanmak mümkün değildir with-syntax-table.


Şunu da belirtmeliyim ki, parse-partial-sexpaçıklamanın veri yapısı, geri dönen veri yapısını syntax-ppssbağladığım Elisp el kitabından daha ayrıntılı olarak açıklıyor .
kırmızı biber

2

Örneğin kıvırcık ayraçlar arasında olup olmadığını kontrol etmek istiyorsanız, şunu kullanın:

(and (looking-back "{") (looking-at "}"))

Tabii, kıvırcık parantezleri ne istersen değiştirebilirsiniz.

DÜZENLE:

Daha kullanışlı bir işlev buna yakın bir şey olacaktır:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
Bu sadece nokta kapanış üzerindeyse işe yarar }ve arasında hiçbir şey yoktur {}. Regexps ile eşleştirilmiş sınırlayıcıları doğru şekilde almak zor olabilir. syntax-pps@Paprika önerdiği gibi kullanmak daha iyi .
Tyler

@Tyler sadece kapanış noktası }gördüğüm davranış değilse çalışır : \ ama evet,
regexps

looking-atnoktadan başlayarak metni inceler. }yukarıdaki ilk ifade üzerinde nokta olmadığı sürece işe yaramaz? Belki Emacs sürümleri arasında bir fark olabilir. : /
Tyler
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.