ভিআইএম না রেখে আমি কীভাবে কোনও ফাইলের একটি অংশে শব্দগুলি গণনা করব?


10

আমার কাছে পাঠ্য পূর্ণ একটি ফাইল রয়েছে (মার্কডাউন বা ল্যাটেক্স বলুন)। আমি এই ফাইলের একটি অংশে শব্দের সংখ্যা গণনা করতে চাই।

আমি জানি আমি :! wc -w %বর্তমান বাফারে ডাব্লুসি-ডাব্লু চালাতে পারি can এবং আমি জানি যে আমি আগ্রহী বিভাগটি একটি নাম রেজিস্ট্রে পরিণত করতে পারি। আমি অনুমান করছি যে কমান্ড বা পাইপ ব্যবহারের জন্য অপারেটিং সিস্টেমে একটি নাম রেজিস্ট্রার প্রেরণ করার একটি উপায় আছে তবে আমি এটির সন্ধান করতে পারিনি। বা একটি রেজিস্টারে শব্দ গণনা করার আরও ভাল উপায় আছে?

আমার ব্যবহারের ক্ষেত্রটি হ'ল আমি ভিমে অনেকগুলি নন-প্রোগ্রামিং রাইটিং (নোটস, থিসিস, ইত্যাদি) করি এবং আমি একটি সম্পাদনার মাঝখানে ফাইলের একটি প্রদত্ত অংশে কতগুলি শব্দ যুক্ত করেছি তা গণনা করতে চাই সেশন.

উত্তর:


16

আপনি ব্যবহার করতে পারেন gCTRL+g, যা আপনাকে দেবে:

Col 1 of 118-121; Line 1 of 5; Word 1 of 142; Byte 1 of 678

আপনি এটিকে ভিজ্যুয়াল মোড থেকেও ব্যবহার করতে পারেন, আপনি যদি কেবলমাত্র নির্বাচনের জন্য শব্দ সংখ্যাটি পেতে চান তবে পাঠ্য অবজেক্টগুলির সাথে বিশেষত দরকারী এটি ip। (যেমন আপনি vipg<C-g>বর্তমান অনুচ্ছেদে শব্দ গণনা পেতে ব্যবহার করতে পারেন )।

দেখুন: :help word-countএবং :help text-objects


উপরের বিকল্পটি সম্ভবত আরও ভাল, তবে আপনি wcকোনও বিভাগে শব্দের সংখ্যা গণনা করতেও ইউটিলিটিটি ব্যবহার করতে পারেন । :! wc -w %আপনি যে ফর্মটি ব্যবহার করেন সেগুলি বাদ দিয়ে আপনিও ব্যবহার করতে পারেন :%!wc -w। এটি শেল সরঞ্জামে একটি গতি ফিল্টার করবে (এই ক্ষেত্রে %পুরো বাফার), তবে আপনি অন্যান্য রেঞ্জগুলি (যেমন :1,5!wc -wপ্রথম 5 লাইনগুলির !,+5!wc -wজন্য বর্তমান এবং পরবর্তী 5 লাইন ইত্যাদির জন্য ব্যবহার করতে পারেন) ব্যবহার করতে পারেন । আপনি ভিজ্যুয়াল মোডে পাঠ্য নির্বাচন করতে পারেন এবং :!wc -wআপনার নির্বাচন ফিল্টার করতে টাইপ করতে পারেন।

দ্রষ্টব্য যে এটি শেল সরঞ্জামের আউটপুট সহ গতি প্রতিস্থাপন করবে, তবে আপনি এটি uপূর্বাবস্থায় ফিরিয়ে নিতে পারেন ।

দেখুন :help :range!, :help rangeএবং এই উত্তরটি যেখানে আমি ব্যাপ্তির আরও উদাহরণ দিই।


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

1
আপনি g<C-g>যেভাবে ব্যবহার করতে পারেন তা আমার কোনও ধারণা ছিল না । অসাধারণ!
চিরসবুজ

3

এটি সম্পাদন করার দুটি উপায় রয়েছে, খাঁটি ভিমস্ক্রিপ্টের উপায় এবং wcউপায়।

খাঁটি ভিএম উপায়

এটি করতে আপনি অনুসন্ধান এবং প্রতিস্থাপন কমান্ডটি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

:%s/\<\w\{-}\>//gn

এটি যা করে তা কোনও প্রদত্ত প্যাটার্নকে কিছু দিয়ে প্রতিস্থাপনের পরিবর্তে এটি কেবল প্যাটার্নের উপস্থিতি গণনা করে। এটি nপতাকার কারণে । একটি নির্দিষ্ট বিভাগে শব্দগুলি গণনা করতে (এই ক্ষেত্রে 5 থেকে 15 পর্যন্ত লাইন), আপনি এরকম কিছু করতে পারেন:

:5,15s/\<\w\{-}\>//gn

এটি একটি নিবন্ধের মধ্যে নির্বাচনের বিষয়বস্তুগুলি ইঙ্ক করার প্রয়োজনীয়তা সরিয়ে দেয়। কী স্থানে স্থাপন করা যায় তার আরও সম্ভাবনা দেখতে 5-15, সহায়তা বিষয়টি পড়ুন cmdline-ranges। আপনি যদি এটি প্রায়শই করতে চান তবে এটির জন্য ম্যাপিং (বা কমান্ড) তৈরি করা ভাল। এছাড়াও, আপনি যদি hlsearchসক্ষম করে থাকেন তবে আপনি :nohlsearchহাইলাইটিং সাফ করার জন্য পরে চালাতে চাইতে পারেন ।

wcপথ

একই জিনিস সঙ্গে সম্পন্ন করা যেতে পারে wc। কমান্ডের cmdline-rangesসাহায্যে অঞ্চলটি নির্বাচন করতে আপনি একইভাবে ব্যবহার করতে পারেন :s, আপনি এগুলি বহিরাগত কমান্ডের সাহায্যে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

:5,15!wc -w

wcকমান্ডের মাধ্যমে এটি 5 থেকে 15 পর্যন্ত রেখা চালায় । এর নেতিবাচক দিকটি হ'ল এটি কমান্ডের আউটপুট দিয়ে রেখাগুলির রেঞ্জটি প্রতিস্থাপন করে। টিপে আপনি এই পরিবর্তনটি পূর্বাবস্থায় ফেরাতে পারেন u। এছাড়াও নোট করুন যে ভাইমস্ক্রিপ্ট সমাধানটি বিভিন্ন ভাষার সাথে কাজ করতে পারে না, কারণ \wঅন্য ভাষায় শব্দের অক্ষরের সাথে সাধারণত মিল নেই। wcএই চেয়ে ভাল করতে পারে \w। এছাড়াও এটির কাজটি আরও দ্রুত করার জন্য এখানে অভিনব কমান্ড দেওয়া হয়েছে:

command -range=% -addr=lines WordCount execute '<count>!wc -w' | .y a | undo | echo @a

মনে রাখবেন এই ক্লোবারগুলি aরেজিস্টার করুন।

বিঃদ্রঃ

দেখা যাচ্ছে এটি g<C-g>কী সংমিশ্রণের সাথে ভিজ্যুয়াল মোডেও সম্পন্ন করা যায় । এর ব্যাখ্যার জন্য কার্পেটস্মোকারের উত্তর দেখুন।


এগুলি বিশ্বব্যাপী করার জন্য এগুলির সাথে এন-এর পাশাপাশি আবশ্যক (অন্যথায়, তারা কেবল প্রতি লাইনে একটি শব্দের সাথে মেলে)। দ্বিতীয়টিরও শুরুতে একটি এস প্রয়োজন।
কলিন ম্যাকফাউল

1
স্থির, সে সম্পর্কে দুঃখিত।
চিরসবুজ

1
\wপ্রথমে একটি দুর্দান্ত ধারণা মত শব্দ ব্যবহার করে , কিন্তু এটি পরীক্ষার পরে আমি বেশ কয়েকটি সমস্যা পেয়েছি। বৃহত্তমটি হ'ল এটি অ-এস্কি অক্ষরের সাথে মেলে না, সুতরাং এর মতো একটি শব্দ überসহজেই এড়ানো যায় ( এই বিষয়ে গতকাল একটি প্রশ্ন ছিল )। এছাড়াও, এর মতো একটি শব্দ e-mail2 শব্দ হিসাবে গণ্য করা হয়, যেহেতু -এটি হয় না \w( -উদাহরণস্বরূপ ডাচে এটি কিছুটা অস্বাভাবিক, তবে উদাহরণস্বরূপ ডাচে খুব সাধারণ)। এই চরিত্রটিতে অবহেলিত অন্য চরিত্রগুলিও থাকতে পারে, যা আমাদের শেষ পয়েন্টে নিয়ে আসে: "শব্দ" হিসাবে বিবেচিত বিষয়গুলির সম্মেলনগুলি পৃথক হতে পারে ...
মার্টিন টর্নিজ

... বিভিন্ন ভাষায়, এবং "যথাযথ" সরঞ্জামগুলি wcলোকালে উঠতে পারে (জিএনইউ wcআসলে উপায় দিয়ে এটি মোকাবেলা করে কিনা জানি না , জিএনইউ সরঞ্জামগুলি তাদের দুর্দান্ত ইউনিকোড সমর্থনের জন্য সুপরিচিত নয়)।
মার্টিন টর্নয়েজ

সেটা মজাদার. আমি wcসমাধানের একটি প্লাস হিসাবে যোগ করতে পারে ।
চিরসবুজ

1

শব্দ ব্যবহারের জন্য:

:.,+4 s/\i\+/&/gn

. বর্তমান রেখাটি বোঝায়।

এছাড়াও আমি আমার .vimrc ফাইলে নিম্নলিখিতটি রেখেছি:

:cabbrev zzcc   s/./&/gn

:cabbrev zzcw   s/\i\+/&/g

আমি টাইপ করতে পারি:

:.,+6 zzcw

এবং zzcwপ্রসারিত হবেs/\i\+/&/g

zzcwশুধু একটি বিজোড় নাম (আমার জন্য) কিছু মিল পাওয়া যায়নি হবে।

একটি পার্শ্ব প্রতিক্রিয়া হ'ল সম্পূর্ণ ফাইলটি নির্বাচিত এবং হাইলাইট হয়।

আমি একটি ফাইলটিতে মাল্টি-লাইন টুইটগুলি টাইপ করতে সক্ষম হয়েছি, নিশ্চিত হয়েছি যে খুব বেশি অক্ষর নেই make

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