web-dev-qa-db-ja.com

VimでPythonコードを実行する

Vimを使用してPythonコードを記述しています。コードを実行するたびに、Vim内に次のように入力します。

:w !python

これはイライラするので、Vim内でPythonコードを実行するより速い方法を探していました。おそらくPythonスクリプトを端末から実行していますか? Linuxを使用しています。

81
multigoodverse

autocmdを追加して、FileType pythonの場合、マッピングを作成する方法は次のとおりです。

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

<F9>を押してpythonで現在のバッファを実行できます

114
Kent

私はこれを私の.vimrcファイルに持っています:

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

Pythonスクリプトの編集が完了したら、<F5>を押すだけです。スクリプトが保存され、空白の画面で実行されます。

22
czayas

<esc>を押して通常モードに移動し、次を入力します。

! clear; python %

enter image description here

ステップごとの説明:

!を使用すると、端末コマンドを実行できます

clearは端末画面を空にします

;は最初のコマンドを終了し、2番目のコマンドを導入できます

pythonはpythonを使用してスクリプトを実行します(たとえば、Rubyに置き換えることができます)

%は、現在のファイル名を連結し、pythonコマンドにパラメーターとして渡します

15
Flavio Wuensche

私はPython出力を新しいVimウィンドウにリダイレクトすることを好みます(そのウィンドウが開いたままの場合は、次回この関数で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

これには多大な労力が必要でしたので、寛大に感じている場合は Paypal 寄付を送ってください:)

14
FocusedWolf

前の回答に基づいて、コードの出力を見ながらコードを見たい場合は、: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>

2行目にvertを使用すると、コードが水平ではなく垂直に分割されて実行されます。

マイナス面は、コードを実行した分割ウィンドウを閉じないと、複数の実行後に多くの分割が発生することです(同じ出力ウィンドウがある元のpython IDLEでは発生しません)再利用)。

(これらの行は/home/user/.vimrc内に保持します)

6
monday

@:を使用して最後に使用したコマンドを繰り返すことができるので、繰り返す必要があるのはこれら2つの文字だけです。

または、文字列w !pythonをレジスタの1つ(たとえば"aなど)に保存し、:<C-R>a<CR>を押してレジスタaの内容をコマンドラインに挿入して実行することもできます。それ。

または、私がしていることを行い、<leader>z:!python %<CR>にマッピングして、現在のファイルを実行することができます。

5
TankorSmash

毎回 ":exec python file.py"を表示したくない場合は、これを使用してください:

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

それは私の電力線/ vim-airlineステータスバーを台無しにしませんでした。

2
Jabba

:wコマンドをすばやくジャンプして戻したい場合は、:wと入力してから上矢印を押すと便利です。 wで始まるコマンドのみを循環します。

1
jared

私はこれを私の.vimrcに持っています:

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

現在のバッファを保存し、Esc + F9のみを指定してコードを実行します

1
derwin

skywind3000/asyncrun.vim も使用できます。 @FocusedWolfがリストしたものに似ています。

1
Mahdi

簡単な方法は、通常モードで:と入力し、キーボードの上矢印キーを押してEnterキーを押すことです。これにより、VIMで最後に入力したコマンドが繰り返されます。

1
multigoodverse

一般的な用途(filetypeに基づいてvimからpython/haskell/Ruby/C++ ...を実行)には、 vim-quickrun という素敵なプラグインがあります。デフォルトで多くのプログラミング言語をサポートしています。また、簡単に設定できるため、必要に応じて任意のファイルタイプの優先動作を定義できます。 githubリポジトリには派手なreadmeはありませんが、docファイルで十分に文書化されています。

1
Yosh

.vimrcにコマンドマッピングを配置する代わりに、~/.vim/ftplugin/python.vimファイル(Windows $HOME\vimfiles\ftplugin\python.vim)にマッピングを配置します。このファイルまたはディレクトリがない場合は、作成してください。この方法は、Pythonスクリプトでのみこのコマンドを実行するため、.pyファイルまたはfiletype=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
jpyams

受け入れられた答えは私のために機能します(Linux上)が、実行する前にこのコマンドでバッファも保存したかったので、少し変更しました:

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

:w <bar>はバッファーを保存し、そのコードを実行します。

0
Alijah O'Connor

この.vimrcマッピングには Conque Shell が必要ですが、Geany(および他のXエディター)の動作を複製します。

  • キーを押して実行します
  • Gnome-terminalで実行します
  • 終了の確認を待ちます
  • ウィンドウは終了時に自動的に閉じます

    :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
user2587717