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

readdir() が欲しい #1128

Open
mattn opened this Issue Dec 13, 2017 · 10 comments

Comments

Projects
None yet
5 participants
@mattn
Member

mattn commented Dec 13, 2017

Vim script の glob は suffixes や wildignore の影響を受けたりいろいろと制限があり、Vim script でアプリケーションを作りたい人にとっては使い辛い物になってしまっています。アプリケーションを作りたい人が本当に欲しいのは readdir() だと思いました。

https://github.com/mattn/vim/commits/add-readdir

引数にパスを貰い、ファイルもしくはディレクトリの名前の一覧を List で返します。省略可能な第二引数で

let dirs = readdir(dir, {x->isdirectory(x)})

こんな感じの事も出来ます。あと

#167

この issue にある通り、ファイル数が多い場合には中断したくなるはずなので、第二引数が -1 を返した場合は中断としました。

如何でしょうか。

  • 実装
  • テスト
  • ドキュメント
@thinca

This comment has been minimized.

Show comment
Hide comment
@thinca

thinca Dec 13, 2017

Member

かっこよす 🎉

let dirs = readdir(dir, {x->isdirectory(x)})

この例ですが、x は単純なディレクトリ内のアイテムの名前だと思うので、そのまま isdirectory() に渡すとカレントディレクトリの影響を受けてまずそうな予感がしますね。

let dirs = readdir(dir, {x->isdirectory(dir . '/' . x)})

こういう感じになりそう。(ちょっとだけめんどい)

Member

thinca commented Dec 13, 2017

かっこよす 🎉

let dirs = readdir(dir, {x->isdirectory(x)})

この例ですが、x は単純なディレクトリ内のアイテムの名前だと思うので、そのまま isdirectory() に渡すとカレントディレクトリの影響を受けてまずそうな予感がしますね。

let dirs = readdir(dir, {x->isdirectory(dir . '/' . x)})

こういう感じになりそう。(ちょっとだけめんどい)

@tyru

This comment has been minimized.

Show comment
Hide comment
@tyru

tyru Dec 13, 2017

Member

現状どういう動きか確認できてないのですが、結果はソートされてた方がいいんじゃないでしょうか?
(例:Go の io/ioutil.Readdir() はソートされてるみたいです)

Member

tyru commented Dec 13, 2017

現状どういう動きか確認できてないのですが、結果はソートされてた方がいいんじゃないでしょうか?
(例:Go の io/ioutil.Readdir() はソートされてるみたいです)

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Dec 13, 2017

Member

ソートする様にしました。

Member

mattn commented Dec 13, 2017

ソートする様にしました。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Dec 13, 2017

Member

テスト通ったら出しちゃおうかな!

※OSX 始まらないので出す

Member

mattn commented Dec 13, 2017

テスト通ったら出しちゃおうかな!

※OSX 始まらないので出す

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn
Member

mattn commented Dec 13, 2017

@tyru

This comment has been minimized.

Show comment
Hide comment
@tyru

tyru Dec 14, 2017

Member

mattn++
ちなみに Win32API に明るくないんですが、 *.* ってドット始まりのファイルも列挙されますでしょうか?

Member

tyru commented Dec 14, 2017

mattn++
ちなみに Win32API に明るくないんですが、 *.* ってドット始まりのファイルも列挙されますでしょうか?

@tyru

This comment has been minimized.

Show comment
Hide comment
@tyru

tyru Dec 14, 2017

Member

自分の期待としては全てのファイルが列挙されてほしいです。

Member

tyru commented Dec 14, 2017

自分の期待としては全てのファイルが列挙されてほしいです。

@Shougo

This comment has been minimized.

Show comment
Hide comment
@Shougo

Shougo Dec 14, 2017

Member

この関数を内部的に使えば delete('rf') のバグも直せると思うのですが、それはどうでしょうか。
現在の delete('rf') は内部的に glob() を使っていて、一部のファイルを削除できないなど問題が多いです。

Member

Shougo commented Dec 14, 2017

この関数を内部的に使えば delete('rf') のバグも直せると思うのですが、それはどうでしょうか。
現在の delete('rf') は内部的に glob() を使っていて、一部のファイルを削除できないなど問題が多いです。

@thinca

This comment has been minimized.

Show comment
Hide comment
@thinca

thinca Dec 21, 2017

Member

Bram さんから返事来てますね。

glob() と被るので、glob({expr}, {dict}) と言う新しい形式作って {dict} にオプション渡せるようにしようって言ってますね。ただ肝心の「glob() だとノイズが多くて使いづらい」というのが伝わっていない感じもします…。filter にしか注目してなさそう。
目的が達成できるなら glob() に統合でも良さそうですが、そうなると更にオプションが必要そうです。

Member

thinca commented Dec 21, 2017

Bram さんから返事来てますね。

glob() と被るので、glob({expr}, {dict}) と言う新しい形式作って {dict} にオプション渡せるようにしようって言ってますね。ただ肝心の「glob() だとノイズが多くて使いづらい」というのが伝わっていない感じもします…。filter にしか注目してなさそう。
目的が達成できるなら glob() に統合でも良さそうですが、そうなると更にオプションが必要そうです。

@thinca

This comment has been minimized.

Show comment
Hide comment
@thinca

thinca Dec 21, 2017

Member

本筋と関係ないけど、ラムダ式書く時は -> の前後にスペースを入れるのが Bram さんの公式見解っぽい (スペースがないと C のコードに見えるとのこと)。

Member

thinca commented Dec 21, 2017

本筋と関係ないけど、ラムダ式書く時は -> の前後にスペースを入れるのが Bram さんの公式見解っぽい (スペースがないと C のコードに見えるとのこと)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment