Vim से निष्पादित कमांड बैश कमांड उपनामों को नहीं पहचान रहे हैं


98

मैं मैक पर बैश का उपयोग करता हूं और उपनाम में से एक ऐसा है

alias gitlog='git --no-pager  log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges'

हालाँकि जब मैं करता हूँ

 :! gitlog

मुझे मिला

/bin/bash: gitlog: command not found 

मुझे पता है कि मैं अपने .gitconfig में इस तरह से उपनाम जोड़ सकता हूं

[alias]
    co = checkout
    st = status
    ci = commit
    br = branch
    df = diff

हालाँकि मैं अपने सभी बैश उपनामों को .gitconfig में जोड़ना नहीं चाहता। यह DRY नहीं है।

क्या कोई बेहतर समाधान है?


यदि उपनाम .itconfig में थे, तो आपको उन्हें अपने बैश उपनामों में दोहराने की आवश्यकता नहीं होगी, और जो कुछ भी गिट का उपयोग करता है वह उन्हें जानता होगा, बजाय सिर्फ बैश के। तो, DRY सराहनीय है, लेकिन इसमें SPOT (सिंगल पॉइंट ऑफ़ ट्रूथ) भी है, और अपने SPOT को सही जगह पर पाने का मतलब है DRY होना भी आसान है।
जोनाथन लेफ़लर


संभावित क्रॉस साइट डुप्लिकेट का डुप्लिकेट: superuser.com/questions/47821/vim-ignores-aliases
Ciro Santilli Sant of of of

जवाबों:


116

बैश आपके .bashrc को लोड नहीं करता है जब तक कि यह इंटरैक्टिव नहीं है। उपयोग

:set shellcmdflag=-ic

विम के :!खोल को अपने कमांड प्रॉम्प्ट की तरह व्यवहार करने के लिए ।


6
अपनी .vimrc फ़ाइल संपादित करें (vim ~ / .vimrc) और उसे वहां एक लाइन में रखें (:) के बिना
skeept

9
यह अच्छा है, लेकिन मुझे समस्याएँ आ रही हैं - अगर मैं इंटरैक्टिव मोड (आई फ्लैग) को सक्षम करता हूं, तो मैं अपने अलियास शेल कमांड को ठीक से निष्पादित कर सकता हूं, लेकिन जैसे ही कमांड निष्पादित होते हैं, विम बाहर निकलता है जो अवांछनीय है। पूर्व, मैंने करने की कोशिश की: ls shellcmdflag = -ic: [4] + रूका हुआ vi ~ / .vimrc
ashgromnies

6
@ केविन: इंटरैक्टिव बैश के साथ विवि के सामान्य व्यवहार को प्राप्त करने का कोई तरीका नहीं है? (कमांड निष्पादित करें, किसी भी कुंजी की प्रतीक्षा करें, विम पर वापस आएं)
मेयू

7
मेरे लिए, .vimrc की कमांड suspended (tty output)तब होती है जब मैं उपयोग करता git commit
हूं

27
विम को हमेशा एक इंटरैक्टिव शेल का उपयोग करने के लिए कहना समस्याएं पैदा कर सकता है। एक बेहतर उपाय यह पता लगाना है कि आपके बैश कॉन्फ़िगरेशन में उपनाम क्या सेट करते हैं और आप इसे उस स्थान पर कैसे स्थानांतरित कर सकते हैं जो गैर-संवादात्मक गोले में भी लोड होता है। उदाहरण के लिए, zshell केवल ~/.zshrcइंटरेक्टिव गोले के लिए लोड करता है , लेकिन यह ~/.zshenvसभी गोले के लिए लोड होता है , इसलिए मैंने अपना उपनाम सेटअप वहां स्थानांतरित कर दिया और यह अब विम के भीतर से काम करता है। अधिक के लिए देखें man zsh(या आपके शेल के मैन पेज)।
नाथन लॉन्ग

83

मुझे पता है कि यह प्रश्न पहले से ही "उत्तर" था, लेकिन मुझे उत्तर के साथ समस्या है। खोल को विम में इंटरएक्टिव सेट करने की आवश्यकता नहीं है । एक इंटरैक्टिव शेल से बाहर निकलने के बिना वैकल्पिक उत्तर के लिए इस धागे को देखें।

यदि आप गैर-संवादात्मक शेल (डिफ़ॉल्ट के रूप में) चाहते हैं, लेकिन बैश उपनामों के विस्तार के लिए, अपनी एलियास परिभाषाओं को एक फ़ाइल में रखें, उदाहरण के लिए .bash_aliases और स्पष्ट रूप से इस फ़ाइल में अन्य उपनाम को सक्षम करें।

shopt -s expand_aliases  
alias la='ls -la'

फिर इसे अपने .vimrc में जोड़ें ताकि एलियास फ़ाइल वास्तव में हर बार जब आप vim के भीतर से शेल कमांड चलाएं तो पढ़ें:

let $BASH_ENV = "~/.bash_aliases"

यह समाधान "जैकब" द्वारा सुझाया गया था। मूल के लिए नीचे दिए गए लिंक को देखें। मैंने मैक ओएस एक्स 10.9 पर यह परीक्षण किया और यह त्रुटिपूर्ण काम किया!

विम - इंटरैक्टिव मोड में जब उपनामों को नहीं पहचान रहा है?


7
अब तक का सबसे अच्छा उपाय। व्यक्तिगत रूप से, मैं $BASH_ENVअपने .bashrc(किसी भी कस्टम इंटरैक्टिव मोड चेक से पहले) वेर को सेट करता हूं , इसलिए मैं अपने सभी उपनामों का उपयोग कर सकता हूं।
el.atomo

2
यह शायद इस पृष्ठ पर सबसे अच्छा समाधान है क्योंकि परिवर्तनों का दायरा विम के भीतर सीमित होगा। एक और भी आगे जा सकता है let $BASH_ENV="~/.vim/vim_bash", और यह :!विम के भीतर सभी आह्वान के लिए इस्तेमाल किया जाएगा ।
तेइइइइइइइइइइइइइइइइइइइइइइए

यह macOS 10.15.2 डिफ़ॉल्ट शेल, zsh, दुर्भाग्य से काम नहीं करता है।
बेन क्विगले

8

ध्यान दें कि आपके bash dotfiles को कैसे कॉन्फ़िगर किया गया है, इसके आधार पर आप -i विकल्प के बजाय -l का उपयोग करना चाहते हैं। यह शेल को लॉगिन शेल के रूप में लॉन्च करेगा।


4
dreftymac ने लिखा: "मेरे लिए यह काम करने के लिए, यह करने के लिए आवश्यक था, विकल्प के लिए, अन्यथा vim 'कमांड नहीं मिला'" लौटा
dreftymac

8

मुझे पता है कि यह एक पुराना प्रश्न हो सकता है, हालाँकि उपरोक्त में से किसी भी उत्तर ने मेरे लिए काम नहीं किया। तो उन लोगों के लिए जो गोग्लिंग से आए थे और (ओह-माय-) zsh यूजर्स के लिए:

इसका मेरा समाधान केवल कॉपी करने के लिए था। zshrc to .shshv - http://zsh.sourceforge.net/Intro/intro_3.html के अनुसार :

जब तक -f विकल्प सेट नहीं किया जाता है, तो शेल के सभी इनवोकेशनों पर '.zshenv' को भेजा जाता है। इसमें कमांड सर्च पथ, प्लस अन्य महत्वपूर्ण पर्यावरण चर सेट करने के लिए कमांड होनी चाहिए। `.zshenv 'में ऐसे कमांड नहीं होने चाहिए जो आउटपुट का उत्पादन करते हैं या मान लें कि शेल एक ट्टी से जुड़ा हुआ है।

तो $ cp ~/.zshrc ~/.zshenvबात करेंगे।


इसके लिए शुक्रिया! बस यह नोट करना चाहते थे कि अगर आपके पास एक फ़ाइल में आपके शेल उपनाम हैं जो आप उन्हें .zshenv में बस स्रोत कर सकते हैं। कुछ इस तरह: . $HOME/.aliases
scifisamurai

2

मैं -i विकल्प को सेट करने में बहुत सहज महसूस नहीं करता, क्योंकि इसका काफी प्रभाव है और मैं अक्सर विम से शेल का उपयोग कर रहा हूं। मैं इसके बजाय क्या करना पसंद करेंगे:!bash -c ". ~/.alias; gitlog"


यह सबसे अच्छा समाधान की तरह लगता है, लेकिन यह मेरे लिए काम नहीं कर रहा है। यह अभी भी कहता है कि कमांड नहीं मिला
still_dreaming_1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.