como detectar se dentro de um par correspondente?

16

P: existe uma maneira geral de detectar se o ponto está ou não dentro de um par de caracteres correspondente?

Ou seja: existe uma função de predicado geral (ou algo assim) que pode determinar se o ponto está entre um par combinado ou alguns caracteres escolhidos arbitrariamente? Estou pensando em um que avaliaria t, por exemplo, os seguintes cenários, com !referência ao ponto:

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

Edit : syntax-ppssparece ser um bom ponto de partida, mas não está claro para mim como alguém o adaptaria a pares combinados com vários caracteres (por exemplo, as `` citações do LaTeX '', ou mesmo correspondentes <b>html tags</b>). Eu estou querendo saber se existe uma solução geral, ou se exigiria um analisador criado especificamente para isso.

Dan
fonte

Respostas:

16

syntax-ppsspode ser útil aqui. Ele retorna uma lista que também tem os seguintes elementos:

  • elemento 0: profundidade em parênteses
  • elemento 3: não nulo se estiver dentro de uma string

Você poderia usá-lo assim:

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

Com uma tabela de sintaxe configurada corretamente no buffer (para strings e parens correspondentes), a função deve fazer o que você espera. Se não for possível usar a tabela de sintaxe do modo, você poderá recorrer with-syntax-table.

páprica
fonte
Devo salientar que a documentação parse-partial-sexpexplica a estrutura de dados retornada com syntax-ppssmais detalhes do que a seção do manual do Elisp à qual vinculei.
paprika
2

Se você quiser, por exemplo, verificar se há chaves, use este:

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

Claro, você pode substituir as chaves pelo que quiser.

EDITAR:

Uma função mais útil será algo próximo disso:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))
Nsukami _
fonte
2
Isso só funciona se o ponto estiver no fechamento }e não houver nada entre os {}. Acertar os delimitadores emparelhados com os regexps pode ser complicado. Melhor usar syntax-ppscomo @paprika sugerido.
Tyler
@Tyler só funciona se ponto de fechamento }não é o comportamento que eu vi: \ mas sim, obter os pares usando expressões regulares é complicado, de fato
Nsukami _
looking-atexamina o texto começando no ponto. a menos que aponte }sua primeira declaração acima, não deve funcionar? Talvez uma diferença entre as versões do Emacs. : /
Tyler