Substituição de consulta do Emacs com transformação textual
Pergunta
Quero encontrar qualquer texto em um arquivo que corresponda a uma expressão regular do formato t[A-Z]
você (ou seja, uma correspondência t seguido por uma letra maiúscula e outra correspondência você, e transforme o texto correspondente para que a letra maiúscula fique minúscula.Por exemplo, para a expressão regular x[A-Z]y
xAy
torna-se
xay
e
xZy
torna-se
xzy
Emacs' query-replace
A função permite referências anteriores, mas AFAIK não a transformação do texto correspondente.Existe uma função interna que faz isso?Alguém tem uma função Elisp curta que eu possa usar?
ATUALIZAR
@Marcel Levy tem: \,
em uma expressão de substituição introduz uma expressão Elisp (arbitrária?).Por exemplo, a solução para o acima é
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
Solução
Parece Steve Yegge na verdade, já postei a resposta para isso há alguns anos: "Brilhante e novo:Emacs 22." Role para baixo até "Alterando maiúsculas e minúsculas em strings de substituição" e você verá o código de exemplo dele usando o replace-regexp
função.
A resposta geral é que você usa "\," para chamar qualquer expressão lisp como parte da string de substituição, como em \,(capitalize \1)
.Lendo o texto de ajuda, parece que está apenas no modo interativo, mas esse parece ser o local onde isso seria mais necessário.
Outras dicas
Uma alternativa ao qrr neste caso é gravar uma macro e reproduzi-la.(isearch-forward-regexp, selecione o caractere, downcase-region.) Acho as macros dinâmicas mais fáceis, pois você obtém feedback imediato se seu regexp estiver errado.
Eu também faria isso com uma macro, mas apenas porque executar código a partir de uma string de substituição para uma expressão regular não é muito intuitivo para mim.Se você estiver escrevendo um script em lote ou algo que precisa ser executado muito rápido, \, certamente é o caminho a seguir.