3

+ruby を使用して最近のバージョンの Vim をコンパイルすると、Vim 内で :ruby コマンドを使用できます。

非同期の Ruby コードを実行すると、内部で何が起こっているのですか?

例えば:

:ruby <<EOS
print 'hello'
Thread.new do
  sleep 1
  print 'world'
end
EOS
# hello

:ruby print 'foo'
# world
# foo

これにより、予想どおり、すぐに「hello」が出力されます。ただし、別の :ruby コマンドを実行するまで「world」は表示されません。Vim は 1 つのスレッドのみをサポートし、次の :ruby コマンドで実行するために新しいスレッドをある種のキューにプッシュしますか?

でこれについて Vim のソースを調べてみましsrc/if_ruby.cたが、私の Ruby C-Extension の読み取りスキルは最高ではありません。

数秒ごとにポーリングして Vim ウィンドウを更新する Ruby を書きたいので、質問しています。

4

1 に答える 1

3

Vim自体はシングルスレッドです。ただし、いくつかの例外または回避策があります。

  1. Pythonスレッドは機能していますが、何らかの理由でARMでは機能していません。vim.*非メインスレッドからメソッドを実行するとどうなるかは予測できますが、言えません。一部のプラグインで使用されているのを見ましたがvim.*、スレッドでは使用されていません。
  2. Pythonマルチプロセッシングモジュールは完全に機能しています(ただし、すべてのvimシグナルハンドラーを無効にする必要があります)。私は個人的にこのソリューションをaurumプラグインで使用しています。ルビーと同等のものは機能すると思いますが、AFAIRはfork()、単純なバイトパイプを唯一の通信として使用する呼び出しであり、( multiprocessing.PipePythonオブジェクトの限られたセットを渡すパイプ)multiprocessing.Queue(オブジェクトキューを実装するパイプのラッパー)、multiprocessing.Value(オブジェクトインターフェイスで固定サイズの値を格納する共有メモリ)またはmultiprocessing.Lock(それが何であるかはわかりませんが、名前は目的についてそれ自体を示しています)。少なくとも標準ライブラリやコアにはありません。

AFAIKいくつかの古いルビーバージョンはグリーンスレッドを使用していたため、(OSの観点から)シングルスレッドでしたが、新しいルビーは現在POSIXスレッドを使用しています。あなたは更新を試みることができます、多分これはうまくいくでしょう。テストとして他のものを選択する方が良いですが(別のスレッドでいくつかの変数を変更するなど)、vimを呼び出すものではありません。ユーザーシステムで見つけることができる現在のPythonバージョンはすべてPOSIXスレッドを使用しています。これが、Pythonスレッドが機能するのにrubyスレッドが機能しない理由の根本である可能性があります。

于 2012-12-22T19:26:47.547 に答える