web-dev-qa-db-ja.com

vim / mvim / gvim内でスクリプトを直接実行する

TextMateには、現在のコンテキスト内からスクリプトを実行して、別のウィンドウに出力を表示できるニース機能があります。これにより、外出先でコードを記述してテストできます。 MacVim/gVIMに同様の機能があることはほぼ確実ですが、それが何であるかはわかりません。現在、バッファーをディスクに保存してから、コマンドラインに移動し、その点でスクリプトを実行しています。 vimでそのワークフローを改善するにはどうすればよいですか?

38
randombits

これはvimで!コマンドを使用して実行できます。たとえば、現在のファイル内の単語の数を数えるには、次のようにします。

:! wc %

%は現在のファイル名に置き換えられます。スクリプトを実行するには、ファイルのインタープリターを呼び出すことができます-たとえば、Perlスクリプトを作成している場合:

:! Perl %
69
jts

vimチュートリアル: Vimでのキーのマッピング

上記のjtsで提案されているように、Perlが現在のスクリプトを実行するようにキーをマップできます。

map <C-p> :w<CR>:!Perl %<CR>

ctrl + Pをマップしてファイルを書き込み、Perlで実行します

imap <C-p> <Esc>:w<CR>:!Perl %<CR>

挿入モードで同じものを呼び出すことができます。

Vim/homeフォルダーに.vimrc(Windowsの場合は_vimrc)ファイルが必要です。 vimの動作に関する指示があります。

map <C-p> :w<CR>:!Perl %<CR>は、Ctrl + pを次のものにマッピングするための単なる命令です。

a)現在のファイルに書き込む:w

b)%(現在開いているファイル)をパラメーターとして使用してコマンド(Perl)を実行します:!Perl %

<CR>各コマンドの後に「キャリッジリターン」の略:特定のコマンドを実行するための命令。 imapはmapと同じですが、挿入モードではCtrl + pをリッスンします。

16
camelotus

Vimから直接実行できます。

:!./script.sh

6
Amardeep AC9MF

ファイルを保存し、インタープリターを使用してスクリプトを呼び出します

例えば。:

:!python %
6

!を探しているようです:

:!{cmd}シェルで{cmd}を実行します。

スクリプトに渡す必要がある場合は、%を使用して現在のファイル名を示すことができます。

!proofread-script %

範囲で!を使用して、コマンドをフィルターとして使用することもできます。

!{motion}{filter}    " from normal mode
:{range}!{filter}    " from command mode

(最初の場合、他の多くのコマンドと同様に、モーションを入力すると、コマンドモードに移行し、モーションを範囲に変換します(例::.,.+2!

そして最後に、ファイルから入力を実際に渡す必要はないが、ファイルに出力を必要とする場合、それは本質的に簡単なフィルターであり、それを行う最も速い方法は!!{cmd}です。これにより、現在の行がコマンドの出力に置き換えられます。

4
Cascabel

.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
3
Evan

ここでのすべての提案は、単に:!{cmd} %、現在のバッファをShell cmdに渡します。ただし、別のオプション:write !{cmd}たとえば、:write !shコマンドは、現在のバッファーの各行がシェルで実行されることです。
たとえば、バッファーに2、3行追加して、最初にバッファーを保存せずにすぐに実行結果を確認したい場合に便利です。
バッファのコンテンツ全体ではなく、ある範囲を実行することも可能です。
:[range]write !{cmd}

3
Vladimir Bauer

現在の実行可能スクリプトを実行するには、使用します

:!./%

!シェルコマンドを実行します。%は現在のファイル名で、。/は現在のディレクトリを前に追加します。

2
Maxim

まあ、それはあなたのOSに依存します-実際に私はM $ Window $でそれをテストしませんでした-しかし、Conqueは周りの最高のプラグインの一つです: http://code.google.com/p/conque/ =

実際には、それは改善できますが、機能します。 vim「ウィンドウ」にシェルウィンドウを埋め込むことができます。

0
Zsolt Botykai