आपकी मैपिंग वह नहीं करती है जो उसे करना चाहिए या अपेक्षा से अलग व्यवहार करता है, इसके निवारण के लिए कई चरणों का पालन करना है:
जांचें कि कुंजी प्रभावी रूप से मैप की गई है कि उसे क्या करना चाहिए
विम एक कमांड प्रदान करता है :map
। डिफ़ॉल्ट रूप से (जब कोई तर्क नहीं दिया जाता है) कमांड वर्तमान में बनाए गए सभी मैपिंग को दिखाएगा। यहाँ कमांड के परिणाम का एक उदाहरण दिया गया है:
हमेशा की तरह डॉक्टर आपका दोस्त है: :h map-listing
आप पहले कॉलम में मैपिंग का मोड ( n
सामान्य मोड के लिए,
v
विजुअल मोड के लिए आदि) देख सकते हैं, दूसरा कॉलम में कीप्स को मैप किया जाता है और आखिरी कॉलम में कीज को मैप किया जाता है। ध्यान दें कि मैप किए गए कार्यों से पहले कुछ अतिरिक्त वर्ण दिखाई दे सकते हैं, उन्हें समझना महत्वपूर्ण है:
*
इंगित करता है कि यह हटाने योग्य नहीं है (अर्थात यह पुनरावर्ती मानचित्रण नहीं है, know when to use nore
बाद में इस उत्तर में देखें )
&
इंगित करता है कि केवल स्क्रिप्ट-स्थानीय मैपिंग रीमैपेबल हैं
@
एक बफ़र-स्थानीय मैपिंग इंगित करता है
मैपिंग के बारे में मदद मांगते समय यह जानकारी जोड़ना अच्छी बात है क्योंकि यह अन्य लोगों को आपकी मैपिंग के व्यवहार को समझने में मदद कर सकती है।
यह की बहन-आदेशों के साथ एक विशेष मोड के लिए शीघ्र प्रतिबंधित करने के लिए संभव है :map
, की तरह :vmap
, :nmap
, :omap
, आदि
अब अपनी खोज को समस्याग्रस्त मानचित्रण तक सीमित करने के लिए आप उस महत्वपूर्ण अनुक्रम को पास कर सकते हैं जिसे आप कमांड के पैरामीटर के रूप में डिबग कर रहे हैं, जैसे:
:map j
:map <Leader>m
:map <F5>
ध्यान दें कि सूची में <Leader>
कुंजी को उसके वास्तविक मूल्य से बदल दिया जाएगा।
यदि कमांड के परिणाम से पता चलता है कि आपकी चाबियाँ सही ढंग से मैप की गई हैं, तो इसका अर्थ है कि समस्या विम से नहीं बल्कि आपके टर्मिनल या आपके डेस्कटॉप वातावरण से आती है। भाग देखें कि क्या आपकी मैपिंग वास्तव में विम द्वारा इंटरसेप्टेड है
यदि कमांड के परिणाम से पता चलता है कि आपकी चाबियाँ सही ढंग से मैप नहीं की गई हैं, तो निम्न भाग देखें।
जाँचें कि आपकी मैपिंग क्या है
:map
कमांड का एक और सुविधाजनक उपयोग इसके साथ संयोजन करना है verbose
: यह अंतिम फ़ाइल को संकेत देगा जिसने आपकी मैपिंग को संशोधित किया है।
उदाहरण के लिए, इन दो स्क्रीन-शॉट्स को देखें जो इसके परिणाम हैं :verbose map
: पहला एक मेरे द्वारा संशोधित मानचित्रण है .vimrc
और दूसरा एक प्लगइन द्वारा बनाया गया मानचित्रण:
अब यदि आप देखते हैं कि एक अन्य स्क्रिप्ट ने आपकी मैपिंग को संशोधित किया है, तो आपको यह देखना होगा कि क्या आप इसे हटा सकते हैं या इसके व्यवहार को संशोधित कर सकते हैं। (ध्यान दें कि कुछ प्लगइन्स अपने मैपिंग को सक्षम / अक्षम करने के लिए चर प्रदान करते हैं, दुर्भाग्य से सभी प्लगइन्स ऐसा नहीं करते हैं)
यदि अंतिम फ़ाइल जिसने आपकी मैपिंग बदल दी है वह आपकी है .vimrc
, तो सुनिश्चित करें कि कोई अन्य पंक्ति नहीं है जो उसी कुंजी के लिए मैपिंग को परिभाषित करती है। .vimrc
फ़ाइल खुशी से फ़ाइल में अपनी तरह का पिछले एक के साथ किसी भी मैपिंग पर आ जाएगी।
जांचें कि क्या आपकी मैपिंग वास्तव में विम द्वारा बाधित है
कई स्थितियों से संकेत मिल सकता है कि विम आपकी कुंजी को बाधित नहीं करता है:
- कमांड से
:map
पता चलता है कि आपकी कुंजी सही ढंग से मैप की गई है लेकिन इसे दबाने से कुछ नहीं होता है।
- आपकी मैपिंग gVim (GUI) पर काम करती है लेकिन टर्मिनल Vim में कुछ भी नहीं करती है
- आपकी मैपिंग एक परिभाषित टर्मिनल एमुलेटर पर काम करती है लेकिन दूसरे पर नहीं
- आपकी मैपिंग एक परिभाषित ओएस पर काम करती है लेकिन दूसरे पर नहीं।
यह संभवतः निम्नलिखित दो चीजों में से एक के कारण होता है:
कुछ Vim से पहले कुंजी को इंटरसेप्ट करता है : यह विभिन्न अनुप्रयोग हो सकते हैं: आपका OS, आपका डेस्कटॉप वातावरण, आपका टर्मिनल एमुलेटर, Tmux (यदि आप इसका उपयोग करते हैं) ...
इसका निवारण करने के लिए, आपको यह करना चाहिए:
.tmux.conf
यदि आप tmux का उपयोग करते हैं तो अस्थायी रूप से हटाने की कोशिश करें
- अपने टर्मिनल या अपने डेस्कटॉप वातावरण के डॉक्टर का संदर्भ लें।
आप सुपर-उपयोगकर्ता ,
यूनिक्स और लिनक्स , AskUbuntu , आदि जैसी बहन-साइटों का भी उल्लेख कर सकते हैं ...
यदि यह समस्या है, तो आपके पास दो समाधान हैं: या तो आप आवेदन के व्यवहार को बदलने के लिए (बहुत) समय व्यतीत करते हैं जो समस्या का कारण बनता है या आप मानचित्र के लिए एक और महत्वपूर्ण संयोजन ढूंढते हैं जो किसी अन्य अनुप्रयोग द्वारा बाधित नहीं होता है।
आपका टर्मिनल एमुलेटर आपके द्वारा मानचित्रित किए जा रहे कुंजी संयोजन को संभाल नहीं सकता है : टर्मिनल एमुलेटर को अलग तरीके से लागू किया जाता है और उनमें से कुछ विशेष कुंजी संयोजन को संभालने में सक्षम नहीं होते हैं। (इस कारण वे इस प्रश्न के दायरे से बाहर नहीं हो सकते, उनके डॉक या बहन-साइटों को अधिक विवरण के लिए पहले देखें)।
इस मामले में, आपके पास बहुत सारे समाधान नहीं हैं: या तो आप अपनी कुंजी को दूसरे के लिए बदल दें जो आपके टर्मिनल द्वारा ठीक से संभाला जाता है या आप अपने टर्मिनल एमुलेटर को बदलते हैं।
सामान्य नुकसान के लिए जाँच करें
मैपिंग में कुछ समस्याएँ बहुत आवर्तक होती हैं और अधिकतर विम्सस्क्रिप्ट सिंटेक्स से संबंधित होती हैं। यदि आपके मानचित्रण में अप्रत्याशित व्यवहार है तो निम्न बिंदुओं को जांचना याद रखें:
अपनी मैपिंग के अनुसार उसी लाइन पर टिप्पणी न करें , इसके बजाय टिप्पणी को ऊपर की लाइन पर रखें। उदाहरण:
ऐसा मत करो:
inoremap ii <esc> " ii to go back into normal mode
विम व्हाट्सएप पर विचार करेगा, "
और टिप्पणी मानचित्रण के एक भाग के रूप में होगी जिसके परिणामस्वरूप अप्रत्याशित व्यवहार होगा।
इसके बजाय वह करें:
" ii to go back into normal mode
inoremap ii <esc>
यह पढ़ना आसान है और आपकी मैपिंग को गड़बड़ नहीं करेगा।
के साथ अपने आदेशों को पाइप न करें|
। उदाहरण:
ऐसा मत करो:
nnoremap <Leader>x :w | !% python -m json.tools
विम पाइप |
को एक कमांड टर्मिनेशन के रूप में मानेगा: जब आप सोर्स करेंगे तो आपकी .vimrc
मैपिंग बन nnoremap <Leader>x :w
जाएगी तब एक्सटर्नल कमांड !% python -m json.tools
निष्पादित हो जाएगा।
इसके बजाय वह करें:
nnoremap <Leader>x :w <bar> !% python -m json.tools
के बारे में एक स्पष्टीकरण<bar>
देखें ।
पता है जब उपयोग करने के लिए nore
: हमेशा ।
LearnVimscriptTheHardWay यह बहुत स्पष्ट रूप से व्याख्या करते हैं: कभी नहीं का उपयोग करें map
, nmap
, vmap
:, आदि ... हमेशा nore संस्करण पसंद करते हैं noremap
, nnoremap
, vnoremap
, आदि ... क्यों? मैपिंग nore
के लिए खड़ा non-recursive
है इसका मतलब है कि मैपिंग के दाहिने हाथ को अंतर्निहित सुविधा माना जाएगा, भले ही आपने इसे रीमैप किया हो। उदाहरण:
मान लें कि आप >
एक पंक्ति को हटाना चाहते हैं और एक पंक्ति -
के इंडेंट को बढ़ाना चाहते हैं। यदि आप गैर-पुनरावर्ती मैपिंग का उपयोग नहीं करते हैं तो आप ऐसा करेंगे:
( ऐसा मत करो कि यह उदाहरण के लिए है )
nmap > dd
nmap - >
जब आप हिट करेंगे तो >आपकी लाइन हट जाएगी, यह अच्छा है। लेकिन जब आप -अपनी लाइन मारेंगे तो आपको इंडेंट होने के बजाय डिलीट भी कर दिया जाएगा। क्यों? क्योंकि विम समझ गया था "मुझे एक हिट मिली, -
जिस पर मुझे अनुवाद >
करना चाहिए, जिसके बदले मुझे अनुवाद करना चाहिए dd
"।
इसके बजाय वह करें
nnoremap > dd
nnoremap - >
इस तरह विम अनुवाद करेगा -
के रूप में >
और वजह से किसी अन्य अनुवाद करने की कोशिश नहीं करेंगे nore
।
नोट संपादित करें "हमेशा" कुछ मामलों में एक अतिरंजित उत्तर हो सकता है आपको पुनरावर्ती मैपिंग फ़ॉर्म का उपयोग करने की आवश्यकता होगी, लेकिन यह वास्तव में सामान्य नहीं है। स्पष्ट करने के लिए, मैं इस उत्तर से @romainl का उद्धरण दूंगा :
यदि आप अपनी मैपिंग में किसी अन्य मैपिंग का उपयोग करने का इरादा रखते हैं, तो केवल एक पुनरावर्ती मैपिंग का उपयोग करें। यदि आप नहीं करते हैं तो गैर-पुनरावर्ती मैपिंग का उपयोग करें।
याद रखें कि कुछ प्रमुख संयोजन समतुल्य हैं : क्योंकि कुछ प्रमुख संयोजनों को बनाने वाले हेक्साडेसिमल कोडों की व्याख्या वीम द्वारा किसी अन्य कुंजी द्वारा की जाएगी। उदाहरण के लिए
<C-h>
के बराबर है <backspace>
<C-j>
जैसा <enter>
- फ्रांसीसी कीबोर्ड पर
<M-a>
समान है á
और सभी <m-
मैपिंग के साथ समान है
। जैसा कि @LucHermitte ने टिप्पणी में बताया है कि इस प्रकार के मैपिंग का उपयोग करने वाले प्लगइन्स के साथ एक समस्या है जैसे विम-लेटेक्स।
<C-S-a>
के बराबर है
<C-a>
। Ctrl + ऊपरी मामले पत्र को Ctrl + निचले मामले पत्र से अलग से मैप करना संभव नहीं है जिस तरह से टर्मिनल ASCII कोड भेजते हैं।
जब आपकी मैपिंग किसी अन्य कुंजी को प्रभावित करने का प्रयास करती है, तो यदि वह समस्या का निरीक्षण करती है, तो हेक्साडेसिमल कोड को विम पर भेजा जाता है।
जांचें कि आपके नेता को सही तरीके से परिभाषित किया गया है : यदि आपके मैपिंग में<leader>
काम नहीं करता है और आपने अपने नेता को कमांड से बदल दिया हैmapleader
, तो जांचें कि आपके लीडरकी परिभाषा मैपिंग की परिभाषा से पहले की गई है। अन्यथा, विम एक कुंजी के साथ मैपिंग बनाने की कोशिश करेगा जो आपके विचार से नहीं है। यदि आप अपने नेता के रूप में स्पेस बार का उपयोग करना चाहते हैं (जो कि बहुत चालू है) सुनिश्चित करें कि आपने सही नोटेशन का उपयोग किया है:let mapleader = "\<Space>"
आपकी मैपिंग अभी भी काम नहीं कर रही है?
यदि आप इस उत्तर के सभी चरणों से गुजरे हैं और आपकी मैपिंग अभी भी आप की तरह काम नहीं करते हैं, तो आप शायद इस साइट पर मदद माँगना चाहते हैं।
कुछ महत्वपूर्ण जानकारी प्रदान करने के लिए लोगों को याद रखने में आपकी मदद करने के लिए:
यह सब आपको और साइट के उपयोगकर्ताओं को बहुत समय बचाएगा।
एक उपयोगी आदेश: :unmap
कभी-कभी अपने व्यवहार को डीबग करने में मदद करने के लिए विम को छोड़ने के बिना मैपिंग को रीसेट करने के लिए यह उपयोगी हो सकता है।
ऐसा करने के लिए आप कमांड का उपयोग कर सकते हैं :unmap <key>
जो <key>
नॉर्मल, विजुअल और ऑपरेटिंग-पेंडिंग मोड्स के लिए असाइन की गई मैपिंग को हटा देगा । :iunmap
इन्सर्ट मोड के लिए मैपिंग को हटा देगा। अन्य मोड के लिए देखें :help :unmap
।
संदर्भ
मानचित्रण के लिए एक उत्कृष्ट परिचय: learnvimscriptthehardway (और विम के अन्य पहलुओं का एक बहुत)
डॉक: :h mapping
,
:h :map
विम के अक्सर पूछे जाने वाले प्रश्न 20 की धारा मानचित्रण के बारे में है और इसमें दिलचस्प प्रश्न हैं:
और एक बोनस: आपकी मैपिंग में किन कुंजियों का उपयोग करना है, यह जानने के लिए सर्वोत्तम प्रथाओं के बारे में एक प्रश्न
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
मैंने अपने प्रश्न की पहली पंक्ति में कहा था, इसलिए इन कारणों को इकट्ठा करके मानचित्रण के बारे में नकली प्रश्नों की संख्या को कम करने की अनुमति देनी चाहिए।