як виявити, чи всередині суміщеної пари?


16

Питання: чи існує загальний спосіб виявити, чи є точка в межах зібраної пари символів чи ні?

Тобто: чи існує загальна функція предиката (чи щось), яка може визначити, чи є точка між між зібраною парою або деякими довільно обраними символами? Я думаю про один, який би оцінив tу, скажімо, наступних сценаріях з !посиланням на пункт:

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

Редагування : syntax-ppssздається, що це є гарною відправною точкою, але мені незрозуміло, як можна було б адаптувати його до пар з декількома символами (наприклад, `` Котирування LaTeX '' або навіть відповідність <b>html tags</b>). Мені цікаво, чи є загальне рішення чи це потребує цілеспрямованого аналізатора.

Відповіді:


16

syntax-ppssможе допомогти тут. Він повертає список, який також містить ці елементи:

  • елемент 0: глибина в паренах
  • елемент 3: ненульовий, якщо всередині рядка

Ви можете використовувати його так:

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

При правильно встановленій таблиці синтаксису в буфері (для рядків і відповідних паронів) функція повинна робити те, що ви очікуєте. Якщо використання таблиці синтаксису режиму неможливо, ніж ви могли вдатися до використання with-syntax-table.


Я мушу зазначити, що docstring parse-partial-sexpпояснює структуру даних, повернуту syntax-ppssбільш детально, ніж розділ ручного Elisp, до якого я посилався.
паприка

2

Якщо ви хочете, наприклад, перевірити, чи немає фігурних дужок, скористайтеся цим:

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

Впевнені, ви можете замінити фігурні брекети на все, що завгодно.

Редагувати:

Більш корисною функцією буде щось близьке до цього:

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

2
Це працює лише в тому випадку, якщо точка закривається }, і між цим немає нічого {}. Отримати парні роздільники правильно за допомогою регулярних виразів може бути складним. Краще використовувати так, syntax-ppsяк запропонував @paprika.
Тайлер

@Tyler працює лише в тому випадку, якщо точка щодо закриття }- це не поведінка, яку я бачив: \ але так, отримати пари за допомогою
regexps

looking-atвивчає текст, починаючи з точки. якщо точка на }вашому першому заяві вище не повинна працювати? Можливо, різниця між версіями Emacs : /
Тайлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.