Uruchamianie kodu Pythona w Vimie

105

Piszę kod w Pythonie za pomocą Vima i za każdym razem, gdy chcę uruchomić swój kod, wpisuję to w Vimie:

:w !python

To jest frustrujące, więc szukałem szybszej metody uruchamiania kodu Pythona w Vimie. Może wykonywanie skryptów Pythona z terminala? Używam Linuksa.

multigoodverse
źródło

Odpowiedzi:

146

Co powiesz na dodanie autocmddo swojego ~/.vimrc-pliku, utworzenie mapowania:

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 wykonać bieżący bufor zpython

Wyjaśnienie:

  • autocmd: polecenie, na którym Vim wykona automatycznie {event}(tutaj: jeśli otworzysz plik Pythona)
  • [i]map: tworzy skrót klawiaturowy do <F9>trybu wstawiania / normalnego
  • <buffer>: Jeśli otwartych jest wiele buforów / plików: po prostu użyj aktywnego
  • <esc>: wyjście z trybu wstawiania
  • :w<CR>: zapisuje twój plik
  • !: uruchamia następującą komendę w twojej powłoce (spróbuj :!ls)
  • %: jest zastępowane nazwą pliku aktywnego bufora. Ale ponieważ może zawierać takie rzeczy, jak spacje i inne „złe” rzeczy, lepiej jest nie pisać :python %, ale użyć:
  • shellescape: ucieczka ze znaków specjalnych. Do 1środków o backslashem

TL; DR: Pierwsza linia będzie działać w trybie normalnym, a po naciśnięciu <F9>najpierw zapisuje plik, a następnie uruchamia plik w Pythonie. Drugi robi to samo, ale najpierw opuszcza tryb wstawiania

Kent
źródło
6
Czy możesz rozszerzyć swoją odpowiedź i wyjaśnić, gdzie mam dodać tę linię. Może w pliku konfiguracyjnym Vima? Jestem nowicjuszem.
multigoodverse,
5
@ArditSulce w swoim pliku vimrc, dodaj wiersz:autocmd FileType python nnoremap <buffer> ....
Kent,
2
Jeśli jesteś na OS X (i zakładam, że Unix) ".vimrc" znajduje się w katalogu domowym. Możesz to sprawdzić, wpisując „: version” w trybie poleceń, aby upewnić się, że zobaczysz wiersz o nazwie „user vimrc file:„ ... ””
ThinkBonobo
Czy istnieje sposób na zapisanie i uruchomienie tego samego pliku zamiast po prostu go uruchamiać
Bharat
5
nnoremap <buffer> <F9> :!python %<cr>wydaje się działać w Vimie 7.4.1689. Do czego służy Shellescape?
Matt Kleinsmith
33

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

! clear; python %

wprowadź opis obrazu tutaj

Wyjaśnienie krok po kroku:

! umożliwia uruchomienie polecenia terminala

clear opróżni ekran terminala

; kończy pierwszą komendę, umożliwiając wprowadzenie drugiej komendy

pythonużyje Pythona do uruchomienia skryptu (można go zastąpić rubyna przykład)

%konkluduje bieżącą nazwę pliku, przekazując ją jako parametr do pythonpolecenia

Flavio Wuensche
źródło
28

Mam to w moim pliku .vimrc:

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

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

czayas
źródło
Dziękuję Ci! Działa całkiem nieźle. Zastanawiam się, jak ustawić skrót na mklawisz plus ,klawisz zamiast F5klawisza?
Jay Wong
Nie widzę, jak to najpierw zapisuje plik?
Thomas Browne,
Przepraszam, zapomniałem dodać „: w”. Poprawiłem to i dodałem też <Esc>.
czayas
2
Należy zauważyć, że jest to wykonywane w Inserttrybie. Do wykonania w Normaltrybie użyj nmapzamiast imap.
Marcin
17

Wolę wyjście Pythona przekierowane do nowego okna Vima (a jeśli to okno pozostanie otwarte, zaktualizuj jego zawartość następnym razem, gdy wykonasz kod Pythona 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
FocusedWolf
źródło
Czy powinienem wprowadzić to bezpośrednio do mojego .vimrc? Jeśli nie, jak mam przekazać ten skrypt Vimowi? (Tutaj Noob)
Benjamin Chausse,
1
@BenjaminChausse Przepraszamy za opóźnioną odpowiedź. Zrobiłem test z .vimrc, który zawierał wyłącznie ten kod i działał z tego, co mogłem powiedzieć. Moje testy ograniczały się do otwarcia pliku .py i naciśnięcia klawisza F5, co spowodowało, że wyjście Pythona pojawiło się w oddzielnym oknie Vima. „jak mam przekazać ten skrypt vimowi?”. To zależy od twojego systemu operacyjnego. Używam systemu Windows, więc mam plik tekstowy C: \ Program Files (x86) \ Vim \ .vimrc, który zawiera ten kod (w systemie Windows można też nazwać go „_vimrc”). W Linuksie lub
Macu miałbyś
4
Chociaż zdajemy sobie sprawę, że stworzenie tego mogło wymagać wiele pracy, umieszczanie linków PayPal w odpowiedzi nie jest właściwe.
Martijn Pieters
11

Opierając się na poprzednich odpowiedziach, jeśli chcesz zobaczyć kod, patrząc na jego wyjście, możesz znaleźć komendę :ter( :terminal).

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 vertw drugiej linii powoduje uruchomienie kodu w podziale pionowym zamiast poziomym.

Wadą tego jest to, że jeśli nie zamkniesz podzielonego okna, w którym został uruchomiony kod, będziesz miał wiele podziałów po wielu uruchomieniach (co nie ma miejsca w oryginalnym Pythonie IDLE, gdzie to samo okno wyjściowe jest ponownie używane).

(Trzymam te linie w środku /home/user/.vimrc)

poniedziałek
źródło
5

Pamiętaj, że możesz powtórzyć ostatnio używane polecenie @:, więc to wszystko, co musisz powtórzyć, to te dwa znaki.

Lub możesz zapisać ciąg w !pythonw jednym z rejestrów (jak "ana przykład), a następnie nacisnąć, :<C-R>a<CR>aby wstawić zawartość rejestru ado wiersza poleceń i uruchomić go.

Czy można zrobić to, co robię i mapę <leader>z, aby :!python %<CR>uruchomić bieżącego pliku.

TankorSmash
źródło
3

Jeśli nie chcesz, aby „ :exec python file.py” było drukowane za każdym razem, użyj tego:

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

Nie zepsuło to również mojego paska statusu powerline / vim-airline.

Jabba
źródło
3

Wtyczka: jupyter-vim

Możesz więc wysłać linie ( <leader>E), wizualną selekcję ( <leader>e) do uruchomionego jupyter-client(zamiennika ipython)

wprowadź opis obrazu tutaj

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

Tinmarino
źródło
2

Do ogólnego użytku (uruchom python / haskell / ruby ​​/ C ++ ... z vim na podstawie filetype), istnieje fajna wtyczka 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 pliku. Repozytorium github nie ma wyszukanego pliku readme, ale jest dobrze udokumentowane w pliku doc.

Yosh
źródło
2

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

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

:w <bar>Zapisuje bufor następnie uruchamia kod w nim.

Alijah O'Connor
źródło
1

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 ostatnio wpisanych poleceń w VIM.

multigoodverse
źródło
Możesz przeprowadzić wyszukiwanie przyrostowe, wpisując początkowe znaki polecenia przed naciśnięciem strzałki w górę. Jeśli wiele poleceń temu zrobiłem! python%, mógłbym:! następnie naciśnij strzałkę w górę, aby przełączać tylko polecenia zaczynające się od!
shmup
1

Jeśli chcesz szybko wrócić do swoich :wpoleceń, fajną rzeczą jest wpisanie, :wa następnie naciśnięcie strzałki w górę. Będzie przechodzić tylko przez polecenia zaczynające się od w.

shmup
źródło
1

Mam to na moim .vimrc:

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

który zapisuje bieżący bufor i wykonuje kod z preselekcją tylko Esc + F9

derwin
źródło
1

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

Mikrofon
źródło
1

Możesz rozszerzyć dla dowolnego języka za pomocą 1 przypisania klawisza za pomocą 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
Đạt Nguyễn Thành
źródło
1

Pomyśl o użyciu linii shebang, abyś mógł jej używać w każdym języku, nie tylko w Pythonie.

Dodawanie shebang:

Dodaj to do pierwszego wiersza skryptu:

#!/usr/bin/env python3

lub tak, jeśli używasz Pythona 2:

#!/usr/bin/env python2

Mapa klawiszy Vima:

Dodaj to do ~/.vimrc:

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

Spraw, aby plik był wykonywalny:

Wpisz Vim:

:!chmod +x %

lub w terminalu:

chmod +x script_name.py

Wyjaśnienie:

Kiedy F7 jest wciśnięty w trybie normalnym, Vim spróbuje wykonać bieżący plik jako skrypt bash. Wtedy interpreter basha zobaczy linię shebang i zrozumie, że ten plik powinien zostać przesłany do Pythona (lub innego programu, jeśli jest potrzebny).

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

./script_name.py

zamiast tego (to też zadziała):

python3 script_name.py
Саша Кошкин
źródło
0

To mapowanie .vimrc wymaga Conque Shell , ale powiela zachowanie Geany (i innych edytorów X):

  • Naciśnij klawisz, aby wykonać
  • Wykonuje się w gnome-terminal
  • Czeka na potwierdzenie, aby wyjść
  • 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; \" "')

user2587717
źródło
0

Umieść kursor gdzieś w kodzie. Kliknij prawym przyciskiem myszy i wybierz jedną z opcji „Wybierz”, aby podświetlić kod. Następnie naciśnij Ctrl: a zobaczysz nowy znak zachęty „<,>”

Teraz wpisz! Python i zobacz, czy to działa.

Po prostu spędzam dni próbując rozwiązać ten sam problem !!! Użyłem kodowania:

s='My name'
print (s) 

Po wyjęciu wszystkich włosów w końcu udało mi się to dobrze!

Bob Cressman
źródło
5
Używanie myszy w
niecodzienny
1
Ale jest to możliwe :% !python. %po prostu oznacza wszystkie linie.
T.Chmelevskij
0

Zamiast umieszczać mapowanie poleceń w swoim .vimrc, umieść mapowanie w swoim ~/.vim/ftplugin/python.vimpliku (Windows $HOME\vimfiles\ftplugin\python.vim). Jeśli nie masz tego pliku lub katalogów, po prostu je utwórz. W ten sposób klucz jest mapowany tylko wtedy, gdy otwierasz .pyplik lub dowolny plik za pomocą filetype=python, ponieważ będziesz uruchamiać to polecenie tylko w skryptach Pythona.

Jeśli chodzi o rzeczywiste mapowanie, lubię móc edytować w Vimie, gdy skrypt działa. Wychodząc z odpowiedzi @cazyas, mam następujące informacje w moim ftplugin\python.vim(Windows):

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

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

noremap <F5> <Esc>:w<CR>:!python % &<CR>
jpyams
źródło
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
źródło