「少し便利な Undo/Redo」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし |
<source>タグを<syntaxhighlight>タグに置き換える |
||
| 18行目: | 18行目: | ||
== Undo == | == Undo == | ||
< | <syntaxhighlight lang="javascript"> | ||
#title = "元に戻す" | #title = "元に戻す" | ||
#include "include/IO.js" | #include "include/IO.js" | ||
| 80行目: | 80行目: | ||
d.Saved = true; | d.Saved = true; | ||
} | } | ||
</ | </syntaxhighlight> | ||
== Redo == | == Redo == | ||
< | <syntaxhighlight lang="javascript"> | ||
#title = "やり直し" | #title = "やり直し" | ||
#include "include/IO.js" | #include "include/IO.js" | ||
| 145行目: | 145行目: | ||
d.Saved = true; | d.Saved = true; | ||
} | } | ||
</ | </syntaxhighlight> | ||
2023年5月16日 (火) 22:52時点における版
概要
次の機能を実装した Undo/Redo です.
- 保存済みのデータと一致したときに保存済みマークを消す
- 連続した入力・削除を一括で処理する
使用上の注意
マクロライブラリにある includeライブラリ を利用しています. このマクロの前にそちらを導入してください.
オプション
| MaxLength | 処理対象とする最大文字数.無制限の場合はコメントアウト.処理が重い場合は小さい値に変更. |
|---|---|
| IsSequence | 連続した入力・削除を一括で処理する場合は true. |
Undo
#title = "元に戻す"
#include "include/IO.js"
// Undo 時に保存済みファイルと比較し、一致するようなら保存済みフラグをオンにする
// 動作定義
var MaxLength = 150*1024; // 処理対象最大文字数.動作が重い場合は小さい値に.無効にする場合はコメントアウト
var IsSequence = false; // 連続した変更を一括で処理する
var d = Document;
var s = d.Selection;
var bt = d.Text;
var bp = s.GetActivePos();
d.Undo();
// 変更チェック
var at = d.Text;
if (bt == at) {
Quit();
}
// サイズ制限
var MaxLength;
if (MaxLength != null && at.length > MaxLength) {
Quit();
}
var t = d.FullName ? IO.LoadFromFile(d.FullName, d.Encoding) : null;
// 連続した変更をまとめる
var IsSequence;
if (IsSequence) {
var ap = s.GetActivePos();
var w = at.length - bt.length;
var y = s.GetActivePointY(mePosLogical);
if (Math.abs(w) == 1 && Math.abs(ap - bp) <= 1) {
var ab = null;
do {
// 保存済み位置まで戻った場合はそこでひとまとめとする
if (t === at) {
d.Saved = true;
Quit();
}
bt = at;
bp = ap;
ab = s.GetAnchorPos();
d.Undo();
at = d.Text;
ap = s.GetActivePos();
} while (at.length - bt.length == w && Math.abs(ap - bp) <= 1 && s.GetActivePointY(mePosLogical) == y);
// 全て Redo しきった訳ではない場合は戻す
if (bt != at) {
d.Redo();
s.SetAnchorPos(ab);
s.SetActivePos(bp, true);
}
}
}
if (t === at) {
d.Saved = true;
}
Redo
#title = "やり直し"
#include "include/IO.js"
// Redo 時に保存済みファイルと比較し、一致するようなら保存済みフラグをオンにする
// 動作定義
var MaxLength = 150*1024; // 処理対象最大文字数.動作が重い場合は小さい値に.無効にする場合はコメントアウト
var IsSequence = false; // 連続した変更を一括で処理する
var d = Document;
var s = d.Selection;
var bt = d.Text;
var bp = s.GetActivePos();
d.Redo();
// 変更チェック
var at = d.Text;
if (bt == at) {
Quit();
}
// サイズ制限
var MaxLength;
if (MaxLength != null && at.length > MaxLength) {
Quit();
}
var t = d.FullName ? IO.LoadFromFile(d.FullName, d.Encoding) : null;
// 連続した変更をまとめる
var IsSequence;
if (IsSequence) {
var ap = s.GetActivePos();
var w = at.length - bt.length;
var y = s.GetActivePointY(mePosLogical);
if (Math.abs(w) == 1 && Math.abs(ap - bp) <= 1) {
var ab = null;
do {
// 保存済み位置まで戻った場合はそこでひとまとめとする
if (t === at) {
d.Saved = true;
Quit();
}
bt = at;
bp = ap;
ab = s.GetAnchorPos();
d.Redo();
at = d.Text;
ap = s.GetActivePos();
} while (at.length - bt.length == w && Math.abs(ap - bp) <= 1 && s.GetActivePointY(mePosLogical) == y);
// 全て Redo しきった訳ではない場合は戻す
if (bt != at) {
d.Undo();
s.SetAnchorPos(ab);
s.SetActivePos(bp, true);
}
}
}
if (t === at) {
d.Saved = true;
}
スポンサーリンク