Jak wykonać zamianę rozróżniającą wielkość liter zapytania?


16

Kiedy zrobić M-x query-replace, aby zastąpić wszystkie wystąpienia vprzez w, to również mecze V(wielkimi literami V). Jak zmusić emacsa do wyszukiwania małych liter v?


„Bez rozróżniania wielkości liter” to domyślne zachowanie, w którym wielkość liter nie ma znaczenia przy wyszukiwaniu. Jeśli chcesz dopasować tylko jeden przypadek, chcesz „rozróżniać małe i wielkie litery”. (Mogę też coś przeoczyć, w razie potrzeby możesz cofnąć edycję)
T. Verron,

@ T.Verron Jestem teraz przekonany, masz rację.
Imię i nazwisko

Odpowiedzi:


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

Lub powiąż tę zmienną (opcję) w swoim własnym poleceniu, które w przeciwnym razie jest tylko opakowaniem query-replace. Ma to tę zaletę, że nie zmienia wartości zmiennej do ogólnego użytku poza zastępowaniem zapytań.

Zobacz także zmienna case-replace, która kontroluje wielkość liter dla tekstu zastępczego.

Zobacz także C-h f query-replacetam, gdzie jest napisane, na przykład:

Dopasowanie jest niezależne od wielkości liter, jeśli case-fold-searchjest inne niż zero, a FROM-STRING nie ma wielkich liter. Zastąpienie przenosi wzór wielkości liter starego tekstu na nowy tekst, jeśli case-replacei case-fold-searchnie są zerowe, a FROM-STRING nie ma wielkich liter

Zobacz także poniższe komentarze i błąd Emacsa # 20687 , w którym pokazano, jak można załatać, perform-replaceaby umożliwić przełączanie składania skrzynek podczas query-replace.


Zauważ też, że istniejący kod dla perform-replacepowiązań case-fold-searchw ten sposób (zwróć uwagę na zmienne, od których zależy):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))

Byłoby miło, aby zmienić case-fold-searchw locie, jak możemy to zrobić podczas isearchkorzystania z M-cwiązania. Ale niestety query-replacema swoją mapę trybów.
Kaushal Modi

2
@kaushalmodi: Zwykle byłoby to tak proste, jak dodanie powiązania klucza w tym celu query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))i (define-key query-replace-map "C" 'toggle-case). Ale obsługa kluczy na tej mapie jest na stałe zakodowana perform-replace. Możesz chcieć M-x report-emacs-bug, aby perform-replacekod był bardziej otwarty, aby klucze mogły być dodawane do mapy. Powinien mieć przynajmniej klauzulę rezerwową, która po prostu wywołuje cmd powiązane z kluczem.
Drew

Dzięki! Nie jestem pewien, dlaczego wcześniej nie znalazłem query-replace-map.
Kaushal Modi

1
Złożyłem teraz raport o błędzie (# 20687 ). Rozwiązaniem jest ten raport o błędach: wystarczy zmodyfikować, perform-replaceaby dodać dodatkową condklauzulę, która wywołuje zdefiniowany klucz query-replace-map. Umieść nową klauzulę tuż przed klauzulą ​​catch-all t. Jest to nowa klauzula: (def (call-interactively def)). Nie może być prościej.
Drew

(customize-set-variable case-fold-search nil)daje błąd customize-set-variable: Attempt to set a constant symbol: nil. Również próbowałem zarówno (setq case-fold-search nil)i (setq case-replace nil)ale kwerenda jeszcze dopasować wielką V.
Nazwa
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.