Vim में कमांड के परिणाम द्वारा दी गई फ़ाइल खोलें


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
ठीक है। यदि वह है, जो आवश्यक है, तो ढूँढें -name somefile.txt | xargs विम
बाल्की

3
नहीं, यह ठीक से काम नहीं करता है और आपके टर्मिनल को गड़बड़ कर सकता है! आप xargs विम के लिए पाइप नहीं कर सकते, क्योंकि विम एक इंटरैक्टिव टर्मिनल से आने के लिए इनपुट की उम्मीद करता है।
डॉगबैन


4
एक और विकल्प होगा vim `find -name somefile.txt`। @ स्टुअर्टपॉवर वैकल्पिक रूप से, आप उपयोग कर सकते हैं vim `!-1`यदि आप पहले से ही इस खोज का उपयोग करते हैं तो आप पिछले कमांड थे
बर्नहार्ड

1
@balki इस परिदृश्य में xargs का उपयोग करने के लिए, आपको फ़्लैग -o का उपयोग करना होगा, यह आदमी में है: -o Reopen stdin as / dev / tty चाइल्ड प्रोसेस में कमांड निष्पादित करने से पहले। यदि आप चाहते हैं कि xargs एक इंटरेक्टिव एप्लिकेशन चलाए तो यह उपयोगी है।
दविदुम

7

इसे इस्तेमाल करे:

  1. शुरू करो
  2. vim में, निम्नलिखित का उपयोग करें:

: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 में काम करता है, लेकिन bash में नहीं (इसे पैरेंट शेल में निष्पादित करने के लिए पाइप लाइन के आउटपुट पक्ष की आवश्यकता होती है)। फ़ंक्शन में कमांड को पाइप करें K(नीचे zsh परिभाषा), जो k अपने चर में आउटपुट को बढ़ाता है $K

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

प्रत्येक कमांड के आउटपुट को स्वचालित रूप से सहेजना वास्तव में केवल शेल के साथ संभव नहीं है, आपको कमांड को एमुलेटेड टर्मिनल में चलाने की आवश्यकता है। आप इसे अंदर चलाकर script(बीएसडी उपयोगिता, लेकिन लिनक्स और सोलारिस सहित अधिकांश यूनियनों पर उपलब्ध) कर सकते हैं, जो आपके सत्र के सभी आउटपुट को एक फ़ाइल के माध्यम से बचाता है (टाइपस्क्रिप्ट में अंतिम संकेत का दृढ़ता से पता लगाने के लिए अभी भी थोड़ा प्रयास करने की आवश्यकता है) )।


2

मुझे बैक टिक्स का उपयोग करना पसंद है `(इसकी ~ जैसी ही कुंजी पर)

> 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

जैसा कि @davidmh ने टिप्पणियों में बताया, यदि आप एक इंटरैक्टिव एप्लिकेशन का उपयोग करना चाहते हैं, तो आप 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'`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.