2010-04-23 8 views
10

में पाइथन फ़ंक्शंस से रजिस्टरों तक पहुंच सकते हैं ऐसा लगता है कि vims पायथन क्रिप्टिंग को vims रजिस्टरों के साथ अच्छी तरह से काम करने के बजाय बफर और फ़ाइलों को संपादित करने के लिए डिज़ाइन किया गया है। रजिस्टरों तक पहुंच प्राप्त करने के लिए आप कुछ विम पैकेज कमांड का उपयोग कर सकते हैं लेकिन यह सुंदर नहीं है।क्या आप विम

रजिस्टर का उपयोग करने वाले पायथन का उपयोग करके एक विम फ़ंक्शन बनाने का मेरा समाधान ऐसा कुछ है।

function printUnnamedRegister() 
python <<EOF 
print vim.eval('@@') 
EOF 
endfunction 

स्थापना रजिस्टरों भी तरह

function setUnnamedRegsiter() 
python <<EOF 
s = "Some \"crazy\" string\nwith interesting characters" 
vim.command('let @@="%s"' % myescapefn(s)) 
EOF 
endfunction 

कुछ का उपयोग कर हालांकि इस लगता है थोड़ा बोझिल संभव हो सकता है और मुझे यकीन है कि myescapefn वास्तव में क्या किया जाना चाहिए नहीं कर रहा हूँ। तो मैं कभी भी सेटिंग संस्करण को ठीक से काम करने में सक्षम नहीं रहा हूं।

तो अगर अधिक की तरह

function printUnnamedRegister() 
python <<EOF 
print vim.getRegister('@') 
EOF 
endfunction 

function setUnnamedRegsiter() 
python <<EOF 
s = "Some \"crazy\" string\nwith interesting characters" 
vim.setRegister('@',s) 
EOF 
endfunction 

या मैं तो इस्तेमाल कर सकते हैं myescapefn का भी एक अच्छा संस्करण है कि बहुत आसान हो जाएगा कुछ करने के लिए एक तरह से नहीं है।

अद्यतन:

zyx द्वारा समाधान मैं अजगर के इस टुकड़े का उपयोग कर रहा के आधार पर

def setRegister(reg, value): 
    vim.command("let @%s='%s'" % (reg, value.replace("'","''"))) 
+0

'अजगर >> EOF' सिंटेक्स त्रुटि में परिणाम है। शायद आप 'पायथन << EOF' का उपयोग करें? – ZyX

+0

और आप 'एंडफंक्शन' के बारे में भूल गए। – ZyX

+0

Thx ZyX। अब तय –

उत्तर

6

आप एकल उद्धरण का उपयोग करते हैं सब कुछ आप की जरूरत है दो एकल के साथ एकल उद्धरण के हर घटना को बदलने के लिए है उद्धरण। कुछ इस तरह:

python import vim, re 
python def senclose(str): return "'"+re.sub(re.compile("'"), "''", str)+"'" 
python vim.command("let @r="+senclose("string with single 'quotes'")) 

अद्यतन: इस विधि एक (गैर-दस्तावेजी)

let abc='string 
with newline' 

और

execute "let abc='string\nwith newline'" 

के बीच अंतर की सुविधा पर काफी निर्भर करता है: पहला दूसरा सफल होता है (और यह :execute और सादे फाइलों में न्यूलाइन हैंडलिंग के बीच मतभेदों का एकमात्र उदाहरण नहीं है)। दूसरी ओर, eval() कुछ अधिक के बाद से string("string\nwith newline") रिटर्न बिल्कुल वही बात senclose करता है इस संभाल करने की उम्मीद है, इसलिए मैं इस बातें अब केवल vim.eval का उपयोग कर लिखें:

python senclose = lambda str: "'"+str.replace("'", "''")+"'" 
python vim.eval("setreg('@r', {0})".format(senclose("string with single 'quotes'"))) 
+0

यह पूरी तरह से काम करता प्रतीत होता है। धन्यवाद। आखिरी पंक्ति के अलावा, जहां। + –

+3

के साथ प्रतिस्थापित करने की आवश्यकता है थोड़ा neater है: vim.command ("let @r = '% s'"% arg.replace ("'", "' '")) –

+0

प्रतिस्थापन विधि के बारे में नहीं पता था। धन्यवाद। – ZyX