文書化されていない機能Internal`HandlerBlock
(マキシムRytinによってuncovered)はここに適用されます。
Off[FindMaximum::"nrnum"]
Internal`HandlerBlock[{"Message", Print},
Message[FindMaximum::"nrnum", arg1, arg2, arg3]]
(* => Hold[Message[FindMaximum::nrnum,arg1,arg2,arg3],False]*)
別のハンドラタイプは "MessageTextFilter" です。 "Message"は生成されたメッセージごとに のために呼び出され、ホールド[...、 ...]という形式の1つの引数をハンドラ関数に渡し、 メッセージの場合は2番目の要素をFalseに設定します。 が実際に印刷され、3つの引数を持つ関数を呼び出すメッセージに対して "MessageTextFilter"が呼び出されます。
マキシムRytin
別の可能性は、それが評価に関する完全な引数に拡張することができます切り捨て引数でインラインの細胞を含むメッセージを出力しますように$MessagePrePrint
を変更することです。もちろん
truncatingRules = {lst : {x_, y__} /;
MatrixQ[lst, NumberQ] && Length[lst] > 3 :>
{x /. v : {a_, b__} /; Length[v] > 3 :>
{a,
Interpretation[Style[Skeleton[Length[{b}]], Gray],
Sequence @@ {b}]},
Interpretation[Style[Skeleton[Length[{y}]], Gray],
Sequence @@ {y}]},
lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 3 :>
{x, Interpretation[Style[Skeleton[Length[{y}]], Gray],
Sequence @@ {y}]}};
InlineCellInsideMessage[expr_] :=
Style[DisplayForm[
Cell[BoxData[MakeBoxes[expr, StandardForm]], "Input"]],
FontWeight -> Bold, FontFamily -> "Courier", Background -> Yellow,
FontColor -> Red, FontSize -> 12, StripOnInput -> True,
AutoNumberFormatting -> True, ShowStringCharacters -> True]
$MessagePrePrint =
Function[expr,
If[TrueQ[ByteCount[Unevaluated[expr]] < $OutputSizeLimit/20.],
InlineCellInsideMessage[expr],
InlineCellInsideMessage[expr /. truncatingRules]
]]
は、$MessagePrePrint
の上記のバージョンはちょうど草稿であるが、それは主なアイデアを示しています。Interpretation
で行うことができます。
私は、オフになっているメッセージ(少なくともオフ[] []メカニズムを使用していないメッセージ)は保存しないと思います。以下の私のコメントを参照してください。 – Simon
@Simon説明されていない関数 '' Internal'HandlerBlock''は、オフになっているメッセージを捕まえることができます。下の私の答えを見てください。 –