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


16

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

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

回答:



10

Vimはemacsやkateなどの組み込みシェルをサポートしておらず、サポートすることはありません(もしそうなら)、このstackoverflowの質問を参照してください。

David Spilletは正しい、あなたはgnu画面内でvimを実行できます:

$ screen vim foo.txt

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

とにかく、編集しているファイルが表示されないという事実に耐えることができるなら、出力を見て、ジャック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>

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

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


この自動コマンドは、au BufEnterと同じ行に最初の行(\ ifを含む)を置くまでは機能しませんでしたが、\を削除しました
Jason

Vimはネイティブシェルをサポートしていない可能性がありますが、私はちょうどこの興味深いシェルプラグイン言及したかった:vim.org/scripts/script.php?script_id=2771
氏ミッケル

:map ;e :w<cr>:!python %<cr>コマンドが実行されたことを「確認」(?)するために、vimバッファーに内容をエコーし​​たい。単純にコマンドをサイレントに実行するにはどうすればよいですか?:map <silent> ...動作していないようです。
ジョニーユタ

5

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

 :!%

これが機能する:!./%ためには、スクリプトが現在のディレクトリで見つかるように修正する必要がありました。
ポールウィンツ

そして、私は専門家ではありませんが!、bimコマンドに続くものはすべて実行するようにvimに指示しているようです!echo "Hello"%現在のファイルの名前であるように拡張されます。
ポールウィンツ

2

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

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

これは;e、現在のファイルを書き出すためにマップし、pythonを使用して実行します(pythonがにあると想定しますPATH)。


2

Bexec vimのプラグインは、正確に何をしたいん。キーボードショートカットが含まれています。




0

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

:! 大丈夫ですが、結果を確認するには端末に切り替える必要があります。

ctrl-zvim を使用してそれを実行できますが、fgそれでもコンテキストを頻繁に切り替える必要があります。

このスニペットの動作方法は、最初に基づいて実行可能ファイルを推測し、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

-1

vimについては直接知りませんが、screenユーティリティを使用してこの方法で画面を分割できます。ctrl+ aS(資本Sであるノートは、)ディスプレイを分割し、あなたが持つ2つの間で切り替えることができますctrl+ atab(ウィンドウが空の場合、使用ctrl+はan他の開いているウィンドウに移動するか、ctrl+ ac新しいものを作成します) 。

表示を2つ以上に分割し、ctrl-a、:resizeで分割のサイズを変更することもできます。私はこの方法でスクリーンを頻繁に使用しますが、単一キーのソリューションではありませんが、非常に便利です。


Vimで機能していると確信していますか?vimで応答しないようです(slpitコマンドを使用してファイル間で分割します)。
アダムマタン

これらはvimではなくGNU画面のコマンドです。
innaM 2009

うん。画面内でvimを実行することについて話しています。
デイヴィッドスピレット2009

vimスプリットは、vimウィンドウ(またはそれが実行されている端末)の領域内で発生するものです。
ハッセン09
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.