Como executar a substituição de consulta com distinção entre maiúsculas e minúsculas?

15

Quando eu faço M-x query-replacepara substituir todas as ocorrências de vby w, ele também corresponde V(maiúsculas V). Como forçar o emacs a encontrar apenas letras minúsculas v?

Nome
fonte
"Não diferencia maiúsculas de minúsculas" é o comportamento padrão, onde maiúsculas e minúsculas não importam na pesquisa. Se você deseja corresponder apenas a um caso, é "sensível a maiúsculas" o que você deseja. (Eu poderia perder alguma coisa também, fique à vontade para reverter a edição, se necessário)
T. Verron
@ T.Verron Estou convencido agora, você está certo.
Nome

Respostas:

13
(customize-set-variable case-fold-search  nil)

Ou vincule essa variável (opção) ao seu próprio comando, que é apenas um invólucro query-replace. Isso tem a vantagem de não alterar o valor da variável para uso geral, fora da substituição de consultas.

Consulte também variável case-replace, que controla maiúsculas e minúsculas para o texto de substituição.

Veja também C-h f query-replace, onde diz, por exemplo:

A correspondência é independente do caso, se case-fold-searchnão for nula e FROM-STRING não tiver letras maiúsculas. Substituição transfere o padrão caso do texto antigo para o novo texto, se case-replacee case-fold-searchsão não-nula e FROM-STRING não tem maiúscula

Veja também os comentários abaixo e o bug # 20687 do Emacs , onde mostra como você pode corrigir perform-replacepara permitir alternar entre dobrar as caixas durante query-replace.


Observe também que o código existente para perform-replacevincula case-fold-searchdessa maneira (observe as variáveis ​​das quais depende):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))
Desenhou
fonte
Teria sido bom mudar case-fold-searchrapidamente, como podemos fazer durante o isearchuso da M-cencadernação. Mas, infelizmente query-replace, tem seu mapa de modo.
Kaushal Modi 28/05
2
@kaushalmodi: Normalmente, seria tão simples quanto adicionar uma ligação de chave para isso query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))e (define-key query-replace-map "C" 'toggle-case). Mas o manuseio de chaves nesse mapa é codificado perform-replace. Você pode querer que M-x report-emacs-bugo perform-replacecódigo seja mais aberto, para que as chaves possam ser adicionadas ao mapa. Deveria ter pelo menos uma cláusula de fallback que apenas invoca o cmd associado à chave.
Drew
Obrigado! Não sei por que não encontrei query-replace-mapantes.
Kaushal Modi 28/05
11
Arquivei esse relatório de bug agora (# 20687 ). A solução está nesse relatório de bug: basta modificar perform-replacepara adicionar uma condcláusula adicional que chama a chave que você definiu query-replace-map. Coloque a nova cláusula imediatamente antes da tcláusula geral . Esta é a nova cláusula: (def (call-interactively def)). Não poderia ser mais simples.
Drew
(customize-set-variable case-fold-search nil)dá o erro customize-set-variable: Attempt to set a constant symbol: nil. Também eu tentei tanto (setq case-fold-search nil)e (setq case-replace nil)mas a consulta ainda coincidir com o V. maiúsculas
Nome