Paste Mathematica code so that's it's brok

2019-02-09 11:23发布

I often copy Mathematica code from websites (such as SO) to a notebook. The code usually gets pasted as a single input cell. I'm looking for a simple way to paste it as several input cells for convenient step-by-step evaluation.

For example,

a = 2;
f[x_] := x^a

Plot[f[x], {x,0,2}]

would ideally paste as two input cells. Manual formatting (i.e. the original newlines) should preferably also be preserved (this is not the case with default pasting).

Generally, if one selects all input cells (ALT-click), copies them into a text editor, then copies the resulting text back into a notebook, one should get a close equivalent of the original cells that were copied.

2条回答
不美不萌又怎样
2楼-- · 2019-02-09 11:39

Or.... you can just Hit Ctrl+Shift+D at the point where you'd like to split your singe cell into 2 separate cells. Some times it's advantageous to group multiple operations into a single cell (or rather not split them to begin with). To undo such a split, select both cells (or more than 2 if you'd like) and click Ctrl+Shift+M to merge them into one.

查看更多
别忘想泡老子
3楼-- · 2019-02-09 11:56

This is a simple implementation (I'd also appreciate a code review, I'm not good in front end programming):

(* This converts a sequence of expressions into boxes *)
Clear[makeManyBoxes]
SetAttributes[makeManyBoxes, HoldAllComplete];
makeManyBoxes[e__] := List@ReleaseHold[MakeBoxes /@ HoldComplete[e]]

(* Split a list at separator *)
split[list_, sep_] := 
 DeleteCases[Split[list, #1 =!= sep && #2 =!= sep &], {sep}] 

wr[e_] := NotebookWrite[InputNotebook[], Cell[BoxData[e], "Input"]]

CreatePalette@Button["Paste!",
  Module[{clipboard},
   clipboard = NotebookGet[ClipboardNotebook[]][[1, 1, 1]];
   If[StringQ[clipboard],

    wr /@ 
     split[ToExpression[clipboard, InputForm, makeManyBoxes], "Null"]
    ]
   ]
  ]

It breaks cells at empty lines. For this, we need to parse the expression first (what if an empty line appears in the middle of a long Module?). But parsing alone will cause several problems.

Problems with this implementation:

  • it removes comments
  • it can't handle incorrect inputs
  • it doesn't preserve the formatting (newlines)
  • I'm sure there must be several other things that can go wrong
查看更多
登录 后发表回答