2010-04-23 3 views
10

Il semble sripting python de VIMS est conçu pour modifier tampon et les fichiers plutôt que de travailler bien avec les registres de VIMS. Vous pouvez utiliser certaines des commandes de vim packages pour accéder aux registres mais ce n'est pas joli.Pouvez-vous accéder aux registres de fonctions de python dans vim

Ma solution pour créer quelque chose comme une fonction vim en utilisant python qui utilise un registre cela.

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

registres de réglage peut également être possible d'utiliser quelque chose comme

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

Cependant, cela se sent un peu lourd et je ne sais pas exactement ce que myescapefn devrait être. Donc, je n'ai jamais réussi à faire fonctionner correctement la version du paramètre.

Donc, s'il y a un moyen de faire quelque chose comme

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 

Ou même une belle version de myescapefn je pourrais utiliser alors ce serait très pratique.

MISE À JOUR:

Sur la base de la solution par zyx J'utilise ce morceau de python

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

'python >> Résultats de EOF' en erreur de syntaxe. Peut-être que vous utilisez 'python << EOF'? – ZyX

+0

Et vous avez oublié 'endfunction'. – ZyX

+0

Thx ZyX. Fixé maintenant –

Répondre

6

Si vous utilisez tout apostrophes dont vous avez besoin est de remplacer toutes les occurrences d'un guillemet simple avec deux lits simples citations Quelque chose comme ça:

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

Mise à jour: cette méthode repose en grande partie sur une (non documentée) caractéristique de la différence entre

let abc='string 
with newline' 

et

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

: tout le premier échoue le second réussit (et il n'est pas le seul exemple de différences entre la gestion de la nouvelle ligne dans :execute et les fichiers simples). D'autre part, eval() est un peu plus devrait gérer ce depuis string("string\nwith newline") retours exactement la même chose senclose fait, donc je vous écris ces choses maintenant seulement en utilisant vim.eval:

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

Cela semble fonctionner parfaitement. Merci. Bien en dehors de la dernière ligne, où. doit être remplacée par + –

+3

légèrement plus net est-: vim.command ("laisser @r = '% s'" % arg.replace ("'", " ''")) –

+0

ne saviez pas sur remplacer la méthode. Merci. – ZyX

Questions connexes