f

2014-07-26

Cannot exit zsh zaw filter: search mode

zshのプラグインzawをantigenによりインストールしてzshを起動すると,以下のようにfilter:の絞り込み検索の状態で起動する。C-gで解除しても即座にfilter:の状態に戻るためzshで操作できない。

filter:

zshでの作業が完全に止まるため, 致命的なバグだといわざるを得ない。原因を調べるとこの現象は以下の3条件が重なると発生するようだ。

  1. lsの aliasに-Fオプションをつけている。
    alias ls="ls -F"
  2. antigen でパッケージ管理をしている。
    source antigen.zsh
  3. zawパッケー ジを読み込んでいる。
    asource zaw.zsh

原因が発生する最小構成の.zshenvを以下に掲載した。コメント文で書いている方法で,事前に~/.zshにantigen.gitをインストールしておく。zawはzshの起動時に自動的にインストールされる。以下の.zshenvファイルを~/に配置してzshを起動するとfilter: の状態となり,抜け出すことができない。

##~/.zshenv
#mkdir ~/.zsh/
#cd ~/.zsh
#git clone https://github.com/zsh-users/antigen.git
alias ls="ls -F"
if [ -f ~/.zsh/antigen/antigen.zsh ]; then
  ADOTDIR=$HOME/.zsh/
  source ~/.zsh/antigen/antigen.zsh
  antigen-bundle zsh-users/zaw
  antigen-apply
fi

この問題の解決策として以下の3種類が考えられる。

  1. lsの aliasから-Fオプションを外す。
  2. antigenによるパッケージ管理をやめ,preztoに乗り換える。
  3. zawの利用をやめる。

現実的な対処法としては,1.のlsのaliasから-Fオプ ションを外すことだろう。これが一番変更が少なくて済む。

複数パッケージの競合による問題のため,どちらに知らせればよいかわからない。よろしければどなたかこの問題を開発者に伝えていただければ幸いである。

以下にリポジトリへのリンクを記載しておく。

また,zawの読み込みはauto-fuより前にかかないと動作しない模様。

2014-07-27追記

.zshenvに,上記で記載したalias ls="ls -F"を指定していたのが原因だった。.zshrcにaliasを移せば動作した。

2 件のコメント:

  1. こんにちは。これは、どちらかというとantigenの方の問題ですね。

    とりあえず利用者側の対策としては、

    1. antigenの設定を .zshenv ではなく .zshrc に移動させる
    2. さらに .zshrc の中でも alias ls="ls -F" の前にantigenの設定を書く

    で使えるようになると思います。

    特に1.については、今回のエラーにかかわらずやっておいたほうが良いです。
    zshenv は zsh のシェルスクリプトを呼び出したときにも読み込まれるので、
    ここで alias や antigen といった設定を書いておくと意図していない alias などによって
    zsh のシェルスクリプトが異常な動作になる可能性があります。
    alias など対話的なシェルでのみ使う設定は、特に理由がなければ .zshrc に書いておくほうが良いです。

    返信削除
  2. Hideaki Miyakeさん。ご指摘ありがとうございます。
    antigenの問題でしたか。
    antigenはNeoBundleと似ていて簡単に管理できるので気にっているのですが,悩ましいですね...。

    私自身はantigenの設定は.zshrcに書いています。
    今回はユーザーごとの.zshenvの干渉を避け,最小の構成でコードを用意するため.zshenvに設定を記載しました。

    ただ,aliasやPATH類の設定は.zshenvに書いていたのでこれはまずかったですね。勉強になりました。
    aliasの設定は.zshrcに移します。念のためzshrcに移して確認しました。
    zshrcにzawの読み込み前にlsのaliasを記載するとzsh起動直後にはfilter: が発動。ただし,C-gで解除するとうまくいきました。
    読み込み後にaliasを設定するのはOKでした。

    単に私が.zshenvにaliasを記載していたのが原因でした。
    お騒がせしました。コメントありがとうございました。

    返信削除