मैं टाइप के रूप में घुलनशील कैफ़ल फिक्सिंग


23

मेरे पास एक धीमी पिंकी है। जैसे-जैसे मेरी अन्य उंगलियां टाइपिंग में तेज और तेज होती जाती हैं, मेरी पिंकी बस ऊपर नहीं रख सकती। यह अक्सर मुझे ऐसे वाक्य लिखने के लिए प्रेरित करता है जिसका पहला शब्द दो बड़े अक्षरों से शुरू होता है। यहाँ एक छोटा उदाहरण है।

THere's nothing in there. DEfinitely not a body.

आमतौर पर मैं जो करता हूं वह हिट होता है M-b M-c(मैं इसे तुरंत हाजिर कर देता हूं), लेकिन मैं इससे थोड़ा थक गया हूं।

मैं Emacs को अपने लिए कैसे ठीक कर सकता हूं?

यही है, मुझे लगता है कि जब मैं एक शब्द टाइप करता हूं, जो दो अपरकेस अक्षर के साथ शुरू होता है, तो कम से कम एक लोअरकेस अक्षर के साथ शुरू होता है, और यह स्वचालित रूप से ठीक करता हूं।

जवाबों:


19

यहां एक फ़ंक्शन है जो घुलनशील कैफ़ल को सिंगल कैपिटल में बदल देगा। मैंने मूल रूप से इसे जोड़ने का सुझाव दिया था post-self-insert-hook, लेकिन नीचे एक संक्षिप्त गौण विधा के लिए एक विकल्प है ताकि आप केवल उस हुक को जोड़ सकें जब आप चाहते हैं:

(defun dcaps-to-scaps ()
  "Convert word in DOuble CApitals to Single Capitals."
  (interactive)
  (and (= ?w (char-syntax (char-before)))
       (save-excursion
         (and (if (called-interactively-p)
                  (skip-syntax-backward "w")
                (= -3 (skip-syntax-backward "w")))
              (let (case-fold-search)
                (looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]"))
              (capitalize-word 1)))))

(add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)

और मामूली मोड परिभाषा:

(define-minor-mode dubcaps-mode
  "Toggle `dubcaps-mode'.  Converts words in DOuble CApitals to
Single Capitals as you type."
  :init-value nil
  :lighter (" DC")
  (if dubcaps-mode
      (add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)
    (remove-hook 'post-self-insert-hook #'dcaps-to-scaps 'local)))

इस संस्करण का उपयोग करते हुए, इसके लायक क्या है:

  • सरल है: बस इसे मैन्युअल रूप से या मोड हुक में चालू / बंद करें;
  • कुंजी बाइंडिंग में कोई परिवर्तन करने की आवश्यकता नहीं है, इसलिए आप कोई अन्य कार्यक्षमता नहीं खो रहे हैं।

यहां तक ​​कि जब आप इसे जोड़ते हैं post-self-insert-hook, तो ओवरहेड लगभग न के बराबर होता है, कम से कम कुछ साधारण बेंचमार्किंग के अनुसार। मेरी मशीन पर, यहां मुझे 10,000 पुनरावृत्तियों में से प्रत्येक के साथ एक बहुत ही सरल रूप और dcaps-to-scapsफ़ंक्शन के साथ मिलता है:

(benchmark-run-compiled 10000 (+ 1 1))          ; => .001 to .003 -ish
(benchmark-run-compiled 10000 (dcaps-to-scaps)) ; => .003 to .006 -ish

तो, हाँ, यह 1 + 1 को जोड़ने की तुलना में धीमा है, लेकिन पूर्ण शब्दों में आप कभी नोटिस नहीं करेंगे।


आप उपयोग कर सकते हैं looking-at-p, जो मैच डेटा को बिल्कुल भी सेट नहीं करता है (यह ठीक है क्योंकि आपको इसकी आवश्यकता नहीं है या इसका उपयोग यहां नहीं किया गया है)।
यंगफ्रॉग

कुछ और टिप्पणियों, ज्यादातर महत्वहीन (लेकिन मैं तो मैं योगदान करना चाहते हैं अपने जवाब पसंद करते हैं; पी): के उपयोग के forward-wordसाथ अच्छी तरह से काम नहीं करेगा subword-mode, का उपयोग कर (char-syntax (char-before))देंगे (मुझे लगता है) गुणों के साथ किसी भी वाक्य रचना वर्ग सेट पर ध्यान न दें (वैकल्पिक समाधान: (syntax-after (1- (point))) , और (अंतिम लेकिन कम से कम) रेक्सएक्सपी को उच्चारण पत्र नहीं मिलेंगे (जैसे "inMincer", फ्रेंच में)
यंगफ्रॉग

@YoungFrog: forward-wordसमस्या से निपटने के लिए अपडेट किया गया , और उच्चारण की राजधानियों से निपटने के लिए regexp को बदल दिया।
डैन

वहाँ पसंद करते हैं करने के लिए एक कारण है andके ऊपर whenपहले उदाहरण में विशेष रूप से,?
क्लेमेंट

@ क्लेमेंट: andशॉर्ट-सर्कुलेटेड है, इसलिए तर्क whenयहां काम करता है। मुझे यकीन नहीं है कि अगर एक बनाम दूसरे का उपयोग करने के बारे में सबसे अच्छे अभ्यास हैं, लेकिन ऐसा लगता है कि यह इस साइट पर एक अच्छा सवाल बना देगा (मैं वैसे भी अपवोट करूंगा)।
दान

8

मेरी प्राथमिकता बस एक नया कार्य करना है जो सामान्य रूप self-insert-commandसे अधिक कार्य करेगा ।

यहाँ कुछ कारण हैं:

  • महीन नियंत्रण जिस पर प्रमुख मोड में यह ऑटो-करेक्टिंग क्षमता होनी चाहिए। उपयोग के इस मामले के लिए, यह हो सकता है केवल-पाठ मोड की तरह org-mode, text-modeआदि
  • सुधार के प्रकार के प्रश्न में अनुरोध के लिए, उपयोगकर्ता आमतौर पर मारते थे SPCया RETया .शब्द के बाद कुंजी। इसलिए कुछ का उपयोग करना post-self-insert-hookएक ओवरकिल हो सकता है, और हम हर बार जब हम किसी भी कुंजी को मारते हैं तो हम उस अतिरिक्त प्रसंस्करण को करेंगे।

तो नीचे प्रस्तावित समाधान इस फ़ंक्शन को केवल SPCकुंजी org-mode-map(कोने के मामले को अनदेखा करता है जहां शब्द एक पंक्ति में अंतिम शब्द हो सकता है) के साथ बांधता है । यदि आवश्यक हो, तो उपयोगकर्ता इसी तरह के आवरण कार्यों को अधिक कुंजियों से बांध सकता है।

(defun space-plus-more ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (self-insert-command 1))

(define-key org-mode-map (kbd "<SPC>") #'space-plus-more)

यह एक दिलचस्प व्यायाम है :)

मैं व्यक्तिगत रूप से इसे बांधना नहीं चाहूंगा RETक्योंकि तब मैं डिफ़ॉल्ट बाइंडिंग खो दूंगा org-modeऔर शायद अन्य प्रमुख मोड भी। लेकिन इसके बारे में सीखना दिलचस्प था eltऔर this-command-keys-vector

(defun my/fix-double-caps ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (if (eq 13 (elt (this-command-keys-vector) 0)) ; detect RET
      (newline)
    (self-insert-command 1)))

(let ((maps-list (list org-mode-map
                       text-mode-map))
      (keys-list (list "<SPC>" "<RET>" ".")))
  (dolist (map maps-list)
    (dolist (key keys-list)
      (define-key map (kbd key) #'my/fix-double-caps))))

ओह, इसे पाठ-व्युत्पन्न मोड तक सीमित करना निश्चित रूप से एक अच्छा विचार है। :)
मालाबार

@ मालाबार क्या आप नहीं चाहते हैं कि यह व्यवहार प्रोग-मोड से प्राप्त मोड के लिए हो?
यंगफ्रॉग

@YoungFrog यकीन है, लेकिन फिर यह जांचना होगा कि यह वास्तव में एक स्ट्रिंग के अंदर है, अन्यथा यह बस रास्ते में मिलेगा।
मालाबार

0

हो सकता है कि यह उत्तर उस समाधान को प्रदान नहीं करता है जिसकी आप अपेक्षा कर रहे हैं (आपके द्वारा लिखे गए शब्दों का संवादात्मक सुधार), मैं इस तरह की समस्याओं से लड़ने के अपने तरीके साझा करना चाहूंगा।

सबसे पहले, मुझे उन चीजों को पसंद नहीं है जो चुपचाप मेरे पाठ को बदल दें (कैपिटलाइज़ इत्यादि, यदि आप शब्द टाइप करना चाहते हैं IBuffer, तो मुझे लगता है कि ऐसा "सुधारक" एक गलत तरीका है), इसलिए मैं दो चीजों की सलाह देता हूं:

सबसे पहले, "स्टिकी कीज़" सुविधा को सक्षम करने का प्रयास करें। यह पहली बार में अजीब लग सकता है लेकिन मैं हर समय इसका उपयोग करता हूं। यह सुविधा OS / डेस्कटॉप पर्यावरण स्तर पर उपलब्ध है, यह Emacs सामान नहीं है। जब यह चीज़ सक्षम हो जाती है तो आप पहले प्रेस करते हैं ⇧ Shiftऔर फिर आप एक और कुंजी दबाते हैं जिसे आप भुनाना चाहते हैं। इस तरह आपकी समस्या भी उत्पन्न नहीं हो सकती है, केवल एक अक्षर को इस अनुक्रमिक दृष्टिकोण में बड़ा किया जाता है! यह आपके हाथ की ⇧ Shiftचाबी को पकड़ने के लिए जरूरी काम को भी कम करता है । मुझे लगता है कि अब टाइप करना आसान है।

दूसरा, अब आप अभी भी ⇧ Shiftसामान्य रूप से कुंजी का उपयोग कर सकते हैं (इसे पकड़कर) जब आपके विचार में यह आवश्यक हो, लेकिन मैं आपको एक Emacs पैकेज प्रस्तावित करना चाहूंगा जिसे फिक्स वर्ड कहा जाता है । यहां तक ​​कि अगर आपको "स्टिकी कीज़" पसंद नहीं है, तो आप शब्दों को उनके उचित रूपों में आसानी से सही कर सकते हैं, और आप कर्सर के बेकार आंदोलनों के बिना कई शब्दों को सही कर सकते हैं। इसे आजमाएं, मैं हर समय इसका उपयोग करता हूं। (यदि आप कई शब्दों को दर्ज करते हैं और आपको जिस शब्द को भुनाने की आवश्यकता होती है, उसे ठीक करना अभी भी मुश्किल है, बीच में कहीं है।)

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