নির্বাচিত শব্দ এবং রেখাগুলি সংশোধন করতে কীভাবে ভিমে একটি বাহ্যিক কমান্ড ব্যবহার করবেন?


22

অন্যান্য সম্পাদকদের ক্ষেত্রে আমি দরকারী কিছু খুঁজে পাওয়ার যোগ্যতা হ'ল:

  • নির্বাচিত পাঠ্য গ্রহণ করুন
  • একটি বাহ্যিক কমান্ড চালান এবং নির্বাচনটি এটিতে পাস করুন stdin
  • বাহ্যিক কমান্ডগুলি গ্রহণ করুন stdoutএবং এটির সাথে বর্তমান নির্বাচনটি প্রতিস্থাপন করুন।

এইভাবে আপনি দরকারী পাঠ্য সরঞ্জামগুলি লিখতে পারেন যা মৌলিক io করতে পারে এমন কোনও ভাষা ব্যবহার করে নির্বাচনের কাজ করে।

সিলেকশন ব্যবহার করে এটি কীভাবে উইম দিয়ে করা যায়? ... একটি একক অক্ষর, শব্দ, অনুচ্ছেদ ... ইত্যাদি

(সরাসরি কমান্ড লাইনে, বা কী বাঁধাইয়ের মাধ্যমে?)


বিঃদ্রঃ

কমান্ডগুলি যেমন !sortলাইন-স্তরে কাজ করে, কারণ আমি এই প্রশ্নটি জিজ্ঞাসা করছি কারণ আমি নির্বাচনের উপর কাজ করতে চাই। (উদাহরণস্বরূপ, xচাপ দেওয়া থাকলে মুছে ফেলা হবে )।

উত্তর:


17

আমি দেখতে পাই যে প্রায়শই সহজ উপায় হ'ল ভিজ্যুয়াল মোডটি ব্যবহার করা v(বা Vসম্পূর্ণ লাইনগুলি নির্বাচনের জন্য মূলধন ), এবং আপনি যে পাঠ্যটি পাইপ করতে চান তা নির্বাচন করুন।

তারপরে টাইপ করুন:

:!cat

এটি যেমন দরকারী কিছু করে না। আমি প্রায়শই ব্যবহার করি একটি দরকারী আদেশ:

:!python -m json.tool

JSON ফর্ম্যাট করতে।

আপনি কেবল টাইপ করতে পারেন (ভিজ্যুয়াল মোড ব্যতীত):

:<range>!command

উদাহরণস্বরূপ, পুরো ফাইলের জন্য:

:%!python -m json.tool

বা বর্তমান লাইনের জন্য:

:.!python -m json.tool

এটির সাথে ব্যবহার করার জন্য আরও একটি দরকারী সরঞ্জাম হ'ল sortকমান্ড।
কোডি পোল

4
@ কোডিপল কি ভিমের সাথে ভুল হয়েছে :sort?
মার্টিন টর্নয়েজ

5
@ কারপেটসমোকার বাহ্যিক সাজানোর কমান্ডটিতে আরও অনেক বিকল্প রয়েছে এবং (লোকেলের উপর নির্ভর করে) একটি পৃথক ক্রম উত্পাদন করে।
ডারোবার্ট

1
এটি একটি লাইনে একটি শব্দ নির্বাচন করার জন্য কাজ করে না। (দেখুন শব্দের স্তর স্তর নির্বাচনের উল্লেখ প্রশ্নের মধ্যে দেখুন)
আইডিম্যান 42

@ ধারণাগুলি ৪৩ ঠিক ... আমি মনে করি আমি এই প্রশ্নটি মূলত "লাইন এবং শব্দ" হিসাবে "রেখা বা শব্দের" হিসাবে পড়েছি ... যাইহোক , শব্দের সাথে এটি করা স্পষ্ট নয়, ইউনিক্স প্রোগ্রামগুলি লাইনে কাজ করে এবং ভিম ব্যতিক্রম নয়। আমি কিছু পরীক্ষা-নিরীক্ষা করেছি এবং এর সমাধান পেয়েছি তবে এটি খুব ভালভাবে কাজ করে না ... হতে পারে আমার দৃষ্টিভঙ্গি ভুল, তাই আমি এটি কয়েক দিনের জন্য রেখে দেব এবং পরে এটিতে ফিরে আসব।
মার্টিন টর্নয়েজ

7

আমি এক্সপ্রেস.ভিম নামে একটি প্লাগইন লিখেছিলাম যা এটির সাথে সহায়তা করতে পারে। প্লাগইনটি এমন একটি অপারেটরকে সংজ্ঞায়িত করে g=যা আপনাকে একটি গতি (বা ভিজ্যুয়াল নির্বাচন) এর মাধ্যমে একটি VimScript এক্সপ্রেশন মূল্যায়ন করতে দেয়। এটি একটি অভিব্যক্তির জন্য অনুরোধ জানায়, যাতে আপনি v:valগতি দ্বারা আবৃত পাঠ্যের (বা, আবার ভিজ্যুয়াল নির্বাচন) জন্য স্থানধারক হিসাবে ব্যবহার করতে পারেন ।

এই ক্ষেত্রে, একটি দরকারী এক্সপ্রেশন system()ফাংশনটি ব্যবহার করবে যা একটি বাহ্যিক কমান্ড চালায়।

system('tr a-z A-Z', v:val)

(এখানে আমি trএকটি সাধারণ উদাহরণ বহিরাগত আদেশ হিসাবে ব্যবহার করেছি ))

এই সমস্যার জন্য এক্সপ্রেস.ভিম ব্যবহারের উপায়টি হবে ভিজ্যুয়াল মোডের সাহায্যে পাঠ্যটি নির্বাচন করা, তারপরে g=সেই অভিব্যক্তিটি টাইপ করুন , তারপরে হিট করুন Enter:

g=system('tr a-z A-Z', v:val)<CR>

আমি স্বীকার করব, এটি ব্যবহার করা সহজ নয়। (আসলে, আমি নিজেই এই প্লাগইনটি খুব কমই নিজেকে ব্যবহার করি!) আমি বাহ্যিক কমান্ডের অনুরোধ করতে শর্টকাট যুক্ত করার কথা ভাবছি, যেমন এর সাহায্যে এক্সপ্রেশন শুরু করা !। আমি যদি এখানে কাজ শেষ করি তবে আমি এখানে একটি আপডেট পোস্ট করব।

সম্পাদনা

আমি এক্সপ্রেশন.ভিমকে সংশোধন করেছি !বহিরাগত কমান্ড হিসাবে অভিব্যক্তিটি শুরু করার জন্য । সুতরাং, trউদাহরণের সাথে আঁকিয়ে রাখলে উপরেরটি অনেক সহজ হয়ে যায়। একটি ভিজ্যুয়াল নির্বাচনের পরে, নিম্নলিখিত টাইপ করুন:

g=!tr a-z A-Z<CR>

ব্যাখ্যা:

  1. এক্সপ্রেস অপারেটরটি সাথে ডেকে আনুন g=
  2. !tr a-z A-Zএক্সপ্রেশন হিসাবে প্রবেশ করুন
  3. প্রেস Enter

4

আপনি ভিমে ফিল্টার কমান্ড সন্ধান করছেন। দেখুন :help filter। এখানে প্রাসঙ্গিক ডকুমেন্টেশন রয়েছে:

!{motion}{filter}   Filter {motion} text lines through the external
                    program {filter}.
!!{filter}          Filter [count] lines through the external program
                    {filter}.
{Visual}!{filter}   Filter the highlighted lines through the external
                    program {filter} (for {Visual} see |Visual-mode|).
                    {not in Vi}

:{range}![!]{filter} [!][arg]               *:range!*
                    Filter {range} lines through the external program
                   {filter}.  ...[See documentation for details]

সুতরাং টাইপিংটি 5!!sortকার্সার থেকে শুরু করে পরবর্তী 5 টি লাইন সাজান।


একটি শব্দও ফিল্টার করা সম্ভব? (লাইন স্তর নয়)
ধারণাগুলি 42

হ্যাঁ। তৃতীয় বিকল্প (ভিজ্যুয়াল মোড) যা হাইলাইট করা হয়েছে তার জন্য কাজ করে (শব্দ, আংশিক লাইন, একাধিক লাইন, আয়তক্ষেত্রাকার ব্লক ইত্যাদি)।
সমীর

1
তৃতীয় বিকল্পটি পুরো লাইনগুলি ফিল্টার করে। আপনি যদি একটি শব্দ নির্বাচন করেন এবং এটি ফিল্টার করেন, উদাহরণস্বরূপ, এর মাধ্যমে tr [:lower:] [:upper], ভিম কেবল এই শব্দটিই নয় পুরো লাইনটিকে উপভোগ করবে।
মারিয়া s

0

নোট করুন যে এটি দিয়ে করা যেতে পারে:

  1. আপনার ইচ্ছামত যাচাই করুন select
  2. s^R=system('tr a-z A-Z', @")[:-2]^M( ^Rসিটিআরএল + আর, এবং এম এম এন্টার থাকা সহ)

এটি নির্বাচনের মতো + প্রতিস্থাপনকারী যে কোনও কিছুতেও কাজ করতে পারে ci"^R=...


মাল্টি লাইন পাঠ্য নির্বাচনে এটি চালানোর সময় ( vকার্সার টিপে এবং সরানোর পরে ) আমি ত্রুটি পাই E16: Invalid range\nE16: Invalid range\nE476: Invalid command(লিনাক্সে trএবং অন্যান্য বেসিক কমান্ড বিদ্যমান)।
ধারণাগুলি 42

আপনি কি টিপেছেন sযা সন্নিবেশ মোডে বা :sকমান্ডে যায়?
লুক হার্মিটে

সন্দেহজনক নয়, তবে আপনার কীভাবে অর্থ হয় তাও নিশ্চিত নন, সম্ভবত উদাহরণটি কীভাবে এটি কোনও কীতে বাঁধতে পারে তা দেখাতে পারে?
ধারণাগুলি 42

আপনি কি sভিজ্যুয়াল মোড থেকে সরাসরি আঘাত করছেন , না আপনি :প্রথমে আঘাত করছেন ? :আমি যে কীগুলি লিখেছি সেগুলির ক্রমের সাথে জড়িত নেই । একটি ম্যাপিং হবে: vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
লুক হার্মিটে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.