Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Paste Mathematica code so that's it's broken into separate input cells

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.

like image 560
Szabolcs Avatar asked Nov 07 '11 08:11

Szabolcs


People also ask

How do I enter a cell input in Mathematica?

To Create a New Cell:Move the pointer in the notebook window until it becomes a horizontal I-beam. Click, and a cell insertion bar will appear; start typing. By default, new cells are the Wolfram System input cells.


2 Answers

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.

like image 196
Gregory Klopper Avatar answered Sep 20 '22 07:09

Gregory Klopper


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
like image 40
Szabolcs Avatar answered Sep 19 '22 07:09

Szabolcs