VimでPythonコードを実行する


102

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

:w !python

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

回答:


144

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}(ここ:Pythonファイルを開いた場合)
  • [i]map<F9>挿入/通常モードでのキーボードショートカットを作成します
  • <buffer>:複数のバッファ/ファイルが開いている場合:アクティブなものを使用する
  • <esc>:挿入モードを終了
  • :w<CR>:ファイルを保存します
  • !:シェルで次のコマンドを実行します(試行:!ls
  • %:アクティブなバッファのファイル名に置き換えられます。しかし、それは空白や他の「悪い」もののようなものを含むことができるので、を書くの:python %ではなく、以下を使用することをお勧めします:
  • shellescape:特殊文字をエスケープします。1バックスラッシュ付きの手段

TL; DR:最初の行は通常モードで機能し、一度押す<F9>と最初にファイルが保存され、次にpythonでファイルが実行されます。2番目は同じことを行いますが、最初に挿入モードを終了します


6
答えを広げて、その行をどこに追加すればよいか説明してください。Vim構成ファイルの中にあるのでしょうか?私は新人です。
multigoodverse 2013

5
あなたのvimrcファイルで@ArditSulce、行を追加しますautocmd FileType python nnoremap <buffer> ....
ケント

2
あなたがos xを使っているなら(そして私はunixだと思います) ".vimrc"はホームディレクトリにあります。これを確認するには、コマンドモードで「:version」と入力して、「user vimrc file: "..."」という行が表示されることを確認します
ThinkBonobo

同じファイルを実行するだけでなく、保存して実行する方法はありますか
Bharat

5
nnoremap <buffer> <F9> :!python %<cr>Vim 7.4.1689で動作するようです。shellescapeの目的は何ですか?
Matt Kleinsmith 2017

31

を押して入力するだけで、通常モードに移行できます<esc>

! clear; python %

ここに画像の説明を入力してください

ステップバイステップの説明:

! 端末コマンドを実行できます

clear 端末画面を空にします

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

pythonPythonを使用してスクリプトを実行します(rubyたとえば、次のものに置き換えることができます )

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


27

私の.vimrcファイルにこれがあります:

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

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


ありがとうございました!それはかなりうまくいきます。ショートカットをkeyではなくmkey plus ,key に設定するにはどうすればよいF5ですか?
ジェイウォン

最初にファイルを保存する方法がわかりませんか?
Thomas Browne

「:w」を追加するのを忘れました。修正し、<Esc>も追加しました。
czayas 2017年

1
これはInsertモードで実行されることに注意してください。Normalモードで実行するnmapには、の代わりに使用しますimap
Marcin

16

私は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

これを私の中に入れるべき.vimrcですか?そうでない場合、どうすればこのスクリプトをvimに渡すことができますか?(Noob here)
Benjamin Chausse

1
@BenjaminChausse返信が遅れて申し訳ありません。私はそのコードのみを含む.vimrcを使用してテストを行い、それは私が言えることから機能しました。私のテストは、.pyファイルを開いてF5を押すことに限定されていました。その結果、Python出力が別のvimウィンドウに表示されました。「このスクリプトをvimに渡すにはどうすればよいですか?」それはあなたのOSに依存します。私はWindowsを使用しているので、そのコードを含むC:\ Program Files(x86)\ Vim \ .vimrcテキストファイルがあります(Windowsでは "_vimrc"と名付けることもできます)。LinuxまたはMacでは、ホームフォルダーに.vimrcテキストファイルがあります。つまり、〜/ .vimrc
FocusedWolf

2
これにより作成するのに多くの作業が必要になったと思われますが、ペイパルリンクを回答に含めることは実際には適切ではありません。
Martijn Pieters

10

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

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

否定的な点は、コードが実行された分割ウィンドウを閉じないと、複数の実行後に多くの分割が発生することです(同じ出力ウィンドウが再利用される元のPython IDLEでは起こりません)。

(私はこれらの行を内側に保ちます/home/user/.vimrc


5

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

または、文字列w !pythonを("aたとえば)レジスターの1つに保存し、ヒット:<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>

私のpowerline / 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>THENバッファを保存し、その中にコードを実行します。


1

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


上矢印を押す前にコマンドの開始文字を入力することにより、インクリメンタル検索を行うことができます。多くのコマンドが前にあった場合、私は!python%、私は:!次に、上矢印を押すと、!で始まるコマンドのみが循環します。
shmup 2014年

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

シバン行の使用を検討してください。そうすれば、Pythonだけでなく、どのような言語でもそれを使用できます。

シバンの追加:

これをスクリプトの最初の行に追加します。

#!/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インタープリターはシバン行を見て、このファイルをPython(または必要に応じて他のプログラム)に渡す必要があることを理解します。

また、その名前を使用してターミナルからスクリプトを実行することもできます。

./script_name.py

この方法の代わりに(これも機能します):

python3 script_name.py

0

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

カーソルをコードのどこかに置きます。右クリックして「選択」の選択肢の1つを選択し、コードを強調表示します。次にCtrlを押します:新しいプロンプト '<、>'が表示されます

!pythonと入力して、機能するかどうかを確認します。

私は同じ問題を理解するために何日も費やしています!!! 私はコーディングを使用しました:

s='My name'
print (s) 

髪全体を抜いた後、ようやくうまくいきました!


5
vimの方法ではないマウスの使用
0xc0de

1
しかし、それは可能です:% !python%すべての行を意味します。
T.Chmelevskij 2016年

0

コマンドマッピングをに配置する代わりに.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
" 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.