короче. `StdDocuments.DuplicateAs()` должна выглядеть вот так:
Код:
(* utility procedure to create duplicated document; will not record the changes in undo buffer *)
PROCEDURE DuplicateAs* (src: Documents.Document; dir: Documents.Directory): Documents.Document;
VAR
l, t, r, b: INTEGER;
res: Documents.Document;
seq: Sequencers.Sequencer;
s: ANYPTR;
BEGIN ASSERT(src # NIL, 20);
IF dir = NIL THEN dir := Documents.dir END;
(* do not record document changes; uses undocumented flag *)
IF src.Domain() # NIL THEN
s := src.Domain().GetSequencer();
IF s # NIL THEN WITH s: Sequencers.Sequencer DO seq := s END WITH ELSE seq := NIL END;
IF seq # NIL THEN seq.BeginModification(3(*notRecorded*), NIL) END
ELSE seq := NIL
END;
src.PollRect(l, t, r, b);
res := dir.New(Views.CopyOf(src.ThisView(), Views.shallow), r - l, b - t);
res.SetRect(l, t, r, b);
res.ThisController().SetOpts(src.ThisController().opts);
IF seq # NIL THEN seq.EndModification(3(*notRecorded*), NIL) END;
RETURN res
END DuplicateAs;
и тогда хак в `StdCmds.SaveWindow()` можно смело аннигилировать.