Gostaria de alterar todas as ocorrências de uma string (digamos string1) por outra string (digamos string2) e vice-versa. Para ser preciso, tenho um documento longo e essas seqüências ocorrem muitas vezes. O que eu faço atualmente é substituir string1 -> string3, depois string2 -> string1 e finalmente string3 -> string2.
Gostaria de saber se já existe uma função no emacs que faça isso. Outras soluções são bem-vindas.
Editar : na verdade, é uma duplicata da pergunta vinculada no comentário. Mas o problema é que a resposta aceita para essa pergunta nem sempre funciona (veja o comentário abaixo). Eu acho que é melhor esperar até que o autor dessa resposta aceita corrija sua resposta ou alguma outra solução saia. Em segundo lugar, antes de postar minha pergunta, pesquisei no Google e essa pergunta não apareceu. Eu acho que ter duas perguntas duplicadas às vezes é útil, pois elas usam palavras diferentes e se um usuário encontrar a duplicada, ele poderá encontrar a correta.
Editar 2: a resposta aceita do recurso de pesquisa / substituição para troca de texto parece estar bem agora.
fonte
backwards
eregion-noncontiguous-p
) na chamada deperform-replace
faz com que funcione aqui (emacs 24.3). Vou testá-lo no emacs 25 quando tiver uma ocasião antes de editar a outra resposta.Respostas:
Para o caso interativo, query-replace-regexp (CM-%) pode fazer isso, usando o relativamente desconhecido \, para a substituição.
Se o texto de substituição contiver \, seguido de uma expressão lisp, ele usará o valor dessa expressão como substituição. Nesse caso, a expressão é um "se" que aceita uma condição e o valor de retorno para os casos verdadeiros e falsos.
Nos comentários, sugere-se usar
Isso funciona porque \ 1 será "string1" se o padrão corresponder a string1 e será nulo caso contrário. Lisp considera verdadeiro qualquer valor não nulo. Embora isso funcione e seja mais curto, acho que minha resposta é mais útil. Eu acho que o código é mais legível para alguém cujo conhecimento do cisco é limitado. Tem uma segunda vantagem, pois ainda funciona se o padrão "de" for fornecido como
ou mesmo
fonte
\,(if \1 "string2" "string1")
, usando o regexp\(string1\)\|string2
.(emacs) Regexp Replace
.Bem, talvez com uma macro isso seja fácil:
F3C-s
a
RETC-bM-tF4. O uso dessa macro em sua pergunta grita este resultado:Estou transpondo posições entre qualquer palavra que está atrás de uma
a
e essa palavra. Mais tarde, você pode editar essa macro para transpor outras palavras, sem precisar redefinir a macro inteira, com a qual você pode editar C-xC-kRET.fonte