Bagaimana cara mengganti permintaan-sensitif-kasus?

15

Ketika saya lakukan M-x query-replaceuntuk mengganti semua kemunculan voleh w, maka itu juga cocok V(huruf besar V). Cara memaksa emacs hanya menemukan huruf kecilv ?

Nama
sumber
"Case-insensitive" adalah perilaku default, di mana case tidak masalah dalam pencarian. Jika Anda hanya ingin mencocokkan satu case, "case-sensitive" yang Anda inginkan. (Saya mungkin kehilangan sesuatu juga, jangan ragu untuk mengembalikan hasil edit jika diperlukan)
T. Verron
@ T. Verron Saya yakin sekarang, Anda benar.
Nama

Jawaban:

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

Atau ikat variabel itu (opsi) dalam perintah Anda sendiri yang jika tidak hanya pembungkus saja query-replace. Ini memiliki keuntungan bahwa itu tidak mengubah nilai variabel untuk penggunaan umum, di luar penggantian-permintaan.

Lihat juga variabel case-replace, yang mengontrol case untuk teks pengganti.

Lihat juga C-h f query-replace, di mana dikatakan, misalnya:

Matching tidak tergantung pada case jika case-fold-searchnon-nil dan FROM-STRING tidak memiliki huruf besar. Penggantian memindahkan pola huruf dari teks lama ke teks baru, jika case-replacedan case-fold-searchtidak nol dan FROM-STRING tidak memiliki huruf besar

Lihat juga komentar di bawah ini, dan bug Emacs # 20687 , di mana tunjukkan bagaimana Anda dapat menambal perform-replaceuntuk memungkinkan Anda beralih lipat case query-replace.


Perhatikan juga bahwa kode yang ada untuk perform-replacemengikat case-fold-searchdengan cara ini (perhatikan variabel yang bergantung padanya):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))
Drew
sumber
Akan menyenangkan untuk mengganti case-fold-searchdengan cepat seperti yang bisa kita lakukan selama isearchmenggunakan M-cpenjilidan. Namun sayangnya query-replacememang sudah memiliki modenya peta.
Kaushal Modi
2
@kaushalmodi: Biasanya, akan sesederhana menambahkan kunci yang mengikat untuk itu ke query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))dan (define-key query-replace-map "C" 'toggle-case). Tetapi penanganan kunci di peta itu sulit dikodekan perform-replace. Anda mungkin ingin M-x report-emacs-bug, untuk membuat perform-replacekode menjadi lebih terbuka, sehingga kunci dapat ditambahkan ke peta. Setidaknya harus memiliki klausa mundur yang hanya memanggil cmd yang terikat pada kunci.
Drew
Terima kasih! Tidak yakin mengapa saya tidak menemukan query-replace-mapsebelumnya.
Kaushal Modi
1
Saya sudah mengajukan laporan bug itu sekarang (# 20687 ). Solusinya ada di laporan bug itu: Cukup modifikasi perform-replaceuntuk menambahkan condklausa tambahan yang memanggil kunci yang telah Anda tetapkan query-replace-map. Letakkan klausa baru tepat sebelum klausa catch-all t. Ini adalah klausa baru:(def (call-interactively def)) . Tidak bisa lebih sederhana.
Drew
(customize-set-variable case-fold-search nil)memberikan kesalahan customize-set-variable: Attempt to set a constant symbol: nil. Saya juga mencoba keduanya (setq case-fold-search nil)dan (setq case-replace nil)tetapi kueri masih cocok dengan huruf besar V.
Nama