এক্সার্গস সহ ভিমকে অনুরোধ করার পরে টার্মিনাল বোর্ক করা


30

আমি মাঝে মাঝে ভিমকে xargsএভাবে ব্যবহার করার চেষ্টা করেছি :

find . -name '*.java' | xargs vim

… কোন ধরণের কাজ:

  1. ভিম চালু করার সাথে সাথে আমি নীচের সতর্কতাটির ফ্ল্যাশটি সংক্ষেপে দেখতে পাচ্ছি:

    Vim: Warning: Input is not from a terminal
    
  2. সম্পাদনা কাজ করে - প্রত্যাশা অনুযায়ী :filesসমস্ত .javaফাইলকে সঠিকভাবে গণনা করে ।
  3. আমি সংরক্ষণ এবং ছেড়ে দিতে পারেন।

তবে, ভিম থেকে বেরিয়ে আসার পরে, আমার টার্মিনালটি উদাস হয়ে গেছে:

  • আমি শেল প্রম্পটে যা টাইপ করি তা প্রতিধ্বনিত হয় না।
  • গাড়ীর রিটার্ন মোটেও প্রদর্শিত হয় না এবং লাইন ফিডগুলি কেবল কখনও কখনও উপস্থিত হয়।

আমি reset(1)টার্মিনালটিকে পুনরায় পুনর্বিবেচনা করার জন্য একটি আদেশ জারি না করা অবধি এটি চলে ।

এটি কি ভিম বাগ, বা কেন এটি এর মতো টার্মিনালের সাথে ইন্টারেক্ট করে তার জন্য আরও সন্তোষজনক ব্যাখ্যা রয়েছে? আমি লিনাক্স এবং বিভিন্ন ইউনিসিতে ভার্ফের 7.৩ সংস্করণ (সংস্করণটি তেমন মনে হয় না) পর্যন্ত ঘটতে দেখেছি।

আমি একটি কাজের বিষয়ে সচেতন, যথা vim $(find . -name '*.java')। অন্যান্য কাজের ক্ষেত্রগুলি স্বাগত জানানো হবে, যদিও এটি আমার মূল প্রশ্ন নয়।


আমি এই সাইটটি যতটা সম্ভব প্রশ্ন সহ পূর্ণ করার জন্য আপনার ইচ্ছাটি পেয়েছি তবে… এই প্রশ্নের উত্তর কয়েক বছর ধরে এসও / এসইউ এবং অন্য কোথাও দেওয়া হয়েছে: xargsএকটি ডামি stdinব্যবহার করে যা ভিম এবং ব্রেকগুলি ব্যবহার করতে পারে না সব পরে।
রোমেনেল

1
@romainl আমি এই সাইটগুলিতে সক্রিয় নই, এবং আমি এটি কখনও জিজ্ঞাসা করতে দেখিনি - সৎ।
200_সূচী

সম্পর্কিত: superuser.com/questions/336016/… - সম্ভবত কেউ একটি দুর্দান্ত উত্তরের শীর্ষের উত্তরগুলি ঘনীভূত করতে পারে।
মারু

2
দুর্দান্ত প্রশ্ন - আমার সাথে এটি বহুবার ঘটেছে। এছাড়াও, আমি অন্য কোনও এসও সাইট ব্যবহার করি না - এটি যদি ভিএম-সম্পর্কিত হয় তবে আমি এটি এখানে খুঁজে পেতে চাই।
ক্রেগ

উত্তর:


21

এটি তখন ঘটে যখন ভিমটি অনুরোধ করা হয় এবং এটি টার্মিনালের পরিবর্তে পূর্ববর্তী পাইপলাইনটির আউটপুটটির সাথে সংযুক্ত থাকে এবং এটি বিভিন্ন অপ্রত্যাশিত ইনপুট (NULs এর মতো) গ্রহণ করে। আপনি চালানোর সময় একই ঘটনা ঘটে: vim < /dev/nullসুতরাং resetএই ক্ষেত্রে আদেশটি সাহায্য করে। এটি সুপারভাইজারের মাধ্যাকর্ষণ দ্বারা ভালভাবে ব্যাখ্যা করা হয়েছে ।

আপনি যদি findসম্পাদনার জন্য ফাইলের নামগুলি ব্যবহার করতে ব্যবহার করেন তবে আপনার প্রয়োজন হবে না xargs, কেবল ব্যবহার করুন -exec, উদাহরণস্বরূপ:

find . -name '*.java' -exec vim {} +

আপনি যদি xargsইউনিক্স / ম্যাকোস ব্যবহার করতে চান তবে আপনার -oপ্যারামিটার ব্যবহার করা উচিত , যেমন:

find . -name '*.java' | xargs -o vim

-oকমান্ড কার্যকর করার আগে শিশু প্রক্রিয়ায় স্ট্যান্ডিনকে / dev / tty হিসাবে আবার খুলুন। আপনি যদি একটি ইন্টারেক্টিভ অ্যাপ্লিকেশন চালাতে xargs চান তবে এটি কার্যকর।

বা:

find . -name "*.java" -type f -print0 | xargs -o -0 vim

দ্রষ্টব্য: ব্যবহার -print0/ -0সাদা অংশের সাহায্যে ফাইলের নামগুলি সমর্থন করবে।


find+ বিএসডিxargs

ইউনিক্স / ম্যাকোস-এ আপনি নিম্নলিখিত কাজের মতো চেষ্টা করতে পারেন:

find . -name '*.java' | xargs -J% sh -c 'vim < /dev/tty $@'

আপনি কমান্ড সাবস্টিটিউশন সিনট্যাক্সও ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

vim $(find . -name '*.java')
vim `find . -name '*.java`

টিটি বরাদ্দের জোর করার parallelপরিবর্তে বিকল্পভাবে জিএনইউ ব্যবহার করুন xargs, উদাহরণস্বরূপ:

find . -name '*.java' | parallel -X --tty vi

দ্রষ্টব্য: parallelইউনিক্স / ওএসএক্সে বিভিন্ন পরামিতি রয়েছে বলে এটি কাজ করবে না এবং এটি tty সমর্থন করে না।

আরও অনেক জনপ্রিয় কমান্ড সিউডো-টিটি বরাদ্দ দেয় (যেমন পছন্দ -tকরে ssh), তাই সাহায্যের জন্য পরীক্ষা করুন।

অন্যান্য পরামর্শ ব্যবহার করা হবে:

সম্পর্কিত:


আমার জিএনইউ xargsনেই -J। এটি একটি ম্যাকোস (বিএসডি) বিকল্প বলে মনে হচ্ছে যা জিএনইউ সংস্করণে উপস্থিত নেই।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

12

কার্যকারণ পরামর্শ: ফাইল সিস্টেম ন্যাভিগেটর হিসাবে একটি বাফার ব্যবহার করুন

vim -Stdin থেকে পাথের তালিকা পড়তে কমান্ডটি ব্যবহার করুন । ভিম এর :help --এই ব্যাখ্যা করে: 1

একটি নতুন বাফার সম্পাদনা শুরু করুন, যা স্টিডিন থেকে পড়া পাঠ্যের সাথে পূর্ণ। কমান্ডগুলি যে স্ট্যান্ডিন থেকে সাধারণত পড়া হত এখন স্ট্ডার থেকে পড়তে হবে। উদাহরণ:

find . -name "*.c" -print | vim -

তারপরে আপনি একই বাফার বা একটি নতুন বিভক্ত উইন্ডোতে যথাক্রমে ফাইলটি ব্যবহার করতে gfবা Ctrl-wCtrl-fনেভিগেট করতে পারেন ।

কার্যকারিতা পরামর্শ: যুক্তি তালিকা

আর একটি দুর্দান্ত উপায় হ'ল ভিমের যুক্তি তালিকাটি ব্যবহার করা। :argadd **/*.javaকমান্ড বর্তমান ডিরেক্টরী যাও recursively ভিতরে পাওয়া সমস্ত Java ফাইলগুলির সাথে তেজ এর যুক্তি তালিকাকে পূর্ণ হবে। তারপরে আপনি ফাইলগুলির মধ্যে :nextএবং :prevসরানোর জন্য ব্যবহার করতে পারেন ।


1 প্রথমটি -ভিমকে বলে যে আপনি একটি কমান্ড লাইন বিকল্পের জন্য সহায়তা অনুসন্ধান করতে চান, দ্বিতীয়টি আসলে আপনি যে কমান্ড লাইন পতাকাটি অনুসন্ধান করছেন তা। :help help-contextএই জাতীয় আরও কৌশল জন্য পড়ুন ।


8

এছাড়াও reset, আপনি চেষ্টা করতে পারেন:

stty sane

যা আপনার টার্মিনালটিকে আবার ব্যবহারযোগ্য করে তুলবে।

ব্যাখ্যা জন্য এখানে দেখুন । এবং কোনওভাবে এটিকে একটি ভীম দুর্ব্যবহার হিসাবে বিবেচনা করা যেতে পারে, কমপক্ষে নিওভিমের এই মুহুর্তে এই সমস্যাটি নেই।


এটি প্রশ্নের সঠিক উত্তর দেয় না, তবে এটি আমাকে সহায়তা করেছে, সুতরাং +1।
মনিকা iamnotmaynard

এটি আমার প্রশ্নের উত্তর দেয়;) যদিও ওপি পড়ার পরে আরও অনুমান করি resetআমারও উচিত।
শ্রীধর সারনোবাত

1

কারণ যে xargsসেট stdinকরতে /dev/null, যেহেতু vimচাহিদা stdinহতে /dev/tty


বিএসডি xargs(যেমন ম্যাক) সমাধান:

echo -e 'file1\nfile2' | xargs -o vim

-oসেট stdinxarg এর শিশু প্রক্রিয়ার ( vimএই ক্ষেত্রে) dev/tty


জিএনইউ xargs(যেমন লিনাক্স) সমাধান:

গনুহ xargsনেই -oবিকল্প। পরিবর্তে আপনি আরও জটিল workaround ব্যবহার করতে হবে। (দ্রষ্টব্য: চলার zeroস্ট্রিংটি থাকা খুব জরুরি , এটি ভুলে যাবেন না))

echo -e 'file1\nfile2' | xargs bash -c '</dev/tty vim "$@"' zero

আপনি এটি একটি উপাধিও তৈরি করতে পারেন:

alias vimin='xargs bash -c '\''</dev/tty vim "$@"'\'' zero'
echo -e 'file1\nfile2' | vimin

জিএনইউ xargs সমাধানের বিশদ ব্যাখ্যা

আসুন এটি ধাপে ধাপে ভেঙে দিন:

echo -e 'file1\nfile2' | xargs bash -c '</dev/tty vim "$@"' zero

1. স্ট্রিংয়ের xargsশেষে কেবল যুক্ত করে stdin, তাই xargsএটি সম্পাদন করা হবে:

    bash -c '</dev/tty vim "$@"' zero file1 file2

2. জন্য বিন্যাস bash -cহয় bash -c 'COMMAND_STRING' $0 $1 $2 etc

"$@"অবস্থানগত প্যারামিটার "$1", "$2"ইত্যাদিতে প্রসারিত হয় ইত্যাদি। এতে "$ 0" অন্তর্ভুক্ত হয় না কারণ এটি স্ক্রিপ্ট নামের জন্য একটি বিশেষ পরামিতি, অবস্থানগত পরামিতি নয়। এজন্য zeroজায়গাটি নিতে আমাদের ডামি স্ট্রিং (এটি কোনও স্ট্রিং হতে পারে) যুক্ত করতে হবে $0। অন্যথায়, আপনি প্রথম ফাইলটি হারাবেন।

সুতরাং আপনি প্রসারিত করার পরে "$@", আপনি এখানে শেষ:

    bash -c '</dev/tty vim file1 file2' 

৩. bash -cCOMMAND_STRING কার্যকর করবে:

    </dev/tty vim file1 file2 

</dev/ttyইন্টারেক্টিভ মোডে কাজ করতে stdinপারে /dev/ttyযাতে সেট করে vim


+1 এটি সর্বাধিক সংখ্যক ভোট সহ উত্তরের ডুপ্লিকেট বলে মনে হবে, তবে তা নয়। $0স্থানধারক (এখানে "শূন্য") চাবিকাঠি।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

0

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

vim -O `grep -lir mySearchTerm *`

আমি ব্যবহার কোন সমস্যা আছে findসঙ্গে xargsএবং grep, কিন্তু আমি সিনট্যাক্স বিরক্তিকর খুঁজে। এবং এমন একটি দৈনিক কোডার হিসাবে যারা vimটার্মিনালটি তাদের আইডিই হিসাবে ব্যবহার করে এবং সম্পত্তিগুলির জন্য ক্রমাগত ফাইল অনুসন্ধান করে, আমি এটি ব্যবহার করে যাচ্ছি।

find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTermভিআইএম এবং অন্যান্য পদ্ধতির মাধ্যমে ফাইল খোলার সাথে একত্রে সময় এবং স্থান রয়েছে । আমার জন্য, এটি খুব কমই হয়।

আশা করি এটি কাউকে সাহায্য করবে।


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