2010-04-23 10 views
10

Parece que vims python sripting está diseñado para editar el búfer y los archivos en lugar de funcionar muy bien con los registros vims. Puede usar algunos de los comandos de paquetes vim para obtener acceso a los registros, pero no es bonito.Puede acceder a los registros de las funciones de python en vim

Mi solución para crear una función vim usando python que usa un registro es algo como esto.

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

registros ajuste también puede ser posible usar algo como

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

Sin embargo esto se siente un poco engorroso y no estoy seguro de lo que debería ser myescapefn. Así que nunca he podido obtener la versión de configuración para que funcione correctamente.

Así que si hay una manera de hacer algo más como

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 

O incluso una versión nueva de myescapefn que podría utilizar entonces que sería muy práctico.

ACTUALIZACIÓN:

Sobre la base de la solución por ZYX estoy usando esta pieza de pitón

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

'python >> EOF' resulta con errores de sintaxis. ¿Tal vez usas 'python << EOF'? – ZyX

+0

Y olvidaste 'endfunction'. – ZyX

+0

Thx ZyX. Corregido ahora. –

Respuesta

6

Si utiliza comillas simples todo lo que necesita es reemplazar todas las ocurrencias de la comilla simple con dos individuales citas. Algo así:

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

actualización: este método se basa en gran medida de una característica (no documentado) de la diferencia entre

let abc='string 
with newline' 

y

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

: mientras el primero falla el segundo tiene éxito (y no es el único ejemplo de diferencias entre el manejo de nueva línea en :execute y archivos sin formato). Por otra parte, es algo más eval() espera que manejar esto desde string("string\nwith newline") vuelve exactamente lo mismo senclose hace, así que escribir estas cosas ahora sólo utilizando vim.eval:

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

Esto parece funcionar perfectamente. Gracias. Bien aparte de la última línea, dónde. necesita ser reemplazado por + –

+3

Un poco más ordenado es: vim.command ("let @r = '% s'"% arg.replace ("'", "' '") –

+0

No sabía sobre el método de reemplazo. Gracias. – ZyX

Cuestiones relacionadas