sakura-editor / sakura

SAKURA Editor (Japanese text editor for MS Windows)
https://sakura-editor.github.io/
Other
1.26k stars 163 forks source link

スペースインデントされたファイルに対してはTabキーでスペースインデントするように自動で切り替えるべき #1924

Closed tats-u closed 1 year ago

tats-u commented 1 year ago

問題内容

https://github.com/sakura-editor/sakura/issues/786 の前提となる問題として。
本エディタはVS Code等と異なり、半角スペースでインデントされたファイルに対し、プログラマーがTabキーでインデントしようとしても、忖度一切なしに不適切であるタブ文字を挿入します。
開いたテキストファイルのインデントスタイルを検知し、Tabキーを押した際に挿入される文字の種類や個数を変えるのが、ソースコードをいじる資格があるテキストエディタの最低要件です。
これを解決しないと https://github.com/sakura-editor/sakura/issues/786 はいつまで経っても解決できません。

Q. あとからスペースに変換すればいいのでは?
A. フールプルーフ。VS Codeではなくあえてこちらを使ってソースコードをいじろうとする人間にそんな思考は及びません。

再現手順

  1. 半角スペースインデントされたソースコードファイルを開く
  2. Tabキーを押す

Tabが挿入されるのは不適切です。開いたファイルをスキャンし、インデント幅に合ったスペースを挿入してください。

再現頻度

100%

問題のカテゴリ

環境情報

スクリーンショット

Video.webm

Safari以外で再生可能

beru commented 1 year ago

image

タイプ別設定のスクリーンのレイアウトの枠内にある「SPACEの挿入」というチェックですが、レイアウトというよりインデントに関わる設定に思えます。

インデント/逆インデント時にカーソル周辺行のインデントスタイルに合わせた処理を行うようにするオプションを用意するというのはどうでしょうか?

tats-u commented 1 year ago

オプションは必須です。将来EditorConfigにより上書きできるようにする必要があります。

ファイル全体(または広範囲領域)ではなく、あえて周辺行だけに限定する実装上の制約はありますか?

beru commented 1 year ago

ファイル全体(または広範囲領域)ではなく、あえて周辺行だけに限定する実装上の制約はありますか?

1ファイルの中で複数のインデントスタイルが併用される事もあるので、それに対応するとなるとカーソル周辺行のインデントスタイルに合わせられるようにした方が良いと思います。ただ周辺行からインデントスタイルが判断出来ない場合もあると思うので、まずは1ファイル全体のインデントスタイルの検出を実装してから考慮した方が良いかもしれないですね。

tats-u commented 1 year ago

Emacsがデフォで混合インデントすることは知っていますが、他はありますか?

その場合はひとまず現在のようにタブキーでタブ文字が入力されるような実装にするとよいのでしょうか? スペースインデントのコードにタブ文字が新規で入らないようにするのが最優先ですので

berryzplus commented 1 year ago

あるべき設定構造はこんな感じだと思います。

  1. 共通設定(実装なし)
  2. タイプ別設定(実装あり)
  3. 編集中ドキュメントの一時設定(基本的に実装なし、部分的に実装あり)
  4. EditorConfigを検出して編集中ドキュメントの一時設定を動的に更新する機能(実装なし)
  5. ドキュメント全体から自動判別して編集中ドキュメントの一時設定を動的に更新する機能(実装なし)
  6. 編集行周辺から自動判別して編集中ドキュメントの一時設定を動的に更新する機能(実装なし)

今回やりたいのはたぶん6。

どうあるべきか?どうあったら便利か?を考えるところが、 一番大変な部分ですが、一番面白い部分だとも思うのでこのへんで止めときます。

tats-u commented 1 year ago
  1. 1928

  2. 既存
  3. 下3つが依存
  4. 786

  5. 個人的にはこれをメインにしてほしい
  6. 5.がダメな場合の代替

他のエディタは5.の実装しか知りません。6.の実装例はご存知ですか?

beru commented 1 year ago

6.の実装例はご存知ですか?

検索してみたんですが全然見つかりませんでした。という事で世の中的に需要は特に無いのかもしれません。

beru commented 1 year ago

@tats-u @berryzplus 「SPACEの挿入」設定を切り替えるマクロ関数を追加しました。

編集ファイルのインデント検出はマクロでも行えると思うので、既存の ChangeTabWidth マクロ関数と追加した ChangeInsertSpace マクロ関数で編集中ドキュメントの一時設定を変えられると思います。

もし #1929 がmergeされたら、編集ファイルのインデントスタイルに合わせた一時設定を行うようにするマクロを書いてみようと思います。サクラエディタ本体に機能を実装するのはその後でも良いのではないかと思います。

tats-u commented 1 year ago

組み込みマクロということですか?

WSH系→セキュリティ上の問題から無効化しているケースあり。(https://qiita.com/akilab/items/cbcb1ba8621f8cc3aef4https://www.softwareisac.jp/ipa/index.php?Windows+Script+Host%E3%81%AE%E5%88%B6%E5%BE%A1%E8%A8%AD%E5%AE%9A)JScriptはIE搭載のエンジンベースなのでES6以降非対応。 他→別途インストールが必要。VS Codeと違い、リモートから何か取ってこなくてもフル機能なのが本エディタの売りなので、依存を増やすのは❌

beru commented 1 year ago

マクロの他にプラグインにするという手もありそうです。 http://sakura.qp.land.to/?Plugin マクロと同じくJScript/VBScriptになりそうですが…。JScript/VBScriptを使いたくない場合はDLLプラグインにするか、もしくはWebView2を使ったりしてWSHではなくてES6に対応させる手もあるとは思います。

本体機能として最初から付いてた方が使う方は手間が掛からないのは確かですね。試しに実装してみます。

berryzplus commented 1 year ago
  1. 編集行周辺から自動判別はボツですか(笑)

Enterキー押下時に次行をインデントするか判定するために行頭をチェックしているので、走査範囲を拡張したら実現できないかな?と思って書きました。5と6は無効にできたほうが便利かな?と思っていたので「ハナから要らん」ならそれで良いです。

beru commented 1 year ago
  1. の編集行周辺から自動判別が出来ると有用なシチュエーションは色々思いつきますが、実装の優先度はファイル全体からの自動判別と比較すると落ちると思います。

Enterキー押下時に次行をインデントするか判定するために行頭をチェックしているので、走査範囲を拡張したら実現できないかな?と思って書きました。

サクラエディタのスマートインデントを強化して色々なインデントスタイルへの対応度が上がると良いなとはなんとなく思ってます。

tats-u commented 1 year ago

6.の編集行周辺から自動判別が出来ると有用なシチュエーションは色々思いつきますが、実装の優先度はファイル全体からの自動判別と比較すると落ちると思います。

同意です。基本的にEditorConfigなど含めて、ファイル全体でタブ/スペースのどちらかに統一するパターンが多いです。

マクロの他にプラグインにするという手もありそうです。 http://sakura.qp.land.to/?Plugin マクロと同じくJScript/VBScriptになりそうですが…。JScript/VBScriptを使いたくない場合はDLLプラグインにするか、もしくはWebView2を使ったりしてWSHではなくてES6に対応させる手もあるとは思います。

よく考えたらコア機能のためにわざわざJSエンジンを呼び出しに行くのはどうなのかなと思いました(DLLはまだマシだがWikiには未安定と書かれていた)

beru commented 1 year ago

1931 がmergeされてこのissueの要求は満たせたと思うのでcloseします。

タイプ別設定の支援タブの画面下のチェックボックスで機能の有効無効を設定できます。

image

tats-u commented 1 year ago

ビルドして確認してみましたがデフォでオフですか・・・ リリース版でしばらく様子見て不具合がなければオンでもいいのではないでしょうか?

beru commented 1 year ago

ビルドして確認してみましたがデフォでオフですか・・・ リリース版でしばらく様子見て不具合がなければオンでもいいのではないでしょうか?

おっしゃる通りですね。しばらく待って不具合報告が無ければデフォルト値をオンにするPRを作成します。