2011-01-04 21 views
2

私はいくつかの特別なウィンドウ管理を行う必要があるvimプラグインを作成しています。VIMバッファ/ウィンドウ非表示

起動時に、現在のウィンドウが2つに分割され、新しく作成されたウィンドウがユーザー入力とプラグイン出力に使用されます。これをI/Oウィンドウと呼ぶことにしましょう。

場合によっては、I/Oウィンドウを「置き換える」必要があります。つまり、新しいコンテンツセットがI/Oウィンドウを含む画面の部分を置き換えます。これを一時的なウィンドウと呼んでください。ただし、I/Oウィンドウはどこかに保存されたままです。ユーザーがこの一時的なウィンドウを終了すると(qまたは:q!で)、I/Oウィンドウの内容が元の場所に再び表示されます。

どうすればこのようなことをやりますか?私は物事を試していたし、バッファーとウィンドウについてのヘルプページでしばらくの間読んでいるが、私はまだそれを把握していないようだ。私は動作するはずだと思う何

は次のとおりです。

  1. :起動時に画面を分割して新しいです。
  2. :I/Oウィンドウでbufhidden = hideを設定します。
  3. :enewは、一時的なウィンドウを表示します。

これは、ユーザーが一時ウィンドウから:qを実行するまで機能します。分割されたままの画面の代わりに、上部が完全に消えます。この時点から終了しようとすると、保存されていないデータに関するエラーが発生します。

ありがとうございます。

+0

'set bufhidden = hide'を' setlocal bufhidden = hide'に置き換えてください。それは物事を修正するものではありませんが、これはユーザーオプションに触れないためにプラグインによってオプションを変更する必要がある方法です。 – ZyX

答えて

1

保存されていないデータについてエラーを表示しないようにするには(変更フラグを設定しないでください)、setlocal buftype=nowriteを使用してください。 vimの葉やバッファが閉じているとき、実際に何かを保存するには、call s:SaveIO()はこのIOを保存し、コマンドに置き換える必要があり

new 
setlocal buftype=nowrite " or even buftype=nofile, if it is possible 
let s:iobufnr=bufnr('%') 
augroup FooSaveIO 
    autocmd! 
    execute "autocmd BufUnload <buffer=".s:iobufnr."> call s:SaveIO()" 
augroup END 

を試してみてください。ウィンドウを削除せずにバッファを終了するには:bufkillプラグインとその:BDコマンドを試してください。別の方法は、一時的なウィンドウのBufWipeoutイベントをキャプチャし、ここにIOバッファを置く第3のウィンドウを開くことです(一時的なバッファと関連するウィンドウが閉じられるとIOウィンドウがその場所に表示されるようになります)。

+0

buftype = nofileオプションは素晴らしいです。ありがとうございました。しかし、私はまだ、別のプラグインを使用せずにIOウィンドウを何とか「隠し」にすることが可能であると考えています。それは本当に不可能ですか? – VimUser

+0

@VimUser。他のプラグインを直接使用したくない場合は、そのプラグインからコードをコピーしてください。そして、この提案はIOバッファを隠すことではなく、ウィンドウを閉じずにバッファを閉じることでした。少なくともいくつかの他のタブでは、ウィンドウが常に表示されなければならないので、*ウィンドウ*(バッファではない)を隠すことはできません。 – ZyX

+0

右、私は "バッファ"を意味しました。とにかくBufUnloadは、新しいウィンドウをもう一度開いて内容を復元するために使うことができるので、私が望むことをやっているようです。ありがとう! – VimUser