Ejecutando el código de Python en Vim

Estoy escribiendo código Python usando Vim, y cada vez que quiero ejecutar mi código, escribo esto dentro de Vim:

:w !python 

Esto se vuelve frustrante, así que estaba buscando un método más rápido para ejecutar el código Python dentro de Vim. ¿Ejecutar scripts de Python desde una terminal tal vez? Estoy usando Linux.

acerca de cómo agregar un autocmd , cuando FileType python , cree una asignación:

 nnoremap   :exec '!python' shellescape(@%, 1) 

luego podría presionar para ejecutar el búfer actual con python

Tengo esto en mi archivo .vimrc:

 imap  :w:!clear;python % 

Cuando termine de editar un script de Python, simplemente presiono . El script se guarda y luego se ejecuta en una pantalla en blanco.

Prefiero la salida de Python redirigida a una nueva ventana Vim (y si esa ventana se deja abierta, entonces actualice su contenido la próxima vez que ejecute el código de Python con esta función):

 " Bind F5 to save file if modified and execute python script in a buffer. nnoremap   :call SaveAndExecutePython() vnoremap   :call SaveAndExecutePython() function! SaveAndExecutePython() " SOURCE [reusable window]: https://github.com/fatih/vim-go/blob/master/autoload/go/ui.vim " save and reload current file silent execute "update | edit" " get file path of current file let s:current_buffer_file_path = expand("%") let s:output_buffer_name = "Python" let s:output_buffer_filetype = "output" " reuse existing buffer window if it exists otherwise create a new one if !exists("s:buf_nr") || !bufexists(s:buf_nr) silent execute 'botright new ' . s:output_buffer_name let s:buf_nr = bufnr('%') elseif bufwinnr(s:buf_nr) == -1 silent execute 'botright new' silent execute s:buf_nr . 'buffer' elseif bufwinnr(s:buf_nr) != bufwinnr('%') silent execute bufwinnr(s:buf_nr) . 'wincmd w' endif silent execute "setlocal filetype=" . s:output_buffer_filetype setlocal bufhidden=delete setlocal buftype=nofile setlocal noswapfile setlocal nobuflisted setlocal winfixheight setlocal cursorline " make it easy to distinguish setlocal nonumber setlocal norelativenumber setlocal showbreak="" " clear the buffer setlocal noreadonly setlocal modifiable %delete _ " add the console output silent execute ".!python " . shellescape(s:current_buffer_file_path, 1) " resize window to content length " Note: This is annoying because if you print a lot of lines then your code buffer is forced to a height of one line every time you run this function. " However without this line the buffer starts off as a default size and if you resize the buffer then it keeps that custom size after repeated runs of this function. " But if you close the output buffer then it returns to using the default size when its recreated "execute 'resize' . line('$') " make the buffer non modifiable setlocal readonly setlocal nomodifiable endfunction 

Simplemente vaya al modo normal presionando y escriba:

 ! clear; python % 

introduzca la descripción de la imagen aquí

Explicación paso a paso:

! le permite ejecutar un comando de terminal

clear vaciará su pantalla de terminal

; finaliza el primer comando, permitiéndole introducir un segundo comando

python usará python para ejecutar su script (podría reemplazarse con ruby por ejemplo)

% concats el nombre de archivo actual, pasándolo como un parámetro al comando python

Tenga en cuenta que puede repetir el último comando usado con @: así que eso es todo lo que necesita repetir son esos dos caracteres.

O puede guardar la cadena w !python en uno de los registros (como "a por ejemplo) y luego presionar :a para insertar el contenido del registro a en la línea de comandos y ejecutarlo.

O puede hacer lo que hago y asignar z a :!python % para ejecutar el archivo actual.

Sobre la base de las respuestas anteriores, si desea ver el código mientras observa su salida, puede encontrar útil el comando :ter ( :terminal ).

 autocmd Filetype python nnoremap   :w:ter python2 "%" autocmd Filetype python nnoremap   :w:vert ter python3 "%" 

El uso de vert en la segunda línea ejecuta el código en división vertical en lugar de horizontal.

Lo negativo de esto es que si no cierra la ventana dividida donde se ejecutó el código, tendrá muchas divisiones después de varias ejecuciones (lo que no ocurre en el IDLE original de python donde se reutiliza la misma ventana de salida).

(Mantengo estas líneas dentro de /home/user/.vimrc )

Si no quiere ver ” :exec python file.py ” impreso cada vez, use esto:

 nnoremap  :echo system('python2 "' . expand('%') . '"') nnoremap  :echo system('python3 "' . expand('%') . '"') 

Tampoco arruinó mi barra de estado de powerline / vim-airline.

Un método simple sería escribir : mientras está en modo normal, y luego presione la tecla de flecha hacia arriba en el teclado y presione Entrar. Esto repetirá los últimos comandos escritos en VIM.

Si desea saltar rápidamente hacia atrás a través de sus comandos :w , una cosa interesante es escribir :w luego presionar la flecha hacia arriba. Solo recorrerá los comandos que comienzan con w .

Para uso genérico (ejecute python / haskell / ruby ​​/ C ++ … desde vim basado en el tipo de filetype ), hay un bonito complemento llamado vim-quickrun . Es compatible con muchos lenguajes de progtwigción de forma predeterminada. También es fácilmente configurable, por lo que uno puede definir comportamientos preferidos para cualquier tipo de archivo si es necesario. El repository de github no tiene un archivo léame elegante, pero está bien documentado con el archivo doc.

Tengo esto en mi .vimrc:

 "map  :w:!python %" 

que guarda el búfer actual y ejecuta el código con solo presionar Esc + F9

Este mapeo .vimrc necesita Conque Shell , pero replica el comportamiento de Geany (y otros editores de X):

  • Presiona una tecla para ejecutar
  • Se ejecuta en gnome-terminal
  • Espera la confirmación para salir
  • La ventana se cierra automáticamente al salir

    :let dummy = conque_term#subprocess('gnome-terminal -e "bash -c \"python ' . expand("%") . '; answer=\\\"z\\\"; while [ $answer != \\\"q\\\" ]; do printf \\\"\nexited with code $?, press (q) to quit: \\\"; read -n 1 answer; done; \" "')

En lugar de poner la asignación de comandos en su .vimrc , ponga la asignación en su archivo ~/.vim/ftplugin/python.vim (Windows $HOME\vimfiles\ftplugin\python.vim ). Si no tiene este archivo o directorios, simplemente hágalos. De esta manera, la clave solo se asigna cuando abre un archivo .py o cualquier archivo con filetype=python , ya que solo ejecutará este comando en los scripts de Python.

Para la asignación real, me gusta poder editar en Vim mientras se ejecuta el script. Saliendo de la respuesta de @cazyas, tengo lo siguiente en mi ftplugin\python.vim (Windows):

 noremap  :w:!START /B python % 

Esto ejecutará la secuencia de comandos de Python actual en segundo plano. Para Linux simplemente cámbielo a esto:

 noremap  :w:!python % & 

Ponga su cursor en el código en algún lugar. Haga clic derecho y elija una de las opciones “Seleccionar” para resaltar su código. Luego presione Ctrl: y verá el nuevo indicador ‘<,>‘

Ahora escribe! Python y ve si eso funciona.

Acabo de pasar días tratando de resolver el mismo problema! Utilicé la encoding:

 s='My name' print (s) 

Después de que saqué todo mi cabello, ¡finalmente lo entendí bien!