কীভাবে ম্যাপিং ডিবাগ করবেন?


65

আমি এখানে অনেকগুলি প্রশ্ন দেখছি যেখানে কোনও ব্যবহারকারীর ম্যাপিং রয়েছে যা কাজ করে না এবং বেশিরভাগ সময় কারণগুলি বেশ একই রকম হয়।

আমি ম্যাপিং ডিবাগ করার জন্য একটি সম্পূর্ণ পদ্ধতি দেওয়ার জন্য, এই প্রশ্নের এই ধরণের প্রশ্নের জন্য একটি রেফারেন্স করার পরামর্শ দিই। যদি কোনও ব্যবহারকারী কোনও ম্যাপিংয়ের সমস্যা হিসাবে থাকে তবে সর্বাধিক সাধারণ সমস্যাগুলি মুছে ফেলার জন্য তাদের এখানে পুনর্নির্দেশ করা যেতে পারে।

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

উত্তর:


88

আপনার ম্যাপিংটি যা করা উচিত তা করে না বা প্রত্যাশার চেয়ে আলাদা আচরণ করে, সমস্যা সমাধানের জন্য কয়েকটি পদক্ষেপ অনুসরণ করা হয়:

কীটি কার্যকরভাবে ম্যাপ করা হয়েছে তা কী করা উচিত তা পরীক্ষা করুন

ভিম একটি কমান্ড সরবরাহ করে :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) এ কাজ করে তবে টার্মিনাল ভিমে কিছুই করে না
  • আপনার ম্যাপিং একটি সংজ্ঞায়িত টার্মিনাল এমুলেটরটিতে কাজ করে তবে অন্যটিতে নয়
  • আপনার ম্যাপিং একটি সংজ্ঞায়িত ওএসে কাজ করে তবে অন্যটি নয়।

এটি সম্ভবত নিম্নলিখিত দুটি বিষয়গুলির মধ্যে একটির কারণে ঘটেছিল:

  • কিছু কিছু ভিমের আগে কীটিকে বাধা দেয় : এটি বিভিন্ন অ্যাপ্লিকেশন হতে পারে: আপনার ওএস, আপনার ডেস্কটপ পরিবেশ, আপনার টার্মিনাল এমুলেটর, টিমাক্স (আপনি যদি এটি ব্যবহার করেন) ...

    এটির সমস্যা সমাধানের জন্য, আপনার উচিত:

    • .tmux.confআপনি tmux ব্যবহার করলে অস্থায়ীভাবে অপসারণ করার চেষ্টা করুন
    • আপনার টার্মিনাল বা আপনার ডেস্কটপ পরিবেশের ডকটি দেখুন।

    আপনি সুপার-ইউজার , ইউনিক্স এবং লিনাক্স , জিজ্ঞাসা উবুন্টু ইত্যাদির মতো বোন-সাইটগুলিও উল্লেখ করতে পারেন ...

    যদি এই সমস্যাটি হয় তবে আপনার দুটি সমাধান রয়েছে: সমস্যাটির কারণ হিসাবে অ্যাপ্লিকেশনটির আচরণ পরিবর্তন করতে আপনি (প্রচুর) সময় ব্যয় করেন বা অন্য কোনও অ্যাপ্লিকেশন দ্বারা আটকানো হয়নি এমন মানচিত্রের জন্য আপনি একটি মূল সংমিশ্রণ খুঁজে পান।

  • আপনার টার্মিনাল এমুলেটর কী কী সংমিশ্রণটি আপনি মানচিত্রের চেষ্টা করছেন সেটি পরিচালনা করতে পারে না : টার্মিনাল এমুলেটরগুলি আলাদাভাবে প্রয়োগ করা হয় এবং এর মধ্যে কিছু নির্দিষ্ট কী সংমিশ্রণ পরিচালনা করতে সক্ষম হয় না। (যে কারণে তারা এই প্রশ্নের আওতার বাইরে নয়, আরও তথ্যের জন্য তাদের ডক বা পূর্বে উল্লিখিত বোন-সাইটগুলি দেখুন)।

    এই ক্ষেত্রে, আপনার কাছে খুব বেশি সমাধান নেই: হয় আপনি অন্য কোনওটির জন্য আপনার কী পরিবর্তন করেন যা আপনার টার্মিনাল দ্বারা সঠিকভাবে পরিচালিত হয় অথবা আপনি আপনার টার্মিনাল এমুলেটরটি পরিবর্তন করেন।

সাধারণ সমস্যাগুলি পরীক্ষা করুন

ম্যাপিংয়ের কিছু সমস্যাগুলি বেশ ঘন ঘন এবং বেশিরভাগই উইমস্ক্রিপ্ট সিনট্যাক্সের সাথে সম্পর্কিত। আপনার ম্যাপিংয়ে যদি অপ্রত্যাশিত আচরণ হয় তবে নীচের বিষয়গুলি পরীক্ষা করতে ভুলবেন না:

  • আপনার ম্যাপিংয়ের মতো একই লাইনে কোনও মন্তব্য করবেন না , পরিবর্তে উপরের লাইনে মন্তব্যটি দিন। উদাহরণ:

    এটি করবেন না:

    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-ম্যাপিংয়ের সাথে একই হয় । যেমন @ লুচর্মিট মন্তব্যে উল্লেখ করেছেন যে ভিএম-লেটেক্সের মতো এই জাতীয় ম্যাপিং ব্যবহার করে প্লাগইনগুলির সাথে সমস্যা।
    • <C-S-a>সমতূল্য <C-a> । টার্মিনালগুলি ASCII কোডগুলি যেভাবে প্রেরণ করে তার জন্য সিটিআরএল + লোয়ার কেস লেটার থেকে পৃথকভাবে Ctrl + আপার কেস লেটার ম্যাপিং করা সম্ভব নয়।

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

  • আপনার লিডারকে সঠিকভাবে সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করুন : আপনার জড়িত ম্যাপিং যদি<leader>কাজ না করে এবং আপনি কমান্ডের সাহায্যে আপনার নেতা পরিবর্তন করেন তবেmapleaderপরীক্ষা করুন যেম্যাপিংয়ের সংজ্ঞা দেওয়ার আগে আপনার নেতারসংজ্ঞা হয়েছে। অন্যথায়, ভিম এমন কী দিয়ে ম্যাপিং তৈরি করার চেষ্টা করবে যা আপনি ভাবেন না। এছাড়াও যদি আপনি স্পেস বারটি আপনার নেতা হিসাবে ব্যবহার করতে চান (যা বেশিরভাগ বর্তমান) আপনি নিশ্চিত করে নিন যে আপনি সঠিক চিহ্নটি ব্যবহার করেছেন:let mapleader = "\<Space>"

আপনার ম্যাপিং এখনও কাজ করে না?

যদি আপনি এই উত্তরের সমস্ত পদক্ষেপগুলি অতিক্রম করে থাকেন এবং আপনার ম্যাপিংটি এখনও আপনার পছন্দ মতো কাজ না করে, আপনি সম্ভবত এই সাইটে সহায়তা চাইতে পারেন।

আপনাকে কিছু গুরুত্বপূর্ণ তথ্য সরবরাহ করতে মনে রাখতে সহায়তা করতে যেমন:

  • আপনার ম্যাপিং সংজ্ঞায়িত করার জন্য আপনি যে কমান্ডটি ব্যবহার করেছিলেন তা
  • আপনি আপনার ম্যাপিংটি কী করবেন বলে আশা করছেন।
  • সমস্যার একটি সুনির্দিষ্ট বর্ণনা:

    "এটি কাজ করে না" যারা আপনাকে সাহায্য করার চেষ্টা করবে তাদের পক্ষে সত্যই সহায়ক হবে না। ম্যাপিংটি কিছু না করে বা আপনি যেটা প্রত্যাশা করেছিলেন তার থেকে এটি অন্যরকম আচরণ করে কিনা আপনার অবশ্যই সুনির্দিষ্ট হওয়া উচিত।

  • এছাড়াও সূচিত করে যে আপনি আসলে পদক্ষেপ এখানে বর্ণিত অনুসৃত এবং ফলাফল আপনার সাথে পেতে :mapএবং:verbose map

এই সবগুলি আপনাকে এবং সাইটের ব্যবহারকারীদেরকে অনেক সময় সাশ্রয় দেবে।


একটি দরকারী আদেশ: :unmap

কখনও কখনও এটি ব্যবহারের আচরণটি ডিবাগ করতে সহায়তা না করে ম্যাপিং পুনরায় সেট করা কার্যকর হতে পারে।

এটি করার জন্য আপনি কমান্ডটি ব্যবহার করতে পারেন :unmap <key>যা <key>সাধারণ, ভিজ্যুয়াল এবং অপারেটিং-মুলতুবি মোডের জন্য নির্ধারিত ম্যাপিং সরিয়ে ফেলবে । :iunmapসন্নিবেশ মোডের জন্য ম্যাপিংগুলি সরিয়ে ফেলবে। অন্যান্য মোডের জন্য দেখুন :help :unmap


তথ্যসূত্র

ম্যাপিংয়ের একটি দুর্দান্ত ভূমিকা: শিখার স্ক্রিপ্টটিহরডওয়ে (এবং ভিমের আরও অনেকগুলি দিক)

ডক: :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আমি আমার প্রশ্নের প্রথম লাইনে যেমন বলেছি, সুতরাং এই কারণগুলি সংগ্রহ করা ম্যাপিং সম্পর্কে নকল প্রশ্নের সংখ্যা হ্রাস করার অনুমতি দেওয়া উচিত।
স্ট্যাটক্স

1
ভিম-লেটেক্স এবং ফ্রেঞ্চ কীবোর্ডগুলির সাথে একটি পুনরাবৃত্তি সমস্যা: <m-i>এবং éভিমের ক্ষেত্রে একই এবং সমস্ত মেটা + কী এর সাথে এটি একই: তারা একটি ভিন্ন ডায়াক্রিটিকের সাথে সম্পর্কিত।
লুক হার্মিটে 9

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>। টার্মিনালে ভিম চালানোর দিকে দৃ as়মুখী হওয়ায় বেশিরভাগ ব্যবহারকারী মেটা কী ব্যবহার করেন না - যেখানে মেটা-কীটি সহজেই ব্যবহার করা যায় না। সমস্যাটি লক্ষ্য করার জন্য আমাদের gvim বা macvim ব্যবহার করা উচিত।
লুক হার্মিটে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.