স্বয়ংক্রিয়ভাবে ভিমে ম্যাচিং বন্ধনী তৈরি করুন


17

আমি কীভাবে স্বয়ংক্রিয়ভাবে ভিমে মিলে যাওয়া বন্ধনীগুলি তৈরি করব?

এটি নিম্নলিখিত হিসাবে কাজ করা উচিত: আমি যদি একটি খোলা ব্রেস ইনপুট করি তবে সমাপ্তিটি স্বয়ংক্রিয়ভাবে উপস্থিত হওয়া উচিত এবং কার্সারটিকে মাঝখানে স্থাপন করা উচিত। ধনুর্বন্ধনী জোড় থেকে লাফিয়ে ফেলার জন্য সংমিশ্রণটি Ctrl-jব্যবহৃত হয়।

স্বয়ংক্রিয় ব্রেস সন্নিবেশ সরবরাহকারী প্রচুর প্লাগইন রয়েছে। কিন্তু তারা

  • হয় হয় Ctrl-jবন্ধনী জোড় থেকে লাফিয়ে যাওয়ার চেয়ে আলাদা কী সংমিশ্রণ ব্যবহার করুন বা
  • UltiSnips কী বাইন্ডিংগুলিতে হস্তক্ষেপ করুন ।

নিম্নলিখিত হিসাবে প্রত্যাশিত হিসাবে কাজ করে

:inoremap ( ()<Esc>:let leavechar=")"<CR>i
:imap <C-j> <Esc>:exec "normal f" . leavechar<CR>a

তবে এই সেটিংসের সাহায্যে আলটিসনিপস স্নিপেটগুলি আর কাজ করে না। সুতরাং আমি বন্ধনী বন্ধনী inোকাতে UltiSnips ব্যবহার করেছি:

inoremap ( (<C-R>=UltiSnips_Anon('($1)$0', '(')<CR>

এটি প্রায় কাজ করে। ম্যাচিং ব্রেস inোকানো হয় এবং আমি এটি বন্ধ করে এড়িয়ে যেতে পারি Ctrl-j। এটি যাইহোক, কেবলমাত্র উন্মুক্ত ধনুর্বন্ধকের সামনে কোনও স্থান থাকলে কাজ করে।

main () // works, the closing parentheses is added
main(   // fails without a space

আমার সমাধানগুলিতে হয় বন্ধ বন্ধনীটি পেরিয়ে যাওয়ার জন্য আলাদা কী বাঁধাই করা দরকার বা খোলাটির সামনে একটি জায়গা প্রয়োজন। কিভাবে এটি ঠিক করবেন?

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


1
আপনি কি অটোক্লোজ চেষ্টা করেছেন ? আপনি এর সাথে )জুটিগুলি ছাড়তে পারবেন , এটিকে পুনরায় তৈরি c-jকরতে পারে work
কেভিন

উত্তর:


4

আমি কীভাবে স্বয়ংক্রিয়ভাবে ভিমে মিলে যাওয়া বন্ধনীগুলি তৈরি করব?

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

সুতরাং আমি বন্ধনী বন্ধনী Ulোকাতে UltiSnips ব্যবহার করেছি

আপনি এর পরিবর্তে এটি চেষ্টা করে দেখতে পারেন (যা আমার মূল পরামর্শের চেয়ে আলাদা):

inoremap ( ()<CR>=UltiSnips_Anon('$1)$0', ')')<CR>

যেখানে UltiSnips ম্যাচে (অন্তর্ভুক্ত mainনা করে লাইনটি বিভক্ত করবে । এর জন্য স্নিপেট প্লাগইন ব্যবহার করে সমস্যাটি হ'ল তারা (সাধারণত) বাসা বাঁধাকে সমর্থন করে না, সুতরাং পরবর্তী (নেস্টেড) স্নিপেট inোকানো হলে তারা কোনও লাফের অবস্থান ভুলে যাবে।

ধনুর্বন্ধনী জোড় থেকে লাফিয়ে ফেলার জন্য সংমিশ্রণটি Ctrl-jব্যবহৃত হয়।

আপনি Ctrl-jUltiSnips বা বিরোধী প্লাগইনগুলির জন্য পুনরায় তৈরি করতে পারেন । যদি নথিতে ম্যাপিংগুলি তালিকাভুক্ত না হয় তবে আপনি :map/imap/nmap <key>ম্যাপিংটি প্রদর্শন করতে ব্যবহার করতে পারেন । আপনি যদি Ctrl-jউভয় প্লাগইন বাছাই করে বেছে নিতে এবং কাজ করতে চান তবে আপনি যা চাইছেন তা জিজ্ঞাসা করছেন:

  1. আপনারা সন্দেহ করতে পারেন তার থেকে অনেক বেশি উন্নত কিছু
  2. আমি সন্দেহ করি এমন কিছু যা আপনি সত্যই চান না

এই ব্যাশ লুপ বিবেচনা করুন:

while (( ${arr1[i]} < ${arr2[i<CURSOR>]} )); do
  [next_snippet_position_marker]
done

এই ক্ষেত্রে, আপনাকে Ctrl-jলুপের বডিটিতে যেতে 5 বার টিপতে হবে। সমান্তরাল জোড় থেকে বাইরে বেরোনোর ​​জন্য বন্ধনী বন্ধনীগুলি ব্যবহার করা আপনি কার্সারটি কোথায় সরানো চান তার আরও অনেক বেশি নিয়ন্ত্রণ দেয়। Pairsোকানো জোড়গুলি ট্র্যাক করতে আপনি একটি স্ট্যাক প্রয়োগ করতে পারেন Ctrl-jএবং পপ এবং সরানোর জন্য ব্যবহার করতে পারেন , তবে আপনি যদি স্ট্যাক থেকে অপসারণ না করে ম্যানুয়ালি ব্রেসগুলি মুছতে শুরু করেন তবে আপনি সমস্যার মধ্যে চলে যাবেন। সুতরাং আপনি যে সমস্যাগুলি বন্ধনী-প্লাগইনগুলি সমাধান করার চেষ্টা করছেন তা সমাধান শুরু করবেন। এটি পুনরায় উদ্ভাবনের জন্য একটি কঠিন চাকা is

এটি প্রসারিত করে, আপনি প্রথমে Ctrl-jব্রেস এবং স্নিপেট থেকে ঝাঁপিয়ে পড়ে যা চেয়েছিলেন তা পেতে পারেন । আপনি যদি স্নিপেটের অবস্থানগুলি উপস্থাপন করতে কিছু ডামি মান ব্যবহার করেন Ctrl-jএবং স্নিপেট বা ধনুর্বন্ধনী হস্তের সাথে সামঞ্জস্য রেখে ডায়নামিক রিম্যাপিংয়ের সাথে ক্লোজিং ব্রেসগুলি ছাড়াও স্ট্যাকের উপর চাপ দিন । তবে তখন আপনাকে কী জাদুটি ঘটতে হবে তা নির্ধারণ করার জন্য কিছুটা উন্নততর হিউরিস্টিক্স প্রয়োগ করতে হবে, যেহেতু আপনি মূলত একবারে দুটি সমস্যা গ্রহণ করছেন যা বর্তমানে স্নিপেট সন্নিবেশ প্লাগইনস এবং ব্রেস ম্যাচিং প্লাগইনগুলি আলাদাভাবে সমাধান করা হচ্ছে, এবং সুবিধার্থে এবং, ভাল, যাদুবিদ্যার জন্য এই সমস্যার পুনরায় সমাধান করা তাদের সমাধানগুলির শীর্ষে ।

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


1

আমার মনে হয় ডিলিমেট আপনার যা প্রয়োজন তা করে does

এটি স্বয়ংক্রিয়ভাবে বন্ধনী বা উদ্ধৃতিগুলি বন্ধ করে দেয় এবং আপনার কার্সারকে মাঝখানে রাখে। একটি প্রথম বন্ধনী যুগল আউট তিড়িং লাফ করার জন্য (যখন সন্নিবেশ মোডে হচ্ছে) আপনি করতে চাই Ctrl-g+ + gকিন্তু আপনার এই remap হতে পারেন Ctrl-jআপনার এই যোগ করে vimrc:

% Jump out of a block of parentheses (uses delimitMate)
imap <C-j> <C-g>g

এখানে আরও বিশদ সরবরাহ করা আরও ভাল, এবং আরও পড়ার জন্য লিঙ্কটি একটি রেফারেন্স হিসাবে ব্যবহার করুন। এই লিঙ্কটি অবৈধ হয়ে যাওয়ার পরে আপনার উত্তরটি তার সমস্ত মানকে আলগা করে না।
অ্যান্টন

1

আমি অটোক্লোজটি কিছুটা পিছলে সংযোজন করেছি এবং আমার সেটআপে (আল্টিসনিপস এবং সুপারট্যাব) হস্তক্ষেপও পেয়েছি, তবে আমি এটির একিপিস সিডিটি অনুকরণের পদ্ধতির পছন্দ করি।

আমি নেভিগেশন এবং ইন্ডেন্টেশন সাহায্যে নিম্নলিখিত মানচিত্রের সাথে ডিলিমিটমেট ব্যবহার করি , একই ফলাফল পাওয়ার চেষ্টা করছি:

imap <C-F> <C-G>g           " To jump out brackets in same line.
inoremap <C-K> <ESC>ki<TAB> " To move and insert an indent on the line before the current cursor (assuming empty line)

আমি এটি এইভাবে ব্যবহার করি: খোলার সন্নিবেশ করান { <CR><CR><C-K>এবং ইনডেন্ট করা অভ্যন্তরের লাইনে লেখা শুরু করুন।


আমি ডিলিমেটমেটটিকেও সামান্য
পিছিয়ে পড়তে দেখলাম

1

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

তবে এটি আপনার প্রয়োজনীয় ট্যাবস্টপগুলিকে সমর্থন করে এবং বন্ধনীটির বাইরে ঝাঁপিয়ে পড়ে। এটি আপনার বন্ধনীগুলির মধ্যে একটি নতুন তৈরি করে না, তবে যাইহোক আপনার কেবল এটির জন্য একটি অতিরিক্ত কী প্রয়োজন - <CR>

আপনি <C-J>নীচের পরের লাইনে লাফ দিতে মানচিত্র করতে পারেন:

:inoremap <C-J> <C-O>j

বা আপনি যদি পরবর্তী লাইনের শুরুতে যেতে চান:

:inoremap <C-J> <C-O>+

0

এরকম কিছু আপনার জন্য কার্যকর হতে পারে।

inoremap {      {}<Left>
inoremap {<CR>  {<CR>}<Esc>O
inoremap {{     {
inoremap {}     {}

আপনি যা পরামর্শ দিচ্ছেন তা হ'ল একটি সাধারণ ম্যাপিং যা বন্ধ বন্ধনীটি পেরিয়ে যাওয়ার অনুমতি দেয় না।
মার্কো

0

আসলে, আলটিসনিপস এটি প্রায় নিখুঁতভাবে করতে পারে (এটি নতুন হতে পারে)। উপরে দেওয়া উত্তরগুলিতে সামান্য পরিবর্তন করা, আমার সাথে ভাল সাফল্য রয়েছে

inoremap () ()<C-R>=UltiSnips#Anon('($1)$0', '()', 'double parentheses', 'i')<CR>

একটি টাইপ ()করতে হবে যা ভাল খুঁজে পায় তবে তাও পরিবর্তিত হতে পারে (। তারপরে অতিরিক্ত alচ্ছিক আর্গুমেন্টগুলি UltiSnips#Anonহ'ল একটি বিবরণ এবং সংশোধক iযা শব্দের প্রসারিত করতে দেয়।

<c-j>কাজের সাথে প্রথম বন্ধনীর বাইরে ঝাঁপ দেওয়া, অন্যান্য স্নিপেটের মধ্যেও নেস্ট করা। তবে নেস্টেড প্রথম ()বন্ধনীর সন্ধান করা এই বৈশিষ্ট্যটিকে ভেঙে ফেলবে বলে মনে হচ্ছে এটি কোনও বড় বিষয় নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.