Vim에서 Python 코드 실행


105

저는 Vim을 사용하여 Python 코드를 작성하고 있으며 코드를 실행할 때마다 Vim에 다음을 입력합니다.

:w !python

이것은 실망스러워서 Vim 내에서 Python 코드를 실행하는 더 빠른 방법을 찾고있었습니다. 터미널에서 Python 스크립트를 실행하고 있습니까? Linux를 사용하고 있습니다.

답변:


146

어떻게 추가에 대한 autocmd사용자에 ~/.vimrc매핑을 생성 - 파일 :

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>

그런 다음을 눌러 <F9>현재 버퍼를 실행할 수 있습니다.python

설명:

  • autocmd: Vim이 자동으로 실행할 명령 {event}(여기서는 파이썬 파일을 여는 경우)
  • [i]map: <F9>삽입 / 일반 모드에서 키보드 단축키를 만듭니다.
  • <buffer>: 여러 개의 버퍼 / 파일이 열려있는 경우 : 활성 파일 만 사용하십시오.
  • <esc>: 삽입 모드 종료
  • :w<CR>: 파일을 저장합니다.
  • !: 쉘에서 다음 명령을 실행합니다 (try :!ls).
  • %: 활성 버퍼의 파일 이름으로 대체됩니다. 그러나 공백 및 기타 "나쁜"항목을 포함 할 수 있으므로 작성하지 않고 다음을 :python %사용하는 것이 좋습니다.
  • shellescape: 특수 문자를 이스케이프합니다. 1백 슬래시 수단

요약 : 첫 번째 줄은 일반 모드에서 작동하며 일단 누르면 <F9>먼저 파일을 저장 한 다음 파이썬으로 파일을 실행합니다. 두 번째는 동일한 작업을 수행하지만 삽입 모드를 먼저 둡니다.


6
답변을 확장하고 그 줄을 어디에 추가해야하는지 설명해 주시겠습니까? Vim 구성 파일 내부에 있습니까? 나는 초보자입니다.
multigoodverse

5
vimrc 파일에 @ArditSulce, 다음 줄을 추가합니다.autocmd FileType python nnoremap <buffer> ....
Kent

2
OS x (그리고 저는 유닉스라고 가정)를 사용한다면 ".vimrc"는 홈 디렉토리에 있습니다. 명령 모드에서 ': version'을 입력하여 'user vimrc file : "..."'이라는 줄이 표시되는지 확인할 수 있습니다.
ThinkBonobo

같은 파일을 저장하고 실행하는 방법 대신 그것을 실행하는, 거기에
바라트

5
nnoremap <buffer> <F9> :!python %<cr>Vim 7.4.1689에서 작동하는 것 같습니다. 쉘 이스케이프는 무엇입니까?
Matt Kleinsmith 2017-04-02

33

을 누르고 다음 <esc>을 입력 하여 일반 모드로 이동하십시오 .

! clear; python %

여기에 이미지 설명 입력

단계별 설명 :

! 터미널 명령을 실행할 수 있습니다.

clear 터미널 화면을 비 웁니다

; 두 번째 명령을 도입 할 수 있도록 첫 번째 명령을 종료합니다.

python 파이썬을 사용하여 스크립트를 실행합니다 ( ruby 예를 들어 ).

%현재 파일 이름을 연결하여 python명령에 매개 변수로 전달합니다.


28

내 .vimrc 파일에 다음이 있습니다.

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

Python 스크립트 편집이 끝나면 키를 누릅니다 <F5>. 스크립트가 저장되고 빈 화면에서 실행됩니다.


감사합니다! 꽤 잘 작동합니다. 단축키를 키 대신 m키 더하기 ,키로 설정하는 방법이 궁금합니다 F5.
Jay Wong

이게 어떻게 파일을 먼저 저장하는지 모르겠어요?
Thomas Browne

죄송합니다. ": w"를 추가하는 것을 잊었습니다. 수정하고 <Esc>도 추가했습니다.
czayas

2
이것은 Insert모드 에서 실행된다는 점에 유의해야 합니다. 의 실행 Normal모드를 사용 nmap하는 대신 imap.
Marcin

17

새 Vim 창으로 리디렉션되는 Python 출력을 선호합니다 (그리고 해당 창이 열려있는 경우 다음에이 함수로 Python 코드를 실행할 때 내용을 업데이트합니다).

" 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

이걸 바로 입력해야하나요 .vimrc? 그렇지 않다면 어떻게이 스크립트를 vim에 제공해야합니까? (Noob here)
Benjamin Chausse

1
@BenjaminChausse 응답이 지연되어 죄송합니다. 나는 그 코드를 독점적으로 포함하는 .vimrc로 테스트를했고 내가 말할 수있는 것으로 작동했다. 내 테스트는 .py 파일을 열고 F5를 누르는 것으로 제한되어 파이썬 출력이 별도의 vim 창에 나타납니다. "이 스크립트를 vim에 어떻게 제공해야합니까?" OS에 따라 다릅니다. 저는 Windows를 사용하고 있으므로 해당 코드가 포함 된 C : \ Program Files (x86) \ Vim \ .vimrc 텍스트 파일이 있습니다 (Windows에서 "_vimrc"로 이름 지정 가능). 리눅스 나 맥에서 당신은 당신의 가정에서의 .vimrc 텍스트 파일을했을 폴더 즉, ~ / .vimrc 파일
FocusedWolf

4
이로 인해 많은 작업이 소요되었을 수 있다는 점에 감사하지만, 답변에 페이팔 링크를 넣는 것은 적절하지 않습니다.
Martijn Pieters

11

이전 답변을 바탕으로 출력을 보면서 코드를보고 싶다면 :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>

사용 vert 두 번째 줄에있는 것은 수직 분할 대신 수평의 코드를 실행합니다.

부정적인 점은 코드가 실행 된 분할 창을 닫지 않으면 여러 번 실행 한 후 많은 분할이 발생한다는 것입니다 (동일한 출력 창이 재사용되는 원래 Python IDLE에서는 발생하지 않음).

(내가이 선을 유지합니다 /home/user/.vimrc)


5

를 사용하여 마지막으로 사용한 명령 @:을 반복 할 수 있으므로이 두 문자 만 반복하면됩니다.

또는 w !python(예 "a를 들어) 레지스터 중 하나에 문자열 을 저장 한 다음 :<C-R>a<CR>을 눌러 레지스터의 내용을 삽입 할 수 있습니다.a :) 명령 줄 하고 실행할 수 있습니다.

또는 내가하는 일을하고 현재 파일을 실행하도록 매핑 <leader>z:!python %<CR>수 있습니다.


3

:exec python file.py매번 인쇄되는 " " 을 보지 않으려면 다음을 사용하십시오.

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

내 전력선 / vim-airline 상태 표시 줄도 엉망으로 만들지 않았습니다.


3

플러그인 : jupyter-vim

당신은 선 (보낼 수 있도록 <leader>E), 시각적 선택 ( <leader>e실행중인에) jupyter-client(의 교체 ipython)

여기에 이미지 설명 입력

나는 편집기와 인터프리터를 분리하는 것을 선호합니다 (각각의 쉘에서). 잘못된 입력 읽기 명령을 보낸다고 상상해보십시오 ...


2

일반적인 사용을 위해 (를 기반으로 vim에서 python / haskell / ruby ​​/ C ++ ... 실행 filetype) vim-quickrun 이라는 멋진 플러그인이 있습니다. 기본적으로 많은 프로그래밍 언어를 지원합니다. 또한 쉽게 구성 할 수 있으므로 필요한 경우 모든 파일 유형에 대해 선호하는 동작을 정의 할 수 있습니다. github 저장소에는 멋진 readme가 없지만 doc 파일로 잘 문서화되어 있습니다.


2

받아 들인 대답은 나에게 적합하지만 (Linux에서)이 명령이 실행되기 전에 버퍼를 저장하기를 원했기 때문에 약간 수정했습니다.

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

:w <bar>다음 버퍼를 저장 그것의 코드를 실행합니다.


1

간단한 방법은 :일반 모드에서 입력 한 다음 키보드의 위쪽 화살표 키를 누르고 Enter 키를 누르는 것입니다. 그러면 VIM에서 마지막으로 입력 한 명령이 반복됩니다.


위쪽 화살표를 누르기 전에 명령의 시작 문자를 입력하여 증분 검색을 수행 할 수 있습니다. 전에 많은 명령을 내렸다면! 파이썬 %, 할 수 있습니다 :! 그런 다음 위쪽 화살표를 눌러!로 시작하는 명령 만 순환합니다.
shmup

1

:w명령 을 빠르게 뒤로 건너 뛰 려면 입력 :w한 다음 위쪽 화살표를 누르는 것이 좋습니다. 로 시작하는 명령 만 순환합니다 w.


1

내 .vimrc에 다음이 있습니다.

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

현재 버퍼를 저장하고 Esc + F9 만 입력하여 코드를 실행합니다.



1

augroup 명령으로 1 개의 키 바인딩으로 모든 언어에 대해 확장 할 수 있습니다. 예를 들면 다음과 같습니다.

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

shebang 라인을 사용하면 Python뿐만 아니라 모든 언어로 사용할 수 있습니다.

shebang 추가 :

다음을 스크립트의 첫 번째 줄에 추가하십시오.

#!/usr/bin/env python3

또는 Python 2를 사용하는 경우

#!/usr/bin/env python2

Vim 키맵 :

이것을 당신의 ~/.vimrc:

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

파일을 실행 가능하게 만듭니다.

Vim 입력 :

:!chmod +x %

또는 터미널에서 :

chmod +x script_name.py

설명:

일반 모드에서 F7을 누르면 Vim은 현재 파일을 bash 스크립트로 실행하려고합니다. 그러면 bash 인터프리터는 shebang 줄을보고이 파일이 Python (또는 필요한 경우 다른 프로그램)에 전달되어야 함을 이해합니다.

또한 이름을 사용하여 터미널에서 스크립트를 실행할 수 있습니다.

./script_name.py

이 방법 대신 (그것도 작동합니다) :

python3 script_name.py

0

이 .vimrc 매핑에는 Conque Shell 이 필요 하지만 Geany (및 다른 X 편집기의) 동작을 복제합니다.

  • 실행하려면 키를 누르세요.
  • 그놈 터미널에서 실행
  • 종료 확인을 기다립니다.
  • 종료시 창이 자동으로 닫힙니다.

    :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

코드 어딘가에 커서를 놓습니다. 마우스 오른쪽 버튼을 클릭하고 "선택"항목 중 하나를 선택하여 코드를 강조 표시하십시오. 그런 다음 Ctrl 키를 누르면 새 프롬프트 '<,>'가 표시됩니다.

이제! python을 입력하고 작동하는지 확인하십시오.

나는 단지 같은 문제를 알아 내려고 며칠을 보낸다 !!! 코딩을 사용했습니다.

s='My name'
print (s) 

머리카락을 모두 뽑은 후 드디어 맞았습니다!


5
vim 방식이 아닌 마우스 사용
0xc0de 2015-08-17

1
그러나 할 수 있습니다 :% !python. %모든 라인을 의미합니다.
T.Chmelevskij

0

에 명령 매핑을 넣는 대신 파일 (Windows )에 .vimrc매핑을 넣습니다 . 이 파일이나 디렉토리가 없으면 만드십시오. 이 방법은 Python 스크립트에서만이 명령을 실행하기 때문에를 사용 하여 파일 또는 파일 을 열 때만 키가 매핑됩니다 .~/.vim/ftplugin/python.vim$HOME\vimfiles\ftplugin\python.vim.pyfiletype=python

실제 매핑의 경우 스크립트가 실행되는 동안 Vim에서 편집 할 수 있기를 원합니다. @cazyas의 대답에서 벗어나면 내 ftplugin\python.vim(Windows)에 다음이 있습니다.

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

그러면 백그라운드에서 현재 Python 스크립트가 실행됩니다. Linux의 경우 다음과 같이 변경하십시오.

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.