35
$\begingroup$

Is there a command / menu entry / keyboard shortcut to evaluate all cells above / up to the current cursor position? I have the feeling I am missing something elementary here...

Addendum: In fact, it is more about selection of those cells, evaluation is not the problem as such.

$\endgroup$
12
  • $\begingroup$ Shift-Home Shift-Enter maybe? (on a keyboard that has Home) $\endgroup$
    – rm -rf
    Commented Dec 20, 2012 at 14:38
  • 3
    $\begingroup$ EXTREMELY useful! I've been suggesting this feature to WRI for several years. $\endgroup$ Commented Dec 21, 2012 at 20:08
  • 1
    $\begingroup$ @AndreasLauschke phew, glad I´m not the only one. And it seems such a minor effort to add this to the menu/shortcuts. Whom at WRI should we bug to reinforce your effort? $\endgroup$
    – Yves Klett
    Commented Dec 21, 2012 at 20:16
  • 2
    $\begingroup$ Useless. Forgeddaboudit. But you could put Rolf's or Martin's or Rojo's solution in an init.m, to put it on a button in a palette, or use the keytranslate. I have no use for the Caps Lock key, I find it the most useless key ever, so I mull putting this on Caps Lock. Solves two problems at once, and turns them into solutions. I don't like overloading Shift and Ctrl keys too much, as I have other key translations for them on an o/s level, but Caps Lock is free and otherwise useless. $\endgroup$ Commented Dec 21, 2012 at 20:25
  • 1
    $\begingroup$ @AndreasLauschke I like the Caps Lock two-in-one fix. No more unneccessary sHOUTING as well! Hmm, a productive evening. $\endgroup$
    – Yves Klett
    Commented Dec 21, 2012 at 20:30

5 Answers 5

28
+100
$\begingroup$

One possibility is to modify your personal KeyEventTranslations.tr (only tested on Windows). Evaluate the following, then restart Mathematica, then Ctrl+Shift+Home will select all cells above the insertion point.


For 9.0.1. use: Import["http://www.mertig.com/shortcuts.m"]


    mymenuitems="
         (* Select all cells upwards *)
         Item[KeyEvent[\"Home\", Modifiers -> {Control, Shift}], 
         KernelExecute[
          Module[{ enb = EvaluationNotebook[],
                   tag = StringJoin[\"tmp\", ToString[Round[AbsoluteTime[]/$TimeUnit]]],editable 
                       },
                    editable = ReplaceAll[Editable, Options[enb, Editable]];
                    SetOptions[enb, Editable -> False];
                    SelectionMove[enb, Previous, Cell, AutoScroll -> False];
                    MathLink`CallFrontEnd[FrontEnd`SelectionAddCellTags[enb, {tag}]];
                    SelectionMove[enb, Before, Notebook, AutoScroll -> False];
                    SelectionMove[enb, Next, Cell, AutoScroll -> False];
                    While[FreeQ[ReplaceAll[CellTags,Options[NotebookSelection[]]], tag],
                          MathLink`CallFrontEnd[FrontEnd`SelectionAddCellTags[enb, {tag}]];
                          SelectionMove[enb, Next, Cell, AutoScroll -> False]
                    ];
                    NotebookFind[enb, tag, All, CellTags, AutoScroll -> False];
                    MathLink`CallFrontEnd[FrontEnd`SelectionRemoveCellTags[enb, {tag}]];
                    SetOptions[enb, Editable -> editable]
                ]
                ], MenuEvaluator -> Automatic ]
                ";
With[{os = Switch[$OperatingSystem,"MacOSX","Macintosh","Windows","Windows","Unix","X"]},
Quiet@CreateDirectory@FileNameJoin[{$UserBaseDirectory,"SystemFiles","FrontEnd","TextResources",os}];
    mykeyeventtrans=FileNameJoin[{$UserBaseDirectory,"SystemFiles","FrontEnd","TextResources",os,"KeyEventTranslations.tr"}];
    (*If[FileExistsQ[mykeyeventtrans],DeleteFile@mykeyeventtrans];*)
    If[!FileExistsQ[mykeyeventtrans],
    CopyFile[FileNameJoin[{$InstallationDirectory,"SystemFiles","FrontEnd","TextResources",os,"KeyEventTranslations.tr"}],mykeyeventtrans]
]];
keytext=Import[mykeyeventtrans,"Text"];
mykeytext=StringReplace[keytext,"EventTranslations[{":>StringJoin["EventTranslations[{\n(* User defined *)\n",mymenuitems,",\n"]];
Export[mykeyeventtrans,mykeytext,"Text"];
$\endgroup$
12
  • 2
    $\begingroup$ (...drawing a deep breath...) AWESOME! This is pure gold, and with bells and whistles as well. My workflow sends most sincere regards and goes home early to celebrate. $\endgroup$
    – Yves Klett
    Commented Dec 21, 2012 at 18:43
  • 1
    $\begingroup$ @YvesKlett Gern geschehen. I actually added SelectionEvaluate[SelectedNotebook[]]; at the end of KernelExecute, since I usually like to do that. It is a matter of personal working style I guess if one wants this or not. Maybe people at WRI work differently? Or have smaller notebooks? Or don't use notebooks really for testing (being WWB freaks all of them?). Who knows. At least it is sufficiently easy to modify/improve things in Mathematica. $\endgroup$ Commented Dec 21, 2012 at 19:00
  • 2
    $\begingroup$ slightly modified to work also under Linux correctly ... Notice that I personally find Control Shift UpKey easier. So what I use can be used like Import["http://www.mertig.com/shortcuts.m"] $\endgroup$ Commented Dec 22, 2012 at 22:22
  • 2
    $\begingroup$ Updated the comments for 9.0.1. Use: Import["http://www.mertig.com/shortcuts.m"] $\endgroup$ Commented Feb 18, 2013 at 16:57
  • 1
    $\begingroup$ Very, very nice. The given code can be (very) slightly modified to create a shortcut that selects all cells below the current cell, using Ctrl+Shift+DownArrow. After the definition of mymenuitems, just add the following line: mymenuitems=StringReplace[mymenuitems, {"Home" -> "Down","Next" -> "Previous", "Previous" -> "Next", "Before" -> "After"}];. $\endgroup$ Commented Mar 13, 2013 at 8:39
6
$\begingroup$

I was just working on something and here's a side effect. Nothing new but given in closed form as palette button:

CreatePalette[
 Button["Evaluate above",
  With[{NB = InputNotebook[]},
   Do[ SelectionMove[Experimental`FromCellIndex[NB, i], All, Cell];
       SelectionEvaluate[NB];
       , {i, 1, Experimental`ToCellIndex @ SelectedCells[NB][[1]]}]
   ]]]

Cursor must not be between cells but in the cell that is meant to be evaluated at the end.

$\endgroup$
2
  • $\begingroup$ Thank You so very much for this massive time saver you came up with! (Hehe, I finally got enough points to thank you). As you are aware, I modified your routine slightly in order to get rid of the "beep," and posted the mod below. I don't use MMA often enough to remember a bunch of Key Commands, so it's nice to have a nifty little palette with the one "Evaluate Above" button on it that I can conveniently place anywhere. $\endgroup$
    – Bill N
    Commented Nov 25, 2016 at 17:31
  • $\begingroup$ @BillN No problem :) Good luck and I hope you will come here more often :) Not only to fix my answers :) $\endgroup$
    – Kuba
    Commented Nov 26, 2016 at 14:18
6
$\begingroup$

This is a modification of @Kuba's answer, again evaluating all cells above and including the selected cell, but without the "beep" (a minor refinement). Thanks @Kuba for the main routine. As with the original, the code generates a dinky palette with a single "Evaluate Above" button, which may then placed at any convenient location (such as next to the other menu items at the top of your working notebook). A cell (any cell) must be selected for the "Evaluate Above" button to work.

CreatePalette[
 Button["Evaluate Above",
  With[{nbI = InputNotebook[]},
   Do[
    SelectionMove[Experimental`FromCellIndex[nbI, i], All, Cell];
     If[TextString["Style" /. Developer`CellInformation[nbI][[1]]] === "Input",
      SelectionEvaluateCreateCell[nbI]];,
     {i, 1, Experimental`ToCellIndex@SelectedCells[nbI][[1]]}]],Method -> "Queued"]]

The code change selects out only Input cells for evaluation, "skipping over" (generating a Null result) for all other cell styles. Thanks @John Fultz for the command that returns cell styles (under "How can I get the style of selected cells?"). Evidently, a "beep" would occur if non-input cells were asked to be evaluated. This seems to be working fine with Mathematica 11.0.1.

I'm new to Mathematica, and this thread has not been active for a while. So I'm not sure whether there is now some easy way to do this built in (can't find anything), or whether a custom routine like this is still required.

Update 3/10/18: I've added the Button option Method -> "Queued" in order to prevent the timeout that occurs with the default Button evaluation method "Preemptive." The "Queued" option is used to evaluate button functions on the main link, which never times out.

$\endgroup$
5
  • $\begingroup$ +1 you should have told me ;) I wasn't aware as I do not use it on daily basis ;) $\endgroup$
    – Kuba
    Commented Nov 22, 2016 at 12:51
  • $\begingroup$ Sry @Kuba :) I'm so new here, I don't have enough points yet to even comment at your post (hehe). A big Thank You is coming once I do. This is a huge "hassle factor" reducer. $\endgroup$
    – Bill N
    Commented Nov 22, 2016 at 13:49
  • 1
    $\begingroup$ Thank you for the update. I am not aware of any changes in the frontend to facilitate that, but I am very happy with Rolf's solution. $\endgroup$
    – Yves Klett
    Commented Nov 27, 2016 at 7:39
  • $\begingroup$ @Yves Klett Thanks for letting me know that a custom function is still required. $\endgroup$
    – Bill N
    Commented Nov 27, 2016 at 13:41
  • $\begingroup$ @BillN welcome to the party :D $\endgroup$
    – Yves Klett
    Commented Nov 27, 2016 at 18:22
2
$\begingroup$

You can evaluate the input cells before the current cell by running this

Function[cobj,
   SelectionMove[cobj, Cell, All];
   SelectionEvaluate[InputNotebook[]];]~
  Scan~
  TakeWhile[Cells[CellStyle -> "Input"], # =!= EvaluationCell[] &];
SelectionMove[EvaluationCell[], After, Cell];
$\endgroup$
4
  • $\begingroup$ Hooray! Only thing missing now is a convenient shortcut (but this is also already covered by @RolfMertig´s answer). $\endgroup$
    – Yves Klett
    Commented Dec 21, 2012 at 19:39
  • $\begingroup$ shortcut or button in a palette. I'll probably put this on a button on a palette, together with other useful buttons. $\endgroup$ Commented Dec 21, 2012 at 20:10
  • $\begingroup$ I don't think this is so easy to put into a button, since you need EvaluationCell[] $\endgroup$ Commented Dec 21, 2012 at 23:47
  • $\begingroup$ @RolfMertig in that case, ExperimentalPreviousCell[]` makes more sense $\endgroup$
    – Rojo
    Commented Dec 22, 2012 at 0:08
1
$\begingroup$

I have no idea how to do this with relation to the cursor in general, but using CellObject you can do a lot if you're in a cell.

There's quite a bit you can do with the SelectionMove function. The following will select all the cells in the evaluation notebook. Note that quite strangely All is specifying the current notebook, After and Previous will give you the respective element of the list of notebooks provided by evaluating Notebooks[].

SelectionMove[EvaluationNotebook[], All, Notebook]

The selection can be moved according to CellGroup. This button will progressively select each CellGroup above the button:

Button["Select previous cell group", SelectionMove[EvaluationNotebook[], Previous, CellGroup]]

The documentation for the SelectionMove function provides quite a few examples, and shows the function can be used to select the internal contents of a cell as well as entire cells.

I think there's a way I can get Mathematica to give me the list of CellObject prior to the first of the SelectedCells but I'm not quite there yet.

$\endgroup$
7
  • $\begingroup$ Most@ExperimentalCellRange[First, EvaluationCell[]]. Or with only documented functions, TakeWhile[Cells[], # =!= EvaluationCell[] &] == Most@ExperimentalCellRange[First, EvaluationCell[]] $\endgroup$
    – Rojo
    Commented Dec 21, 2012 at 11:12
  • $\begingroup$ Sorry, I thought it was before hte evaluating cell, use SelectedCell[] instead for the selected cell $\endgroup$
    – Rojo
    Commented Dec 21, 2012 at 11:13
  • $\begingroup$ That's pretty cool, I'll need to play around with CellRange. I can't believe the Experimental context shows in the command completion menu now. $\endgroup$ Commented Dec 21, 2012 at 11:46
  • $\begingroup$ @Rojo your first comment ate up a context backtick and the rest does not really work on V9 here... would you care to elaborate? $\endgroup$
    – Yves Klett
    Commented Dec 21, 2012 at 18:49
  • $\begingroup$ Yes, sorry, Most@Experimental`CellRange[First, EvaluationCell[]]. Or with only documented functions, TakeWhile[Cells[], # =!= EvaluationCell[] &]. That should give a list of the CellObjects before the evaluating one. $\endgroup$
    – Rojo
    Commented Dec 21, 2012 at 18:52

Not the answer you're looking for? Browse other questions tagged or ask your own question.