কেন এই <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 শুরু করুন:

vim --noplugin -u escmapvimrc

তারপর তেজ একটি সঙ্গে অপারেটর-মুলতুবী মোডে শুরু হবে 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

ভিম স্টার্টআপ স্ক্রিনটি তখন অদৃশ্য হয়ে যায় এবং আপনি উপরে বর্ণিত হিসাবে অপারেটর-মুলতুবি মোডে রয়েছেন।

কি হচ্ছে?

সম্পাদনা: আচরণটি ভিএম 7.3-তে বর্ণিত হিসাবে রয়েছে। ভিম 7.4.52 এ, nmapকারণগুলি কোনও ফাইল ছাড়াই ভিম শুরু করার সময় প্রতিস্থাপন মোডে ভিমটি শুরু করে। (যদি ভিএম 7.4.52 কোনও ফাইল দিয়ে শুরু করা হয় , তবে এটি একটি সি-কমান্ড চলমান শুরু করে।


আমি এটি ভিএম দিয়ে পুনরুত্পাদন করেছি, তবে কমান্ড লাইনটি :nohআমার কাছে প্রদর্শন করে নি। Gvim দিয়ে একই কাজ করা এই আচরণটি প্রদর্শন করে নি।
ফিলিপফ্র্যাঙ্ক

1
অনুসন্ধানের হাইলাইট সাফ করার জন্য একটি সাধারণ ম্যাপিং হ'ল:nnoremap <c-l> :noh<cr><c-l>
পিটার রিনকার

পার্শ্ব নোট হিসাবে, আপনি /alksdjflaskjঅনুসন্ধান হাইলাইট সাফ করতে ব্যবহার করতে পারেন যা বেশ দ্রুতগতির।
শাহবাজ

উত্তর:


11

ভিম স্টার্টআপের সময় কয়েকটি বিশেষ টার্মিনাল কোড প্রেরণ করে (এতে সাধারণত <esc>কী থাকে ) বিভিন্ন জিনিস নির্ধারণ করতে (রঙ, বিএস, ...) আপনি ম্যাপ <esc>করলে এটি সম্ভবত রিটার্ন কোডগুলির পার্সারকে বিভ্রান্ত করবে এবং অদ্ভুত জিনিসগুলি ঘটতে পারে।

অতএব, সমস্ত কিছু সঠিকভাবে সেট আপ হওয়ার পরে আপনার উপরের মানচিত্রটি ব্যবহার করুন (উদাহরণস্বরূপ একটি ভিমএন্টার অটোকমন্ডের মাধ্যমে)।


1
ঠিক আছে, যখনই 'term'বিকল্পটি সেট করা হয় তখন এগুলি প্রেরণ করা হয়। এটি সাধারণত কেবল স্টার্টআপের সময়ই হয় তবে এমন পরিস্থিতিতে থাকতে পারে যেখানে এটি রানটাইম সেট করা থাকে।
জামেসান

এই বিশেষ ক্ষেত্রে, এটি সম্ভবত_আরেক_আম্বিগিউস_চর_উইথ () দ্বারা ঘটেছিল বলে মনে হচ্ছে যা কেবলমাত্র স্টার্টআপে ডাকা হয়
খ্রিস্টান ব্র্যাব্যান্ড

আমি ঠিক এটি চেষ্টা করার পরিকল্পনা করছিলাম (এ কারণেই আমি অন্য উত্তরটি গ্রহণ করি নি)। এটি নিশ্চিত হওয়া ভাল তবে এটি কাজ করা উচিত।
ধনী

এটি কৌশলটি করেছে, যদিও VimEnterবিশেষভাবে কাজ করে না।
ধনী

আপনি ঠিক মজা করছেন? যোগাযোগের জন্য ব্যবহৃত পালানো কী কী ম্যাপিং থেকে পৃথক হওয়া উচিত।
shawnhcorey

11

লিনাক্স টার্মিনালটি <Esc>ভিমে বিশেষ কীগুলি প্রেরণের জন্য এএনএসআই এস্কেপ সিকোয়েন্সগুলি (অর্থাত্‍ অক্ষরের স্ট্রিংগুলি ) ব্যবহার করে এবং যোগাযোগ প্রোটোকলের অংশ হিসাবে অ্যাপ্লিকেশন তার দক্ষতার জন্য অনুসন্ধান করে। আপনার ম্যাপিং এতে হস্তক্ষেপ করে এবং এর ফলে এই "অদ্ভুত" আচরণের দিকে পরিচালিত করে।

অতএব, মানচিত্র রাখবেন না<Esc> । অন্য কী ব্যবহার করুন। জিভিআইএম-তে সমস্যাটি কম বলা হয়, তবে আমি সেখানে এটির সুপারিশও করব না।


দুর্ভাগ্যক্রমে, আমি ভিএম ব্যবহার শুরু করার পর থেকেই আমার এই ম্যাপিংটি প্রায় ছিল, তাই এটি এতক্ষণে আমার পেশীগুলির স্মৃতিতে বেশ ভালভাবে জ্বলে উঠেছে। যদিও ব্যাখ্যার জন্য ধন্যবাদ।
সমৃদ্ধ

আমার সম্ভবত যুক্ত হওয়া উচিত, উত্তরসূরির জন্য, বর্ণিত সমস্যাটিই কেবলমাত্র আমি জানি যে এই সমস্যাটি অবশ্যই ম্যাপিংয়ের ফলে ঘটেছিল এবং আমি কেবলমাত্র ভিমের সাথে থাকার সমস্যাটি মনে করতে পারি না we
ধনী

1
@ ধনী এই জাতীয় কিছু ব্যবহারে অভ্যস্ত হওয়া কতটা কঠিন হবে <Esc><Esc>?
এলোমেলো 832

@ র্যান্ডম 832 এটি একটি আকর্ষণীয় ধারণা।
ধনী

1
সমস্ত এক্সটার্ম প্রোগ্রামগুলি এটি করবে কারণ তারা ভিটি -100 টার্মিনালগুলি অনুকরণ করে। লিনাক্সের সাথে এর কোনও যোগসূত্র নেই। আইওএস, যা লিনাক্স নয়, বিএসডি ভিত্তিক, এর মধ্যে এক্সটারেমও রয়েছে যা ভিটি -১০০ অনুকরণ করে।
shawnhcorey

1

এটা চেষ্টা কর:

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

সিএফ /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

পরে ম্যাপিংটি শুরু করার পরে অটোকমন্ড স্থাপন করার চেষ্টা করেছি, তবে সমস্যাটি এখনও ঘটেছিল। *

আমি Inোকানো মোডে প্রথমবার প্রবেশ করার পরে অবশেষে একটি অটোমন্ডম তৈরি করেছি। এটি স্পষ্টতই নিখুঁত সমাধান নয়, তবে আমার জন্য এটি বেশিরভাগ সময় কাজ করবে এবং এটি আমার পক্ষে সেরা হতে পারে বলে মনে হয়:

আপডেট : কয়েক বছর ধরে ইস্যু ছাড়াই নীচের দীর্ঘতর সংস্করণটি ব্যবহার করার পরে, আমি স্থির করেছিলাম এটি সম্ভবত কিছুটা বেশি ইঞ্জিনিয়ারড, এবং তখন থেকে আমি এই এত সহজ সংস্করণটি ব্যবহার করেছি, যা প্রতিবার আপনি প্রবেশের মোডে প্রবেশের সময় কেবল ম্যাপিংটিকে পুনরায় সেট করে:

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অটোকমন্ড চেষ্টা করেছেন ?
খ্রিস্টান ব্রাব্যান্ড 18

@ ক্রিশ্চিয়ান ব্র্যাব্যান্ড আমার কাছে এখন আছে। এটা আমার জন্য ভাল কাজ করে না :(।
রিচ

আমি সম্প্রতি শিখেছি যে, টার্মিনাল সম্পর্কিত সমস্ত ক্যোয়ারী কমান্ডের জন্য TermResponse ট্রিগার করা হয়নি, যে ভিম কেবল প্রেরণ করে। ( t_RV, t_u7, t_RF, t_RB, এবং সম্ভবত অন্যদের।) তাই এই শক্তি আপনার টার্মিনাল উপর নির্ভর করে
খ্রিস্টান Brabandt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.