ভিশ এডিটর এবং পাইপ আউটপুটকে বাশ করতে কীভাবে অনুরোধ করবেন


34

কখনও কখনও আমাকে পাঠ্য লিখতে হবে এবং তারপরে সেই পাঠ্যটিকে অন্য কমান্ডে পাইপ করতে হবে। আমার স্বাভাবিক ওয়ার্কফ্লো এরকম কিছু যায়:

vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example 
rm file.txt

আমি এই জটিল এবং ব্যাশ স্ক্রিপ্টিং শিখতে চাইছি এমন একটি কমান্ড লিখে প্রক্রিয়াটি আরও সহজ করে তুলতে চাই যা কোনও সম্পাদককে চালিত করে এবং সম্পাদক যখন সম্পাদকের সম্পাদনার স্টপআউট বন্ধ করে দেয়। তাহলে আমি কমান্ডটি চালাতে সক্ষম হব quickedit | pandoc -o file.pdf

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

function quickedit {
    filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
    vim $filename
    cat $filename
    rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal

আমি শীঘ্রই যে সমস্যার মুখোমুখি হয়েছি তা হ'ল আমি যখন quickedit | commandভিমের মতো কিছু করি তখন নিজেই সম্পাদক হিসাবে ব্যবহার করা যায় না কারণ সমস্ত আউটপুট পাইপের সাথে সীমাবদ্ধ থাকে।

আমি ভাবছি যে এটির কোনও quickeditকার্যকারিতা আছে কিনা, যাতে আমি আমার ফাংশনের আউটপুটটি পাইপ করতে পারি । সাবপটিমাল বিকল্পটি হ'ল পৃথক সম্পাদককে চালিত করা, উচ্চারণের পাঠ্যটি বলুন, তবে আমি সত্যিই টার্মিনালে থাকতে চাই।


ভিএম এর মধ্যে থেকে কমান্ড জারি করবেন :w !pandoc -o file.pdf? (দ্রষ্টব্য: মধ্যে স্থান wএবং !অপরিহার্য।)
John1024

ঠিক আছে এটা দারুণ. আমি জানতাম না আপনি ভিআইএম এর মধ্যে থেকেই ভিএম আউটপুট পাইপ করতে পারবেন। এটি আমার উদ্দেশ্যগুলি পরিবেশন করে, তবে আমার ভবিষ্যতের জ্ঞানের জন্য, আমি কীভাবে আমার সমস্যার সমাধান করার ইচ্ছা রেখেছিলাম তা ঠিক কীভাবে আমার সমস্যার সমাধান করা সম্ভব?
থিওডিস্মিথ

আপনি কি আপনার ফাংশন পোস্ট করতে পারেন? আপনি শীঘ্রই যে সমস্যার মুখোমুখি হয়েছিলেন (দ্বিতীয় শেষ অনুচ্ছেদ) তার সম্পর্কে কথা বলার অর্থ কী? আমি তা পাই না।
লুকাস

5
অন্যদিকে, আপনার এটি অনিরাপদ ফ্যাশনে পুনর্নবীকরণের পরিবর্তে ব্যবহার করাmktemp উচিত ।
ওয়াইল্ডকার্ড

নতুন ব্যাশ ব্যবহারকারী হিসাবে, এমকেটেম্প পুনর্নবীকরণের সুরক্ষা বিপদগুলি কী কী?
থিওডেম্মিথ

উত্তর:


42

vipe পাইপলাইন সম্পাদনা করার জন্য একটি প্রোগ্রাম:

command1 | vipe | command2

এর সম্পূর্ণ আউটপুট সহ আপনি একটি সম্পাদক পাবেন command1এবং আপনি যখন প্রস্থান করবেন তখন সামগ্রীগুলি command2পাইপের মাধ্যমে প্রেরণ করা হবে ।

এই ক্ষেত্রে, নেই command1। সুতরাং, আপনি করতে পারেন:

: | vipe | pandoc -o foo.pdf

বা:

vipe <&- | pandoc -o foo.pdf

vipeউপর আপ EDITORএবং VISUALভেরিয়েবল, তাই আপনি এটা তেজ খুলতে পেতে ঐ ব্যবহার করতে পারেন।

আপনি যদি এটি ইনস্টল না করে থাকেন vipeতবে moreutilsপ্যাকেজে উপলব্ধ ; sudo apt-get install moreutils, বা আপনার স্বাদের সমতুল্য যা কিছু হোক।


1
এখানে উপস্থিত ম্যাক ব্যবহারকারীদের জন্য: moreutilsহোমব্রুতে উপলব্ধ।
ভার্জেনজেট

ফ্রিবিএসডি ব্যবহারকারীদের জন্য: পিকেজি (8) এরmoreutils মাধ্যমে ইনস্টল করার জন্য উপলব্ধ ।
ম্যাটিউজ পিয়োট্রোস্কি

20

আপনি ভিমের মধ্যে থেকে এটি করতে পারেন:

:w !pandoc -o file.pdf

অথবা বাফারটিকে একটি জটিল পাইপলাইনে লিখুন:

:w !grep pattern | somecommand > file.txt

এবং তারপরে আপনি সংরক্ষণ না করেই ভিম থেকে প্রস্থান করতে পারেন:

:q!

তবে, আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে বিবেচনা করে viআপনার কমান্ড লাইন সম্পাদক হিসাবে ব্যবহার করার চেয়ে আরও ভাল সমাধান হতে পারে । ধরে নিচ্ছি আপনি ব্যবহার করছেন bash:

set -o vi

এটি আপনার কী-বাইন্ডিংগুলিকে সেট করে vi। তাই আপনাকে মৌলিক সঙ্গে কমান্ড লাইন ডানে আপনার কমান্ড সম্পাদনা করতে পারেন viটিপে কী-বাইন্ডিং <Esc>এবং তারপর টাইপ viযেমন কমান্ড x, cwইত্যাদি (আপনি টিপে সন্নিবেশ মোডে ফিরে পেতে পারেন i।)

আরও ভাল এবং এই প্রশ্নের সাথে আরও প্রাসঙ্গিক, আপনি সরাসরি আপনার কমান্ড লাইনের সামগ্রী তৈরি করতে ভিমটি খুলতে পারেন। কেবল টাইপ করুন <Esc>vএবং আপনি একটি খালি ভিম বাফার পাবেন। আপনি সংরক্ষণ করে প্রস্থান করে, তখন সেই হয় আপনার কমান্ড লাইনে কমান্ড তা অবিলম্বে চালানো হয়। কমান্ড লাইনে সরাসরি সম্পাদনার চেয়ে এটি অনেক বেশি নমনীয় কারণ আপনি চাইলে পুরো মিনি-স্ক্রিপ্ট লিখতে পারেন।


সুতরাং, উদাহরণস্বরূপ, আপনি যদি কিছু চতুর পাঠ্য লিখতে চান এবং তা অবিলম্বে পান্ডোকের মধ্যে পাইপ করতে পারেন তবে আপনি কেবল টাইপ করতে পারেন:

<Esc>v

তারপরে ভিম বাফারটি সম্পাদনা করুন যতক্ষণ না আপনার মতো কিছু থাকে:

cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF

তারপরে সেভ এবং প্রস্থান (সহ :x) এবং পুরো জিনিসটি শেল কমান্ড হিসাবে চালানো হবে।

এটি আপনার শেলের কমান্ডের ইতিহাসে উপলব্ধ হবে।


1
আপনি যদি ইমাস কি কী বাইন্ডিংগুলি রাখতে চান, আপনি এখনও EDITORপরিবেশের পরিবর্তনশীলকে সেট করতে vimএবং কমান্ড লাইন সম্পাদনার সময় Ctrl-Xঅনুসরণ করে টিপে কমান্ড লাইনগুলি সম্পাদনা করতে ভিম ব্যবহার করতে পারেন Ctrl-E
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

18

পাইপলাইনে চলছে

চেষ্টা করুন:

quickedit() (  trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )

মূলটি হ'ল, vimসাধারণত ব্যবহার করতে সক্ষম vimহওয়ার জন্য টার্মিনাল হওয়ার জন্য স্টডআউট দরকার। আমরা এখানে পুনর্নির্দেশ সঙ্গে এটি সম্পন্ন >/dev/tty

সুরক্ষার উদ্দেশ্যে, আমি ব্যবহারকারীর হোম ডিরেক্টরিতে অস্থায়ী ফাইলটি রেখেছি। এ সম্পর্কে আরও তথ্যের জন্য, গ্রেগের FAQ প্রশ্ন 062 দেখুন । এটি একটি অস্পষ্ট ফাইলের নাম ব্যবহারের প্রয়োজনকে দূর করে।

উদাহরণ:

vimখোলার সময় আমি This function succeeded.ফাইলটি টাইপ করে সংরক্ষণ করি। স্ক্রিনে ফলাফলটি দেখে মনে হচ্ছে:

$ quickedit | grep succeeded
This function succeeded.

যদিও এর আউটপুটটি quickeditপাইপলাইনে পুনঃনির্দেশিত হয়েছে, vimতবুও এটি স্বাভাবিকভাবে কাজ করে কারণ আমরা এটিকে সরাসরি অ্যাক্সেস দিয়েছি /dev/tty

ভিএম এর মধ্যে থেকে একটি প্রোগ্রাম চালানো

আমি মন্তব্যগুলিতে উল্লেখ করেছি, ভিআইএম একটি ফাইলকে একটি কমান্ডে পাইপ করতে পারে। ভিএম এর মধ্যে থেকে, উদাহরণস্বরূপ, কমান্ডটি জারি করুন :w !pandoc -o file.pdf(দ্রষ্টব্য: ডাব্লু এবং এর মধ্যে স্থান অপরিহার্য)।


2
চমৎকার উত্তর. এটি সরাসরি ব্যবহারকারীর প্রশ্নকে সম্বোধন করে এবং একটি দ্রুত এবং মার্জিত সমাধান দেয়: ভিমকে / dev / tty এ পুনঃনির্দেশ করুন! সরল!
মাইক এস

আমি Zsh ব্যবহার করছি; trap '...' exitব্যর্থ হয় তবে trap '...' EXITকাজ করতে দেখা যায়। আমি ফাঁদে ফেলা সম্পর্কে খুব বেশি জানি না, তবে অস্থায়ী ফাইলগুলির জন্য আমার সাধারণ পদ্ধতির ব্যবহার mktmp [--suffix=...]। এছাড়াও, vim <outfile> -c '...' >/dev/ttyফাইলটি লোড না হওয়া অবধি স্বাভাবিক হিসাবে চালিত হয়, তারপরে প্রদত্ত কমান্ড চেইন কার্যকর করে, :wqআপনি যদি সম্পাদনা পর্বটি এড়াতে চান তবে। আমিও ব্যবহার করেছি set | grep -a EXITএবং খুঁজে পেয়েছি signals=(EXIT ... DEBUG)
জন পি

5

এটি vimআপনার ডিফল্ট সম্পাদক হিসাবে সেট করা আছে তা নিশ্চিত করুন (যেমন export EDITOR=vimআপনার .bash_profileবা এর .bashrcপরে, তারপরে, যে কোনও প্রম্পটে আপনি টাইপ করতে পারেন Ctrl- Xতারপরে Ctrl- Eএটি আপনার কনফিগার করা সম্পাদকটিতে আপনার বর্তমান কমান্ড লাইনটি খুলবে (যেমন vim) আপনার সম্পাদনাগুলি করুন, সংরক্ষণ করুন এবং প্রস্থান করুন এবং কমান্ডটি কার্যকর করা হবে যেমন আপনি এটি কমান্ড লাইনে পাইপলাইন এবং লাইক সহ টাইপ করেছেন।

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