git ls-filesでシンボリックリンクが存在する場合に一覧に含んでしまってpost processで死ぬ問題
git ls-files でファイル一覧を取得したあとにpost-processでファイル名に色を付けようとすると、シンボリックリンクが含まれていた場合に下に余計な出力が付いて死ぬ
rg --files --hidden --no-messages だと含まないので起きない
具体的には $ git ls-files --exclude-standard | gxargs -d "\n" exa -1 --color=always を実行して
code:shell
$ git ls-files --exclude-standard | gxargs -d "\n" exa -1 --color=always
...
src/util/object.ts
tsconfig.json
rplugin/node/fzf-preview.vim:
autoload
bin
...
の rplugin/node/fzf-preview.vim: 以下
FzfPreviewGitFiles の出力自体に余計なものが含まれるのと、deviconをファイル名に付与しようとした場合に配列のインデックス数がずれてそもそもコマンドの実行に失敗する。
回避方法は簡単には2つある、前者が4600ファイルで(getfttype()の実行のみで)0.1秒、後者が67000ファイルでexaを使った色づけまで含めて6秒くらい
Vim script側で getftype() でシンボリックリンクを弾く
test -L でシンボリックリンクを弾く
$ time find . -type f | while read line;do if [[ ! -L $line ]];then echo $line; fi; done | gxargs -d "\n" exa --color=always
これ以上良い方法が思いつかないのと、 git ls-files でそもそも数万行返ってくることはないと思いたいので、ユーザにコマンド色々やってどうにかして貰うか、post-processでの色づけを諦めて貰う方向でいこうと思う
雑にやるなら g:fzf_preview_git_files_command を git ls-files --exclude-standard | while read line;do if [[ ! -L $line ]];then echo $line; fi; done にするとか