স্ট্যান্ডার্ড ইনপুট থেকে কীভাবে সামগ্রী সম্পাদনা করবেন?


15

আমি ভিমে এমন সামগ্রী সম্পাদনা করতে চাই যা ফাইলটি না রেখেই কমান্ড-লাইন থেকে গতিশীলভাবে তৈরি হয়েছিল।

উদাহরণে:

$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin

তবে এটি ত্রুটিগুলির সাথে ব্যর্থ হচ্ছে:

ভিম: সতর্কতা: ইনপুট কোনও টার্মিনাল থেকে নয়

ভিম: ইনপুট পড়ার সময় ত্রুটি, প্রস্থান করা হচ্ছে ...

এটা কি সম্ভব?


:help stdin... এটি আশ্চর্যজনক যে কোনও দস্তাবেজগুলি বিল্ট ইন ডকুমেন্টেশন সম্পর্কে তাদের প্রশ্ন জিজ্ঞাসা করে কত দ্রুত উত্তরগুলি খুঁজে পেতে পারে।
ড্যাশ-টম-ব্যাং

উত্তর:


24

-কমান্ড লাইনে ফাইলের নামের পরিবর্তে আপনাকে ব্যবহার করতে হবে :

echo This is example. | vim -

উপরের কমান্ডটি স্ট্যান্ডার্ড ইনপুট থেকে পাঠ্যটিতে ভরা একটি নামহীন বাফারটি খুলবে।


7
-কমান্ডলাইন সরঞ্জামগুলির জন্য স্টিডিনের জন্য ব্যবহার করা বেশ মানক;
মার্টিন টর্নয়েজ

6

এই মাত্র বেশিরভাগই সম্পর্কে একটি মজার নোট bashএবং readline, কিন্তু আপনি যদি আপনার সেট EDITORথেকে এনভায়রনমেন্ট ভেরিয়েবল vim, আঘাত Ctrl+ + x+ + eবর্তমান লাইন আপ খুলবে vim। উপরন্তু, যদি আপনি টাইপ Meta(Alt/Opt/Esc)+ + Ctrl+ + e, ব্যাশ একটি বর্তমান কমান্ড লাইন, অর্থাত্ স্থান সম্প্রসারণ মধ্যে সঞ্চালন করা হবে:

$ echo $EDITOR # Assuming EDITOR was set

সাথে Meta(Alt/Opt/Esc)+ Ctrl+ eহয়ে যাবে

$ echo vim # Assuming EDITOR was set

সাথে Ctrl+ x+ eহয়ে যাবে

1 echo vim # Assuming EDITOR was set
~
~
/tmp/sometmpbufferfile

মনে রাখবেন যে ভিএম ছাড়ার পরে, ভিম বাফারের সামগ্রীগুলি কমান্ড লাইনে কার্যকর করা হবে।

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

সুতরাং মূল প্রশ্নের উত্তর দিতে আপনি লিখতেও পারেন,

$ This is an example

এবং তারপরে এটি লোড করতে Ctrl+ x+ টিপুন । এছাড়াও আপনি থাকতে পারে,evim

 $ $(cat /etc/hosts)

কি Meta(Alt/Opt/Esc)+ + Ctrl+ + eতারপর Ctrl+ + x+ + e, যা এক লাইনে hosts ফাইলের সব করা এবং এটা লোড হবে vim(এই বৈশিষ্ট্যগুলির সম্ভবত না ভাল ব্যবহার - যাইহোক, এই পদ্ধতির উপযোগিতা আলোচনা কয়েকটি উদাহরণ থেকে extrapolated যাবে এখানে).

মনে রাখবেন যে আমি ধরে নিয়েছি যে আপনার মোডে readlineসেট করা আছে emacs। যদি আপনার মোডে readlineসেট করা থাকে vimআপনি কমান্ডটি ব্যবহার করে সহজেই সম্পর্কিত বাইন্ডিংগুলি আবিষ্কার করতে পারেন:

bind -p

এবং অনুসন্ধান করা edit-and-execute-commandবা shell-expand-line, যা যথাক্রমে Ctrl+ x+ eএবং Meta(Alt/Opt/Esc)+ Ctrl+ বাইন্ডিংগুলির সাথে যুক্ত ছিল e


আপনি বাশকে ইমাসের পরিবর্তে vi কী বাইন্ডিং ব্যবহার করতে বলতে পারেন। set -o viএটি চালু করতে ব্যবহার করুন। তারপরে আপনি vআপনার সম্পাদকের বর্তমান কমান্ডটি সম্পাদনা করতে সাধারণ মোডে ম্যাপিংটি ব্যবহার করতে পারেন ।
কুইন্সি বোলার্স

1
নিশ্চিতভাবেই vi ব্যবহার করে কমান্ড লাইনটি সম্পাদনা করা একটি দুর্দান্ত কৌশল তবে স্ট্যান্ডিনের পাঠ্য পড়তে এই পদ্ধতিটি ব্যবহার করে কমপক্ষে দুটি সমস্যা রয়েছে: ১. shell-expand-lineপ্রসারিত পাঠ্য থেকে নতুন লাইনগুলি সরিয়ে ফেলুন এবং ২. edit-and-execute-commandবাফারে লেখা কমান্ডটি কার্যকর করার চেষ্টা করুন , যা কিছু সেভ হয় বা না হয়, যখন আপনি vi ছেড়ে যান।
toro2k

ওহ, এটি দুর্দান্ত। আমি প্রতিদিন পঠনের বিষয়ে একটি নতুন জিনিস শিখি, মনে হয় ...
ডোরকনব

2

ব্যাশে আমি <(command)সিনট্যাক্স ব্যবহার করে প্রক্রিয়া বিকল্প ব্যবহার করা দরকারী বলে মনে করেছি , উদাহরণস্বরূপ:

vim <(echo This is example.)
vim <(cat /etc/hosts)

আরো দেখুন:


4
নোট করুন এটি সমস্ত শেলগুলিতে কাজ করবে না । আমার মনে হয় এটা শুধুমাত্র কাজ করবে bashএবং zsh(এবং sh, ksh, dash, fish, csh, tcsh, ইত্যাদি)
মার্টিন Tournoij

@ কার্পেটস্মোকারকে ksh88 এবং তার উপরে কাজ করা উচিত, আমার ধারণা, তবে হ্যাঁ, প্রক্রিয়া প্রতিস্থাপন পসিক্স নয়।
মুরু

4
এবং নিজেকে কৌতুক না করার দিকে মনোযোগ দিন! আপনি যখন এইভাবে ভিম শুরু করেন এটি কোনও ফাইলের মতো বাফারটি খোলে /proc/PID/fd/FD। আপনি যদি বাফারটি লিখেন এবং প্রস্থান করেন, ভিম অভিযোগ করেন না, তবে আপনি যে ফাইলটি লিখেছেন সেটি ওএস দ্বারা মুছে ফেলা হবে। ব্যবহার -ফাইল নামের খোলা বাফার এটা দিয়ে এত যুক্ত যদি তোমাকে ছাড়া সংরক্ষণ তেজ আপনাকে সতর্ক করবে (যতদিন আপনি একটি ঠুং কমান্ড বা অনুরূপ ব্যবহার করবেন না) প্রস্থান করার জন্য চেষ্টা কোন ফাইল আছে।
toro2k

1
এটি দুর্দান্ত কারণ এটি ভাল জেনারেলাইজ করে vimdiff <(echo foo) <(echo bar)
wchargin

@ toro2k আপ অনুসরণ করতে, এটি ব্যবহার দেখে মনে হচ্ছে :nextএবং :prevপ্রবাহ পুনরায় সার্চ এবং কিছুই পায়। এটিও উল্লেখযোগ্য যে প্রক্রিয়াগুলি একে অপরের সাথে সমান্তরাল নয় - উদাহরণস্বরূপ cat <(sleep 3; echo a) <(echo b)প্রিন্টগুলি - এবং catইন্টারলিভগুলি লিখতে এবং পড়ার সময়, vimবাইরের ফ্রেম ব্যতীত সমস্ত প্রদর্শন করার আগে ফাইলটির "সমাপ্তি পড়া" অপেক্ষা করে।
জন পি

-1

যদি কোনও নতুন ভিমে পাইপলাইন ব্যবহারের প্রয়োজন হয় না, আপনি বর্তমান বাফারে কমান্ডের আউটপুটটি টানতে ভিমের ক্ষমতাটি ব্যবহার করতে পারেন, নন-ফাইল ব্যাকযুক্ত বাফার থাকার সাথে ( :newঅস্তিত্বহীন ফাইল সম্পাদনা করার সাথে )

:read!cat /etc/hosts কমান্ড-মোড আপনার বর্তমান বাফারে বর্তমান কার্সার অবস্থানের নীচে আউটপুট স্থাপন করবে।

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


1
কিভাবে এই প্রশ্নের উত্তর দেয়?
মুরু

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