web-dev-qa-db-fra.com

En cours d’exécution Python dans Vim

J'écris Python en utilisant Vim, et chaque fois que je veux exécuter mon code, je tape ceci dans Vim:

:w !python

Cela devient frustrant, alors je cherchais une méthode plus rapide pour exécuter Python dans Vim. Exécution de Python scripts depuis un terminal peut-être? J'utilise Linux.

81
multigoodverse

que diriez-vous d'ajouter un autocmd, quand FileType python, créez un mapping:

nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>

alors vous pourriez appuyer sur <F9> pour exécuter le tampon actuel avec python

114
Kent

J'ai ceci dans mon fichier .vimrc:

imap <F5> <Esc>:w<CR>:!clear;python %<CR>

Quand j'ai fini d'éditer un script Python, il suffit d'appuyer sur <F5>. Le script est enregistré puis exécuté dans un écran vide.

22
czayas

Il suffit d’aller en mode normal en appuyant sur <esc> et tapez:

! clear; python %

enter image description here

Explication pas à pas:

! vous permet d'exécuter une commande de terminal

clear va vider l'écran de votre terminal

; termine la première commande, vous permettant d'introduire une deuxième commande

python utilisera python pour exécuter votre script (il pourrait être remplacé par Ruby par exemple))

% concatte le nom de fichier actuel en le passant comme paramètre à la commande python

15
Flavio Wuensche

Je préfère Python redirigée vers une nouvelle fenêtre Vim (et si cette fenêtre est laissée ouverte, mettez à jour son contenu lors de la prochaine exécution Python avec cette fonction ):

" Bind F5 to save file if modified and execute python script in a buffer.
nnoremap <silent> <F5> :call SaveAndExecutePython()<CR>
vnoremap <silent> <F5> :<C-u>call SaveAndExecutePython()<CR>

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

Cela a demandé beaucoup d'efforts, alors si vous vous sentez généreux, n'hésitez pas à envoyer un don Paypal )

14
FocusedWolf

En vous appuyant sur les réponses précédentes, si vous souhaitez voir le code tout en regardant sa sortie, vous pouvez trouver :ter (:terminal) commande utile.

autocmd Filetype python nnoremap <buffer> <F5> :w<CR>:ter python2 "%"<CR>
autocmd Filetype python nnoremap <buffer> <F6> :w<CR>:vert ter python3 "%"<CR>

Utiliser vert dans la deuxième ligne exécute le code en fractionnement vertical au lieu d’horizontal.

Le point négatif est que si vous ne fermez pas la fenêtre divisée où le code a été exécuté, vous aurez plusieurs fractionnements après plusieurs exécutions (ce qui n’est pas le cas dans l’original python IDLE où le même la fenêtre de sortie est réutilisée).

(Je garde ces lignes à l'intérieur /home/user/.vimrc)

6
monday

N'oubliez pas que vous pouvez répéter la dernière commande utilisée avec @:, il ne vous reste plus qu'à répéter ces deux caractères.

Ou vous pouvez enregistrer la chaîne w !python dans un des registres (comme "a _ par exemple) puis appuyez sur :<C-R>a<CR> pour insérer le contenu du registre a dans la ligne de commande et l'exécuter.

Ou tu peux faire ce que je fais et cartographier <leader>z à :!python %<CR> pour exécuter le fichier actuel.

5
TankorSmash

Si vous ne voulez pas voir ":exec python file.py "imprimé à chaque fois, utilisez ceci:

nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr>
nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>

Il n'a pas gâché ma barre de statut powerline/vim-airline.

2
Jabba

Si vous voulez revenir rapidement dans votre :w commandes, une bonne chose est de taper :w puis appuyez sur votre flèche vers le haut. Il ne parcourra que les commandes commençant par w.

1
jared

J'ai ceci sur mon .vimrc:

"map <F9> :w<CR>:!python %<CR>"

qui enregistre le tampon courant et exécute le code en ne pressant que Esc + F9

1
derwin

Vous pouvez également utiliser skywind3000/asyncrun.vim . Ceci est similaire à ce que @FocusedWolf a répertorié.

1
Mahdi

Une méthode simple serait de taper : en mode normal, appuyez sur la touche fléchée vers le haut du clavier, puis sur Entrée. Cela répétera les dernières commandes saisies sur VIM.

1
multigoodverse

Pour une utilisation générique (exécutez python/haskell/Ruby/C++ ... à partir de vim sur la base de filetype), il existe un plugin Nice appelé vim-quickrun . Il supporte de nombreux langages de programmation par défaut. Il est également facilement configurable, de sorte que vous pouvez définir des comportements préférés pour tout type de fichier si nécessaire. Le repo de github n'a pas de fichier readme sophistiqué, mais il est bien documenté avec le fichier doc.

1
Yosh

Au lieu de mettre le mappage de commande dans votre .vimrc, Placez le mappage dans votre fichier ~/.vim/ftplugin/python.vim (Windows $HOME\vimfiles\ftplugin\python.vim). Si vous n'avez pas ce fichier ou ces répertoires, créez-les simplement. De cette façon, la clé n’est mappée que lorsque vous ouvrez un fichier .py Ou n’importe quel fichier avec filetype=python, Car vous n’exécuterez cette commande que sur Python .

Pour le mappage réel, j'aime bien pouvoir éditer dans Vim pendant l'exécution du script. En quittant la réponse de @cazyas, j'ai le texte suivant dans mon ftplugin\python.vim (Windows):

noremap <F5> <Esc>:w<CR>:!START /B python %<CR>

Ceci exécutera le script actuel Python en arrière-plan. Pour Linux, remplacez-le par ceci:

noremap <F5> <Esc>:w<CR>:!python % &<CR>
0
jpyams

La réponse acceptée fonctionne pour moi (sous Linux), mais je voulais que cette commande enregistre également le tampon avant de l'exécuter. Je l'ai donc légèrement modifiée:

nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>

Le :w <bar> enregistre le tampon ALORS exécute le code.

0
Alijah O'Connor

Ce mappage .vimrc nécessite Conque Shell , mais il reproduit le comportement de Geany (et des autres éditeurs X):

  • Appuyez sur une touche pour exécuter
  • Exécute dans gnome-terminal
  • Attend la confirmation pour sortir
  • La fenêtre se ferme automatiquement à la sortie

    :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; \" "')

0
user2587717