bagaimana cara mendeteksi jika di dalam pasangan yang cocok?

16

T: apakah ada cara umum untuk mendeteksi apakah titik ada di dalam pasangan karakter yang cocok atau tidak?

Yaitu: apakah ada fungsi predikat umum (atau sesuatu) yang dapat menentukan apakah titik berada di antara pasangan yang cocok atau beberapa karakter yang dipilih secara sewenang-wenang? Saya sedang memikirkan satu yang akan dievaluasi tdalam, katakanlah, skenario berikut, dengan !merujuk pada poin:

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

Sunting : syntax-ppsstampaknya menjadi titik awal yang baik, tetapi tidak jelas bagi saya bagaimana orang akan mengadaptasinya ke pasangan yang cocok dengan multi-karakter (misalnya, `` kutipan LaTeX '', atau bahkan cocok <b>html tags</b>). Saya bertanya-tanya apakah ada solusi umum, atau apakah itu akan membutuhkan parser yang dibuat khusus.

Dan
sumber

Jawaban:

16

syntax-ppssmungkin bisa membantu di sini. Ini mengembalikan daftar yang juga memiliki elemen-elemen ini:

  • elemen 0: kedalaman dalam parens
  • elemen 3: non-nil jika di dalam string

Anda bisa menggunakannya seperti ini:

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

Dengan mengatur sintaks-tabel dengan benar di buffer (untuk string dan parens yang cocok) fungsi harus melakukan apa yang Anda harapkan. Jika menggunakan sintaks-tabel mode tidak mungkin daripada Anda bisa menggunakan with-syntax-table.

paprika
sumber
Saya harus menunjukkan bahwa dokumentasi parse-partial-sexpmenjelaskan struktur data yang dikembalikan secara syntax-ppsslebih rinci daripada bagian manual Elisp yang saya tautkan.
paprika
2

Jika Anda ingin misalnya memeriksa apakah antara kurung kurawal, gunakan ini:

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

Tentu, Anda dapat mengganti kurung kurawal dengan apa pun yang Anda inginkan.

EDIT:

Fungsi yang lebih bermanfaat adalah sesuatu yang dekat dengan ini:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))
Nsukami _
sumber
2
Itu hanya berfungsi jika titik ada di penutupan }, dan tidak ada di antara keduanya {}. Mendapatkan pembatas yang berpasangan tepat dengan regexps bisa sulit. Lebih baik digunakan syntax-ppsseperti yang disarankan @ paprika.
Tyler
@ Tyler hanya berfungsi jika titik pada penutupan }bukan perilaku yang saya lihat: \ tapi ya, membuat pasangan menggunakan regexps memang rumit, memang
Nsukami _
looking-atmemeriksa teks mulai dari titik. kecuali poinnya ada pada }pernyataan pertama Anda di atas seharusnya tidak bekerja? Mungkin perbedaan antara versi Emacs. : /
Tyler