Deleteを(Undoして)Redoするとカーソル位置が後ろにずれる
-
お初です。
無選択状態でDeleteキーを一回押すとカーソル位置の後ろの文字が削除されるわけですが、そのDeleteをマクロでUndoしてRedoするとカーソルが後ろにずれます。(本当なら最初のDelete後の状態に戻るはずですが)
特に、行末から一文字前の状態でDeleteしてUndoしてRedoした場合には、カーソルが次の行の頭に移動してしまいます。組んでるマクロ内部で対応してもいいんですが、DeleteとRedoの仕様とは思えないので報告しておきますね。
(Ver2.6.7とVer3.2.8両方で確認しています)| キュウモウ | 返信 -
ご報告ありがとうございます。
Mery で使用させていただいているエディターコンポーネントの仕様上、Undo および Redo におけるカーソル位置は、完全に元の位置に復元される、というわけではありません。
編集内容によってはなるべく元の位置に復元できるようにプログラムを組んでいる箇所もありますし、編集内容によってはカーソル位置が Undo と Redo で異なるケースもございます。
ご不便をおかけして申し訳ございませんがご了承くださいませ。
| Kuro | 返信 -
ありがとうございます。
マクロで対応する場合、文章量変化・前後のカーソル移動・選択状態とかデータを集めて、いろいろなコマンドの中からどのコマンドだったか推測する必要があり、結構面倒です。(実際、組みかけてたりしますが、どうすればいいんだ状態)
UndoしてRedo、というのは、範囲選択するマクロなどを作っていて、最後に編集した場所のカーソル位置をつきとめたかったわけです。カーソルは自由に動かせるので、そうやって元の位置を復元しようと思った。
すると、「最後に編集したカーソル位置」か、履歴として「やったコマンド」を別の手段でつきとめられないか? なのか。
私が気づいてないだけで、手段があるんでしょうか?| キュウモウ | 返信 -
ご返信ありがとうございます。
Mery の Undo、Redo はカーソルが移動したデータまでは保持していないので、Undo・Redo の前後で必ずしもカーソルの位置が元に戻るとは限りません。
> 範囲選択するマクロなどを作っていて、最後に編集した場所のカーソル位置をつきとめたかったわけです。
これはマクロの中で "Delete して Undo して Redo" することで、強制的に Undo ポイントを作ろうとされているのでしょうか?
そういった用途であれば、Ver 3.0.1 以降の機能になりますが、マクロの window.AddUndo() メソッドを使えば編集していない状態でも現在のカーソルの位置と選択範囲を Undo 情報に記録することができます。
window.AddUndo();
また、最後に編集した箇所にカーソルを移動させるだけであれば、[最後に編集した位置へ移動] コマンド (Ctrl + Shift + Z) という機能もあります。(Ver 2.6.9 以降)
[最後に編集した位置へ移動] コマンドはマクロからは以下のように呼び出すことができます。
editor.ExecuteCommandByID(2241);
ご希望の動作かどうかはわかりませんが…。
| Kuro | 返信 -
おっ……おはようございます。
> そういった用途であれば、Ver 3.0.1 以降の機能になりますが、マクロの window.AddUndo() メソッドを使えば編集していない状態でも現在のカーソルの位置と選択範囲を Undo 情報に記録することができます。
> また、最後に編集した箇所にカーソルを移動させるだけであれば、[最後に編集した位置へ移動] コマンド (Ctrl + Shift + Z) という機能もあります。(Ver 2.6.9 以降)
>
> [最後に編集した位置へ移動] コマンドはマクロからは以下のように呼び出すことができます。ベータにしたのは昨日だったので、これらはまだ知りませんでした。ありがたい!
(Deleteだけの回避なら、昨日作ってみた処理で既にできちゃってるみたいです。これならまあいいか状態)ちなみに。
Undo/Redoコマンドでどこが変わる(戻る)のかが知りたくて、そこで変化範囲を先んじて選択しようと思ってマクロを組んだわけですよ。変化の場所が飛び回ると、今どこが変わったんやと見失うから。
またここで、私は日本語再変換マクロも別で作って入れてるので、そんな賢いUndo系マクロ作って適当な範囲選択ができれば、そのまま再変換に放り込むこともできる。つまり、日本語の打ち間違い変換間違いがすぐに直せるわけです。これはかなり便利。| キュウモウ | 返信