[python] Vim에서 Python 코드 실행

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

:w !python

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



답변

어떻게 추가에 대한 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>먼저 파일을 저장 한 다음 파이썬으로 파일을 실행합니다. 두 번째는 동일한 작업을 수행하지만 삽입 모드를 먼저 둡니다.


답변

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

! clear; python %

여기에 이미지 설명 입력

단계별 설명 :

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

clear 터미널 화면을 비 웁니다

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

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

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


답변

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

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

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


답변

새 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


답변

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


답변

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

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

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


답변

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

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

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