web-dev-qa-db-ja.com

Vim:作業中のスクリプトを分割画面で実行します

私は小さなpythonスクリプトに取り組んでいます。このスクリプトは、デバッグしてさらに開発するために頻繁に実行する必要があります。

Vim画面を分割して、キーストロークで一部の部分でスクリプトを実行できますか?

16
Adam Matan

次の行を.vimrcに追加します。

command R !./%

そして、Vimで「:R」と入力するだけでスクリプトを実行できます( vim-run-current-file

9
caleb

Vimは、emacsやkateのような組み込みシェルをサポートしていません(それを意味する場合)。 このスタックオーバーフローの質問 を参照してください。

David Spilletが正解です。GNU画面内でvimを実行できます。

$ screen vim foo.txt

しかし、それはリモートでターミナルのウィンドウマネージャに似たものを提供するだけです-sshまたはXのないボックスで使用すると非常に便利ですが、ローカルで別のxtermを開いてそれらを切り替えることもできます。*

とにかく、編集中のファイルが生成する出力を見ているときにファイルが表示されないという事実に耐えられるのであれば、Jack Mのヒントは良いですが、もっと短くなる可能性があります。

:map ;e :w<cr>:!python %<cr>

同じ目的で、これを~/.vimrc

au BufEnter *
\if match( getline(1) , '^\#!') == 0 |
\ execute("let b:interpreter = getline(1)[2:]") |
\endif

fun! CallInterpreter()
    if exists("b:interpreter")
         exec ("!".b:interpreter." %")
    endif
endfun

map <F5> :call CallInterpreter()<CR>

これは、シバン(#!)最初の行。インタプリタを使用してファイルを実行するため、実行権限を持っている必要はありません。

*(画面には、出力からのコピーアンドペースト、非表示のウィンドウのアクティビティ/非アクティビティの監視、異なる端末からのセッションを同時に使用できる、すべてのプログラムを残してログアウトできるなど、他の非常に優れた機能がいくつかあります実行中-それは強力なツールです)。

10
0x89

最も冗長でない方法(スクリプトが実行可能である必要があります)は、おそらく次のとおりです。

 :!%
5
T.N.T.

Bexec vimプラグインは、まさにあなたが望んでいることをします。キーボードショートカットが含まれています。

2
jmetz

分割画面ではないかもしれませんが、これは私にとってはかなりうまく機能します:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>

これは;e現在のファイルを書き出し、pythonを使用して実行します(pythonがPATHにあることを前提としています)。

2
Jack M.

同様のStackOverflow質問 があります。

この小さなスニペット を.vimrcに入れて、現在のファイルを1回のキーストローク(F5など)で実行し、結果を新しい分割ペインバッファーに表示します。

:!は問題ありませんが、結果を確認するには端末に切り替える必要があります。

ctrl-zでそれを行い、fgでvimを戻すことはできますが、それでもコンテキストを何度も切り替える必要があることを意味します。

この スニペット が機能する方法は、最初にfiletypeに基づいて実行可能ファイルを推測し、次に現在のファイルを引数として実行することです。

次に 便利なユーティリティメソッド 出力を取得し、新しいバッファにダンプします。

完璧ではありませんが、一般的なワークフローでは非常に高速です。

以下にコピーしたスニペットを示します。

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" RUN CURRENT FILE """""""""""""""""""""""""""""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Execute current file
nnoremap <F5> :call ExecuteFile()<CR>

" Will attempt to execute the current file based on the `&filetype`
" You need to manually map the filetypes you use most commonly to the
" correct Shell command.
function! ExecuteFile()
  let filetype_to_command = {
  \   'javascript': 'node',
  \   'coffee': 'coffee',
  \   'python': 'python',
  \   'html': 'open',
  \   'sh': 'sh'
  \ }
  let cmd = get(filetype_to_command, &filetype, &filetype)
  call RunShellCommand(cmd." %s")
endfunction

" Enter any Shell command and have the output appear in a new buffer
" For example, to Word count the current file:
"
"   :Shell wc %s
"
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_Shell_commands_in_new_window
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>)
function! RunShellCommand(cmdline)
  echo a:cmdline
  let expanded_cmdline = a:cmdline
  for part in split(a:cmdline, ' ')
     if part[0] =~ '\v[%#<]'
        let expanded_part = fnameescape(expand(part))
        let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '')
     endif
  endfor
  botright new
  setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
  call setline(1, 'You entered:    ' . a:cmdline)
  call setline(2, 'Expanded Form:  ' .expanded_cmdline)
  call setline(3,substitute(getline(2),'.','=','g'))
  execute '$read !'. expanded_cmdline
  setlocal nomodifiable
  1
endfunction
0
Evan
map <F5> :w<CR>:exe ":!python " . getreg("%") . "" <CR> 

私が一緒に使用したものです(F5は現在のスクリプトを実行します)。

Vimを強力なpython IDEに変えるには、このチュートリアルをお勧めします:

0
Aymeric