0

別のバッファのクローンとして新しいバッファを作成するにはどうすればよいですか? つまり、内容は同じである必要がありますが、これらは最終的に 2 つの異なるバッファーである必要があります。これは将来のプラグインで必要になるため、マッピングの観点からではなく、プログラムによる方法に興味があります。

1 つのバッファーをヤンクしてから別のバッファーにフォーカスを移して貼り付けるなどの推奨事項は、ここでは機能しません。これは、ユーザーの以前のヤンクを上書きし、プラグイン メソッドの呼び出し後にユーザー エクスペリエンスを台無しにすることを意味するためです。私はそれをできるだけ卑劣にする方法を探しています。

さらに、おまけとして、この新しいバッファは非表示で作成する必要があります。これは、処理されたデータをすばやく保存してすぐに破棄するために使用されるためです。できるだけ早く閉じても(Vimが画面を再描画するため)迷惑な点滅が発生するため(/コンボなど) 、スプリットなしで行うことが望ましいです。また、複製したいバッファに名前があると仮定することもできません。:new:close

ありがとうございました。

結論


いくつかのテストでは、データを

:put=getbufline(...)

は最速の方法であり、ユーザー エクスペリエンスをまったく妨げないため、最も安全な方法です。

誰もこれについて答えませんでしたが、分割なしで新しい隠しバッファを作成する関数を見つけることができました。つまり、ウィンドウなしでバックグラウンドで静かに作成されます。詳細については、 を参照してください:h bufnr()。例:

let buffer_number = bufnr('My New Hidden Buffer', 1)

さらに、この呼び出しは暗黙的に次のことを行います。

let &l:buflisted = 0

この新しく作成されたバッファでは、 からも隠され:lsます。これはまさに上記の要件を満たすために必要なものです。

その結果、まばたきや:new/:closeコンボのようなユーザーへの視覚的な刺激はありません...いくつかの汚い仕事のための真に隠されたバッファです。

4

3 に答える 3

2

という関数がありますgetbufline()。見上げる:h getbufline()

これは、この clone コマンドに組み込まれた実際の動作です。

:new | put =getbufline('#',1,'$') | 1d_

これにより、現在のバッファーが新しい分割に複製されます。

ノート:

  • 垂直<Bar>チェーン Ex コマンド、この場合は 3 つ。
  • :new分割ウィンドウに新しいバッファーを作成し、そこにフォーカスを移動します。
  • :put =渡された式を評価し、リストの項目を行として挿入します。
  • getbufline()「代替ファイル」から最初1から最後まで行を読み取るために呼び出されます。'$''#'
  • :1d_によって副作用として生成された空の行 1 を取り除き:putます。

便宜上、ユーザー コマンドとしてパッケージ化されたコマンドをもう一度示します:Clone

:command! Clone new | put =getbufline('#',1,'$') | 1d_
于 2013-10-22T21:16:03.043 に答える