मैपिंग को डीबग कैसे करें?


65

मुझे यहाँ बहुत सारे प्रश्न दिखाई देते हैं जहाँ एक उपयोगकर्ता के पास एक मैपिंग है जो काम नहीं करता है और अधिकांश समय कारण बहुत ही समान होते हैं।

मैं इस प्रश्न को इस तरह के प्रश्नों के लिए एक संदर्भ बनाने का सुझाव देता हूं, एक मानचित्रण को डीबग करने की पूरी प्रक्रिया देता हूं। यदि कोई उपयोगकर्ता मैपिंग में कोई समस्या है, तो उन्हें सबसे आम मुद्दों को खत्म करने के लिए यहां पुनर्निर्देशित किया जा सकता है।

बेशक, अभी भी कुछ विशेष मामले होंगे जिन्हें एक समर्पित प्रश्न की आवश्यकता होगी और यहां संबोधित नहीं किया जाएगा।

जवाबों:


88

आपकी मैपिंग वह नहीं करती है जो उसे करना चाहिए या अपेक्षा से अलग व्यवहार करता है, इसके निवारण के लिए कई चरणों का पालन करना है:

जांचें कि कुंजी प्रभावी रूप से मैप की गई है कि उसे क्या करना चाहिए

विम एक कमांड प्रदान करता है :map। डिफ़ॉल्ट रूप से (जब कोई तर्क नहीं दिया जाता है) कमांड वर्तमान में बनाए गए सभी मैपिंग को दिखाएगा। यहाँ कमांड के परिणाम का एक उदाहरण दिया गया है:

<code>: map </ code> का परिणाम

हमेशा की तरह डॉक्टर आपका दोस्त है: :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, तो सुनिश्चित करें कि कोई अन्य पंक्ति नहीं है जो उसी कुंजी के लिए मैपिंग को परिभाषित करती है। .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>"

आपकी मैपिंग अभी भी काम नहीं कर रही है?

यदि आप इस उत्तर के सभी चरणों से गुजरे हैं और आपकी मैपिंग अभी भी आप की तरह काम नहीं करते हैं, तो आप शायद इस साइट पर मदद माँगना चाहते हैं।

कुछ महत्वपूर्ण जानकारी प्रदान करने के लिए लोगों को याद रखने में आपकी मदद करने के लिए:

  • कमांड जो आप अपने मानचित्रण को परिभाषित करने के लिए उपयोग करते हैं।
  • क्या आप अपने मानचित्रण करने की उम्मीद कर रहे हैं।
  • समस्या का सटीक विवरण:

    "यह काम नहीं करता है" वास्तव में उन लोगों के लिए उपयोगी नहीं होगा जो आपकी मदद करने की कोशिश करेंगे। यदि आपको मैपिंग कुछ भी नहीं करता है या आप जो अपेक्षा कर रहे थे, उससे अलग व्यवहार करता है तो आपको सटीक होना चाहिए।

  • यह भी इंगित करें कि आपने वास्तव में यहाँ वर्णित चरणों का पालन किया है और परिणाम आपके साथ मिलते हैं :mapऔर:verbose map

यह सब आपको और साइट के उपयोगकर्ताओं को बहुत समय बचाएगा।


एक उपयोगी आदेश: :unmap

कभी-कभी अपने व्यवहार को डीबग करने में मदद करने के लिए विम को छोड़ने के बिना मैपिंग को रीसेट करने के लिए यह उपयोगी हो सकता है।

ऐसा करने के लिए आप कमांड का उपयोग कर सकते हैं :unmap <key>जो <key>नॉर्मल, विजुअल और ऑपरेटिंग-पेंडिंग मोड्स के लिए असाइन की गई मैपिंग को हटा देगा । :iunmapइन्सर्ट मोड के लिए मैपिंग को हटा देगा। अन्य मोड के लिए देखें :help :unmap


संदर्भ

मानचित्रण के लिए एक उत्कृष्ट परिचय: learnvimscriptthehardway (और विम के अन्य पहलुओं का एक बहुत)

डॉक: :h mapping, :h :map

विम के अक्सर पूछे जाने वाले प्रश्न 20 की धारा मानचित्रण के बारे में है और इसमें दिलचस्प प्रश्न हैं:

और एक बोनस: आपकी मैपिंग में किन कुंजियों का उपयोग करना है, यह जानने के लिए सर्वोत्तम प्रथाओं के बारे में एक प्रश्न


2
हमारे अनुभव को अन्य उपयोगकर्ताओं के साथ साझा करने के लिए जैसा कि हमारे मॉडरेटर ने करने का सुझाव दिया है । और क्योंकि 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मैंने अपने प्रश्न की पहली पंक्ति में कहा था, इसलिए इन कारणों को इकट्ठा करके मानचित्रण के बारे में नकली प्रश्नों की संख्या को कम करने की अनुमति देनी चाहिए।
statox

1
विम-लेटेक्स और फ्रेंच कीबोर्ड के साथ एक आवर्ती समस्या: <m-i>और éविम के लिए समान हैं, और यह सभी मेटा + कुंजी के साथ समान है: वे एक अलग डियाक्रिटिक से जुड़े हैं।
ल्यूक हरमिट

1
यह जानना भी महत्वपूर्ण है कि बफर-लोकल मैपिंग को कैसे पढ़ा जाए जब हम इसकी परिभाषा के साथ पूछते हैं :map {sequence}-> *संबंधित कार्रवाई से पहले क्या प्रिंट में उल्टा हाइलाइट होता है।
ल्यूक हरमिट

2
कभी-कभी हम वास्तव में डिबग करना चाहते हैं कि क्या होता है। आमतौर पर जब मैपिंग एक प्लग मैपिंग, या एक फ़ंक्शन जिसे याद रखना असंभव है या जटिल मापदंडों के साथ एक फ़ंक्शन कहता है। उस मामले में हम पर अमल कर सकते हैं: :debug normal {keysequence}(किसी भी धमाके के बिना), या :debug i{keysequence}डालने मोड मैपिंग के लिए, आदि तो कुंजी अनुक्रम विशेष कुंजियों तरह बातें (शामिल <cr>, <left>, <c-x>, <m-i>, <leader>...)। फिर हमें निष्पादित + डबल-कोट्स + बैकस्लैश -> के साथ खेलना होगा :debug execute "normal \<leader>\<cr>Z"
ल्यूक हरमिट

2
मेटा-सीक्वेंस के संबंध में, यह FAQ का एक पुराना बिंदु है क्योंकि विम-लेटेक्स ने चीजों का उपयोग करने के लिए चुना था <m-i>। अधिकांश उपयोगकर्ता मेटा कुंजी का उपयोग नहीं करते हैं क्योंकि वे टर्मिनल में विम को चलाने के लिए दृढ़ता से उन्मुख होते हैं - जहां मेटा-कुंजी को बस उपयोग नहीं किया जा सकता है। हमें समस्या को नोटिस करने के लिए gvim या macvim का उपयोग करने की आवश्यकता है।
ल्यूक हरमिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.