शब्द के हिस्से के रूप में अंडरस्कोर का इलाज कैसे करें?


34

मैं Emacs + evilमोड का उपयोग करता हूं ।

जब मैं eटेक्स्ट के एक हिस्से में कर्सर को सामान्य स्थिति में रखता हूं abc_def_ghi, जैसे , ciw(आंतरिक शब्द बदलें) केवल defस्ट्रिंग के हिस्से को बदलता है , जबकि विम संपूर्ण को बदल देगा abc_def_ghi

मैं evilअंडरस्कोर का इलाज करने के लिए कैसे मजबूर कर सकता हूं क्योंकि विम करता है (यानी, शब्द के हिस्से के रूप में)?

जवाबों:


26

सबसे सरल समाधान: ciWव्हॉट्सएप-सीमांकित शब्द का चयन करने के लिए उपयोग करें।

बड़े मुद्दे को सिंटैक्स टेबल_ में चरित्र के मूल्य के साथ करना है । मुद्दा यह है कि डिफ़ॉल्ट रूप से, वाक्यविन्यास तालिका में एक प्रतीक घटक है, और आप इसे एक शब्द घटक के रूप में व्यवहार करना चाहते हैं।_

यदि आप 24.4 emacs का उपयोग कर रहे हैं, तो आप सक्षम करने का प्रयास कर सकते हैं superword-mode। मैंने खुद इसकी कोशिश नहीं की है, इसलिए आपका माइलेज अलग हो सकता है।

एक विकल्प यह है कि आप सिंटैक्स टेबल को स्वयं संशोधित करें और Emacs को बताएं कि आप चाहते हैं कि वह _वर्ण को शब्द के रूप में व्यवहार करे , जैसे:

(modify-syntax-entry ?_ "w")

आपके द्वारा ऐसा करने के बाद, ciwजैसा आप चाहते हैं, वह काम करता है, जैसे कि यह abc_def_ghiकेवल के बजाय सभी का चयन करेगा def

इस तरह से करना, हालांकि, ओवरकिल हो सकता है, खासकर यदि आप केवल _टेक्स्ट ऑब्जेक्ट के लिए शब्द के भाग के रूप में गिनना चाहते हैं । इसके बजाय, आप evil-inner-wordनिम्नानुसार सलाह दे सकते हैं:

(defadvice evil-inner-word (around underscore-as-word activate)
  (let ((table (copy-syntax-table (syntax-table))))
    (modify-syntax-entry ?_ "w" table)
    (with-syntax-table table
      ad-do-it)))

अब, इनर-वर्ड टेक्स्ट ऑब्जेक्ट को छोड़कर , _अभी भी सब कुछ के लिए एक प्रतीक घटक है , इसलिए आप किसी अन्य चीज़ की कार्यक्षमता को छूने के बिना ठीक वही करेंगे जो आप चाहते हैं।ciw

आप EmacsWiki नोड पर सिंटैक्स तालिकाओं को संशोधित करने के बारे में अधिक पढ़ सकते हैं ।


यह एक आकर्षण की तरह काम करता है। सभी आंदोलनों (परिवर्तन करने के लिए w, aw, आदि), आप निम्नलिखित कार्य भी साथ भी ऐसा ही कर सकते हैं: evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, evil-a-word, evil-inner-word। नोट: आपको underscore-as-wordविभिन्न, अद्वितीय (मनमाने) मूल्यों में बदलने की आवश्यकता है ।
सिटाक्तीफ

(modify-syntax-entry ?_ "w")किसी कारण से मेरे लिए काम नहीं किया। यह अंतःक्रियात्मक रूप से काम करने से भी नहीं हुआ। किसी भी विचार क्यों या कैसे मैं यह डिबग कर सकते हैं? मैं स्पेसमैक्स के मामले में प्रासंगिक हूं।
हेलडर एस रिबेरो

1
यह मेरी समस्या बताते हैं। जाहिरा तौर पर आपको लक्ष्य सिंटैक्स तालिका का उल्लेख करना होगा। मेरे मामले में मैंने इस्तेमाल किया (modify-syntax-entry ?_ "w" rust-mode-syntax-table), फिर इसने काम किया।
हेलडर एस रिबेरो

वाक्यविन्यास प्रविष्टि को संशोधित करने के अनपेक्षित प्रभाव क्या हैं?
luntain

FTR: superword-modeआंदोलन को प्रभावित नहीं करता है evil-mode। तो यह सिंटैक्स तालिकाओं को संशोधित करने के लिए एक घटक नहीं है।
हाय-एंजेल

28

निम्नलिखित स्निपेट ईविल को एक शब्द के रूप में एमाक्स प्रतीक का इलाज करेगा ।

(with-eval-after-load 'evil
    (defalias #'forward-evil-word #'forward-evil-symbol)
    ;; make evil-search-word look for symbol rather than word boundaries
    (setq-default evil-symbol-word-search t))

इसका यह फायदा है कि यह भाषा के आधार पर बदलता है:

foo-bar

एक प्रतीक है, lisp-modeलेकिन दो प्रतीकों (द्वारा अलग -) में है c-mode


14

Spacemacs पूछे जाने वाले प्रश्न प्रदान करता है निम्न भाषा-विशिष्ट समाधान:

;; For python
(add-hook 'python-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For ruby
(add-hook 'ruby-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For Javascript
(add-hook 'js2-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))

यह नियमित रूप से emacs में भी काम करता है। पर बुराई के साथ यह सब शब्द से संबंधित आदेशों के साथ काम करता है ( w, e, *, #, आदि)

अधिक आम तौर पर, यह इसे सभी प्रमुख मोडों के लिए करेगा:

(add-hook 'after-change-major-mode-hook
          (lambda ()
            (modify-syntax-entry ?_ "w")))

2
'prog-mode-hookहर भाषा को कवर करने के लिए एक विकल्प का उपयोग कर रहा है ?
बॉलपॉइंटबैन

2

एमएसीएस 24 पेश किया गया superword-mode, एक मामूली मोड जो शब्दों के हिस्से के रूप में अंडरस्कोर व्यवहार करता है। evil-modeइस सेटिंग का सम्मान करता है।

यहाँ प्रलेखन है:

(superword-mode &optional ARG)

सुपरडॉग मूवमेंट और एडिटिंग (सुपरवर्ड मोड) को टॉगल करें। एक उपसर्ग तर्क के साथ ARG, सुपर मोड को सक्षम करें यदि ARGसकारात्मक है, और अन्यथा इसे अक्षम करें। यदि लिस्प से कहा जाता है, तो ARGछोड़ दिया गया या शून्य होने पर मोड को सक्षम करें ।

सुपरवर्ड मोड एक बफर-लोकल मामूली मोड है। जैसे, में: यह सक्षम करने से शब्द की परिभाषा ऐसी है कि प्रतीकों वर्ण शब्द के कुछ हिस्सों के रूप में इलाज कर रहे हैं बदलता है superword-mode, "this_is_a_symbol"एक शब्द के रूप में गिना जाता है।


यदि आप उपयोग कर रहे हैं evil-mode, दुर्भाग्य से, superword-modeसक्षम होने पर एक बग है। यह evil-forward-word-beginकहा जाता है जब कुछ अनिश्चित व्यवहार का कारण बनता है: github.com/emacs-evil/evil/issues/721
modulitos

0

मैं वास्तव में इस व्यवहार को काफी पसंद करता हूं क्योंकि मैं केवल शब्द के एक हिस्से को संपादित करना चाहता हूं और अन्य हिस्सों को बरकरार रख सकता हूं। अगर मैं पूरे शब्द पर जाना चाहता हूं, जिसका मैं हमेशा उपयोग कर सकता हूं E, Wया B, अपरकेस वेरिएंट। यह मुझे और अधिक महीन दानेदार नियंत्रण देता है।

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