2010-08-31 15 views
5

Cuando Vim se compila con compatibilidad Python, puede crear una secuencia de comandos de Vim con Python utilizando el comando :python. ¿Cómo podría usar esto para ejecutar el comando e insertar el resultado debajo del cursor? Por ejemplo, si tuviera que ejecutar :python import os; os.listdir('aDirectory')[0], me gustaría que el primer nombre de archivo devuelto se insertara debajo del cursor.Ejecute un comando python dentro de vim y obtenga la salida

EDIT: Para aclarar, quiero el mismo efecto que ir al terminal, ejecutar el comando, copiar el resultado y ejecutar "+p.

Respuesta

2

Me funciona lo siguiente: escriba el código python que desea ejecutar en la línea que desea.

import os 
print(os.listdir('.')) 

después de que seleccione visualmente las líneas que desea ejecutar en Python

:'<,'>!python 

y después de que el código Python reemplazado por la salida del pitón.

+0

Pero eso no usa el soporte interno de Python de Vim. Soporte de shell de Vim. –

+0

sí, tienes razón, pasé por alto eso. – skeept

+1

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. –

2

Es necesario asignar a la línea actual, se puede utilizar el módulo de vim:

:python import os; import vim; vim.current.line=os.listdir('.')[0] 
+0

Esto funciona bien, pero terminas con un comando como ': python import os; importar vim; vim.current.line = vim.current.line [: vim.current.window.cursor [1]] + os.listdir ('blah') [0] + vim.current.line [vim.current.window.cursor [1]:] 'que es un poco molesto: -S –

+0

Puede crear un comando que tome el directorio como parámetro y ponerlo en su .vimrc: ' command -nargs = 1 FirstFile: python import os; importar vim; vim.current.line = vim.current.line [: vim.current.window.cursor [1]] + os.listdir ('') [0] + vim.current.line [vim.current.window.cursor [1]:] ' Y también puede asignar alguna combinación de teclas a este para un directorio particular: ' nmap ff: FirstFile. ' –

5
:,!python -c "import os; print os.listdir('aDirectory')[0]" 
+0

@Chinmay Kanchi: vuelva a leer el código –

+0

¡Vaya! Parece que ni siquiera puedo leer hoy ... –

+0

No me permite volver a subirlavedad de la respuesta a menos que se edite, ¿te importa agregar un espacio extra o algo así y guardarlo para poder votar? –

0

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 csiempre 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.

Cuestiones relacionadas