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.

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


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


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.


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

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)


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.


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.


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 ...


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.


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.


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.


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.


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



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

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

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


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!


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>

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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.