केस-संवेदी क्वेरी-प्रतिस्थापन कैसे करें?


16

जब मैं द्वारा M-x query-replaceहोने वाली सभी घटनाओं को प्रतिस्थापित करने के लिए करता हूं , तो यह भी मेल खाता है (अपरकेस )। Emacs को केवल लोअरकेस खोजने के लिए कैसे मजबूर किया जाए ?vwVVv


"केस-असंवेदनशील" डिफ़ॉल्ट व्यवहार है, जहां खोज में मामला मायने नहीं रखता है। यदि आप केवल एक मामले से मेल खाना चाहते हैं, तो यह "केस-सेंसिटिव" है जो आप चाहते हैं। (मैं भी कुछ याद कर सकते हैं, अगर जरूरत हो तो संपादन को रोलबैक करने के लिए स्वतंत्र महसूस करें)
टी। वेरॉन

@ 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 Bug # 20687 , जहां दिखाते हैं कि आप किस तरह से perform-replaceमामले को मोड़ने के लिए पैच कर सकते हैं query-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करने के दौरान फ्लाई पर बदलना अच्छा होता । लेकिन दुर्भाग्य से इसका मोड मैप है। isearchM-cquery-replace
कौशल मोदी

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कोड को अधिक ओपन-एंड होने के लिए प्राप्त किया जा सके, इसलिए कुंजी को मानचित्र में जोड़ा जा सकता है। इसमें कम से कम एक फ़ॉलबैक क्लॉज़ होना चाहिए जो कि कीम से बंधे हुए सीएमडी को आमंत्रित करता है।
ड्रयू

धन्यवाद! मुझे यकीन नहीं है कि मैं query-replace-mapपहले क्यों नहीं मिला ।
कौशल मोदी

1
मैंने उस बग रिपोर्ट को अभी (# 20687 ) दर्ज किया है। समाधान उस बग रिपोर्ट में है: बस perform-replaceएक अतिरिक्त condक्लॉज जोड़ने के लिए संशोधित करें जो आपके द्वारा परिभाषित कुंजी को लागू करता है query-replace-map। कैच-ऑल tक्लॉज से ठीक पहले नया क्लॉज लगाएं। यह नया क्लॉज है (def (call-interactively def)):। सरल नहीं हो सकता।
ड्रयू

(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 से मेल खाती है
नाम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.