110

Vi(m)で編集しているファイルを実行し、分割ウィンドウ(SciTEのように)で出力を取得するにはどうすればよいですか?

もちろん、私はそれを次のように実行することができます:

:!scriptname

しかし、スクリプト名と、画面の下部ではなく分割ウィンドウで出力を取得する方法を記述しないようにすることは可能ですか?

4

13 に答える 13

112

コマンドがありmakeます。オプションで設定されたコマンドを実行しmakeprgます。%現在のファイル名のプレースホルダーとして使用します。たとえば、Pythonスクリプトを編集している場合:

:set makeprg=python\ %

はい、あなたはスペースを脱出する必要があります。この後、簡単に実行できます。

:make

必要に応じて、オプションを設定すると、 :autowriteを実行する前に自動的に保存されます。makeprg

:set autowrite

これにより、実行部分が解決されます。ファイルへのリダイレクトを伴わない分割ウィンドウにその出力を取得する方法がわかりません。

于 2009-06-04T22:20:12.480 に答える
29

現在のバッファのファイル名にアクセスするには、%. それを変数に入れるには、expand()関数を使用できます。新しいバッファで新しいウィンドウを開くには、:newまたはを使用します:vnew。コマンドからの出力を現在のバッファにパイプするには、 を使用します:.!。すべてを一緒に入れて:

:let f=expand("%")|vnew|execute '.!ruby "' . f . '"'

明らかにruby、必要なコマンドに置き換えます。executeファイル名を引用符で囲むことができるように使用したので、ファイル名にスペースが含まれていても機能します。

于 2009-06-04T22:48:57.413 に答える
23

Vim には!、VIM ウィンドウから直接シェル コマンドを実行する ("bang") コマンドがあります。さらに、パイプに接続された一連のコマンドを起動し、stdout を読み取ることができます。

例えば:

! node %

コマンドプロンプトウィンドウを開いてコマンドを起動するのと同じです:

cd my_current_directory 
node my_current_file

詳しくは「Vim のヒント: 外部コマンドの操作」を参照してください。

于 2012-07-15T19:57:14.697 に答える
11

私のvimrcにそのためのショートカットがあります:

nmap <F6> :w<CR>:silent !chmod 755 %<CR>:silent !./% > .tmp.xyz<CR>
     \ :tabnew<CR>:r .tmp.xyz<CR>:silent !rm .tmp.xyz<CR>:redraw!<CR>

これにより、現在のバッファが書き込まれ、現在のファイルが実行可能になり (unix のみ)、実行され (unix のみ)、出力が .tmp.xyz にリダイレクトされます。その後、新しいタブが作成され、ファイルが読み取られてから削除されます。

それを分解する:

:w<CR>                             write current buffer
:silent !chmod 755 %<CR>           make file executable
:silent !./% > .tmp.xyz<CR>        execute file, redirect output
:tabnew<CR>                        new tab
:r .tmp.xyz<CR>                    read file in new tab
:silent !rm .tmp.xyz<CR>           remove file
:redraw!<CR>                       in terminal mode, vim get scrambled
                                   this fixes it
于 2012-11-30T15:10:45.830 に答える
4

私が使用したシェルスクリプトの場合

:set makeprg=%

:make
于 2010-10-19T18:29:42.930 に答える
1

I use a slightly more intrusive mechanism through maps:

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

Just makes it so I don't have to save, then go. Just go.

于 2009-06-16T21:23:33.627 に答える
1

vim のプラグインbexecを使用できます。私の知る限り、最新バージョンは 0.5 です。

それで:

$ mkdir -p ~/.vim/plugin
$ mv bexec-0.5.vba ~/.vim/plugin
$ vim ~/.vim/plugin/bexec-0.5.vba

.vba ファイルの編集中に vim 自体の内部で次のことを行います。

:so %

bexec.vimやドキュメントなどが作成されたことを知らせる出力が表示されます。

これで、vim で (#! インタープリターが正常に動作する言語スクリプトであれば何でも) を開いてテストすることができます。

:Bexec 

注:分割を水平ではなく垂直にしたかったので、次のようにしました。

$ grep -i -n split ~/.vim/plugin/bexec.vim | grep -i hor
102:    let bexec_splitdir = "hor" " hor|ver
261:        exec {"ver":"vsp", "hor":"sp"}[g:bexec_splitdir]

の値を「hor」から「ver」に変更しました。

私はそれが古い質問であることを知っていますが、これが誰かを助けることができることを願っています. パラジ教授が Emacs を使用し、私は Emacs が好きではない Coursera のスタートアップ エンジニアリング コースを受講している間、私は同じ問題を抱えています。

于 2013-07-06T23:09:39.543 に答える
0

@xorpaul

私はかなり長い間、このスクリプト (python/Windows) を探していました。Windowsには「ティー」がないため、次のように変更しました。

function! Setup_ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent ! python % > d:\\temp\\output_".n ." 2>&1"
  execute "vsplit d:\\temp\\output_".n
  execute "redraw!"
  set autoread
endfunction

function! ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent ! python % > d:\\temp\\output_".n . " 2>&1"
endfunction

:nmap <F9> :call Setup_ExecNDisplay()<CR>
:nmap <F2> :call ExecNDisplay()<CR>
于 2014-10-10T10:51:09.920 に答える
0

@SethKriticos と @Cyril の回答に基づいて、次を使用します。

function! Setup_ExecNDisplay()
  execute "w"
  execute "silent !chmod +x %:p"
  let n=expand('%:t')
  execute "silent !%:p 2>&1 | tee ~/.vim/output_".n
  " I prefer vsplit
  "execute "split ~/.vim/output_".n
  execute "vsplit ~/.vim/output_".n
  execute "redraw!"
  set autoread
endfunction

function! ExecNDisplay()
  execute "w"
  let n=expand('%:t')
  execute "silent !%:p 2>&1 | tee ~/.vim/output_".n
  " I use set autoread
  "execute "1 . 'wincmd e'"
endfunction

:nmap <F9> :call Setup_ExecNDisplay()<CR>
:nmap <F2> :call ExecNDisplay()<CR>

F9 を使用して新しいウィンドウをセットアップし、F2 を使用してスクリプトを実行し、出力ファイルにティーします。

また、複数のスクリプトで同時に使用できるように、スクリプト名を出力ファイル名に追加しました。

于 2014-03-05T16:01:33.047 に答える
0

以下に示すように、コロンと感嘆符を使用するだけです

:!< スクリプト名>

于 2020-04-16T04:41:03.000 に答える