Al final, lo resolví escribiendo un script llamado pyexec.vim y lo puso en mi directorio de complementos El guión se reproduce a continuación:
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
Esto funciona como se esperaba para oneliners, pero no funciona bien para múltiples sentencias que siguen un bloque. Entonces python pycurpos('a=2;if a==3:b=4;c=6')
dará como resultado c
siempre siendo 6
, ya que el bloque if
termina con la primera línea siguiéndolo.
Pero para una ejecución rápida y sucia de python, que es lo que yo quería, el script es adecuado.
Pero eso no usa el soporte interno de Python de Vim. Soporte de shell de Vim. –
sí, tienes razón, pasé por alto eso. – skeept
Esto más directamente logra el deseo declarado de * el mismo efecto que ir al terminal, ejecutar el comando, copiar el resultado y ejecutar "+ p * expresado por el OP. –