These are chat archives for zplug/zplug

24th
Feb 2016
Masaki ISHIYAMA
@b4b4r07
Feb 24 2016 00:53
zplug.txt は asciidoc で書いて https://github.com/b4b4r07/zplug2/blob/master/src/dev_tools/make_manpage.sh で man ページにしています。
b4b4r07/zplug#110 の件についてありがとうございます。たしかに以前は問題なかった気がするのですが…
diff --git a/zplug b/zplug
index 7f112e8..01775ca 100644
--- a/zplug
+++ b/zplug
@@ -609,7 +609,10 @@ __zplug::update()

             if [[ -n $zspec[do] ]]; then
                 if [[ $ret -eq 0 ]]; then
+                    (
+                    builtin cd -q "$zspec[dir]"
                     eval "$zspec[do]"
+                    )
                 fi
             fi
このようなパッチ(for v1)で解決できそうですが、違いましたか?
Naoki Mizuno
@NigoroJr
Feb 24 2016 02:01

make_manpage.sh

あ、すみません。Makefileばかり見ていて、完全にdev_toolsディレクトリのこと忘れてました…。了解しました、ありがとうございます。

このようなパッチ(for v1)

説明不足でした。ローカルで〜というのは、v2の方でして、v1のほうはそれで大丈夫だと思います。

v2の方では

diff --git a/autoload/commands/__load__ b/autoload/commands/__load__
index 782c974..2a54c34 100644
--- a/autoload/commands/__load__
+++ b/autoload/commands/__load__
@@ -291,7 +291,7 @@ do
     if [[ -n $zspec[hook_load] ]]; then
         hook_load+=(
             "$zspec[name]"
-            "$zspec[hook_load]"
+            "$zspec[hook_load]"$'\n'"$zspec[dir]"
         )
     fi
 done
@@ -386,8 +386,11 @@ for k in "${(k)hook_load[@]}"
 do
     # execute the hook_load command if the package successfully loads
     if (( ! $failed_packages[(I)$k] )); then
-        eval "$hook_load[$k]"
-        hook_load_cmds+=("$hook_load[$k]")
+        local -a cmd_dir=( ${(@f)hook_load[$k]} )
+        local cmd="$cmd_dir[1]"
+        local dir="$cmd_dir[2]"
+        ( builtin cd -q "$dir" && eval "$cmd" )
+        hook_load_cmds+=("$cmd")
     fi
 done

こんな感じのことをしています。(変数は見やすさのためにifブロック内で初期化してます)

Masaki ISHIYAMA
@b4b4r07
Feb 24 2016 02:05
あ、理解しました。なるほどなるほど、厄介ですね。たしかにスマートな解決ではなさそうですね
とりあえず v1 のほうはこれで修正して closing します。
Naoki Mizuno
@NigoroJr
Feb 24 2016 02:07

とりあえず v1 のほうはこれで修正して closing します。

OKです :+1:

Naoki Mizuno
@NigoroJr
Feb 24 2016 02:12

スマートな解決ではなさそう

やはり一番ベタな方法は、 hook_load_dir のようなハッシュをもう一つ作るということでしょうか。しかしoh-my-zsh等のディレクトリが特殊になるパッケージの場合、どうするかという点が残りますね。今まではどうでしたっけ?

Masaki ISHIYAMA
@b4b4r07
Feb 24 2016 02:43
少し考えていたのですが v1 での do に関するバグは v2 では hook-build にある、と思うのですが、hook-load とはまた別ではないですか?
hook-load は少しややこしい hook なんですよね。ロードに成功したときにのみ実行、かつキャッシュにも入れたい、となるとこのような実装を取らざるを得ませんでした。もうひとつハッシュを設けるか、hook_load ハッシュのキーにある name をうまく dir と絡められないか、考えています
Naoki Mizuno
@NigoroJr
Feb 24 2016 03:31

言われてみれば確かにそうですね。hook-buildはなんでうまくいったんだろう…。

hook_load ハッシュのキーにある name をうまく dir と絡められないか

failed_packages をキー: パッケージ名、値: dirのハッシュにするとかはどうでしょう?

Masaki ISHIYAMA
@b4b4r07
Feb 24 2016 03:38
その提案、いいかもしれません!
Naoki Mizuno
@NigoroJr
Feb 24 2016 16:06

と、言ってみたものの、 failed_packages もzspec[dir]がなくなった後に作られてました(‥)

ふと思ったのですが、 zplugs にパッケージの情報を全て詰め込むのではなく、 zplugs_dir, zplugs_at のようなタグごとのglobalなハッシュを作り、必要になった場合 $zplugs_dir['foo/bar'] というようにアクセスするのはどうでしょう?こうしておけば、

  1. デフォルトを使う場合、空文字列でいいため、 -EMP- が必要なくなる。
  2. 毎回 __parser__ を呼ぶ必要がなくなる。
  3. どこからでもzplugs情報にアクセスできる。

一方でデメリットは、

  1. タグごとにglobalなハッシュが必要になる。
  2. タグ名を変数にしたい場合、少しややこしくなる。

ということでしょうか。

function() {
    local -A zplugs_dir
    local -A zplugs_at
    zplugs_dir=( 'foo/bar' '~/baz' )
    zplugs_at=( 'foo/bar' '' 'baz/bar' 'qux' )

    local tag=at
    for k in ${(kP)$( echo zplugs_$tag )}; do
        print "$k => ${${(P)$( echo zplugs_$tag )}[$k]}"
    done
}
# 出力:
# foo/bar =>
# baz/bar => qux
もう少しうまいやり方があるかもしれませんが、基本的なコンセプトはこんな感じです。