Open6

vimからrake aするとディレクトリが削除される現象

yharayhara
  • Shiikaの開発時は、rake aというコマンドでexamples/a.skをビルドして実行するのを繰り返す
  • 実行のためにtmuxウィンドウを切り替えるのは面倒→quickrunでできないか?
  • quickrunからrake aを実行するようにしたら大変快適になった

しかし…

  • 時々、quickrunでrakeを起動したあと、ファイルが削除される現象が発生

例 (Dが削除されたファイル)

Changes to be committed:
  (no files)
Changes not staged for commit:
D lib/shiika_core/src/names/class_name.rs
D lib/shiika_core/src/names/const_name.rs
D lib/shiika_core/src/names/method_name.rs
D lib/shiika_core/src/names/module_name.rs
D lib/shiika_core/src/names/namespace.rs
yharayhara

再現した環境

OS:

macOS 10.15.7

vim:

VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jul 04 2021 13:54:08)
macOS 版 - x86_64
適用済パッチ: 1-3100
Compiled by Homebrew

vim-quickrun:

commit 4f2f5628098efba5db2ae152dc3ac0d9b310659a (HEAD -> master, origin/master, origin/HEAD)
Author: thinca <thinca@gmail.com>
Date:   Sun Nov 7 21:15:11 2021 +0900

    Improve runner/terminal

    Reuse the last window.
yharayhara

他プラグインが干渉している?

  • xolox/vim-session, 907th/vim-auto-saveあたりが干渉しているかもしれないのでオフにして試してみた
  • 最初は再現していたが、最終的にもとの.vimrcでも再現しなくなった
    • →セッション状態に依存?

再現するセッションを保存

  • .vimsessionsに保存されたセッションで試してみる(vim -S foo.vim)
    • "lib/shiika_core/src/names" はディレクトリです
    • おや…?
    • edit lib/shiika_core/src/namesという行がある
    • そういえばnetrwでこのディレクトリを開いていた
    • netrwでディレクトリを開いていることが必要条件?
      • 最初はvim-sessionを有効にしていたので、当該ディレクトリを開いていたはず
      • vim-sessionを無効にしたときから、当該ディレクトリを開かないので発生しなくなっていたのかも

新規セッションで実験

  • netrwでlib/shiika_core/src/namesを開いてからquickrun
    • 再現せず
  • :tabnでタブを作り、netrwでlib/shiika_core/src/namesを開いてからもとのタブに戻ってquickrun
    • 再現した
yharayhara

ということは

  1. vim起動
  2. tabe lib/shiika_core/src/namesでnetrw起動
  3. もとのタブに戻り、適当な.rsを開いてquickrun実行

で再現するか?
うーん、しないこともあるな、、

yharayhara

いちおう、rakeタスクをp :helloだけにしても再現することを確認した。

yharayhara

ああーわかったかも

  1. lib/shiika_core/src/names.rsを開く
  2. quickrunする
  3. lib/shiika_core/src/namesが削除される

こういうことか。いろんなディレクトリで発生してたのは、fooとfoo.rsが同時に存在するパターンが(Rustの規約により)いろんなとこにあったからか。

hook/sweep/filesを空にすることで解決したっぽい。

  let g:quickrun_config['rust'] = {
        \ 'exec': 'RUST_BACKTRACE=1 rake a',
        \ 'hook/sweep/files': [],
        \}