With the GeneralUtilities`PrintDefinitions functions comes a usable code formatting engine. On this site, most of the time we share code. I believe it would be awesome to have a robust button that lets you copy selected code or cells directly to clipboard and make pasting more easy.

Look for instance at this small function:

<< GeneralUtilities`
Button["Print Formatted Code",
            MakeFormattedBoxes @@ MakeExpression[CurrentValue["SelectionData"]]

It has some major flaws (it doesn't preserve strings, it adds contexts, etc..) but it gives a head start. With it, you can select a portion of code (not a cell) and get a reformatted version. The above code block was created with it.

It can turn this


into this

    0.8724536302414463, 0.6876741664055988, 0.12793381311984442, 0.5447962818014034,
    0.5222421222710214, 0.6994341188236166, 0.02900006229926766, 0.11109627731891036,
    0.9046020599101727, 0.04702874732980167, 0.3094690356201151, 0.664935721568001,
    0.6139357391996489, 0.25651232073953256, 0.24772295896395002, 0.04291086493297902,
    0.2751346161611363, 0.9072882664480462, 0.3813024502288167, 0.14290372799071482

Not perfect, but a start.

Question: Can we create a robust "Copy code to clipboard" button that handles all use-cases and copies a reformatted version of the selection to the clipboard? It should not rely on additional packages (like Leonids code formatter) but it should reuse what is provided by the GeneralUtilities` package.

Reformatting expressions

If we have the code as expression and not as Cell[..] we can look into the implementation of MakeFormattedBoxes. Especially the function


is very interesting as it contains all rules that are applied to turn an expression into its reformatted box form. Spelunking there, we find how the reformatter

  • includes context names in the code (sn)
  • adjusts that f[x] is turned into f@x (syntax)
  • make e.g. Or displayed as either Or[..] or x||y

Below is an image of the code, because SE breaks it with dollar variables. You can get the code with


Mathematica graphics

  • $\begingroup$ It appears I don't have MakeFormattedBoxes in version 10.1.0 but +1 for an interesting question! $\endgroup$ – Mr.Wizard Feb 23 '17 at 11:22
  • $\begingroup$ Could you outline requirements for a valid answer? I'm not sure I got the point. Moreover, the fundamental problem with those tools is that they work with expressions (afaict) so no original choices about operators form used is preserved (f[x] vs f@x vs f//x). Another major issue is that comments will be stripped. $\endgroup$ – Kuba Sep 14 '17 at 8:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.