Eu usaria o regexp [$]\([a-zA-Z0-9_-]+\)
e a string de substituição ${}
. Aqui está uma explicação para minhas alterações no seu regexp:
-
O caractere
$
corresponde à posição "fim de linha", portanto, é necessário escapá-lo quando corresponder a um literal$
. Usar[$]
em vez de\$
é uma questão de gosto (e reduz as barras invertidas que podem precisar ser escapadas se você quiser traduzir isso para elisp). -
Você não precisa fazer escape da barra invertida
-
dentro da alternativa do personagem, e na verdade você não pode; Incluindo a barra invertida apenas coincide com barras invertidas também. De o manual :As a ‘\’ is not special inside a character alternative, it can never remove the special meaning of ‘-’ or ‘]’. So you should not quote these characters when they have no special meaning either. This would not clarify anything, since backslashes can legitimately precede these characters where they have special meaning, as in ‘[^\]’ (‘"[^\]"’ for Lisp string syntax), which matches any single character except a backslash.
Mas
-
será igual a si mesmo quando usado dentro de uma alternativa de caractere, desde que não possa ser interpretado como parte de um intervalo. Para estar seguro, coloque primeiro ou por último. -
Acho que você não deseja corresponder a um
$
solitário, portanto, use+
em vez de*
. Provavelmente não é um grande negócio, no entanto. -
Por fim, é necessário agrupar o nome da variável em
\(
\)
para que você possa referenciá-lo na string de substituição (como).
Quanto à sua segunda pergunta, você tem várias opções:
-
A opção mais direta é
ESC C-%
. Note queESC
não é uma tecla modificadora, é uma chave de prefixo. -
Você poderia usar o fato de o Emacs interpretar
ESC
eC-[
de forma idêntica e usarC-[ C-%
. -
Você poderia invocar o comando pelo nome como
M-x query-replace-regexp
. -
Ou você pode vincular o comando a uma chave mais conveniente em sua configuração pessoal.