ভিএম-তে একটি কমান্ডের ফলাফলের দ্বারা প্রদত্ত একটি ফাইল খুলুন


34

আমি নিজেকে প্রায় প্রতিদিন নিম্নলিখিতগুলি করতে দেখি

  1. একটি অনুসন্ধান চালান ( find -name somefile.txt)
  2. ফলাফল খুলুন vim

সমস্যাটি হ'ল আমাকে কমান্ডের ফলাফলটি অনুলিপি করে কপি করতে findহবে vim। এটি না করার কোনও উপায় আছে কি? আমি কিছুটা পরীক্ষা-নিরীক্ষা করেছি ( find -name somefile.txt | vimকিন্তু) কাজ করে এমন কিছুই পাইনি।

আগাম ধন্যবাদ

উত্তর:


31

আপনি কমান্ড প্রতিস্থাপন ব্যবহার করতে পারেন:

vim $(find -name somefile.txt)

অথবা

find -name somefile.txt -exec vim {} \;

1
ঠিক আছে. যদি এটির প্রয়োজন হয় তবে সন্ধান করুন-somefile.txt | xargs vim
বালকি

3
না, এটি সঠিকভাবে কাজ করে না এবং আপনার টার্মিনালটিকেও জড়িয়ে ফেলতে পারে! আপনি xargs ভিমে পাইপ করতে পারবেন না, কারণ ভিএম ইন্টারেক্টিভ টার্মিনাল থেকে ইনপুট আসার প্রত্যাশা করে।
ডগবনে

1
একজন অনামী ব্যবহারকারী নোট করেছেন যে যদি ফাইলের নাম ফাঁক হয় তবে এটি ব্যর্থ হবে
মাইকেল মরোজেক

4
অন্য বিকল্প হবে vim `find -name somefile.txt`। @ স্টার্টপাওয়ার্স বিকল্পভাবে, আপনি vim `!-1`যদি ইতিমধ্যে এই সন্ধানটি ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন আপনি পূর্ববর্তী কমান্ড ছিলেন
বার্নহার্ড

1
এই দৃশ্যে @ বল্কি xargs ব্যবহার করার জন্য, আপনাকে পতাকাটি ব্যবহার করতে হবে, এটি লোকটির মধ্যে রয়েছে: - কমান্ডটি কার্যকর করার আগে শিশু প্রক্রিয়ায় স্ট্যান্ডিনকে / dev / tty হিসাবে পুনরায় খুলুন। আপনি যদি একটি ইন্টারেক্টিভ অ্যাপ্লিকেশন চালাতে xargs চান তবে এটি কার্যকর।
ডেভিড্ম

7

এটা চেষ্টা কর:

  1. vim শুরু করুন
  2. ভিমে, নিম্নলিখিত ব্যবহার করুন:

:r!find /<path> -name 'expression'

অনুসন্ধানগুলি সম্পূর্ণ হলে ফলাফলগুলি ভিমে প্রদর্শিত হবে।

অথবা

চেষ্টা করুন:

find /<path> -name > results.txt
vim results.txt 

আমার সমাধান হুবহু একই কাজ করে তবে কেন এটি ভোট দেওয়া হয়?
বালকি

5

যদি আপনি কমান্ডটি আবার চালাতে আপত্তি করেন না: Upএকটি xargsকমান্ড টিপুন এবং সংযোজন করুন । অথবা ইতিহাসের বিকল্প ব্যবহার করুন এবং চালান

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

কমান্ডের আউটপুট সংরক্ষণের একটি হালকা উপায় আছে যা ksh এবং zsh এ কাজ করে তবে ব্যাশে নয় (প্যারেন্ট শেলের মধ্যে একটি পাইপলাইনের আউটপুট দিকটি কার্যকর করা প্রয়োজন)। পাইপ ফাংশন মধ্যে কমান্ড K(নীচে zsh সংজ্ঞা), যা পরিবর্তনশীল এর আউটপুট eeps $K

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

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


2

আমি পিছনে টিক্স ব্যবহার করতে চাই key (এটি একই কিতে ~ এর মতো)

> vim `find . -name somefile.txt`

পিছনের টিকগুলি টিকসের ভিতরে কমান্ড কার্যকর করে এবং আউটপুটটি কমান্ড দ্বারা ব্যবহার করা যেতে পারে। উপরের সমস্ত ফাইল somefile.txt সন্ধান করবে এভাবে আপনাকে সমস্ত ফাইলের :nextমধ্য দিয়ে চলতে দেয় ।

আপনি যদি কমান্ডকে পরিমার্জন করার জন্য বেশ কয়েকটি চেষ্টা করে ব্যয় করেন তবে এটি ব্যবহারকারীর সম্পূর্ণ নয়, কারণ আপনি সম্পাদকের জন্য আদেশটি পুনরাবৃত্তি করতে ইতিহাসের বিকল্প ব্যবহার করতে পারেন।

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

আমি অবশ্যই এখানে কথাটি মিস করেছি, কারণ আমি এটি ব্যবহার করব:

:find **/somefile.txt

(আমি যদি জানতাম আমার মধ্যে কেবল একজনই আছে :echo &path ) বা, আমি যদি তাদের সমস্তটি চাইতাম:

:args **/somefile.txt

সম্পাদনা: ছি! ঠিক আছে, তাই আমি করেনি মিস বিন্দু - আপনি খুঁজে তালিকা, প্রকৃত ফাইলগুলি খোলা চাও? চেষ্টা করুন (আবার, ভিমের মধ্যে থেকে):

!!find . -name somefile.txt

- আমার খারাপ :)


1

@ ডেভিডমহ মন্তব্যগুলিতে ইঙ্গিত হিসাবে, আপনি যদি ইন্টারেক্টিভ অ্যাপ্লিকেশনটি ব্যবহার করতে চান তবে আপনি xargsপতাকাটি ব্যবহার করতে পারেন -o

find . -name somefile.txt | xargs -o vim

আপনি যদি ব্যবহার না করেন -o, আপনি সম্ভবত ভিআইএম ছাড়ার পরে টার্মিনাল অবস্থার মধ্যে বিশৃঙ্খলা করবে। আপনি যদি এটিটি করেন তবে নিম্নলিখিত কমান্ড দিয়ে আপনার টার্মিনালটি পুনরায় সেট করতে সক্ষম হওয়া উচিত:

reset

0

আমি একটি ফাংশন লিখেছি pvimযা আপনি যা চান তা করে। যদি এতে একাধিক লাইন পাইপ করা pvimথাকে তবে প্রথমটি ব্যতীত সমস্ত উপেক্ষা করে, ভিএম-তে একাধিক ফাইল খোলার ক্ষেত্রে এটি বাড়ানো যেতে পারে।

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

এটি ব্যবহার করুন:

stu@sente ~ $ find . -name "foo.txt" | pvim

যা প্রথম "foo.txt" ভিএম-তে লোড করবে ঠিক যেমনটি আপনি টাইপ করেছেন:

vim $(find . -name "foo.txt | head -n1")


0

xargsইতিমধ্যে উল্লিখিতগুলির তুলনায় এখানে একটি সহজ সমাধান:

find -name somefile.txt | xargs vim -p

-pবিকল্প বলে vimআলাদা ট্যাবে প্রতিটি ফাইল খুলতে। আমি এটি বাফার ব্যবহারের চেয়ে বেশি সুবিধাজনক বলে মনে করি।


0

আমি দেখতে পেয়েছি যে ভিএম এর সাহায্যে একটি ফাইল খোলার locateপক্ষে অত্যন্ত সুবিধাজনক এবং এর চেয়েও দ্রুত find

নিম্নলিখিত কমান্ডটি app.pyডিরেক্টরি সম্বলিত পথে ডাকা একটি ফাইল অনুসন্ধান করে MyPythonProject

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