vim

2010-04-23 19 views
10

'da python işlevlerinden gelen kayıtlara erişebiliyorsunuz Vims python sripting, vims kayıtlarıyla güzel çalışmak yerine arabelleği ve dosyaları düzenlemek için tasarlanmış görünüyor. Kayıtlara erişebilmek için bazı vim paketleri komutlarını kullanabilirsiniz, ancak hoş değil.vim

Kayıt defteri kullanan python kullanarak bir vim işlevi oluşturmak için kullandığım çözüm buna benzer.

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

Ayar kayıtlar da Ancak bu biraz hantal hissediyor

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

gibi bir şey kullanarak mümkün olabilir ve ben myescapefn olmalı tam olarak ne olduğundan emin değilim. Bu yüzden, ayar sürümünü düzgün bir şekilde çalıştırabildim.

Yani eğer daha

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 

Veya çok kullanışlı olacağını Sonra kullanabilirsiniz myescapefn bile güzel bir versiyonu gibi bir şey yapmak için bir yolu var.

GÜNCELLEME: Python parçasını kullanıyorum ZYX tarafından çözümüne dayanan

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

'piton >> EOF' sonuçları. Belki "python << EOF" kullanıyorsunuz? – ZyX

+0

Ve “endfunction” unuzu unuttun. – ZyX

+0

Thx ZyX. Şimdi sabit. –

cevap

6

Eğer tek tırnak kullanırsanız ihtiyacınız olan her şey iki tek tek alıntının her oluşumunu değiştirmektir tırnak. Böyle şey:

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

Güncelleme: Bu yöntem

let abc='string 
with newline' 

ve

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

arasındaki farkın bir (belgesiz) özelliği dayanır: süre İlk başarısız olur, ikinci başarılı (ve o :execute'daki yeni satır kullanımı ve düz dosyalar arasındaki farkların tek örneği değildir). Öte yandan, eval() biraz daha string("string\nwith newline") döner tam olarak aynı şey senclose yapar çünkü bu işlemek için beklenen, bu yüzden artık sadece vim.eval kullanarak bu şeyler yazma: sözdizimi hatası

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

Bu mükemmel çalışıyor gibi görünüyor. Teşekkürler. Son satırın yanı sıra, nerede. + –

+3

ile değiştirilmesi gerekiyor. Hafifçe şöyledir: vim.command ("let @r = '% s'"% arg.replace ("'", "' '")) –

+0

Değiştirme yöntemi hakkında bilgi sahibi değildi. Teşekkürler. – ZyX