【要望】.editorconfig への対応

  1. こんにちは、お疲れ様です。普段からMeryを愛用しており、いつも大変お世話になっております。

    ご要望したいことがあるのですが、EditorConfig (.editorconfig) に対応していただけないでしょうか。

    【参照】https://qiita.com/naru0504/items/82f09881abaf3f4dc171

    まずファイルごとの設定の有効化は、根本的な変更が必要であるというコメントを拝見しまして、難しい希望であることは承知しております。もし可能であれば、将来的な機能として実装をご検討いただけますと幸いです。

    よろしくお願いいたします。

     |  100の人  |  返信
  2. こんばんは、Mery をご愛用いただきありがとうございます。

    EditorConfig は初めて聞きましたが、面白そうな仕組みですね。

    > まずファイルごとの設定の有効化は、根本的な変更が必要であるというコメントを拝見しまして、難しい希望であることは承知しております。

    そうですね。もともと、拡張子ごとや編集モードごとに設定を持つエディタは設定画面が煩雑で設定作業も面倒くさいので、設定を一本化したエディタがあればいいのに、というコンセプトで開発したエディタが Mery です。

    なのでファイルごとに異なる設定を持つという概念自体がありません ^^;

    でも、拡張子ごとに設定を持つというスタイルが多い国産のメジャーなテキストエディタよりは、そもそもそういった概念がない Mery のほうが EditorConfig は実装しやすいかもしれません。(拡張子ごとに設定を持つ仕組みが既にあると、EditorConfig との共存が難しそう)

    ちょっと気になったのが、Mery のようにプロジェクト管理機能のないエディタの場合、どこの .editorconfig を参照すれば良いのかという点です。

    Sublime Text で試してみたところ、開く対象のファイルと同じ階層にある .editorconfig を参照する。同じ階層に .editorconfig が存在しない場合は一つ上の階層をチェック…を繰り返してルートディレクトリまでチェックする、といった感じな気がするので、 このような仕様で良ければ Mery でも実装できるかもしれません。

    ともあれ、まだ本格的に使ったことがないので、EditorConfig の細かい仕様まではわかっていませんから、そもそも実装できないかもしれませんが、今後、EditorConfig を実装するときが来ましたらご協力いただけると幸いです。

     |  Kuro  |  返信
  3. いろいろとご検討いただきありがとうございます。

    EditorConfigにはプロジェクトの概念はないようです。ファイルの保存場所からルートディレクトリまで「.editorconfig」という名前のファイルを探していき、途中に

    root = true

    というルールを持つ「.editorconfig」ファイルが存在すれば、それより上の階層は無視されるという仕様になっていました。ただ自分が試した中で、Visual Studio 2019 のネイティブ実装は、プロジェクトファイルから1つ上の階層までで探索を止めてしまいました。

    https://editorconfig.org/#file-location
    > When opening a file, EditorConfig plugins look for a file named .editorconfig in the directory of the opened file and in every parent directory. A search for .editorconfig files will stop if the root filepath is reached or an EditorConfig file with root=true is found.
    > EditorConfig files are read top to bottom and the most recent rules found take precedence. Properties from matching EditorConfig sections are applied in the order they were read, so properties in closer files take precedence.

    試していただいている Sublime Text と同じような実装が、仕様通りということになるかと思います。

    > ともあれ、まだ本格的に使ったことがないので、EditorConfig の細かい仕様まではわかっていませんから、そもそも実装できないかもしれませんが、今後、EditorConfig を実装するときが来ましたらご協力いただけると幸いです。
    今後、もし実装可能で、実装をするという算段になりましたら、必要ならばぜひともご協力させていただきたいです。よろしくお願いいたします。

     |  100の人  |  返信
  4. ご返信ありがとうございます。

    > EditorConfigにはプロジェクトの概念はないようです。

    情報ありがとうございます。なるほど、root = true の効果が良くわかっていなかったのでこれでスッキリしました。

    > ただ自分が試した中で、Visual Studio 2019 のネイティブ実装は、プロジェクトファイルから1つ上の階層までで探索を止めてしまいました。

    上位の階層に .editorconfig が存在しない場合にルートディレクトリまでたどる仕組みはネットワーク上のファイルを開くときなどにあまり好ましくないと思いますので、1 つ上の階層までで探索を止めるという仕様も一理ありそうな気はしますね。

    > 今後、もし実装可能で、実装をするという算段になりましたら、必要ならばぜひともご協力させていただきたいです。よろしくお願いいたします。

    ありがとうございます。検証してみましたところ、Mery の仕様的には実装可能だと思います。

    ただ、テキストエディタというよりは IDE (開発ツールなど) 寄りの機能のように見えますので、標準機能で対応するかどうかという点は検討させてください。

    とりあえず .editorconfig で設定可能なオプションを Mery のプラグインから変更できるような仕組みを用意しておいて、Sublime Text みたいに誰かが拡張機能 (プラグインやマクロ) を作ってくれるのに期待するというのもアリかも…。

    EditorConfig の仕様を読んだ感じだと .editorconfig のファイル名の部分 ([*.md] みたいなやつ) のパーサーを開発するとなると私の技術力では数か月はかかりそうな気がしますからね ^^;

     |  Kuro  |  返信
  5. > ありがとうございます。検証してみましたところ、Mery の仕様的には実装可能だと思います。
    >
    > ただ、テキストエディタというよりは IDE (開発ツールなど) 寄りの機能のように見えますので、標準機能で対応するかどうかという点は検討させてください。

    承知しました。どうぞよろしくお願いいたします。

    > とりあえず .editorconfig で設定可能なオプションを Mery のプラグインから変更できるような仕組みを用意しておいて、Sublime Text みたいに誰かが拡張機能 (プラグインやマクロ) を作ってくれるのに期待するというのもアリかも…。

    検索してみるとマクロで実装できるんじゃないかみたいなツイートを見かけました。自分も時間ができて実装可能なようであれば試してみたいとは思っています。

    > EditorConfig の仕様を読んだ感じだと .editorconfig のファイル名の部分 ([*.md] みたいなやつ) のパーサーを開発するとなると私の技術力では数か月はかかりそうな気がしますからね ^^;

    この部分は漏れがあると怖いですし、難しそうですね……この手のたぶん汎用的なワイルドカード風?構文は各言語向けにライブラリが見つかりそうな気もしますが。

     |  100の人  |  返信
  6. ご返信ありがとうございます。

    > 検索してみるとマクロで実装できるんじゃないかみたいなツイートを見かけました。自分も時間ができて実装可能なようであれば試してみたいとは思っています。

    Mery 側の機能としては EditorConfig の indent_style (タブを空白にするかどうか) と indent_size (タブ幅) はマクロから変更できないので本体側のカスタマイズが必要ですが、その他のオプションはマクロから操作できます。

    本体側に indent_style と indent_size をマクロから操作できる仕組みを用意すれば、おそらくマクロでも EditorConfig を実装することは可能だと思います。

    > この部分は漏れがあると怖いですし、難しそうですね……この手のたぶん汎用的なワイルドカード風?構文は各言語向けにライブラリが見つかりそうな気もしますが。

    そうですね。マクロからですと JavaScript が使用できますので、ファイル名のワイルドカード風な部分の解析は JavaScript 向けの汎用ライブラリを使えば行けそうです。

    現状ですが、Mery のオプションの「タブの代わりに空白を挿入」 (indent_style に該当) と「タブの桁数」 (indent_size に該当) をプラグインから設定を上書きできる仕組みを試験的に作ってみました。

    EditorConfig のファイル名のワイルドカード風な部分を解析する汎用ライブラリは Mery の開発環境の Delphi 向けのものはありませんでしたが、Lazarus という Delphi に似た開発環境向けのものが見つかりまして、これを改造してみたところ一応 Delphi でも動くようになりました。(互換性はないので不具合があるかもしれませんが…)

    次のバージョンではある程度 EditorConfig への対応を考慮したものをリリースできると思いますが、ちょっと問題があります。

    ★ EditorConfig の trim_trailing_whitespace (行末の空白除去) と insert_final_newline (ファイルの末尾に改行を挿入) の機能を本体側に実装するかどうか (マクロやプラグインからでもがんばれば実現は可能)

    ★ EditorConfig のオン・オフを切り替えられるようにする必要があるか?EditorConfig に対応しているエディタは強制的に EditorConfig がオンになるっぽい。

    このファイルは EditorConfig オンだけど、あのファイルは EditorConfig オフにしたいなどというご要望がくることが予想される?そもそもそういう使い方はしないもの?

    ★ EditorConfig の tab_width 項目はそもそも Mery にその機能がないので対応なしで良い? (Sublime Text でも未対応だったと思います)

    ★ Lazarus 向けのライブラリを無理やり改造して Delphi でビルドできるようにしたけど動作に不安が残るので、プラグインよりも JavaScript を使ったマクロで対応したほうが良いかもしれない。

    その場合、マクロから indent_style と indent_size を操作できる機能を追加する必要がある。

    などなど、ちょっと悩ましいことになっています。

    とりあえず Mery 側の機能追加 + EditorConfig プラグインをベータ版で公開して様子を見る感じで行ってみて、バグが多発したらプラグインは中止してマクロでの実装を検討する方向にしてみようと思います。

     |  Kuro  |  返信
  7. > 現状ですが、Mery のオプションの「タブの代わりに空白を挿入」 (indent_style に該当) と「タブの桁数」 (indent_size に該当) をプラグインから設定を上書きできる仕組みを試験的に作ってみました。

    おお、お早い。すごいです。

    > EditorConfig の trim_trailing_whitespace (行末の空白除去) と insert_final_newline (ファイルの末尾に改行を挿入) の機能を本体側に実装するかどうか

    自動整形に当たると思うので、個人的に EditorConfig のプロパティとしては重要視していません。

    > このファイルは EditorConfig オンだけど、あのファイルは EditorConfig オフにしたいなどというご要望がくることが予想される?そもそもそういう使い方はしないもの?

    そういった指定も .editorconfig で行うものかと思います。Visual Studio では EditorConfig を完全に無効化する設定があるのと、トラブルシューティングとして .editorconfig の探し方がこちらのページに記載されているくらいですね。

    https://docs.microsoft.com/ja-jp/visualstudio/ide/create-portable-custom-editor-options?view=vs-2019#troubleshoot-editorconfig-settings

    > EditorConfig の tab_width 項目はそもそも Mery にその機能がないので対応なしで良い?

    Mery だと「タブの桁数」がその機能になるのではないでしょうか。ただ、これはファイルの中身に関するプロパティではないので、個人的にはファイルごとに切り替える必要性はあまり感じません。

    EditorConfig 対応のベータ版が公開されましたら、常用してみて動作確認に協力させていただきたいと思います!

     |  100の人  |  返信
  8. ご返信ありがとうございます。

    EditorConfig ですが、ようやく形になりましたので近日中にはリリースできると思います。

    > 自動整形に当たると思うので、個人的に EditorConfig のプロパティとしては重要視していません。

    ありがとうございます。これは Mery 側の機能として実装するかどうか悩んだのですが、とりあえず Mery 側で実装することにしてみました。

    > そういった指定も .editorconfig で行うものかと思います。Visual Studio では EditorConfig を完全に無効化する設定があるのと、トラブルシューティングとして .editorconfig の探し方がこちらのページに記載されているくらいですね。

    なるほど、全体的な設定でオン・オフできるのですね。

    Visual Studio でそうなっているのであれば、Mery もその仕様に沿ったかたちにしようと思います。

    途中で EditorConfig をオフにした場合は、次に開いたファイルからは EditorConfig を適用しないというかたちになります。現在編集中のファイルですでに .editorconfig の設定が適用されているものはそれが解除されるわけではなく、そのままとなります。

    > > EditorConfig の tab_width 項目はそもそも Mery にその機能がないので対応なしで良い?
    > Mery だと「タブの桁数」がその機能になるのではないでしょうか。ただ、これはファイルの中身に関するプロパティではないので、個人的にはファイルごとに切り替える必要性はあまり感じません。

    EditorConfig では indent_size と tab_width のプロパティがあって、どちらもインデントの桁数に関する設定です。

    Mery の [タブの桁数] は半角空白によるインデントでもタブによるインデントでも共通の設定となっており、indent_size と tab_width のように別々に設定する機能がありません。

    EditorConfig では tab_width を指定しない場合は indent_size の設定が使用されるようなので、恐らく indent_size のほうを重視しているのだと思いますから、Mery でも indent_size の値を採用し、tab_width は使用しないようにする方向で開発しています。(Sublime Text と同じ)

    ほぼ完成したのですが、一つ、ツッコミが入りそうな点がありまして、ここはリリース前に解決しておきたいのでご意見を頂けると助かります。

    というのも、Sublime Text や NotePad++、Visual Studio Code、Visual Studio などの EditorConfig の挙動を見ていると、新規でファイルを作成して [名前を付けて保存] した場合には、.editorconfig が適用されません。

    一度、名前を付けて保存した後に、再度、上書き保存した場合は .editorconfig が適用されます。

    これは Mery でも現状の仕様に基づいてプラグインで EditorConfig を実装すると発生する問題です。([名前を付けて保存] を実行した段階ではまだファイルのパスがわからないため)

    Sublime Text や NotePad++ は外部プラグインによる実装なので仕方ないと思うのですが、ネイティブで EditorConfig に対応している Visual Studio でもそんな仕様なので、Mery でもそれでいいですよね…?

    これが解決すれば完成です! ^^

     |  Kuro  |  返信
  9. お疲れ様です!

    たしかにエディタ上で新規作成した時点だと定まりませんね。あまりそういうことをやらないので考えていませんでした。

    他のアプリが [名前を付けて保存] したときに整形を行わないのであれば、それに合わせるのが良いでしょうし、自分もその挙動の方が自然かと思います!

     |  100の人  |  返信
スポンサーリンク