Uruchamianie kodu Pythona w Vimie

Piszę Kod Pythona używając Vima i za każdym razem, gdy chcę uruchomić mój kod, wpisuję go wewnątrz Vima:

:w !python

Robi się to frustrujące, więc szukałem szybszej metody uruchamiania kodu Pythona wewnątrz Vima. Może uruchamianie skryptów Pythona z terminala? Używam Linuksa.

 112
Author: multigoodverse, 2013-09-22

22 answers

Może dodasz autocmd do pliku ~/.vimrc, tworząc mapowanie:

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>

Następnie możesz nacisnąć <F9>, aby uruchomić bieżący bufor za pomocą python

Wyjaśnienie:

  • autocmd: polecenie, które Vim wykona automatycznie na {event} (tutaj: jeśli otworzysz plik Pythona)
  • [i]map: tworzy skrót klawiaturowy do <F9> w trybie insert / normal
  • <buffer>: Jeśli otwartych jest wiele buforów / plików: po prostu użyj aktywnego
  • <esc>: zostawiając insert mode
  • :w<CR>: zapisuje Twój plik
  • !: uruchamia następujące polecenie w powłoce (try :!ls)
  • %: jest zastępowana przez nazwę pliku aktywnego bufora. ale ponieważ może zawierać takie rzeczy jak spacje i inne " złe " rzeczy, lepiej poćwiczyć nie pisać :python %, ale używać:
  • shellescape: unikaj znaków specjalnych. 1 oznacza z ukośnikiem wstecznym

TL;DR: pierwsza linia będzie działać w trybie normalnym i po naciśnięciu <F9> najpierw zapisuje Twój plik, a następnie uruchamia go za pomocą Pythona. Drugi robi to samo, ale opuszcza tryb wstawiania jako pierwszy

 163
Author: Kent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-10 15:00:17

Po prostu przejdź do trybu normalnego, naciskając <esc> i wpisz:

! clear; python %

Tutaj wpisz opis obrazka

Wyjaśnienie krok po kroku:

! pozwala na uruchomienie polecenia terminal

clear opróżni ekran terminala

; kończy pierwszą komendę, pozwalając na wprowadzenie drugiej komendy

python użyje Pythona do uruchomienia skryptu (można go zastąpić ruby na przykład)

% concats the current nazwę pliku, przekazując go jako parametr do python Komenda

 40
Author: Flavio Wuensche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 13:22:25

Mam to w swoim .plik vimrc:

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

Kiedy skończę edytować skrypt Pythona, po prostu naciskam <F5>. Skrypt jest zapisywany, a następnie wykonywany na pustym ekranie.

 29
Author: czayas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 17:41:20

Preferuję wyjście Pythona przekierowane do nowego okna Vima (i jeśli to okno zostanie otwarte, zaktualizuj jego zawartość następnym razem, gdy wykonasz Kod Pythona z tą funkcją):

" 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
 20
Author: FocusedWolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-09 16:26:26

Bazując na poprzednich odpowiedziach, jeśli chcesz zobaczyć kod, patrząc na jego wyjście, możesz znaleźć :ter (:terminal) polecenie użyteczne.

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

Użycie vert w drugiej linii uruchamia kod w pionie zamiast w poziomie.

Minusem jest to, że jeśli nie zamkniesz okna dzielonego, w którym działał kod, będziesz miał wiele podziałów po wielu uruchomieniach (co nie dzieje się w oryginalnym Pythonie bezczynności, gdzie to samo okno wyjściowe jest ponownie używane).

(trzymam te lines inside /home/user/.vimrc)

 12
Author: michalmonday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-27 02:21:02

Pamiętaj, że możesz powtórzyć ostatnio użyte polecenie z @:, więc wystarczy, że powtórzysz te dwa znaki.

Lub możesz zapisać łańcuch w !python w jednym z rejestrów (na przykład "a), a następnie nacisnąć :<C-R>a<CR>, aby wstawić zawartość rejestru a do linii poleceń i uruchomić go.

Lub możesz zrobić to, co ja i mapować <leader>z na :!python %<CR>, aby uruchomić bieżący plik.

 5
Author: TankorSmash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 21:09:31

Plugin: jupyter-vim

Więc możesz wysyłać linie (<leader>E), selekcję wizualną (<leader>e) do running jupyter-client (zamiennik ipython)

Tutaj wpisz opis obrazka

Wolę oddzielić edytor i interpreter (każdy w swojej powłoce). Wyobraź sobie, że wysyłasz złe polecenie odczytu danych wejściowych ...

 5
Author: Tinmarino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 04:15:06

Jeśli nie chcesz za każdym razem wyświetlać ":exec python file.py", Użyj tego:

nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr>
nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>
Nie zepsuł też mojego paska stanu powerline / vim-airline.
 4
Author: Jabba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-17 20:29:04

Do użytku ogólnego (Uruchom python / haskell / ruby / C++... od Vima opartego na filetype), jest ładny plugin o nazwie vim-quickrun . Domyślnie obsługuje wiele języków programowania. Jest również łatwo konfigurowalny, więc w razie potrzeby można zdefiniować preferowane zachowania dla dowolnego typu plików. Repozytorium github nie ma wyszukanego readme, ale jest dobrze udokumentowane za pomocą pliku doc.

 2
Author: Yosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 14:13:42

Zaakceptowana odpowiedź działa dla mnie (na Linuksie), ale chciałem, aby ta komenda również zapisała bufor przed uruchomieniem, więc lekko ją zmodyfikowałem:

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

:w <bar> zapisuje bufor, a następnie uruchamia w nim kod.

 2
Author: Alijah O'Connor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-08 17:30:06

Pomyśl o używaniu shebang line, więc będziesz mógł go używać z dowolnym językiem, nie tylko Pythonem.

Dodanie:

Dodaj to do pierwszej linijki skryptu:

#!/usr/bin/env python3

Lub to, jeśli używasz Pythona 2:

#!/usr/bin/env python2

Vim keymap:

Dodaj to do swojego ~/.vimrc:

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

Utwórz plik wykonywalny:

Wpisz Vim:

:!chmod +x %

Lub w terminal:

chmod +x script_name.py

Explanation:

Gdy F7 zostanie naciśnięte w trybie normalnym, Vim spróbuje wykonać bieżący plik jako skrypt bash. Wtedy interpreter bash zobaczy linię shebang i zrozumie, że ten plik powinien zostać przekazany do Pythona (lub dowolnego innego programu, jeśli zajdzie taka potrzeba).

Będziesz także mógł uruchomić skrypt z terminala używając jego nazwy:

./script_name.py

Zamiast w ten sposób (to też zadziała):

python3 script_name.py
 2
Author: Alex Kosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-03 22:53:44

Używam

:! [filename.py]; python %

That ' s what works for me

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-18 09:53:33

Prostą metodą byłoby wpisanie : w trybie normalnym, a następnie naciśnięcie klawisza strzałki w górę na klawiaturze i naciśnięcie klawisza Enter. Spowoduje to powtórzenie ostatnich wpisanych poleceń w Vimie.

 1
Author: multigoodverse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-17 10:11:04

Jeśli chcesz szybko przejść z powrotem przez polecenia :w, fajną rzeczą jest wpisanie :w, a następnie naciśnięcie strzałki w górę. Będzie przełączać się tylko przez polecenia zaczynające się od w.

 1
Author: shmup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-19 19:56:16

Mam to na sobie .vimrc:

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

Który zapisuje bieżący bufor i wykonuje kod z naciśnięciem tylko Esc + F9

 1
Author: derwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 13:45:02

Możesz użyć skywind3000 / asyncrun.vim również. Jest to podobne do tego, co wymienił @FocusedWolf.

 1
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-07 16:54:20

Możesz rozszerzyć dla dowolnego języka z 1 klawiszami używając polecenia augroup, na przykład:

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

 1
Author: Đạt Nguyễn Thành,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-14 03:45:17

To .vimrc mapping needs Conque Shell , but it replicates Geany (and other x editors') behavior:

  • naciśnij klawisz, aby wykonać
  • wykonuje w gnome-terminal
  • czeka na potwierdzenie wyjścia
  • Okno zamyka się automatycznie przy wyjściu

    :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
Author: user2587717,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 13:08:53

Umieść kursor gdzieś w kodzie. Kliknij prawym przyciskiem myszy i wybierz jedną z opcji "Wybierz", aby podświetlić swój kod. Następnie naciśnij Ctrl : i zobaczysz nowy znak zachęty' '

Teraz pisz !python i sprawdź, czy to działa. Spędzam całe dnie próbując rozwiązać ten sam problem!!! Użyłem kodowania:
s='My name'
print (s) 

Po tym, jak wyciągnęłam wszystkie włosy, w końcu się udało!

 0
Author: Bob Cressman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 13:09:50

Zamiast umieszczać polecenie mapping w .vimrc, Umieść mapowanie w pliku ~/.vim/ftplugin/python.vim (Windows $HOME\vimfiles\ftplugin\python.vim). Jeśli nie masz tego pliku lub katalogów, po prostu je stwórz. W ten sposób klucz jest mapowany tylko wtedy, gdy otworzysz plik .py lub dowolny plik z filetype=python, ponieważ będziesz uruchamiał to polecenie tylko na skryptach Pythona.

Dla rzeczywistego mapowania, Lubię móc edytować w Vimie podczas uruchamiania skryptu. Wychodząc z odpowiedzi @cazyas, w moim ftplugin\python.vim (Windows):

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

Spowoduje uruchomienie bieżącego skryptu Pythona w tle. Dla Linuksa po prostu zmień to na to:

noremap <F5> <Esc>:w<CR>:!python % &<CR>
 0
Author: jpyams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-01 18:25:17
" 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>
 0
Author: Neo Mosaid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-19 15:13:46
  1. przejdź do katalogu domowego. cd
  2. Otwórz swoje .plik vimrc z vim. vim .vimrc
  3. Dodaj następny kod do pliku. nmap <F4> <Esc>:w<CR>:!clear;python %<CR>
  4. zapisz to i zakończ. ZZ

Następnym razem, gdy chcesz uruchomić kod, po prostu naciśnij F4 w "trybie normalnym". Jeśli chcesz uruchomić kod w "trybie wstawiania", zamień nmap na imap.

 0
Author: Chris Caro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-12 15:16:08