আমি কীভাবে d [গণনা] d ম্যাপ করব?


18

এনবি এটি "d3fg" কমান্ড কীভাবে কাজ করে তার নকল নয় ? ভোট দেওয়ার আগে দয়া করে এটি পড়ুন!

ছোট মুছে ফেলার কাজগুলি বড়র মতো করার জন্য আমি আমার সন্ধানে কিছুটা অচলাবস্থা নিয়ে এসেছি । আমি যে সমস্যাটি পেয়েছি তা হ'ল কমান্ডগুলি পুনর্নির্মাণের পদ্ধতিটি আমি বুঝতে পারি না d3d। আসলে, আমি বুঝতে পারি না যে তারা কীভাবে প্রথম স্থানে কাজ করে, এবং ভিমের সহায়তায় তাদের কোনও উল্লেখ খুঁজে পাই না find

d3jসোজা: এটি গতিতে dঅপারেটরকে প্রয়োগ করে 3j,

3ddএটিও সোজা: এটি dd3 এর একটি "গণনা" দিয়ে কমান্ডটি চালায় ।

d3d দেখে মনে হচ্ছে এটি সোজা হওয়া উচিত, এটি dঅপারেটরের সাথে প্রয়োগ করে… তবে কী 3d? এটি কোনও গতি নয়। আপনি যদি 3dনিজে নিজে টাইপ করেন, ভিম এটিকে অপারেটর অনুসারে একটি গণনা হিসাবে বিবেচনা করে এবং আরও ইনপুটটির জন্য ধৈর্য ধরে অপেক্ষা করে।

এবং আপনি অপারেটরগুলিকে অন্যান্য অপারেটরগুলিতে প্রয়োগ করতে পারবেন না। ddদুটি অপারেটরের ক্রম হিসাবে সাহায্যে বর্ণনা করা হয়নি। এটি একটি পৃথক, দ্বি-কীস্ট্রোক কমান্ড। (সিএফ dc। যা কিছুই করে না))

এটি এমনটিও দেখা যায় না যে দুটি কীবোস্ট্রোক প্রয়োজন এমন কমান্ডগুলির জন্য গণনাটির অবস্থানটি নমনীয়: 2gjকার্সারটিকে দুটি স্ক্রিন-লাইনের নিচে সরিয়ে g2jদেয় , তবে প্রথম দুটি কিপ্রেস পুরোপুরি ত্যাগ করে এবং কার্সারটিকে এক লাইনের নিচে নিয়ে যায়।

সুতরাং কিভাবে এটি কাজ করে? এটি কি ভিমের অভ্যন্তরীণ কোডের মধ্যে একটি বিশেষ মামলা? আমি কোনও d[count]dম্যাপিং তৈরি করতে পারি এমন কোন উপায় আছে কি ?

সম্পাদনা : এটি কোনও পাঠ্য অবজেক্ট? :h text-objectsএটি "টেক্সট অবজেক্ট সিলেকশন কমান্ডস" এর তালিকায় অন্তর্ভুক্ত করে না, তবে তারপরে এটি "ছোট থেকে বড় অবজেক্টগুলিতে দলবদ্ধ" মুছে ফেলার তালিকায় ডিডি অন্তর্ভুক্ত করে না । এবং d2awকার্সারের নীচে শব্দটি এবং নীচেরটি মুছে দেয়। অন্যদিকে, c2dকিছুই করে না।

* আমি নিশ্চিত যে এগুলির কিছু উল্লেখ অবশ্যই আছে তবে আমি এটি খুঁজে পাচ্ছি না। আমি পড়েছি :help deleting, :help motion.txtএবং চেষ্টা :helpgrep dNd1-9 থেকে এন সব মানের জন্য


2
আমি মনে করি শেষটি dএকটি নিশ্চিতকরণ হিসাবে কাজ করে; সুতরাং এটি হিসাবে একই d3<CR>y3yএবং c3cএকই কাজ ... আমি এই কোন দস্তাবেজ খুঁজে পাচ্ছি না পারেন যদিও তেজ: সাহায্য, ষষ্ঠ (1), NVI (1), অথবা POSIX বৈশিষ্ট ... এটা একই আচরণ করে viএবং nviBTW ।
মার্টিন টর্নোইজ

1
ddএকরকম , একইরকম d__( [count]-1) ম লাইনটিতে প্রথমটি অ- ফাঁকাতে কার্সারটি নীচে নিয়ে আসে , তবে এটি লাইনওয়াইজ হয়, সুতরাং যখন অপারেটরের সাথে জুড়ি তৈরি হয়, তখন এটি সম্পূর্ণ লাইনে কাজ করে। যে কারণে, এটি উপলব্ধি করে যে দুটি dগণকের মধ্যে একটি গণনা উপস্থিত হতে পারে ।
tommcdo

উত্তর:


28

অপারেটর-মুলতুবি মোড

একটি অপারেটর (যেমন টাইপ মধ্যে d, cঅথবা gU) এবং একটি গতি (যেমন w, i}অথবা /foo<CR>), তেজ অপারেটর-মুলতুবী মোডে রয়েছে। আপনি এটি ব্যবহার করে :omapএবং এর জন্য ম্যাপিং তৈরি করতে পারেন :onoremap

আমার উদাহরণগুলিতে, আমি অপারেটরটির মুলতুবি dকরতে যাচ্ছি w। এটি একটি এলোমেলো পছন্দ, কারণ আপনি আসলে এটি কী ব্যবহার করতে চেয়েছিলেন তা আমি জানি না।

একটি ওম্যাপ তৈরি করুন

dঅপারেটর মুলতুবি মোডের জন্য একটি ম্যাপিং তৈরি করা যাক । আমি ধরে নেব যে আমরা এখানে ভাইমস্ক্রিপ্ট লিখছি (যেমন আপনার হিসাবে .vimrc), তাই আমি নেতৃস্থানীয় :গুলি বাদ দেব ।

onoremap d w

এটি ddমত কাজ করে তোলে dw। এটি যেমন d[count]dকাজ করে তোলে d[count]w। তবে আমি বাজি ধরছি যে আপনি dd(যেমন [count]সরবরাহ করা হয়নি) এর আচরণকে প্রভাবিত করতে চান না ।

এক্সপ্রেশন ম্যাপিংস

এক্সপ্রেশন ম্যাপিংস আপনাকে ম্যাপিংয়ের ডান-হাতের উত্পাদন করতে একটি ভিমস্ক্রিপ্ট এক্সপ্রেশন মূল্যায়ন করতে দেয়। এক্সপ্রেশন একটি স্ট্রিং মূল্যায়ন করা উচিত। এক্সপ্রেশন ম্যাপিংগুলি <expr>কীওয়ার্ড দ্বারা চিহ্নিত করা হয় ।

ভিমে কিছু বিল্ট-ইন ভেরিয়েবল রয়েছে যা বিভিন্ন সময়ে পপুলেশন হয় এবং ম্যাপিংয়ের সময় প্রায়শই কার্যকর হয়। এর মধ্যে একটি হ'ল v:countযা [count]অপারেটর বা গতিতে সরবরাহ করা হয়।

সব একসাথে রাখা যাক। যদি [count]সরবরাহ করা হয় না, v:countহবে 0। আমরা আমাদের ম্যাপিংয়ে কেবল dসেই ক্ষেত্রে ব্যবহার করতে বলতে পারি ।

onoremap <expr> d v:count == 0 ? 'd' : 'w'

এখন ddডিফল্টের মতো আচরণ করে (একটি লাইন মুছে ফেলে), তবে d[count]dআচরণ করে d[count]w। শান্ত!

dঅপারেটরের পরে এটি ব্যবহারে সীমাবদ্ধ করুন

আপনি কিছু খেয়াল করতে পারেন, যদিও। এখন cdমত আচরণ করে cw। এটি কোনও সমস্যা নাও হতে পারে তবে সম্পূর্ণতার জন্য, আসুন এটি সীমাবদ্ধ রাখুন যাতে এটি কেবল dঅপারেটরের পরে কাজ করে ।

ভিমের আরও একটি পরিবর্তনশীল v:operatorরয়েছে, এতে সাম্প্রতিককালে ব্যবহৃত অপারেটর রয়েছে। বিশেষ কিছু করার আগে এটিও পরীক্ষা করে দেখুন।

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : 'w'

দ্রষ্টব্য: যেহেতু :mapকমান্ডগুলি শৃঙ্খলাবদ্ধভাবে বেঁধে রাখা যেতে পারে |, আমাদের এখানে তাদের প্রকাশে সেগুলি এড়াতে হবে। সুতরাং লজিকাল ওআর অপারেটর ||হয়ে যায় \|\|

কুল, তাই cdএবং c[count]dপিছনে, অসম্মতির এবং তাদেরও করার জন্য ব্যবহৃত হয়। এটি ভাল যাতে অন্যান্য প্লাগইনগুলি সংজ্ঞায়িত করতে পারে cd

আমি অন্য কিছু গতি মুছতে চাই না

আপনি যদি d[count]dপুরোপুরি আলাদা কিছুতে মানচিত্র বানাতে চেয়েছিলেন তবে পাঠ্য মুছে ফেলার সাথে কিছুই করার নেই, আমরা সেই কাজটিও করতে পারি।

আপনি যখন নরমাল মোডে কমান্ডগুলি টাইপ করেন, এবং আপনি ভুল করে একটি কমান্ড টাইপ করতে শুরু করেন, আপনি <Esc>সেই আদেশটি বাতিল করতে পারেন । আপনার ম্যাপিংয়ের ক্ষেত্রেও এটি একই প্রযোজ্য।

চলুন d[count]dবর্তমান লাইনে যা কিছু হোক [count]তা পরিবর্তন করুন ।

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : '<Esc>cc' . v:count . '<Esc>'

ম্যাপিং শেষ অংশ একটি VimScript অভিব্যক্তি: <Esc>cc' . v:count . '<Esc>'। এটা <Esc>মুলতুবী বাতিল করতে dকমান্ড, তারপর ccবর্তমান লাইন পরিবর্তন করতে v:countমান টাইপ করতে [count](ঢোকান মোডে), এবং <Esc>সাধারণ মোডে ফিরতে হবে। নোট করুন যে আমরা এখানে উইমস্ক্রিপ্ট কনটেনটেশন অপারেটর ব্যবহার করে একটি স্ট্রিং তৈরি করছি .


আপনার প্রকৃত ব্যবহারের ক্ষেত্রে সম্ভবত আমি এখানে বর্ণিতের চেয়ে আলাদা হতে চলেছি, তবে আশা করি এটি আপনাকে বল ঘূর্ণায়মান হতে সহায়তা করবে।

শুভ ভিমিং!


দুর্দান্ত উত্তর! সম্মত। প্রশ্নের শুরুতে আমি আমার ব্যবহারের ক্ষেত্রে (vi.SE তেও) লিঙ্কটি দিয়েছিলাম তবে আমার ধারণা আপনি এটি অবশ্যই মিস করেছেন। আমার মূলত :omap d d(!) করা দরকার, তবে দুর্ভাগ্যক্রমে অপারেটর-পেন্ডিং মোডটি কখনই আমার ডি ম্যাপিংয়ের কারণে কাস্টম অপারেটরের ক্রিয়াকলাপটি স্থির করে না। আশা করি জিনিসগুলি d3dকীভাবে করা উচিত তা তৈরি করার জন্য ঝাঁকুনি দেওয়া সম্ভব though (আপনার যদি কিছু ধারণা থাকে তবে আমাকে জানান, বা যদি আপনি চান তবে অন্য প্রশ্নের সম্পূর্ণ সমাধান পোস্ট করতে নির্দ্বিধায়) ধন্যবাদ!
ধনী

1
আসলে, দ্বিতীয় চিন্তা, আমি এখন এটি গ্রহণ করছি। আপনি এই জাতীয় ম্যাপিং কীভাবে তৈরি করবেন এবং কীভাবে এটি হুডের নীচে কাজ করে তা উভয়েরই ব্যাখ্যা দিয়েছিলেন, যা আমি জিজ্ঞাসিত দুটি জিনিস ছিল।
ধনী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.