วิธีการดำเนินการแทนแบบสอบถามแบบตามตัวพิมพ์ใหญ่ - เล็ก?


15

เมื่อฉันทำM-x query-replaceเพื่อแทนที่ทั้งหมดที่เกิดขึ้นvโดยwมันก็ตรงกับV(ตัวพิมพ์ใหญ่V) จะบังคับให้ emacs ค้นหาตัวพิมพ์เล็กได้vอย่างไร


"ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่" เป็นลักษณะการทำงานเริ่มต้นโดยไม่ต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในการค้นหา หากคุณต้องการจับคู่เพียงหนึ่งกรณีนั่นคือ "ตรงตามตัวพิมพ์ใหญ่ - เล็ก" ที่คุณต้องการ (ฉันอาจจะพลาดบางสิ่งบางอย่างด้วยเช่นกันคุณสามารถย้อนกลับการแก้ไขหากจำเป็น)
T. Verron

@ T.Verron ตอนนี้ฉันมั่นใจแล้วคุณพูดถูก
ชื่อ

คำตอบ:


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

หรือผูกที่ตัวแปร (ตัวเลือก) query-replaceในคำสั่งของคุณเองที่เป็นอย่างอื่นเป็นเพียงแค่กระดาษห่อรอบ สิ่งนี้มีข้อดีที่จะไม่เปลี่ยนค่าตัวแปรสำหรับการใช้งานทั่วไปนอกเหนือจากการแทนที่แบบสอบถาม

ดูเพิ่มเติมที่ตัวแปรcase-replaceซึ่งควบคุมขนาดตัวพิมพ์สำหรับข้อความการแทนที่

ดูเพิ่มเติมC-h f query-replaceที่ข้อความระบุไว้ตัวอย่างเช่น:

การจับคู่นั้นcase-fold-searchไม่ขึ้นอยู่กับตัวพิมพ์ใหญ่ - เล็กถ้าไม่ใช่ศูนย์และ FROM-STRING ไม่มีตัวอักษรตัวใหญ่ การเปลี่ยนถ่ายโอนรูปแบบตัวพิมพ์ของข้อความเก่าไปยังข้อความใหม่หากcase-replaceและ case-fold-searchไม่ใช่แบบไม่มีศูนย์และ FROM-STRING ไม่มีตัวพิมพ์ใหญ่

ดูเพิ่มเติมความคิดเห็นด้านล่างและ Emacs ข้อผิดพลาด # 20687ซึ่งแสดงให้เห็นว่าคุณสามารถแก้ไขเพื่อให้คุณสลับกรณีพับในช่วงperform-replacequery-replace


โปรดสังเกตว่ารหัสที่มีอยู่สำหรับการperform-replaceผูกcase-fold-searchด้วยวิธีนี้ (โปรดสังเกตตัวแปรที่ขึ้นอยู่กับมัน):

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

มันจะเป็นการดีที่จะเปลี่ยนcase-fold-searchทันทีที่เราสามารถทำได้ในระหว่างการisearchใช้การM-cผูก แต่น่าเสียดายที่query-replaceมีแผนที่โหมด
Kaushal Modi

2
@kaushalmodi: โดยปกติก็จะเป็นง่ายๆเป็นเพิ่มคีย์ผูกพันเพื่อที่จะquery-replace-map: และ(defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search))) แต่การจัดการของคีย์ในแผนที่ว่าเป็นเรื่องยากในรหัส(define-key query-replace-map "C" 'toggle-case) perform-replaceคุณอาจต้องการM-x report-emacs-bugรับperform-replaceรหัสให้เป็นแบบปลายเปิดมากขึ้นเพื่อให้สามารถเพิ่มรหัสลงในแผนที่ได้ อย่างน้อยควรมีประโยคทางเลือกที่จะเรียก cmd ที่ถูกผูกไว้กับกุญแจ
Drew

ขอบคุณ! ไม่แน่ใจว่าทำไมฉันไม่เคยพบquery-replace-mapมาก่อน
Kaushal Modi

1
ฉันได้ยื่นรายงานข้อผิดพลาดนั้นตอนนี้ (# 20687 ) การแก้ปัญหาคือในรายงานข้อผิดพลาดที่: เพียงแค่ปรับเปลี่ยนperform-replaceเพื่อเพิ่มอีกข้อที่จะเรียกสำคัญที่คุณได้กำหนดไว้ในcond query-replace-mapใส่ข้อใหม่เพียงก่อนที่จะจับทุกtข้อ (def (call-interactively def))นี่คือประโยคใหม่: ไม่ง่ายกว่านี้อีกแล้ว
Drew

(customize-set-variable case-fold-search nil)customize-set-variable: Attempt to set a constant symbol: nilจะช่วยให้เกิดข้อผิดพลาด ฉันลองทั้งสองอย่าง(setq case-fold-search nil)แล้ว(setq case-replace nil)แต่ข้อความค้นหายังคงตรงกับตัวพิมพ์ใหญ่ V.
ชื่อ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.