আরগলিস্টটি জনপ্রিয় করতে কীভাবে ব্যাকটিক-এক্সপেনশন ব্যবহার করবেন?


11

সহায়তা থেকে :help backtick-expansion:

On Unix and a few other systems you can also use backticks for the file name
argument, for example:
    :next `find . -name ver\\*.c -print`
    :view `ls -t *.patch  \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program.  The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.

যদি আমি সহায়তা থেকে নেওয়া আদেশটি টাইপ করি তবে আমি একটি ত্রুটি পেয়েছি:

:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards  

সাহায্যের উদাহরণটি কেন একের পরিবর্তে দুটি ব্যাকস্ল্যাশ ব্যবহার করে এবং কেন এটি কার্যকর হয় না?

নিম্নলিখিত কাজ:

  • যদি আমি সেই দুটি ব্যাকস্ল্যাশগুলির একটি অপসারণ করি যা কর্মক্ষেত্রের আগে শেল দ্বারা প্রসারিত হওয়া থেকে তারাকে রক্ষা করে find:

    :next `find . -name ver\*.c -print`
    
  • যদি আমি উভয় ব্যাকস্ল্যাশগুলি সরিয়ে ফেলে এবং প্যাটার্নটির চারপাশে একক উদ্ধৃতি রাখি ver*.c:

    :next `find . -name 'ver*.c' -print`
    

এ পর্যন্ত, নিয়মটি মনে হচ্ছে:
যদি আপনার শেল কমান্ডটিতে একটি তারা থাকে এবং আপনি কমান্ডের আগে শেলটি প্রসারিত করতে না চান, তার সামনে একটি ব্যাকস্ল্যাশ রাখুন বা প্যাটার্নের চারপাশে একক উদ্ধৃতি রাখুন

তবে সহায়তা আরেকটি উদাহরণ দেয়:

:view `ls -t *.patch  \| head -n1`

এই কমান্ডটি কোনও পরিবর্তন ছাড়াই, একক উদ্ধৃতির প্রয়োজন নেই, ব্যাকস্ল্যাশ প্রয়োজন নেই without
আমি মনে করি এটি কাজ করার কারণটি হ'ল lsআদেশটি (কমান্ডের -nameযুক্তির বিপরীতে find) একাধিক ফাইল আর্গুমেন্ট গ্রহণ করে এবং শেল প্রসারণে কোনও সমস্যা দেখেনি *.patch

এখন, আসুন আমি বলি যে আমি ফোল্ডারের .confভিতরে এক্সটেনশন সহ সমস্ত ফাইল সন্ধান করতে চাই /etcএবং কেবল স্ট্রিংযুক্ত মিলগুলি পাওয়ার findজন্য আউটপুটটি পাইপ করি । শেলটিতে, যে কোনও কার্যনির্বাহী ডিরেক্টরি থেকে, আমি টাইপ করব:grepinput

find /etc -name '*.conf' | grep input

এবং এটি কাজ করবে।

ভিমে, আমি একই কমান্ডটি তার চারপাশে ব্যাকটিকস লাগিয়ে টাইপ করব এবং পাইপ প্রতীকটির সামনে একটি ব্যাকস্ল্যাশ কমান্ড সমাপ্তি হিসাবে এটি ব্যাখ্যা করতে বাধা দিতে পারি:

:next `find /etc -name '*.conf' \| grep input`

এবং এটি কাজ করে।

এখন, আমি যদি পাইপ এবং এটি ছাড়াই একই কমান্ডটি টাইপ করি তবে আমি grep inputএকটি ত্রুটি পেয়েছি:

:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards

আমি একক উদ্ধৃতি দিয়ে তারাটিকে সুরক্ষিত করার পরেও কেন এই ক্ষেত্রে ত্রুটি রয়েছে?
এবং কেন এখন একটি ত্রুটি আছে তবে কেবল পাইপ এবং এর সাথে নয় grep input?

বোঝার চেষ্টা করার জন্য, আমি একটি সহজ কমান্ড নিয়ে এসেছি:

find . -name '*.conf'

এটি .confওয়ার্কিং ডিরেক্টরিতে এক্সটেনশন সহ সমস্ত ফাইল সন্ধান করে। কমান্ডটি শেলটিতে কাজ করে।

এটি ভিমে পরীক্ষার জন্য, আমি টাইপ করেছি: :next `find . -name '*.conf'`
এবং এটি কার্যকর হয়। সেক্ষেত্রে ডটটি আমার বর্তমান ওয়ার্কিং ডিরেক্টরিকে প্রাক্তন কমান্ড দ্বারা প্রদর্শিত হিসাবে দেখানো হয়েছে :pwdযা আমার হোম ডিরেক্টরি যা /home/usernameআমি এটি থেকে ভিআইএম সেশনটি চালু করেছি।

যখন আমি যখন স্বেচ্ছাসেবী ফোল্ডারে অনুসন্ধান করতে বলি তখন কাজ করে না কেন আমি যখন বর্তমান ওয়ার্কিং ডিরেক্টরিটি অনুসন্ধান করতে বলি তখন কেন এটি কাজ করে /etc?

এখন, আমি যদি আমার কাজ ডিরেক্টরি পরিবর্তন /home/usernameকরার /etcতেজ প্রাক্তন আদেশের সঙ্গে :cd /etcএবং একই কমান্ড আগের মতই, এটা ত্রুটি আউট পুনরায় চেষ্টা আবার

:next `find . -name '*.conf'`
E79: Cannot expand wildcards

আমি যখন আমার বাড়ির ফোল্ডারে থাকি কিন্তু আমি যখন থাকি না কেন কেন একই কমান্ডটি কাজ করে /etc?

আমি নিশ্চিত যে কিছু যুক্তি আছে, কিন্তু আমি এটি খুঁজে পাচ্ছি না।

একটি স্বেচ্ছাসেবী শেল কমান্ড (কোন তারকা, একটি পাইপ, কোনও কার্যকরী ডিরেক্টরি থেকে কোনও ডিরেক্টরিতে অনুসন্ধান করে) দিয়ে আরগলিস্টটি জনপ্রিয় করার জন্য সাধারণ এবং সঠিক বাক্য গঠন কী?

আমি ভিএম সংস্করণ 7.4.942 ব্যবহার করছি এবং zsh আমার ডিফল্ট শেল। আমি এই আদেশগুলি vim -u NORC -Nবাশ এবং zsh থেকে সর্বনিম্ন সূচনা ( ) দিয়ে পরীক্ষা করেছি ।

আমার কি ভিশকে কল করতে zim নয় কনফিগার করতে হবে?


আমি ভাবছি আপনি কি আর্গুমেন্ট হিসাবে পাস করা সমস্ত ফাইল দিয়ে ভিএম শুরু করার চেষ্টা করেছিলেন? আমি এরকম কিছু বোঝাতে চাইছি:vim $(find . -name ver*.c)
ভ্লাদ গুরুদিগা

@VladGURDIGA আমি শুধু চেষ্টা করেছি এবং তারা সব কাজ শেল থেকে আশানুরূপ: vim $(find . -name ver\*.c -print), vim $(ls -t *.patch | head -n1), vim $(find /etc -name '*.conf' | grep input), vim $(find /etc -name '*.conf'),vim $(find . -name '*.conf')
Saginaw

@ ভ্লাদগ্রুদিগা তবে আমি জানতে চাই যে বর্তমান অধিবেশনটি না ছাড়াই কীভাবে যুক্তিযুক্ত তালিকা তৈরি করা যায়, কারণ আমার কাছে সাধারণত একটি থাকে। আমি শেলের মধ্যেও ঘুরতে পারি, ফাইলগুলির একটি গ্রুপ অনুসন্ধান করতে এবং সেগুলি একটি ভিম সার্ভারে প্রেরণ করতে পারি (যুক্তি সহ --remote, দেখুন: vi.stackexchange.com/a/5618/4939 ) তবে আমি কীভাবে জানতে আগ্রহী এটি বর্তমান অধিবেশন থেকে সরাসরি করুন। যদি এটি সম্ভব না হয় তবে তা ভাল, তবে সহায়তাটি পড়ার পরে মনে হয় এটি করা সম্ভব। যদি এটি হয় তবে আমি বুঝতে চাই যে ভিম অনুরূপ কমান্ডের প্রতি কেন এত আলাদা প্রতিক্রিয়া দেখায়।
saginaw

আরে, প্রথম স্যাম্পল কমান্ডে মনে হচ্ছে আপনি ক্লোজিং ব্যাকটিকটি মিস করছেন। ;) যদিও এর বাইরে, আমি শেল প্রসারণ রোধে একের পরিবর্তে দুটি ব্যাকস্ল্যাশ ব্যবহার করে সহায়তা থেকে উদাহরণটি অনুমান করি, যেমন এখানে ব্যাখ্যা করা হয়েছে: unix.stackexchange.com/q/104260/23669
ভ্লাদ গুরুদিগা

find /etc -name '*.conf'কাজ না করার ক্ষেত্রে , আমি মনে করি কিছু কৌতুকপূর্ণ নাম সেই আদেশটি থেকে বেরিয়ে এসেছে, এবং পাইপ দেওয়ার সময় এটি কাজ করার কারণ হতে পারে grep
ভ্লাদ গুরুদিগা

উত্তর:


6

আমি এখনও জানি না কীভাবে একটি স্বেচ্ছাসেবী শেল কমান্ড দিয়ে আরগলিস্টটি পপুলেট করতে ব্যাকটিক-এক্সপেনশন ব্যবহার করা যায় তবে আমি একটি কাজের সন্ধান পেয়েছি।

থেকে :help `=:

You can have the backticks expanded as a Vim expression, instead of as an
external command, by putting an equal sign right after the first backtick,
e.g.:
    :e `=tempname()`
The expression can contain just about anything, thus this can also be used to
avoid the special meaning of '"', '|', '%' and '#'.  However, 'wildignore'
does apply like to other wildcards.

সুতরাং, সরাসরি শেল কমান্ডটি প্রসারিত করার পরিবর্তে এইভাবে করুন:

:args `shell command`

আমরা Vim ফাংশনে শেল কমান্ডটি প্রেরণ systemlist()করতে এবং এক্সপ্রেশন রেজিস্টারটি =এর ফলে ফলাফলটি প্রকাশ করতে:

:args `=systemlist("shell command")`

কিছু কীস্ট্রোক সংরক্ষণ করতে, আমি আমার ভিএমআরসিতে (পপুলেট আরগলিস্টের :PAজন্য) নিম্নলিখিত প্রাক্তন কমান্ডটি সংজ্ঞায়িত করেছি :

command! -nargs=1 PA args `=systemlist(<q-args>)`

এবং এটি বিভিন্ন শেল কমান্ড দিয়ে পরীক্ষা করেছে:

:PA find . -name ver\*.c -print 2>/dev/null
:PA find . -name 'ver*.c' -print 2>/dev/null
:PA ls -t *.patch  | head -n1
:PA find /etc -name '*.conf' 2>/dev/null | grep input
:PA find /etc -name '*.conf' 2>/dev/null
:PA find . -name '*.conf' 2>/dev/null

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

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