2010-08-31 15 views
5

प्राप्त करें जब विम पाइथन समर्थन के साथ संकलित किया गया है, तो आप :python कमांड का उपयोग करके पायथन के साथ विम स्क्रिप्ट कर सकते हैं। आदेश को निष्पादित करने और कर्सर के नीचे परिणाम डालने के लिए मैं इसका उपयोग कैसे करूं? उदाहरण के लिए, यदि मैं :python import os; os.listdir('aDirectory')[0] निष्पादित करना चाहता था, तो मैं चाहता हूं कि पहला फ़ाइल नाम कर्सर के नीचे डाला जाए।विम के भीतर एक पायथन कमांड निष्पादित करें और आउटपुट

संपादित करें: स्पष्टीकरण के लिए, मुझे टर्मिनल पर जाने, आदेश निष्पादित करने, परिणाम की प्रतिलिपि बनाने और "+p निष्पादित करने के समान प्रभाव चाहिए।

उत्तर

2

निम्नलिखित मेरे लिए ठीक काम करता है: उस पायथन कोड को लिखें जिसे आप इच्छित लाइन में निष्पादित करना चाहते हैं।

import os 
print(os.listdir('.')) 

उसके बाद नेत्रहीन लाइनों आप अजगर

:'<,'>!python 

में निष्पादित करने के लिए चाहते हैं का चयन और उसके बाद अजगर कोड अजगर उत्पादन के द्वारा बदल दिया जाएगा।

+0

लेकिन यह विम के आंतरिक पायथन समर्थन का उपयोग नहीं करता है। विम का खोल समर्थन। –

+0

हाँ, आप सही हैं, मैंने इसे अनदेखा किया। – skeept

+1

यह सबसे अधिक सीधे * टर्मिनल पर जाने, आदेश को निष्पादित करने, परिणाम की प्रतिलिपि बनाने और ओपी द्वारा व्यक्त किए गए "+ पी * निष्पादित करने के समान प्रभाव की अपेक्षित इच्छा प्राप्त करता है। –

2

आप वर्तमान पंक्ति निर्दिष्ट करने के लिए की जरूरत है, तो आप vim मॉड्यूल का उपयोग कर सकते हैं:

:python import os; import vim; vim.current.line=os.listdir('.')[0] 
+0

यह ठीक काम करता है, लेकिन आप ': python import os जैसे कमांड के साथ समाप्त होते हैं; आयात vim; vim.current.line = vim.current.line [: vim.current.window.cursor [1]] + os.listdir ('blah') [0] + vim.current.line [vim.current.window.cursor [1]:] 'जो थोड़ा परेशान है: -एस –

+0

आप एक कमांड बना सकते हैं जो निर्देशिका को पैरामीटर के रूप में लेता है और इसे आपके .vimrc में डालता है: 'command-nargs = 1 फर्स्टफाइल: पायथन आयात ओएस; आयात vim; vim.current.line = vim.current.line [: vim.current.window.cursor [1]] + os.listdir ('') [0] + vim.current.line [vim.current.window.cursor [1]:] ' और आप कुछ विशेष निर्देशिका के लिए कुछ महत्वपूर्ण संयोजन भी मैप कर सकते हैं: ' nmap ff: firstFile। ' –

5
:,!python -c "import os; print os.listdir('aDirectory')[0]" 
+0

@Chinmay Kanchi: कोड –

+0

कोड दोबारा पढ़ें! ऐसा लगता है कि मैं आज भी पढ़ नहीं सकता ... –

+0

यह मुझे तब तक उत्तर देने की अनुमति नहीं देगा जब तक कि इसे संपादित नहीं किया जाता है, क्या आप अतिरिक्त जगह या कुछ जोड़ना और इसे सहेजना चाहते हैं ताकि मैं ऊपर जा सकूं? –

0

अंत में, मैं यह एक स्क्रिप्ट कहा जाता pyexec.vim लिख कर हल और में रख मेरी प्लगइन निर्देशिका।

python << endpython 
import vim 
def pycurpos(pythonstatement): 
    #split the python statement at ; 
    pythonstatement = pythonstatement.split(';') 
    stringToInsert = '' 
    for aStatement in pythonstatement: 
     #try to eval() the statement. This will work if the statement is a valid expression 
     try: 
      s = str(eval(aStatement)) 
     except SyntaxError: 
      #statement is not a valid expression, so try exec. This will work if the statement is a valid python statement (such as if a==b: or print 'a') 
      #if this doesn't work either, fail 
      s = None 
      exec aStatement 


     stringToInsert += s if s is not None else '' 

    currentPos = vim.current.window.cursor[1] 
    currentLine = vim.current.line 
    vim.current.line = currentLine[:currentPos]+stringToInsert+currentLine[currentPos:] 

endpython 

यह oneliners के लिए अपेक्षा के अनुरूप काम करता है, लेकिन नहीं है एक ब्लॉक निम्नलिखित कई बयानों के लिए काफी काम: स्क्रिप्ट नीचे गयी है। तो python pycurpos('a=2;if a==3:b=4;c=6') परिणामस्वरूप cहमेशा6 होने के कारण, if ब्लॉक इसके बाद पहली पंक्ति के साथ समाप्त होता है।

लेकिन त्वरित और गंदे पायथन निष्पादन के लिए, जो मैं चाहता था, स्क्रिप्ट पर्याप्त है।

संबंधित मुद्दे