Vimを使用してPythonコードを記述しています。コードを実行するたびに、Vim内に次のように入力します。
:w !python
これはイライラするので、Vim内でPythonコードを実行するより速い方法を探していました。おそらくPythonスクリプトを端末から実行していますか? Linuxを使用しています。
autocmd
を追加して、FileType python
の場合、マッピングを作成する方法は次のとおりです。
nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>
<F9>
を押してpython
で現在のバッファを実行できます
私はこれを私の.vimrcファイルに持っています:
imap <F5> <Esc>:w<CR>:!clear;python %<CR>
Pythonスクリプトの編集が完了したら、<F5>
を押すだけです。スクリプトが保存され、空白の画面で実行されます。
私は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 寄付を送ってください:)
前の回答に基づいて、コードの出力を見ながらコードを見たい場合は、: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
内に保持します)
@:
を使用して最後に使用したコマンドを繰り返すことができるので、繰り返す必要があるのはこれら2つの文字だけです。
または、文字列w !python
をレジスタの1つ(たとえば"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ステータスバーを台無しにしませんでした。
:w
コマンドをすばやくジャンプして戻したい場合は、:w
と入力してから上矢印を押すと便利です。 w
で始まるコマンドのみを循環します。
私はこれを私の.vimrcに持っています:
"map <F9> :w<CR>:!python %<CR>"
現在のバッファを保存し、Esc + F9のみを指定してコードを実行します
skywind3000/asyncrun.vim も使用できます。 @FocusedWolfがリストしたものに似ています。
簡単な方法は、通常モードで:
と入力し、キーボードの上矢印キーを押してEnterキーを押すことです。これにより、VIMで最後に入力したコマンドが繰り返されます。
一般的な用途(filetype
に基づいてvimからpython/haskell/Ruby/C++ ...を実行)には、 vim-quickrun という素敵なプラグインがあります。デフォルトで多くのプログラミング言語をサポートしています。また、簡単に設定できるため、必要に応じて任意のファイルタイプの優先動作を定義できます。 githubリポジトリには派手なreadmeはありませんが、docファイルで十分に文書化されています。
.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>
受け入れられた答えは私のために機能します(Linux上)が、実行する前にこのコマンドでバッファも保存したかったので、少し変更しました:
nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>
:w <bar>
はバッファーを保存し、そのコードを実行します。
この.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; \" "')