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.