यदि पूर्ण मिलान नहीं है तो Isearch string के भाग को हटा दें, या अंतिम char को हटा दें


11

मेरे पास निम्नलिखित है

(defun isearch-del-fail-or-char ()
  "Delete failed isearch text, or if there is none, a single character."
  (interactive)
  (if (isearch-fail-pos)
      (delete-region (isearch-fail-pos) (point))
    (isearch-del-char)))

(define-key isearch-mode-map (kbd "DEL") 'isearch-del-fail-or-char)

कोड का उद्देश्य deleteपूरे असफल स्ट्रिंग को हटाने के लिए खोज में बनाना है (या यदि कोई एकल स्ट्रिंग केवल एक असफल स्ट्रिंग नहीं है)।

हालाँकि, delete-regionबफ़र से पाठ को हटाना isearchखोज रहा है, न कि खोज बफ़र स्वयं।

ऐसा करने का उचित तरीका क्या है? बाकी मेरे इमैक लिस्प स्टाइल पर क्रिटिक का भी स्वागत है :)

जवाबों:


12

आह येस। Isearch आपके द्वारा लिखी गई कुंजियों को पढ़ता है, उन्हें ऊपर देखता है isearch-mode-mapऔर वर्तमान बफ़र में इनवॉइस करता है ।

खोज , दिखावे के बावजूद, मिनीबफ़र का उपयोग नहीं करता है । यह इको क्षेत्र का उपयोग करता है। यही है, जो आप देखते हैं वह वास्तव में आउटपुट संदेश है, जिसमें आपके द्वारा टाइप किए गए पात्रों की गूँज शामिल है।

यह वही करना चाहिए जो आप पूछते हैं:

(defun mydelete ()
  "Delete the failed portion of the search string, or the last char if successful."
  (interactive)
  (with-isearch-suspended
      (setq isearch-new-string
            (substring
             isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
            isearch-new-message
            (mapconcat 'isearch-text-char-description isearch-new-string ""))))

(define-key isearch-mode-map (kbd "DEL") 'mydelete)

(BTW, आपका सवाल deleteचरित्र कहता है , लेकिन आपने लिखा है DEL, जो बैकस्पेस वर्ण है।)


जैसा कि @Malabarba एक टिप्पणी में बताता है, जब आप नए खोज स्ट्रिंग को ""(खाली स्ट्रिंग) पर सेट करते हैं , with-isearch-suspendedतो अंतिम खोज स्ट्रिंग के लिए खोज करके फिर से शुरू होता है, बजाय एक खाली खोज स्ट्रिंग के साथ शुरू करने के।

यह सामान्य रूप से " सुविधा " है with-isearch-suspended। लेकिन क्योंकि आप कभी-कभी इस खोज को नियंत्रित करने के लिए, isearch + .el के चर with-isearch-suspendedमें संस्करण के लिए खोज स्ट्रिंग को फिर से शुरू करने के लिए खाली करना चाह सकते हैं । यदि आप इसे बांधते हैं और आप फिर से खोज करते हैं तो खाली खोज स्ट्रिंग के साथ फिर से शुरू करें।isearchp-if-empty-prefer-resuming-with-lastnilisearch-new-string""

तो Isearch + के साथ आप वही कर सकते हैं जो आप इस परिभाषा के साथ चाहते हैं:

(defun mydelete ()
  "Delete the failed portion of the search string, or the last char if successful."
  (interactive)
  (let ((isearchp-if-empty-prefer-resuming-with-last  nil))
    (with-isearch-suspended
        (setq isearch-new-string
              (substring
               isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
              isearch-new-message
              (mapconcat 'isearch-text-char-description isearch-new-string "")))))

मैं भी अब कि Emacs 24.4 प्रतिगमन, जो मैं मामला दर्ज किया है शुरू की नोटिस Emacs बग # 20466 के लिए, जिसका अर्थ है कि बंधन DELमें isearch-mode-mapपर्याप्त नहीं है। उन्होंने <backspace>इसके लिए एक के अलावा एक अलग बंधन जोड़ा DEL। इसका मतलब यह है कि <backspace>अब खोज के DELलिए ( अनुवाद नहीं किया जाता है , लेकिन आम तौर पर Emacs के लिए इसका अनुवाद अभी भी मिलता है)।

तो अगर आप बैकस्पेस कुंजी क्या आप Emacs 24.4 में पूछा या बाद में तो तुम सिर्फ बाध्य नहीं कर सकते हैं क्या करना चाहते DELकरने के लिए mydelete। आपको बांधने की जरूरत <backspace>है mydelete। गूंगा, AFAICT, n'arrete pas le progres पर माईस ...


मैं करने के लिए एक समान आदेश जोड़ दिया है iSearch + और यह करने के लिए बाध्य C-M-l(समान में एक पूरा होने के बेमेल निकालने के लिए किया कुंजी Icicles )।

इस बात से भी अवगत रहें कि खोज C-gमें भी, जब कोई मिसमैच होगा, बेमेल टेक्स्ट को हटा दें। (लेकिन C-gखोज सफल होने पर प्रभाव भी पड़ता है।)


मुझे इस बात का उल्लेख करना चाहिए था कि इस्क्रा + में भी कुछ समय के लिए इसी तरह की लाइनों के साथ एक वैकल्पिक व्यवहार रहा है। M-k3 व्यवहारों के बीच इस्केल टॉगल के दौरान, जिसे विकल्प के मूल्य द्वारा नियंत्रित किया जाता है isearchp-drop-mismatch:

  • replace-last- आपका वर्तमान इनपुट अंतिम बेमेल पाठ को बदल देता है। आप हमेशा अपना अंतिम इनपुट देख सकते हैं, भले ही वह बेमेल हो। और यह प्रयोग करके संपादन के लिए उपलब्ध है M-e

  • nil - आपका वर्तमान इनपुट संलग्न है, भले ही पिछले इनपुट में एक बेमेल हिस्सा हो।

  • कुछ और - यदि आपके वर्तमान इनपुट को अनदेखा किया जाता है (हटा दिया जाता है) तो यह एक बेमेल का कारण बनता है। खोज स्ट्रिंग में हमेशा सफल मैच होते हैं।


BTW, मैंने Isearch + के लिए एक समान कमांड जोड़ने के बारे में सोचा है जब से मैंने असफल भाग का हाइलाइटिंग जोड़ा है (वर्षों पहले, जब मैंने इसे GNU Emacs में जोड़ा था), लेकिन मुझे इसके आसपास कभी नहीं मिला। मैंने अब ऐसा किया है । (हालांकि, मैंने एक चरित्र को हटाना शामिल नहीं किया था। मैंने जो आदेश जोड़ा था, वह एक न-ऑप है यदि कोई असफल भाग नहीं है।)
आकर्षित

मैं OS X पर हूं। मेरा मतलब था कि पीछे की तरफ हटना।
asmeurer

Isearch + प्रतिस्थापित-अंतिम व्यवहार बहुत अच्छा लगता है। हालांकि हर बार घंटी बजने का कोई रास्ता नहीं है, हालांकि खोज विफल रहती है?
asmeurer

2
मैंने का एक नया संस्करण अपलोड किया है isearch+.el। यह (ए) स्वचालित बेमेल हटाने को ठीक करता है ताकि रैपराउंड ठीक काम करे। और यह एक विकल्प जोड़ता है isearchp-ring-bell-function, जिसका उपयोग आप खोज के दौरान घंटी को दबाने के लिए कर सकते हैं।
आकर्षित किया

3
मालाबार, दिलचस्प। मैं बग पर एक शॉट ले लिया और साथ समाप्त हो गया इस । ज्यादातर कार्गो- isearch-del-charड्रू के जवाब से खेती की जाती है लेकिन यह उद्देश्य के अनुसार काम करता है। with-isearch-suspendedमैक्रो अपराधी था।
jbm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.