2009-02-01 13 views
51

Pierdo mucho tiempo entre Vim y Python. Me parece demasiado lento para copiar y pegar manualmente de Python a Vim y viceversa. Un buen ejemplo roto es:¿Cómo se puede usar Python en Vim?

% python for i in xrange (25); imprimir 6 * i \ n

¿Cómo se pueden hacer estos ajustes directamente en Vim? [Resuelto]

[Aclaración] necesito cosas a Vim, como secuencias de impresión, la aritmética ... - cosas que no puedo hacer en Vim.

Puede alguien elaborar este punto [?]: "la secuencia de comandos puede leer de la entrada estándar para operar directamente sobre las líneas dadas (.,%, ...)."

[Más aclaración]

Si Quiero imprimir 'Hola' a las líneas 4,5, 6 y 7, lo que está mal:

: 4-7 python -c "print 'hola'"

The dot. modifica la línea actual. ¿Puedo imprimir en varias líneas 7, 32 y 99:

: 7,32,99 python -c "imprimir 'hola'"

Es evidente que no trabajan. ¿Cómo?

+1

¿Es esta una pregunta? –

+0

¿Podría por favor elaborar más, qué está tratando de hacer? – Alex

Respuesta

164

En cualquiera de sus ventanas vim, escriba algo como esto:

for x in range(1,10): 
    print '-> %d' % x 

seleccionar visualmente esas dos líneas (V para iniciar el modo visual), y escriba lo siguiente:

:!python 

Debido ha pulsado ':' en el modo visual, que va a terminar pareciéndose a:

:'<,'>!python 

Hit entrar y la selección se reemplaza por la salida de las declaraciones print. Desde aquí se puede convertir en un mapeo:

:vnoremap <f5> :!python<CR> 
+12

He estado usando vim y python durante años y, sin embargo, esta sugerencia me dejó sin palabras. No tengo idea de por qué eso nunca se me ocurrió. – rhettg

+0

Esto es realmente increíble. –

+3

En realidad, no me di cuenta de que podía hacerse tan fácilmente hasta que HL hizo su pregunta y tuve que encontrar una respuesta ... –

5

Según su ejemplo, parece que desea ejecutar un script de Python y hacer que el resultado del script aparezca en el búfer de Vim actual. Si eso es correcto, entonces usted puede hacer lo siguiente en la línea de comandos de Vim:

%!python -c "for i in xrange(25): print 6*i" 

La opción -c-python le da una secuencia de comandos para ejecutar. Sin embargo, puede encontrar esta técnica útil solo en casos muy breves, porque a diferencia de otros lenguajes, Python no se presta bien para escribir programas completos, todo en una línea.

1

Creo que solo te falta la bandera -c. Por ejemplo:

:.!python -c "print 'hello'" 

No debe ser que la secuencia de comandos que proporcione actúe como un filtro en la selección de línea. Es decir, su secuencia de comandos puede leer desde stdin para operar directamente en las líneas dadas (., %, ...). Algo más que las tareas más simples, sin embargo, y sería mejor que pusieras los comandos de python en un archivo de script propio.

6

Puede alguien elaborar este punto: "la secuencia de comandos puede leer de la entrada estándar para operar directamente sobre las líneas dadas (.,%, ...)."

Un uso común es ordenar las líneas de texto usando el comando 'ordenar' disponible en su caparazón. Por ejemplo, puede ordenar el archivo completo usando este comando:

:%!sort 

O bien, puede ordenar sólo unas pocas líneas seleccionándolos en modo visual y luego escribiendo:

:!sort 

Se podría ordenar líneas 5-10 usando este comando:

:5,10!sort 

se puede escribir su propio script de línea de comandos (asumiendo que sabe cómo hacer eso) que invierte líneas de texto. Funciona así:

bash$ myreverse 'hello world!' 
!dlrow olleh 

Se podría aplicar a uno de los archivos abiertos en vim exactamente de la misma manera que utilizó sort:

:%!myreverse  <- all lines in your file are reversed 
+0

:%! Myreverse no funciona para mí en Vim. Da la salida:/bin/bash: myreverse: comando no encontrado –

+1

@Masi: The La idea es que, si hubiera escrito un comando 'myreverse', así es como lo ejecutaría. –

0

Si Quiero imprimir 'Hola' a las líneas 4,5, 6 y 7, lo que está mal:

Si desea hacer algo en lugares elegidos al azar en todo el archivo, es mejor que grabe las teclas y las vuelva a reproducir . Vaya a la primera línea que desea cambiar, y presione qz para iniciar la grabación en el registro z. Haga las ediciones que desee para esa línea y presione q nuevamente cuando haya terminado. Vaya a la siguiente línea que desea cambiar y presione @z para reproducir la macro.

0

Si quieres hacer algunas llamadas pitón sin compilar Vim con el intérprete de Python (que sería permitirá escribir plug-ins en Python, y también que se necesita para Omnicomplete de todos modos) se puede tratar como esto:

:.!python -c "import os; print os.getcwd()" 

Eso le diría dónde se encuentra en el disco (ruta actual).

Ahora vamos a número de unas pocas líneas, a partir de un archivo vacío, así que se puede ver el resultado fácilmente:

:.!python -c "for i in range(1,101): print i" 

(números vim líneas de 1 No 0) Ahora tenemos el número de cada línea en cada línea hasta la línea 100.

Pongamos ahora una pequeña secuencia de comandos en su ruta actual (como se muestra arriba) y ejecútela, vea cómo funciona. Vamos a copiar pegar este tonto. En realidad se encuentra más útil para hacer la escritura que la producción de una línea por línea, pero usted no tiene que ver que a medida que este script muestra:

print "hi" 

try: 
    while True: 
     i=raw_input() 
     print "this was:",i 
except EOFError: 
    print "bye" 

para que pueda llamar, por ejemplo (imagina lo llamaste "what.py"):

: 10,20 pitón what.py

(Tenga en cuenta que la implementación del tabulador de los nombres de archivos funciona, para que pueda verificar que es realmente en el camino)

Como puede ver, everyline se alimenta al script como entrada estándar. Primero se emite "hola", al final "bye" y en el medio, para cada línea se muestra "this was:" más la línea. De esta forma puede procesar línea por línea. Observe que puede hacer cosas más complejas que procesar línea por línea, realmente puede considerar las líneas anteriores. Para tales cosas prefiero importar sys y hacerlo así:

import sys 

print "hello" 

for i in sys.stdin.readlines(): 
    i = i.rstrip("\n") # you can also prevent print from doing \n instead 
    print "here lyeth",i 

print "see you" 

Espero que ayude.

+0

Supongo que esto podría hacerse más corto. No obtuve el método largo para trabajar. –

0

Creo que lo que realmente quiere se explica here.

1

puede ejecutar el código, leer la salida en el cursor y termine con u, suponiendo que está ejecutando código python. Simple y rápido.

:r !python % 

u 

me gusta por encima de asignación y selección-en-el modo visual, al igual que con too-much-php, ya que mantiene la base de sencillo!

+0

esto, sin embargo, no es posible si está utilizando un búfer tmp, primero debe guardarlo, luego funciona, ¿hay alguna posibilidad de que usted sepa cómo hacer que esto funcione para un búfer temporal? – serup

0

En Windows, si está editando el script en Python, acaba de hacer:

!start python my... 

y pulse tab para desplazarse a lo largo de los nombres de archivo disponibles, hasta que encuentre su partido:

!start python myscript.py 

Se ejecutará en una nueva ventana cmd.Personalmente prefiero hacer !start cmd y desde allí ejecutar Python, ya que es más fácil depurar de los eventuales mensajes de error.

1

si usted ha escrito su script Python en una nueva [No Name] buffer, a continuación, puede utilizar lo siguiente:

:0,$!python 

cuando se tiene un buffer sin nombre, entonces no se puede utilizar '%', por lo tanto, la necesidad de 0, lo que significa $ todas las líneas en tampón de partida con la línea de cero hasta la última línea

salida será escrita en tampón y por desgracia no al final

Cuestiones relacionadas