Comment effectuer un remplacement de requête sensible à la casse?

15

Lorsque je fais M-x query-replacepour remplacer toutes les occurrences de vpar w, cela correspond également à V(majuscule V). Comment forcer emacs à ne trouver que des minuscules v?

Nom
la source
"Insensible à la casse" est le comportement par défaut, où la casse n'a pas d'importance dans la recherche. Si vous ne souhaitez faire correspondre qu’un seul cas, vous devez respecter la casse. (Je pourrais aussi manquer quelque chose, n'hésitez pas à annuler la modification si nécessaire)
T. Verron
@ T.Verron Je suis convaincu maintenant, vous avez raison.
Nom

Réponses:

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

Ou liez cette variable (option) dans votre propre commande qui est autrement juste un wrapper query-replace. Cela a l'avantage de ne pas modifier la valeur de la variable pour une utilisation générale, en dehors du remplacement de requête.

Voir aussi variable case-replace, qui contrôle la casse du texte de remplacement.

Voir aussi C-h f query-replace, où il est écrit, par exemple:

La correspondance est indépendante de la casse si elle case-fold-searchest non nulle et FROM-STRING n'a pas de lettres majuscules. Le remplacement transfère le modèle de casse de l'ancien texte vers le nouveau texte, si case-replaceet case-fold-searchsont non nuls et FROM-STRING n'a pas de majuscule

Voir également les commentaires ci-dessous et le bogue Emacs n ° 20687 , où vous apprendrez comment vous pouvez corriger perform-replacepour vous permettre de basculer le pliage de cas pendant query-replace.


Notez également que le code existant pour les perform-replaceliaisons case-fold-searchde cette manière (notez les variables dont il dépend):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))
A dessiné
la source
Cela aurait été bien de changer case-fold-searchà la volée comme on peut le faire lors de l' isearchutilisation de la M-creliure. Mais malheureusement, query-replacea sa carte de mode.
Kaushal Modi
2
@kaushalmodi: Normalement, ce serait aussi simple que d'ajouter une liaison de clé pour cela à query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))et (define-key query-replace-map "C" 'toggle-case). Mais la gestion des clés dans cette carte est codée en dur perform-replace. Vous voudrez peut-être M-x report-emacs-bug, pour que le perform-replacecode soit plus ouvert, afin que des clés puissent être ajoutées à la carte. Il devrait au moins avoir une clause de secours qui invoque simplement le cmd lié à la clé.
Drew
Merci! Je ne sais pas pourquoi je ne l'ai pas trouvé query-replace-mapavant.
Kaushal Modi
1
J'ai déposé ce rapport de bogue maintenant (# 20687 ). La solution est dans ce rapport de bogue: modifiez simplement perform-replacepour ajouter une condclause supplémentaire qui invoque la clé que vous avez définie dans query-replace-map. Placez la nouvelle clause juste avant la tclause catch-all . Voici la nouvelle clause: (def (call-interactively def)). Rien de plus simple.
Drew
(customize-set-variable case-fold-search nil)donne l'erreur customize-set-variable: Attempt to set a constant symbol: nil. J'ai aussi essayé les deux (setq case-fold-search nil)et (setq case-replace nil)mais la requête correspond toujours au V. majuscule
Nom