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.
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
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.
Il suffit d’aller en mode normal en appuyant sur <esc>
et tapez:
! clear; python %
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é parRuby
par exemple))
%
concatte le nom de fichier actuel en le passant comme paramètre à la commandepython
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 )
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
)
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.
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.
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
.
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
Vous pouvez également utiliser skywind3000/asyncrun.vim . Ceci est similaire à ce que @FocusedWolf a répertorié.
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.
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.
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>
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.
Ce mappage .vimrc nécessite Conque Shell , mais il reproduit le comportement de Geany (et des autres éditeurs X):
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; \" "')