Ausführen von Python-Code in Vim

102

Ich schreibe Python-Code mit Vim und jedes Mal, wenn ich meinen Code ausführen möchte, gebe ich diesen in Vim ein:

:w !python

Das wird frustrierend, deshalb suchte ich nach einer schnelleren Methode, um Python-Code in Vim auszuführen. Vielleicht Python-Skripte von einem Terminal aus ausführen? Ich benutze Linux.

multigoodverse
quelle

Antworten:

143

Wie wäre es, wenn Sie autocmdIhrer ~/.vimrc-Datei eine hinzufügen und eine Zuordnung erstellen:

autocmd FileType python map <buffer> <F9> :w<CR>:exec '!python3' shellescape(@%, 1)<CR>
autocmd FileType python imap <buffer> <F9> <esc>:w<CR>:exec '!python3' shellescape(@%, 1)<CR>

dann können Sie drücken <F9>, um den aktuellen Puffer mit auszuführenpython

Erläuterung:

  • autocmd: Befehl, den Vim automatisch ausführt {event}(hier: wenn Sie eine Python-Datei öffnen)
  • [i]map: Erstellt eine Tastenkombination <F9>im Einfüge- / Normalmodus
  • <buffer>: Wenn mehrere Puffer / Dateien geöffnet sind: Verwenden Sie einfach den aktiven
  • <esc>: Einfügemodus verlassen
  • :w<CR>: speichert Ihre Datei
  • !: führt den folgenden Befehl in Ihrer Shell aus (try :!ls)
  • %: wird durch den Dateinamen Ihres aktiven Puffers ersetzt. Aber da es Dinge wie Leerzeichen und andere "schlechte" Dinge enthalten kann, ist es besser, nicht zu schreiben :python %, sondern zu verwenden:
  • shellescape: Entkomme den Sonderzeichen. Das 1bedeutet mit einem Backslash

TL; DR: Die erste Zeile funktioniert im normalen Modus. Sobald Sie darauf drücken <F9>, wird Ihre Datei zuerst gespeichert und anschließend mit Python ausgeführt. Der zweite macht dasselbe, verlässt aber zuerst den Einfügemodus

Kent
quelle
6
Können Sie bitte Ihre Antwort erweitern und erklären, wo ich diese Zeile hinzufügen soll? Vielleicht in einer Vim-Konfigurationsdatei? Ich bin ein Neuling.
Multigoodverse
5
@ArditSulce in Ihrer vimrc-Datei, fügen Sie eine Zeile hinzu:autocmd FileType python nnoremap <buffer> ....
Kent
2
Wenn Sie auf OS X sind (und ich nehme Unix an), befindet sich ".vimrc" im Home-Verzeichnis. Sie können dies überprüfen, indem Sie im Befehlsmodus ': version' eingeben, um sicherzustellen, dass eine Zeile mit dem Namen 'user vimrc file: "..."'
ThinkBonobo
Gibt es eine Möglichkeit, dieselbe Datei zu speichern und auszuführen, anstatt sie nur auszuführen
Bharat
5
nnoremap <buffer> <F9> :!python %<cr>scheint in Vim 7.4.1689 zu funktionieren. Wofür ist die Shellescape?
Matt Kleinsmith
31

Gehen Sie einfach in den normalen Modus, indem Sie drücken <esc>und Folgendes eingeben:

! clear; python %

Geben Sie hier die Bildbeschreibung ein

Schritt für Schritt Erklärung:

! Mit dieser Option können Sie einen Terminalbefehl ausführen

clear wird Ihren Terminalbildschirm leeren

; Beendet den ersten Befehl, sodass Sie einen zweiten Befehl einführen können

pythonverwendet Python, um Ihr Skript auszuführen (es könnte rubyzum Beispiel durch ersetzt werden)

%Überlegt den aktuellen Dateinamen und übergibt ihn als Parameter an den pythonBefehl

Flavio Wuensche
quelle
27

Ich habe dies in meiner .vimrc-Datei:

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

Wenn ich mit dem Bearbeiten eines Python-Skripts fertig bin, drücke ich einfach <F5>. Das Skript wird gespeichert und dann auf einem leeren Bildschirm ausgeführt.

czayas
quelle
Danke dir! Es funktioniert ziemlich gut. Ich frage mich, wie ich die Verknüpfung auf mTaste plus ,Taste anstelle von F5Taste einstellen kann .
Jay Wong
Ich sehe nicht, wie dies die Datei zuerst speichert?
Thomas Browne
Entschuldigung, ich habe vergessen, ": w" hinzuzufügen. Ich habe es korrigiert und auch <Esc> hinzugefügt.
Czayas
1
Es ist zu beachten, dass dies im InsertModus ausgeführt wird. Für die Ausführung im NormalModus verwenden Sie nmapanstelle von imap.
Marcin
16

Ich bevorzuge die Python-Ausgabe, die in ein neues Vim-Fenster umgeleitet wird (und wenn dieses Fenster geöffnet bleibt, aktualisieren Sie seinen Inhalt, wenn Sie das nächste Mal Python-Code mit dieser Funktion ausführen):

" 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
FocusedWolf
quelle
Soll ich das direkt in mein eingeben .vimrc? Wenn nicht, wie soll ich dieses Skript vim geben? (Noob hier)
Benjamin Chausse
1
@BenjaminChausse Entschuldigung für die verspätete Antwort. Ich habe einen Test mit einer .vimrc durchgeführt, die ausschließlich diesen Code enthielt, und es funktionierte nach allem, was ich sagen konnte. Meine Tests beschränkten sich darauf, eine .py-Datei zu öffnen und F5 zu drücken, was dazu führte, dass die Python-Ausgabe in einem separaten VIM-Fenster angezeigt wurde. "Wie soll ich dieses Skript vim geben?" Das hängt von Ihrem Betriebssystem ab. Ich verwende Windows, daher habe ich eine Textdatei C: \ Programme (x86) \ Vim \ .vimrc, die diesen Code enthält (Sie können ihn auch in Windows "_vimrc" nennen). Unter Linux oder Mac hätten Sie eine .vimrc-Textdatei in Ihrem Home-Ordner, dh ~ / .vimrc
FocusedWolf
2
Obwohl wir uns darüber im Klaren sind, dass Sie möglicherweise viel Arbeit für die Erstellung benötigt haben, ist es nicht wirklich angemessen, Paypal-Links in eine Antwort einzufügen.
Martijn Pieters
10

Aufbauend auf den vorherigen Antworten können Sie den Befehl :ter( :terminal) nützlich finden, wenn Sie den Code sehen möchten, während Sie sich die Ausgabe ansehen .

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

Bei Verwendung vertin der zweiten Zeile wird der Code in vertikaler Aufteilung anstelle von horizontal ausgeführt.

Das Negative daran ist, dass wenn Sie das Split-Fenster, in dem der Code ausgeführt wurde, nicht schließen, Sie nach mehreren Läufen viele Splits haben (was im ursprünglichen Python-IDLE nicht der Fall ist, in dem dasselbe Ausgabefenster wiederverwendet wird).

(Ich behalte diese Zeilen im Inneren /home/user/.vimrc)

Montag
quelle
5

Denken Sie daran, dass Sie den zuletzt verwendeten Befehl wiederholen können. Das @:ist also alles, was Sie wiederholen müssen, sind diese beiden Zeichen.

Oder Sie können die Zeichenfolge w !pythonin einem der Register speichern (wie "azum Beispiel) und dann drücken :<C-R>a<CR>, um den Inhalt des Registers ain die Befehlszeile einzufügen und auszuführen.

Oder Sie können tun , was ich tun und Karte , <leader>zum :!python %<CR>die aktuelle Datei auszuführen.

TankorSmash
quelle
3

Wenn Sie nicht :exec python file.pyjedes Mal " " gedruckt sehen möchten , verwenden Sie Folgendes:

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

Es hat auch meine Powerline / Vim-Airline-Statusleiste nicht durcheinander gebracht.

Jabba
quelle
3

Plugin: jupyter-vim

So können Sie Zeilen ( <leader>E), visuelle Auswahl ( <leader>e) an einen Lauf senden jupyter-client(das Ersetzen von ipython)

Geben Sie hier die Bildbeschreibung ein

Ich bevorzuge es, Editor und Interpreter zu trennen (jeder in seiner Shell). Stellen Sie sich vor, Sie senden einen schlechten Eingabe-Lesebefehl ...

Tinmarino
quelle
2

Für den generischen Gebrauch (führen Sie Python / Haskell / Ruby / C ++ ... von vim basierend auf dem aus filetype) gibt es ein nettes Plugin namens vim-quickrun . Es unterstützt standardmäßig viele Programmiersprachen. Es ist auch leicht konfigurierbar, sodass bei Bedarf bevorzugte Verhaltensweisen für jeden Dateityp definiert werden können. Das Github-Repo hat keine ausgefallene Readme-Datei, ist aber mit der Dokumentdatei gut dokumentiert.

Yosh
quelle
2

Die akzeptierte Antwort funktioniert für mich (unter Linux), aber ich wollte, dass dieser Befehl auch den Puffer vor dem Ausführen speichert, also habe ich ihn leicht geändert:

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

Das :w <bar>speichert den Puffer DANN führt den Code darin aus.

Alijah O'Connor
quelle
1

Eine einfache Methode wäre, :im normalen Modus zu tippen , dann die Aufwärtspfeiltaste auf der Tastatur zu drücken und die Eingabetaste zu drücken. Dadurch werden die zuletzt in VIM eingegebenen Befehle wiederholt.

multigoodverse
quelle
Sie können eine inkrementelle Suche durchführen, indem Sie die Startzeichen des Befehls eingeben, bevor Sie den Aufwärtspfeil drücken. Wenn vor vielen Befehlen ich ein! Python%, ich könnte :! Drücken Sie dann den Aufwärtspfeil, um nur Befehle zu durchlaufen, die mit beginnen!
Shmup
1

Wenn Sie schnell durch Ihre :wBefehle zurückspringen möchten , ist es cool, zu tippen :wund dann den Aufwärtspfeil zu drücken. Es werden nur Befehle durchlaufen, die mit beginnen w.

shmup
quelle
1

Ich habe dies auf meiner .vimrc:

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

Dadurch wird der aktuelle Puffer gespeichert und der Code nur mit Esc + F9 ausgeführt

derwin
quelle
1

Sie können für jede Sprache mit 1 Tastenkombination mit dem Befehl augroup erweitern, zum Beispiel:

augroup rungroup
    autocmd!
    autocmd BufRead,BufNewFile *.go nnoremap <F5> :exec '!go run' shellescape(@%, 1)<cr>
    autocmd BufRead,BufNewFile *.py nnoremap <F5> :exec '!python' shellescape(@%, 1)<cr>
augroup END
Nt Nguyễn Thành
quelle
1

Denken Sie an die Verwendung der Shebang-Linie, damit Sie sie in jeder Sprache verwenden können, nicht nur in Python.

Shebang hinzufügen:

Fügen Sie dies in die erste Zeile Ihres Skripts ein:

#!/usr/bin/env python3

oder dies, wenn Sie Python 2 verwenden:

#!/usr/bin/env python2

Vim Keymap:

Fügen Sie dies zu Ihrem hinzu ~/.vimrc:

nmap <F7> :w<cr>:!clear;"%:p"<cr>

Datei ausführbar machen:

Geben Sie Vim ein:

:!chmod +x %

oder im Terminal:

chmod +x script_name.py

Erläuterung:

Wenn F7 im normalen Modus gedrückt wird, versucht Vim, die aktuelle Datei als Bash-Skript auszuführen. Dann wird der Bash-Interpreter die Shebang-Zeile sehen und verstehen, dass diese Datei an Python (oder ein anderes Programm, falls erforderlich) übergeben werden sollte.

Außerdem können Sie Ihr Skript vom Terminal aus unter folgendem Namen ausführen:

./script_name.py

statt so (das wird auch funktionieren):

python3 script_name.py
Саша Кошкин
quelle
0

Diese .vimrc-Zuordnung benötigt Conque Shell , repliziert jedoch das Verhalten von Geany (und anderen X-Editoren):

  • Drücken Sie zum Ausführen eine Taste
  • Wird im Gnome-Terminal ausgeführt
  • Wartet auf die Bestätigung zum Beenden
  • Das Fenster schließt sich beim Verlassen automatisch

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

user2587717
quelle
0

Setzen Sie Ihren Cursor irgendwo in den Code. Klicken Sie mit der rechten Maustaste und wählen Sie eine der Optionen "Auswählen", um Ihren Code hervorzuheben. Drücken Sie dann Strg: und Sie sehen die neue Eingabeaufforderung '<,>'.

Geben Sie nun! Python ein und prüfen Sie, ob dies funktioniert.

Ich verbringe nur Tage damit, das gleiche Problem herauszufinden !!! Ich habe die Codierung verwendet:

s='My name'
print (s) 

Nachdem ich alle Haare ausgezogen hatte, habe ich es endlich richtig gemacht!

Bob Cressman
quelle
5
Verwenden der Maus nicht auf eine vim Weise
0xc0de
1
Aber es ist möglich zu tun :% !python. %bedeutet nur alle Zeilen.
T.Chmelevskij
0

Anstatt die Befehlszuordnung .vimrcin Ihre ~/.vim/ftplugin/python.vimDatei einzufügen , fügen Sie die Zuordnung in Ihre Datei (Windows $HOME\vimfiles\ftplugin\python.vim) ein. Wenn Sie diese Datei oder Verzeichnisse nicht haben, erstellen Sie sie einfach. Auf diese Weise wird der Schlüssel nur zugeordnet, wenn Sie eine .pyDatei oder eine Datei mit öffnenfiletype=python , da Sie diesen Befehl nur für Python-Skripte ausführen.

Für das eigentliche Mapping möchte ich in Vim bearbeiten können, während das Skript ausgeführt wird. Ausgehend von der Antwort von @cazyas habe ich Folgendes in meinem ftplugin\python.vim(Windows):

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

Dadurch wird das aktuelle Python-Skript im Hintergrund ausgeführt. Für Linux ändern Sie es einfach wie folgt:

noremap <F5> <Esc>:w<CR>:!python % &<CR>
jpyams
quelle
0
" run current python file to new buffer
function! RunPython()
    let s:current_file = expand("%")
    enew|silent execute ".!python " . shellescape(s:current_file, 1)
    setlocal buftype=nofile bufhidden=wipe noswapfile nowrap
    setlocal nobuflisted
endfunction
autocmd FileType python nnoremap <Leader>c :call RunPython()<CR>
Neo Mosaid
quelle