ファイル再読み込み時にスクロール位置を復元する

  1. こんにちは。ご覧くださりありがとうございます。
    不具合ではなく、こうなってくれたら嬉しいなーという要望をさせてください。

    私は外部ツールに整形ツール (clang-format など、標準的なスタイルでコードをフォーマットしてくれるプログラム) を設定して利用しています。これらのプログラムはファイルを読み込んで整形した後、そのファイルを整形済みのもので上書きします。なので Mery 側からは外部でファイルが変更された旨のダイアログが出て、リロードすることになります。

    このリロード時、カーソル位置は復元されるようですが、スクロール位置は復元されないように見えます。もちろん、整形ツールが改行を挟んだり消したりし得るので「元々の行」を「画面上の同じ位置」に表示することはできないと思いますが、行数に変更がない場合でもリロードすると、カーソル行が下から3行目あたりに見える位置までスクロールが移動してしまいます。ピクセル位置でよいので前のスクロール位置を保存していただけると嬉しいです (マクロで言うなら window.ScrollY の値をリロードの前後で保ってくださると嬉しいです) 。

    スクロールが保持されなくてもカーソル位置が保持されるので、実用上あまり問題にはならないのですが。
    ただ少しだけ位置を見失うので、保存されると便利だなと思った次第です

    おまけ

    整形ツールは標準入力から受け付けて標準出力から整形済みコードを返すといった動作も可能になっています。外部ツールのアウトプットバー機能に「文章と置換」という機能があるようなので使えるかなーと思ったのですが、たびたびゴミが混じったり途中で切れたりとあまり安定しませんでした。ただ、これは全然原因を調べられていないので、こちらの環境依存の問題かもしれません。

     |  lake  |  返信
  2. こんばんは、書き込みありがとうございます。

    > このリロード時、カーソル位置は復元されるようですが、スクロール位置は復元されないように見えます。
    そういう仕様になっています。ご指摘の通り、ファイルの内容が変更されているケースもあるので、カーソル位置のみ復元で、スクロール位置は自動調整になっていますね。

    > ピクセル位置でよいので前のスクロール位置を保存していただけると嬉しいです
    ここの仕様は好みがわかれるところだと思います。必ずスクロール位置が復元されるとなると、リロード時にカーソル位置が画面外になったりするケースも出てきて、逆に使いづらくなる恐れがありますね。

    > ただ少しだけ位置を見失うので、保存されると便利だなと思った次第です
    上記の問題を踏まえて、カーソル位置を復元しつつ、できるだけスクロール位置を復元する感じならアリかもしれません ^^ (スクロール位置を復元したあとに、もしカーソル位置が外に飛び出してたら追従、飛び出してなければそのまま)

    > 整形ツールは標準入力から受け付けて標準出力から整形済みコードを返すといった動作も可能になっています。
    clang-format、調べてみました。標準入力を受けられるようなので Mery でも動くかと思ったのですが、まったく動きませんでした。

    clang-format.exe をコマンドラインから実行した場合は、標準入力に入力して CTRL + Z (^Z, 0x1A) を入力してやると終端を検知して出力が返ってくるのですが、Mery の外部ツールから実行した場合、[EOFを追加] にチェックを入れて (内部的に 0x1A を送信してます) も、そこで終端と判断してもらえないようです。

    原因を調べてみたところ、どうも clang-format.exe は終端記号 (0x1A) の送信だけではダメで、標準入力をクローズしてやらないと出力を返してこないようです。

    0x1A を送信してやると自動で終わってくれるアプリと、そうでないものがあるようで、[外部ツール] の機能的には自動で標準入力をクローズしてやっても差し支えなさそうなので、Mery の次のバージョンでは対応してみたいと思います。

     |  Kuro  |  返信
  3. お返事ありがとうございます。

    確かに、カーソルが画面外に行くとそれはそれで困りますね。おっしゃる通り、カーソルが画面内に残るならスクロール保存、そうでなければカーソル追従というのが良い気がします。

    clang-format の問題、つぶやいただけで調べてくれてありがとうございます!まさかそこまでしていただけるとは。

    確かに今確かめてみたら動いてくれませんでした...。前は送る内容を「カスタム」にして [SUB] などを自分でつっこんだら動くようになった気がしたのですが、今試したらそれもできませんでした。前どうやっていたのだろう?
    動いてた頃は、同じ文字列がダブったり、途中で混ざっていたり、途中で切れてしまったりということが多発してとても整形には使えない状態でした。今となっては動かす方法ごと謎になりました...。

    標準入力を閉じる話、なるほどです。とりあえずアップデートを楽しみにさせていただきます。
    ありがとうございました。

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

    > カーソルが画面内に残るならスクロール保存、そうでなければカーソル追従というのが良い気がします。
    ありがとうございます。言い忘れていましたが、[読み直し] 機能、または他で変更された時の「読み直し」のときに限りますけどね。一度閉じてしまったファイルの場合は、ウィンドウのサイズが変わっている場合もあるのでスクロール位置の復元は難しいです。

    > 動いてた頃は、同じ文字列がダブったり、途中で混ざっていたり、途中で切れてしまったりということが多発してとても整形には使えない状態でした。今となっては動かす方法ごと謎になりました...。
    clang ではないですが (JQ.exe です)、以前のバージョンの Mery では↑のような現象が発生することがあり、改善した記憶がありますので、次のバージョンでは動くかと思います。

    > 標準入力を閉じる話、なるほどです。とりあえずアップデートを楽しみにさせていただきます。
    ありがとうございます。現在、鋭意開発中ですので今しばらくお待ちくださいませ。

     |  Kuro  |  返信
スポンサーリンク