Na verdade, existem quatro re-builder
opções de sintaxe diferentes , e você pode alternar entre elas comC-cTAB
Dois são para os compiladores regexp na forma sexp rx
e sregex
(mas como o primeiro é mais abrangente e quase totalmente compatível com a sintaxe, você pode realmente ignorar o sregex, a menos que trabalhe com o código antigo que o usou).
As outras duas opções de sintaxe são read
(o padrão) e string
(que é a sintaxe que você usa interativamente).
A read
sintaxe é a sintaxe 'code' - ou seja, conforme reconhecida pelo lisp reader - na qual você insere o regexp conforme a sintaxe de leitura para strings :
C-hig (elisp) Syntax for Strings
RET
A string
sintaxe (que eu sempre considerei um nome desnecessariamente confuso neste contexto) é a sintaxe de uma sequência de expressões regulares que já foi lida e, portanto, não possui nenhum caractere de escape necessário ao escrever a sequência. Ou seja, esta é a sintaxe da expressão regular real , a mesma que você usa quando o Emacs solicita interativamente.
Se você deseja usar a sintaxe de string por padrão, adicione o seguinte ao seu arquivo init ou use M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Observe que você pode alternar entre a sintaxe de leitura e de seqüência de caracteres ao editar a regexp, sem perda de dados. Você também pode alternar dos formulários sexp para a sintaxe de leitura / string (naturalmente; compilar sexps para strings é para isso que servem essas bibliotecas), mas não pode ir na outra direção e gerar um sexp a partir de uma string. o re-builder lembra qual era o sexp, para que você não perca essa forma ao alterar a sintaxe; mas também não é atualizado se você modificar o regexp em uma sintaxe diferente e depois voltar. Em suma, se você estiver criando o regexp como um sexp, certifique-se de editá- lo apenas ao usar essa sintaxe.
Uma pegadinha com o rx
suporte é que ela está realmente usando a rx-to-string
função, que não é exatamente idêntica a usar a rx
macro no código. rx
aceita um número arbitrário de argumentos de formulário e os trata como uma sequência implícita , enquanto rx-to-string
aceita apenas um único formulário, e qualquer sequência de nível superior deve ser explicitada '(sequence ...)
ou equivalente.
Em resumo, quando você insere um formulário '(...)
no reconstrutor, ele é processado como (rx-to-string '(...))
e não(rx ...)
Observe também que um formulário inválido pode re-builder
interromper a atualização dinâmica das correspondências no buffer associado, mesmo após a validação do formulário. A C-cC-uligação para reb-force-update
é útil para resolver essas situações.
Por padrão, a linha de modo mostra "RE Builder" ao usar read
ou string
sintaxe, e "RE Builder Lisp" ao usar rx
ou sregex
sintaxe, mas parece muito mais útil identificar a sintaxe específica em uso (especialmente para diferenciar entre read
e string
).
Se você instalar o delight
pacote do GNU ELPA, poderá usar o seguinte para adicionar um indicador de sintaxe à linha de modo.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Isso altera o nome do modo para "Regexp [read]" na read
sintaxe e da mesma forma para os outros.
Ou, para incluir uma dica para a pegada rx
vs rx-to-string
descrita acima, faça a linha de modo dizer "Regexp [rx-to-string]" ao usar a rx
sintaxe:
(let ((name '("Regexp["
(:eval (symbol-name (if (eq reb-re-syntax 'rx)
'rx-to-string
reb-re-syntax)))
"]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))