Come eseguire la sostituzione di query con distinzione tra maiuscole e minuscole?


15

Quando lo faccio M-x query-replaceper sostituire tutte le occorrenze di vby w, allora corrisponde anche V(maiuscolo V). Come forzare gli emacs a trovare solo lettere minuscole v?


"Distinzione tra maiuscole e minuscole" è il comportamento predefinito, in cui il caso non ha importanza nella ricerca. Se si desidera abbinare solo un caso, è "sensibile al maiuscolo / minuscolo" che si desidera. (Potrei anche perdere qualcosa, sentiti libero di ripristinare la modifica se necessario)
T. Verron,

@ T.Verron Sono convinto ora, hai ragione.
Nome

Risposte:


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

O associa quella variabile (opzione) al tuo comando che altrimenti è solo un wrapper query-replace. Ciò ha il vantaggio di non modificare il valore della variabile per uso generale, al di fuori della sostituzione della query.

Vedi anche variabile case-replace, che controlla il caso per il testo sostitutivo.

Vedi anche C-h f query-replace, dove dice, ad esempio:

La corrispondenza è indipendente dal caso se case-fold-searchè diversa da zero e FROM-STRING non ha lettere maiuscole. La sostituzione trasferisce il modello maiuscolo del vecchio testo nel nuovo testo, se case-replacee case-fold-searchsono diversi da zero e FROM-STRING non ha maiuscole

Vedi anche i commenti qui sotto e il bug # 20687 di Emacs , in cui mostra come applicare le patch perform-replaceper permetterti di attivare o disattivare la piegatura del case durante query-replace.


Si noti inoltre che il codice esistente per si perform-replacelega case-fold-searchin questo modo (notare le variabili da cui dipende):

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

Sarebbe stato bello cambiare case-fold-searchal volo come possiamo fare durante l' isearchuso della M-crilegatura. Ma sfortunatamente query-replaceha la sua mappa delle modalità.
Kaushal Modi,

2
@kaushalmodi: Normalmente, sarebbe semplice come aggiungere un'associazione chiave per questo a query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))e (define-key query-replace-map "C" 'toggle-case). Ma la gestione delle chiavi in ​​quella mappa è codificata perform-replace. È possibile che si desideri che M-x report-emacs-bugil perform-replacecodice sia più aperto, in modo da poter aggiungere le chiavi alla mappa. Dovrebbe almeno avere una clausola di fallback che invoca semplicemente il cmd associato alla chiave.
Drew

Grazie! Non sono sicuro del perché non l'ho trovato query-replace-mapprima.
Kaushal Modi,

1
Ho presentato la segnalazione di bug ora (n. 20687 ). La soluzione è nella segnalazione dei bug: basta modificare perform-replaceper aggiungere una condclausola aggiuntiva che invoca la chiave definita query-replace-map. Inserire la nuova clausola appena prima della tclausola generale. Questa è la nuova clausola: (def (call-interactively def)). Non potrebbe essere più semplice.
Drew

(customize-set-variable case-fold-search nil)dà l'errore customize-set-variable: Attempt to set a constant symbol: nil. Inoltre ho provato entrambi (setq case-fold-search nil)e (setq case-replace nil)ma la query corrisponde ancora alla V maiuscola
Nome
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.