回答:
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番目は同じことを行いますが、最初に挿入モードを終了します
autocmd FileType python nnoremap <buffer> ....
nnoremap <buffer> <F9> :!python %<cr>
Vim 7.4.1689で動作するようです。shellescapeの目的は何ですか?
を押して入力するだけで、通常モードに移行できます<esc>
。
! clear; python %
ステップバイステップの説明:
!
端末コマンドを実行できます
clear
端末画面を空にします
;
最初のコマンドを終了し、2番目のコマンドを導入できるようにします
python
Pythonを使用してスクリプトを実行します(ruby
たとえば、次のものに置き換えることができます )
%
現在のファイル名を連結し、パラメータとしてpython
コマンドに渡します
私の.vimrcファイルにこれがあります:
imap <F5> <Esc>:w<CR>:!clear;python %<CR>
Pythonスクリプトの編集が終わったら、を押すだけ<F5>
です。スクリプトが保存され、空白の画面で実行されます。
m
key plus ,
key に設定するにはどうすればよいF5
ですか?
Insert
モードで実行されることに注意してください。Normal
モードで実行するnmap
には、の代わりに使用しますimap
。
私は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)
以前の回答に基づいて、コードの出力を見ながらコードを確認したい場合は、: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
2行目で使用すると、水平ではなく垂直分割でコードが実行されます。
否定的な点は、コードが実行された分割ウィンドウを閉じないと、複数の実行後に多くの分割が発生することです(同じ出力ウィンドウが再利用される元のPython IDLEでは起こりません)。
(私はこれらの行を内側に保ちます/home/user/.vimrc
)
プラグイン:jupyter-vim
したがって<leader>E
、行()、視覚的選択(<leader>e
)を実行中に送信できますjupyter-client
(の置換ipython
)
私はエディターとインタープリター(それぞれがシェルにある)を分離することを好みます。不正な入力読み取りコマンドを送信したとします...
一般的な使用(に基づいてvimからpython / haskell / ruby / C ++ ...を実行するfiletype
)には、vim-quickrunと呼ばれる素晴らしいプラグインがあります。デフォルトで多くのプログラミング言語をサポートしています。これも簡単に設定できるため、必要に応じて任意のファイルタイプの優先動作を定義できます。githubリポジトリには特別なreadmeはありませんが、docファイルで十分に文書化されています。
簡単な方法は:
、通常モードで入力してから、キーボードの上矢印キーを押してEnterキーを押すことです。これにより、VIMで最後に入力したコマンドが繰り返されます。
skywind3000 / asyncrun.vimも使用できます。これは、@ FocusedWolfがリストしたものに似ています。
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
シバン行の使用を検討してください。そうすれば、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
この.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; \" "')
カーソルをコードのどこかに置きます。右クリックして「選択」の選択肢の1つを選択し、コードを強調表示します。次にCtrlを押します:新しいプロンプト '<、>'が表示されます
!pythonと入力して、機能するかどうかを確認します。
私は同じ問題を理解するために何日も費やしています!!! 私はコーディングを使用しました:
s='My name'
print (s)
髪全体を抜いた後、ようやくうまくいきました!
:% !python
。%
すべての行を意味します。
コマンドマッピングをに配置する代わりに.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>
" 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>