我想完成以下内容:在评估输入单元格时,它应该自毁(即删除自身)。我试图与SelectionMove
和NotebookDelete
一起破解某些东西,但却没有得到我想要的东西。
以下是潜在的用例:
该命令可能是一系列动态生成并插入笔记本的其他命令的简写
该命令可能仅用于副作用(例如设置笔记本选项或打开新笔记本);在评估之后将命令留在笔记本中没有任何意义并且造成混乱
编辑:根据Wizard先生的说法,答案是SelectionMove[EvaluationNotebook[], Previous, Cell]; NotebookDelete[];
。我不知道为什么以前不适合我。这是一些使用这个习语的代码。
writeAndEval[nb_, boxExpr_] := (NotebookWrite[nb,
CellGroupData[{Cell[BoxData[boxExpr], "Input"]}]];
SelectionMove[nb, Previous, Cell];
SelectionMove[nb, Next, Cell];
SelectionEvaluate[nb]);
addTwoAndTwo[] := Module[{boxExpr},
boxExpr = RowBox[{"2", "+", "2"}];
SelectionMove[EvaluationNotebook[], Previous, Cell];
NotebookDelete[];
writeAndEval[EvaluationNotebook[], boxExpr];
]
现在,正在运行addTwoAndTwo[]
会删除原始输入,并使其看起来好像已经评估了“2 + 2”。当然,你可以做各种各样的事情,而不一定要打印到笔记本上。
编辑2:Sasha的抽象非常优雅。如果您对“真实世界”使用此内容感到好奇,请查看我在“工具包中的内容”问题中发布的代码:What is in your Mathematica tool bag?
答案 0 :(得分:9)
要影响所有输入单元格,请评估这是笔记本:
SetOptions[EvaluationNotebook[], CellEvaluationFunction ->
( (
SelectionMove[EvaluationNotebook[], All, EvaluationCell]; NotebookDelete[];
ToExpression@#
)&)
]
如果您只想影响一个单元格,请选择单元格并使用选项检查器按上述方式设置CellEvaluationFunction
。
答案 1 :(得分:8)
或者,在Mr. Wizard的解决方案的基础上,您可以创建一个函数SelfDestruct
,如果您只想偶尔执行此操作,它将删除输入单元格:
SetAttributes[SelfDestruct, HoldAllComplete];
SelfDestruct[e_] := (If[$FrontEnd =!= $Failed,
SelectionMove[EvaluationNotebook[], All, EvaluationCell];
NotebookDelete[]]; e)
然后评估2+3//SelfDestruct
输出5
并删除输入单元格。这种使用场景似乎对我更有吸引力。