как обнаружить, если внутри совпадающей пары?

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.

паприка
источник
Я должен отметить, что строка документации 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 работает только в том случае, если точка закрытия }не соответствует поведению, которое я видел: \ да, получить пары с помощью
регулярных выражений
looking-atисследует текст, начиная с точки. разве точка на }вашем первом утверждении выше не должна работать? Может быть, разница между версиями Emacs. : /
Тайлер