यह क्यों <Esc> सामान्य मोड मैपिंग स्टार्टअप को प्रभावित करता है?


13

मैं एक सामान्य मोड के मानचित्रण के साथ एक अजीब समस्या का सामना कर रहा हूं Esc

यदि आप escmapvimrcसामग्री के साथ फाइल बनाते हैं:

set nocompatible
set showcmd " Doesn't affect the problem: just makes it easier to see
nnoremap <Esc> :noh<CR><esc>

और फिर इस vimrc का उपयोग करके विम शुरू करें:

vim --noplugin -u escmapvimrc

फिर vim ऑपरेटर-पेंडिंग मोड में शुरू होगा जिसमें cआगे इनपुट के लिए एक कमांड के साथ , एक खाली फ़ाइल प्रदर्शित करना, और कमांड-लाइन प्रदर्शित करना है :noh

यदि आप nnoremapलाइन को हटाते हैं , तो समस्या दूर हो जाती है।

यदि आप डिबग करते हैं और सब कुछ प्राप्त करते हैं, तो आपको निम्न आउटपुट मिलते हैं:

Entering Debug mode.  Type "cont" to continue.
/[...]/escmapvimrc
line 1: set nocompatible
>s
/[...]/escmapvimrc
line 2: set showcmd " Doesn't affect the problem: just makes it easier to see
>s
/[...]/escmapvimrc
line 3: nnoremap <Esc> :noh<CR><esc>
>s
/[...]/escmapvimrc
line 4: End of sourced file
>s
Press ENTER or type command to continue

आपके द्वारा एंटर दबाने के बाद, विम स्टार्टअप स्क्रीन प्रदर्शित होती है, और नीचे:

Entering Debug mode.  Type "cont" to continue.
cmd: noh
>s

Vim स्टार्टअप स्क्रीन तब गायब हो जाती है, और आप ऑपरेटर-लंबित मोड में हैं, जैसा कि ऊपर वर्णित है।

क्या चल रहा है?

EDIT: व्यवहार ..३ में वर्णित है। विम start.४.५२ में, nmapविम को फ़ाइल के बिना शुरू करने पर विम मोड में शुरू करने का कारण बनता है। (यदि विम 7.4.52 को एक फ़ाइल के साथ शुरू किया गया है, हालांकि, यह एक सी-कमांड के साथ भी शुरू होता है।) किसी भी तरह से, जब नैम निकाल दिया जाता है तो समस्या दूर हो जाती है।


मैंने इसे वीम के साथ पुन: पेश किया, लेकिन कमांड लाइन :nohमेरे लिए नहीं दिखा । जीवीएम के साथ ऐसा करने से यह व्यवहार नहीं दिखा।
फिलिपफ्रैंक 12

1
खोज हाइलाइट को साफ़ करने के लिए एक सामान्य मानचित्रण है:nnoremap <c-l> :noh<cr><c-l>
पीटर रिनेकर

एक साइड नोट के रूप में, आप /alksdjflaskjखोज हाइलाइट को साफ़ करने के लिए उपयोग कर सकते हैं जो कि काफी तेज़ है।
शाहबाज

जवाबों:


12

Vim स्टार्टअप के दौरान कुछ विशेष टर्मिनल कोड (जिसमें आमतौर पर <esc>कुंजी होती है) को कई चीजों (रंगों, bs, ...) को निर्धारित करने के लिए भेजता है यदि आप मैप <esc>करते हैं तो यह सबसे अधिक संभावना है कि रिटर्न कोड के पार्सर को भ्रमित करेगा और अजीब चीजें हो सकती हैं।

इसलिए, सब कुछ सही ढंग से सेटअप किए जाने के बाद ही अपने उपरोक्त मानचित्र का उपयोग करें (जैसे कि VimEnter ऑटोकॉमैंड के माध्यम से)।


1
जब भी 'term'विकल्प सेट किया जाता है , तो उन्हें भेजा जाता है। यह आमतौर पर केवल स्टार्टअप के दौरान होता है, लेकिन ऐसे परिदृश्य हो सकते हैं जहां यह रनटाइम पर सेट किया गया हो।
जामसेन

इस विशेष मामले में, यह may_req_ambiguous_char_width () के कारण होता है जिसे केवल स्टार्टअप पर कहा जाता है
क्रिश्चियन ब्रेबेंड

मैं ठीक यही कोशिश करने की योजना बना रहा था (यही वजह है कि मैंने दूसरे उत्तर को स्वीकार नहीं किया)। हालांकि, यह पुष्टि करने के लिए अच्छा है कि यह काम करना चाहिए।
रिच

यह चाल चली है, हालांकि VimEnterविशेष रूप से काम नहीं किया।
रिच

तुम मज़ाक कर रहे, है ना? संचार के लिए इस्तेमाल किया जाने वाला एस्केप एस्केप की मैपिंग से अलग होना चाहिए।
shawnhcorey

11

लिनक्स टर्मिनल एएनएसआई एस्केप सीक्वेंस का उपयोग करता है (अर्थात इसके साथ शुरू होने वाले वर्णों को <Esc>), विशेष कुंजियों को वीएम को भेजने के लिए, और संचार प्रोटोकॉल के भाग के रूप में जिसके साथ अनुप्रयोग अपनी क्षमताओं के लिए प्रश्न करता है। आपकी मैपिंग उसी के साथ हस्तक्षेप करती है, और जिससे ये "अजीब" व्यवहार होते हैं।

इसलिए, नक्शा न करें<Esc> । दूसरी कुंजी का उपयोग करें। यह समस्या GVIM में कम स्पष्ट है, लेकिन मैं इसे वहां नहीं सुझाऊंगा, न ही।


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

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

1
@ जो कुछ का उपयोग करने के लिए इस्तेमाल किया जाना कितना मुश्किल होगा <Esc><Esc>?
रैंडम 832

@ Random832 यह एक पेचीदा विचार है।
रिच

1
सभी xterm प्रोग्राम ऐसा करेंगे क्योंकि वे VT-100 टर्मिनलों का अनुकरण करते हैं। इसका लिनक्स से कोई लेना-देना नहीं है। iOS, जो BSD नहीं लिनक्स पर आधारित है, में xterms भी होंगे जो VT-100s का अनुकरण करते हैं।
shawnhcorey

1

इसे इस्तेमाल करे:

augroup escape_mapping
  autocmd TermResponse * nnoremap <Esc> :noh<CR><esc>
augroup end

cf /programming//a/16027716/400545


यह मेरे लिए अच्छी तरह से काम नहीं करता है। इसके बाद, मेरी escapemapvimrcफ़ाइल में मैपिंग को बदलने के साथ, जब विम स्टार्टअप पूरा होता है, तो मैं कमांड-लाइन मोड में हूं, कमांड लाइन जिसमें निम्न सामग्री होती है: :83/94/95^G(यह CTRL-Gअंत में एक शाब्दिक है )। :helpलगता है कि यह थोड़ा सा यह मैपिंग सेट करने का सबसे अच्छा समय नहीं हो सकता है:Note that this event may be triggered halfway executing another event, especially if file I/O, a shell command or anything else that takes time is involved.
रिच

1

मैंने स्टार्टअप में बाद में मैपिंग सेट करने के लिए एक ऑटोकॉमैंड स्थापित करने की कोशिश की, लेकिन समस्या अभी भी हुई। *

मैंने अंत में सम्मिलित मोड में पहली बार प्रवेश करने के लिए एक ऑटोकेमैंड बनाया। यह स्पष्ट रूप से एक सही समाधान नहीं है, लेकिन मेरे लिए यह ज्यादातर समय काम करेगा, और यह सबसे अच्छा लगता है जो मैं कर सकता हूं:

अद्यतन : कुछ वर्षों के लिए बिना किसी समस्या के नीचे दिए गए लंबे संस्करण का उपयोग करने के बाद, मैंने फैसला किया कि यह संभवतः थोड़ा अधिक इंजीनियर था, और तब से मैंने इस बहुत सरल संस्करण का उपयोग किया है, जो आपके डालने के मोड में प्रवेश करने के बजाय हर बार मैपिंग को रीसेट करता है:

augroup escape_mapping
  autocmd!
  autocmd InsertEnter * call s:setupEscapeMap()
augroup END

function! s:setupEscapeMap()
  nnoremap <Esc> :noh<CR><Esc>
endfunction

हर बार जब आप इन्सर्ट मोड डालते हैं तो मैपिंग को रीसेट करने की आवश्यकता नहीं होती है, लेकिन ऐसा करने के लिए विम को कोई नुकसान नहीं पहुंचता है।

मूल संस्करण :

if !exists('g:escape_mapped')  " Only need to set the mapping up once.
  augroup escape_mapping
    autocmd!
    " Create the autocommand, to fire when Insert mode is entered
    autocmd InsertEnter * call s:setupEscapeMap()
  augroup END
endif

function! s:setupEscapeMap()
  " Actually create the mapping
  nnoremap <Esc> :noh<CR><Esc> 

  " Now the map exists, so we won't ever need the autocommand again.
  let g:escape_mapped = 1

  " Tidy up the autocommand and group
  autocmd! escape_mapping InsertEnter *
  augroup! escape_mapping
endfunction

* मैं विभिन्न घटनाओं के साथ जोड़ते करने की कोशिश की: VimEnter, BufReadPost, BufWinEnter, और यहां तक कि CursorMoved(!), लेकिन इन सब बहुत जल्दी आग लगते हैं।


क्या आपने कभी TermResponseऑटोकॉमैंड की कोशिश की है ?
क्रिश्चियन ब्रेबेंड


मुझे अभी हाल ही में पता चला है, कि टर्मिनल से संबंधित सभी क्वेरी कमांड के लिए टर्मरेस्पोंस को ट्रिगर नहीं किया गया है, जो कि अभी बाहर भेजता है। ( t_RV, t_u7, t_RF, t_RB, और संभवतः अन्य शामिल हैं।) तो यह हो सकता है भी अपने टर्मिनल पर निर्भर करते हैं
ईसाई Brabandt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.