Wie führe ich das Ersetzen von Abfragen durch?

15

Wenn ich tue M-x query-replace, um alle Vorkommen von vdurch zu ersetzen w, dann stimmt es auch überein V(Großbuchstaben V). Wie man Emacs zwingt, nur Kleinbuchstaben zu finden v?

Name
quelle
"Groß- und Kleinschreibung wird nicht berücksichtigt" ist das Standardverhalten, bei dem die Groß- und Kleinschreibung bei der Suche keine Rolle spielt. Wenn Sie nur einen Fall zuordnen möchten, müssen Sie die Groß- und Kleinschreibung berücksichtigen. (Ich könnte auch etwas vermissen, zögern Sie nicht, die Bearbeitung zurückzusetzen, wenn nötig)
T. Verron
@ T.Verron Ich bin jetzt überzeugt, du hast recht.
Name

Antworten:

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

Oder binden Sie diese Variable (Option) in Ihrem eigenen Befehl, der sonst nur ein Wrapper ist query-replace. Dies hat den Vorteil, dass der Variablenwert für die allgemeine Verwendung außerhalb des Ersetzens von Abfragen nicht geändert wird.

Siehe auch Variable case-replace, die Groß- und Kleinschreibung für den Ersetzungstext steuert.

Siehe auch C-h f query-replace, wo es heißt, zum Beispiel:

Die Übereinstimmung ist unabhängig von der Groß- / Kleinschreibung, wenn sie case-fold-searchnicht null ist und FROM-STRING keine Großbuchstaben enthält. Beim Ersetzen wird das Groß- / Kleinschreibungsmuster des alten Textes in den neuen Text übertragen, wenn case-replaceund case-fold-searchohne Null und FROM-STRING kein Großbuchstabe vorhanden ist

Siehe auch die Kommentare unten und den Emacs-Fehler Nr. 20687 , in dem gezeigt wird, wie Sie patchen können perform-replace, um das Falten von Groß- und Kleinschreibung während des Patchens umzuschaltenquery-replace .


Beachten Sie auch, dass der vorhandene Code für perform-replaceBindungen case-fold-searchauf diese Weise (beachten Sie die Variablen, von denen es abhängt):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))
Drew
quelle
Es wäre schön gewesen, die Bindung im Handumdrehen zu wechseln case-fold-search, wie wir es bei der isearchVerwendung der M-cBindung tun können . Hat aber leider query-replaceseine mode map.
Kaushal Modi
2
@kaushalmodi: Normalerweise wäre es so einfach, eine Schlüsselbindung für diese zu query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))und (define-key query-replace-map "C" 'toggle-case). Der Umgang mit Schlüsseln in dieser Karte ist jedoch fest programmiert perform-replace. Möglicherweise möchten Sie M-x report-emacs-bug, dass der perform-replaceCode offener wird, damit Schlüssel zur Karte hinzugefügt werden können. Zumindest sollte es eine Fallback-Klausel geben, die nur den an den Schlüssel gebundenen Befehl aufruft.
Drew
Vielen Dank! Ich bin mir nicht sicher, warum ich es vorher nicht gefunden habe query-replace-map.
Kaushal Modi
1
Ich habe diesen Fehlerbericht jetzt eingereicht (# 20687 ). Die Lösung befindet sich in diesem Fehlerbericht: Ändern Sie einfach perform-replace, um eine zusätzliche condKlausel hinzuzufügen , die den von Ihnen definierten Schlüssel aufruft query-replace-map. Setzen Sie die neue Klausel direkt vor die Catch-All- tKlausel. Dies ist die neue Klausel: (def (call-interactively def)). Einfacher geht es nicht.
Drew
(customize-set-variable case-fold-search nil)gibt den Fehler aus customize-set-variable: Attempt to set a constant symbol: nil. Auch ich habe beide ausprobiert (setq case-fold-search nil)und (setq case-replace nil)aber die Abfrage stimmt immer noch mit dem Großbuchstaben V überein.
Name