प्रतीकों को शब्दों के रूप में व्यवहार करें


12

Emacs में कई कमांड हैं जो "शब्दों" पर लागू होते हैं। उदाहरणों में शामिल हैं forward-word, kill-word, upcase-word, mark-word, transpose-words, आदि "शब्द" की परिभाषा आदेशों के बीच थोड़ा भिन्न हो रहा है। उदाहरण के लिए, forward-wordएक अंडरस्कोर में एक शब्द (जैसे foo_bar) के भीतर बंद हो जाएगा लेकिन mark-wordअंडरस्कोर पर नहीं रुकता है।

क्या "शब्द" की परिभाषा को बदलना संभव है जब मैं एक प्रोग मोड में हूं ताकि एमएसीएस वर्तमान भाषा के वाक्यविन्यास के लिए उपयुक्त शब्द सीमाओं का उपयोग करेगा?

जब मैं अंदर होता c-modeहूं forward-wordतो अंडरस्कोर को छोड़ना चाहता हूं , और जब मैं अंदर होता lisp-modeहूं forward-wordतो हाइफन और अंडरस्कोर दोनों को छोड़ना चाहता हूं , आदि।

जवाबों:


4

Emacs को पहले से ही " वर्तमान भाषा के वाक्यविन्यास के लिए उपयुक्त शब्द सीमाओं " का उपयोग करना चाहिए । यदि यह नहीं है तो उस भाषा के लिए प्रमुख मोड के लिए बग दर्ज करें।

लेकिन शायद आप वास्तव में शब्दों का मतलब नहीं है । हो सकता है कि आप का मतलब प्रतीक वाक्य रचना, नहीं शब्द वाक्य रचना। Emacs दोनों को अलग करता है।

प्रतीक वाक्यविन्यास के लिए, प्रतीक कमांड का उपयोग करें, शब्द कमांड का नहीं: forward-symbolआदि, आपके विवरण से, यह वही है जो आप वास्तव में चाहते हैं।

यदि आपको लगता है कि आप वास्तव में एक प्रतीक पर एक शब्द समारोह का उपयोग करना चाहते हैं, तो आप प्रतीक -घटक वाक्यविन्यास के बजाय शब्द-घटक वाक्यविन्यास करने के लिए विशेष वर्णों के वाक्यविन्यास श्रेणी को बदल सकते हैं लेकिन आम तौर पर यह वह नहीं है जो आप करना चाहते हैं और आपको इसे करने की आवश्यकता नहीं होनी चाहिए।

चरित्र सिंटैक्स के बारे में जानकारी के लिए एलिफ़िश मैनुअल देखें। और कमांड और अन्य कार्यों के लिए Emacs मैनुअल और Elisp मैनुअल देखें जो प्रतीकों पर काम करते हैं (लिस्प प्रतीक नहीं, लेकिन प्रतीक वाक्यविन्यास के साथ पाठ, जो भी भाषा में)।

और ध्यान रखें कि प्रतीकों पर अभिनय के लिए भी सेक्सप्स पर संचालन अक्सर उपयोगी होता है: C-M-f( forward-sexp), C-M-t( transpose-sexps), आदि।


C-M-fके लिए बाध्य है forward-sexpऔर आप क्या वर्णन की तरह कुछ भी व्यवहार नहीं करता है। आप सही हैं कि मैं जो चाहता हूं वह प्रतीकों द्वारा नेविगेट करना है, लेकिन मुझे वह विकल्प दिखाई नहीं देता है।
nispio

@nispio forward sexpअनिवार्य रूप से forward-symbolअधिकांश समय है, साथ ही मेल खाने वाले ब्रेसिज़ की अतिरिक्त बहुमुखी प्रतिभा भी। आपको इसे मौका देना चाहिए।
मालाबार

@ मलबार्बा मैं दृढ़ता से असहमत हूं जो कि forward-sexpएक निकट सन्निकटन है forward-symbol। शुरुआत के लिए, यह आपको पूरे कार्यों में उलझन में डाल सकता है, जहां से आपने शुरू किया था, वहां से आपको सैकड़ों लाइनें मिलेंगी। यह तर्क सूचियों आदि पर भी कूदता है, और यह प्रयास करें: निम्नलिखित लिस्प कोड को (global-set-key [remap list-buffers] 'ibuffer)अपने कर्सर को शब्द के बीच में रखें remapऔर forward-sexpकुछ बार चलाएं । यह समापन तक पहुंचने पर एक त्रुटि उठाता है] । जी नहीं, धन्यवाद।
nispio

@nispio मैं हमेशा सेक्सप और शब्द नेविगेशन के संयोजन का उपयोग करता हूं। इस तरह मैं इन दोनों में से किसी की भी चंचलता से बच सकता हूं। लेकिन यह सब वरीयता का मामला है। ;-) यदि आप जानते हैं कि आप कभी भी शब्द नेविगेशन को याद नहीं करेंगे, तो superword-modeहो सकता है कि आपका लड़का हो।
मालाबार

क्षमा करें, मैं सुझाव नहीं देना चाहिए था C-M-fऔर C-M-tप्रतीकों पर कार्रवाई (वे sexps पर कार्रवाई)। मैं उस छाप को सुधारने के लिए संपादन करूंगा। लेकिन आप निश्चित रूप forward-symbolसे अपनी पसंद की किसी भी कुंजी को बांध सकते हैं, अगर आपको यह विशेष रूप से उपयोगी लगता है। कोई नहीं है transpose-symbols, लेकिन आप एक बार फिर से लिख सकते हैं, अगर आपको लगता है कि यह उपयोगी है।
ड्रू

11

देख लेना superword-modeऔर subword-mode। सुपरवर्ड एक सीमा के बजाय एक शब्द के हिस्से के रूप में अंडरस्कोर का व्यवहार करता है, इसलिए foo_bar इसे एक शब्द के रूप में माना जाएगा
सबवार्ड विपरीत करता है लेकिन कैमलकेस के लिए, इसलिए fooBarएक के बजाय दो शब्दों के रूप में व्यवहार किया जाता है।

यह आपके द्वारा cc-modeउपयोग किए जाने वाले व्यवहार की तरह लगता है superword-mode

(add-hook 'c-mode-common-hook 'superword-mode)

मैं स्रोत के बारे में पढ़ने की सलाह दूंगा subword-mode, भले ही वे दो तरीके बिल्कुल वैसा नहीं कर रहे हों जैसा आप चाहते हैं, उन्हें आपको यह दिखाना चाहिए कि शब्द पहचान के व्यवहार को कैसे बदलना है।

Emacsredux , और ergomacs पर लंबी चर्चा ।


क्या इसके superword-modeसाथ खेलना अच्छा है paredit? उदाहरण के लिए, सक्षम paredit-forward-kill-wordहोने पर पूरे शब्द (अंडरस्कोर युक्त) को नहीं हटाता superword-modeहै।
रेना रानेली

यह एक शब्द की परिभाषा बदल रहा है, और pareditइसका सम्मान कर रहा है, इसलिए मुझे लगता है कि यह वही कर रहा है जो इसके बारे में पूछा जाता है।
dgtized

बात यह है कि पैराडिट उसका सम्मान नहीं कर रहा है। paredit-forward-kill-wordद्वारा परिभाषित समान शब्द को नहीं मारता है superword-mode
रैनन रानेली

ओह, मैं गलत था। हम्म। बस एक बार देख लिया paredit-forward-kill-wordऔर ऐसा लग रहा है कि यह खुद कर रहा है। तो बाहर स्वैप करने में सक्षम हो सकता है, लेकिन शायद नहीं।
dgtized

3

अगर मुझे आपका सवाल समझ में आया, तो आप भाषा वाक्य-विन्यास तालिका को संशोधित कर सकते हैं, उदाहरण के लिए c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos फिर सिंटैक्स-टेबल को देखें, इससे आपको भी मदद मिलेगी।

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