pockestrap

Programmer's memo

vim-quickrunのテンポラリファイルを、編集しているファイルと同じディレクトリに置く

vim-quickrun

quickrun とは、vimプラグインである。 vimで編集しているファイルをそのまま実行できるものであり、大変便利である。

問題点

保存されていないファイルで quickrun を実行すると、一旦テンポラリファイルに書きだされてから実行される。
その時のテンポラリファイルのパスは、tempname()で生成されるパスであり、これは/tmp/下に作られるようだ。

通常これでも問題はないのだが、例えば require_relativeを使用しているRubyプログラムなどでは問題となる。 require_relativeは、プログラムファイルからの相対パスで別のRubyファイルを読み込むメソッドである。 つまり、元のプログラムとは違う位置でテンポラリファイルが生成されて実行されてしまっては、require_relativeがファイルを見つけることは出来なくなってしまう。

改善策

quickrun のドキュメントを読んでいると、このような記述があった。

vim-quickrun/doc/quickrun.jax at 3532c2b71f4ed84bac5e4755027245b929092b04 · thinca/vim-quickrun · GitHub

==============================================================================
オプション                 *quickrun-options*
コマンドラインで指定するオプションのリストです。省略したオプションは
|g:quickrun_config| で設定しているものが使用されます。(*) が付いているものにつ
いては |quickrun-syntax-option| を参照してください。

......

tempfile (*)                *quickrun-option-tempfile*
    プログラムを実行する際、現在のバッファ全体を実行する以外の場合は、ソー
    スファイルを一時ファイルに書き出して実行します。その際の一時ファイル名
    を指定します。
    一時ファイルは実行する度に削除されます。
    デフォルトは "%{tempname()}" です。

つまり、tempfile オプションを弄ればいいことになる。 そのため、vimrcに以下のように変更を加えた。

(vim) change quickrun tmpfile path · ef70391 · pocke/dotfiles · GitHub

  let g:quickrun_config = {
    .....
\     '_': {
\       'tempfile': '%{expand("%:p:h") . "/" . system("echo -n $(uuidgen)")}'
\     }
    .....
\   }

現在編集中のファイルのディレクトリとuuidをくっつけて、編集中のファイルと同じディレクトリにテンポラリファイルを生成している。

echo -nで出力しているのは、改行コードが後ろに付いているとうまく動かないからである。

vimscriptに関しては全くの初心者なので、もう少しよい方法があるように思える。