Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] Let users write :packadd volt in his/her vimrc #118

Closed
tyru opened this issue Dec 19, 2017 · 17 comments
Closed

[RFC] Let users write :packadd volt in his/her vimrc #118

tyru opened this issue Dec 19, 2017 · 17 comments

Comments

@tyru
Copy link
Member

tyru commented Dec 19, 2017

TL;DR

Volt の仕様変更で vimrc に :packadd volt と書いてもらうようにしたいです。

理由

これまで Volt はわざわざ vimrc に何も書かなくても使えるように ~/volt/repos/<repos> から ~/.vim/pack/opt/<repos> にファイルをコピーしてました。
しかしこの方法だと当然 Volt でインストールするたびにファイルコピーが走って少し待たされることになります。
特に Dropbox で ~/.vim をまるごと共有してたり、アンチウイルスソフト等がファイル監視してる環境だと遅くなります。

そこでせめてユーザに :packadd volt を vimrc に書いてもらうことにしました。
:packadd volt によりプラグインのパス ($VOLTPATH/repos/<repos>) が rtp に追加され、プラグインの設定 (plugconf) も読み込まれるようになります。

@tyru tyru changed the title Let users write :packadd volt in his/her vimrc [RFC] Let users write :packadd volt in his/her vimrc Dec 19, 2017
@tyru
Copy link
Member Author

tyru commented Dec 19, 2017

@Warashi @thinca ユーザの立場としてこの変更はどう思うのか、意見をお聞きしたいです。

@tyru
Copy link
Member Author

tyru commented Dec 19, 2017

ちなみに以前の挙動 (インストール等の度にいちいちファイルをコピーする) も設定ファイル ($VOLTPATH/config.json) で選択できるようにする予定です。

@Warashi
Copy link
Contributor

Warashi commented Dec 20, 2017

profile機能を使うユーザ向けにはマジックコメント同様に自動で追加してあげればいいんじゃないですかね

ところで、packadd voltを書くと$VOLTPATH/repos/<repos>がrtpに追加されるってのはvolt側で追加するってことですよね?
.vim/pack/volt/start/system/plugin/bundled_plugconf.vim でその処理をやるってのはだめなんでしょうか

@Warashi
Copy link
Contributor

Warashi commented Dec 20, 2017

bundled_plugconf.vimと書きましたが、もちろん同ディレクトリの別ファイルでいいです

@tyru
Copy link
Member Author

tyru commented Dec 20, 2017

.vim/pack/volt/start/system/plugin/bundled_plugconf.vim で rtp に追加したとしてもプラグインが読み込まれないんです。
具体的には以下のような順番みたいです(もしかしたら 2 と 3 逆かもしれませんが、要するに
bundled_plugconf.vim でやっても手遅れ)。

  1. vimrc の読み込み
  2. プラグインの読み込み
  3. ~/.vim/pack/*/start/* の読み込み

@tyru
Copy link
Member Author

tyru commented Dec 20, 2017

profile機能を使うユーザ向けにはマジックコメント同様に自動で追加してあげればいいんじゃないですかね

上述のタイミングの問題があるので、「profile 機能を使うユーザは書かなくてもいい、けど profile 機能を使わないユーザは書かないとダメ」みたいになるので一貫性がないかなーと

@tyru
Copy link
Member Author

tyru commented Dec 20, 2017

@rhysd さんに Twitter で「シンボリックリンク張っちゃダメなんでしょうか?」と言われたので、考えた際のメモを載せておきます。


volt build は現在以下の 1 の方法でプラグインを読み込んでいるが、何もわざわざコピーしなくてもいい。
いくつか方法が考えられるが、以下の 4 をデフォルトの動作としたい。
しかし Vim script のトランスパイルを考えた際にトランスパイルした Vim script を読み込むためにコピーした方が嬉しいこともある。
よって今の挙動も後々設定ファイルで選択できるようにする。

  1. $VOLTPATH/repos/<repos> から ~/.vim/pack/volt/opt/<repos> にコピーする
  • volt build:遅い
  • Vim の起動:速い
  1. ~/.vim/pack/volt/opt/<repos> に symlink を作る
  • volt build:速い
  • Vim の起動:速い
  • 欠点
    • bare リポジトリをサポートできない
    • Windows などサポートできない環境がある
  1. $VOLTPATH/repos/<repos> を rtp に加えて直接 :source する
  • volt build:速い
  • Vim の起動:遅い
  • 欠点
    • bare リポジトリをサポートできない
    • Vim script でわざわざプラグインのファイルを一つずつ :source してるので遅い (はず)
  1. vimrc で :packadd volt と書いてもらう
  • volt build:速い
  • Vim の起動:速い
  • ~/.vim/pack/volt/start/_volt_started/plugin/started.vim の行う処理
    • let g:volt_source_repos = 1
  • ~/.vim/pack/volt/opt/volt/plugin/startup.vim の行う処理
    • g:volt_source_repos が zero なら以下を行う
      • set rtp+=$VOLTPATH/repos/<repos>
      • autocmd VimEnter * call s:config_xxx()
    • g:volt_source_repos が non-zero なら以下を行う
      • set rtp+=$VOLTPATH/repos/<repos>
      • :so $VOLTPATH/repos/<repos>/plugin/**/*.vim
      • 警告を出す ([WARN] Please write "packadd volt" in your vimrc. [WARN] Load plugins directly... (very slow))
      • autocmd VimEnter * call s:config_xxx()

@Warashi
Copy link
Contributor

Warashi commented Dec 20, 2017

「profile 機能を使うユーザは書かなくてもいい、けど profile 機能を使わないユーザは書かないとダメ」みたいになりますが、volt profile newした後にpackadd voltを書き忘れる事故が発生しそうなので自動で書いといて欲しいと思いますね。

@tyru
Copy link
Member Author

tyru commented Dec 20, 2017

ふーむ確かにそれもそうですね…

{マジックコメント}
packadd volt
{元の }

のような内容で ~/.vim/vimrc をインストールした方が良さそうですね。
すでに :packadd volt$VOLTPATH/rc/<profile>/vimrc.vim に書かれてた場合も考慮して、2回 :packadd volt が vimrc に書かれていても何もしないようにします。

@tyru
Copy link
Member Author

tyru commented Dec 20, 2017

↑のメモを少しだけ更新しました。

volt build は現在以下の 1 の方法でプラグインを読み込んでいるが、何もわざわざコピーしなくてもいい。
いくつか方法が考えられるが、以下の 4 をデフォルトの動作としたい。
しかし Vim script のトランスパイルを考えた際にトランスパイルした Vim script を読み込むためにコピーした方が嬉しいこともある。
よって今の挙動も後々設定ファイルで選択できるようにする。

@tyru
Copy link
Member Author

tyru commented Dec 20, 2017

ref #93

@Warashi
Copy link
Contributor

Warashi commented Dec 20, 2017

~/.vim/pack/volt/opt/<repos> に symlink を作るとbareリポジトリをサポートできないとのことですが、ディレクトリ階層はvoltで作ってやって、各ファイルのsymlinkをつくるようにしてやればできる気がします。
あと、windowsでもmklinkとかいうsymlinkを作るコマンドがあった気がしますが、それは使えないんですかね?

@tyru
Copy link
Member Author

tyru commented Dec 21, 2017

bare リポジトリにはプラグインのファイルはないので、どこかにワークツリーを復元してそこへの symlink を作るという意味でしょうか?
ちなみにもう bare リポジトリをサポートする必要がほぼ無いと思うので、サポートを辞めてもいいかな、とは思っています。

確かに Windows でも mklink を使ったり Win32API を直接呼び出すという手もありそうです。

@Warashi
Copy link
Contributor

Warashi commented Dec 21, 2017

bare リポジトリの意味をあんまりわからずにコメントしてました。コピーする元があるならそこへのsimlink作れば良いかな、と。よく考えてみるとワークツリーを復元する必要がありそうで面倒ですね。
サポート切ってしまってよいなら切るのも一つの手段だと思います。

@tyru
Copy link
Member Author

tyru commented Dec 31, 2017

#157~/.vim/pack/volt/opt に symlink 貼る実装をしてみて分かったことが2つあります…

  • なぜか Windows で os.Symlink() を使えないと思い込んでましたが、普通に Windows でも使えました
  • ~/.vim/pack/volt/opt/ 以下に symlink を貼っても Vim の package は runtimepath に追加してくれない (無視される)

@tyru
Copy link
Member Author

tyru commented Dec 31, 2017

良いニュースがあります!

~/.vim/pack/volt/opt/ 以下に symlink を貼っても Vim の package は runtimepath に追加してくれない (無視される)

~/.vim/pack/volt/start/ じゃないから自動的に読み込まれないだけでした!!!(アホ)

@tyru
Copy link
Member Author

tyru commented Jan 1, 2018

すみません、本件は #157 でデフォルトでシンボリックリンクを貼るようにしてとりあえずは速度改善したことと、なるべくならユーザに必要な設定を書かせたくないという理由から、閉じることにします。

ちなみに

  • Windows ではジャンクション、それ以外ではシンボリックリンクを使います。
  • bare リポジトリの場合はシンボリックリンクを作成するのではなく以前通りコピーします。
  • $VOLTPATH/config.toml に以下のように書くと以前のシンボリックリンクを貼らない挙動に戻ります。
[build]
strategy = "copy"

@tyru tyru closed this as completed Jan 1, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants