26
$\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$
  • $\begingroup$ Shift-Home Shift-Enter maybe? (on a keyboard that has Home) $\endgroup$ – rm -rf Dec 20 '12 at 14:38
  • 2
    $\begingroup$ EXTREMELY useful! I've been suggesting this feature to WRI for several years. $\endgroup$ – Andreas Lauschke Dec 21 '12 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 Dec 21 '12 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$ – Andreas Lauschke Dec 21 '12 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 Dec 21 '12 at 20:30
23
+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$
  • 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 Dec 21 '12 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$ – Rolf Mertig Dec 21 '12 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$ – Rolf Mertig Dec 22 '12 at 22:22
  • 2
    $\begingroup$ Updated the comments for 9.0.1. Use: Import["http://www.mertig.com/shortcuts.m"] $\endgroup$ – Rolf Mertig Feb 18 '13 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$ – Eric Thewalt Mar 13 '13 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$
  • $\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 Nov 25 '16 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 Nov 26 '16 at 14:18
5
$\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$
  • $\begingroup$ +1 you should have told me ;) I wasn't aware as I do not use it on daily basis ;) $\endgroup$ – Kuba Nov 22 '16 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 Nov 22 '16 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 Nov 27 '16 at 7:39
  • $\begingroup$ @Yves Klett Thanks for letting me know that a custom function is still required. $\endgroup$ – Bill N Nov 27 '16 at 13:41
  • $\begingroup$ @BillN welcome to the party :D $\endgroup$ – Yves Klett Nov 27 '16 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$
  • $\begingroup$ Hooray! Only thing missing now is a convenient shortcut (but this is also already covered by @RolfMertig´s answer). $\endgroup$ – Yves Klett Dec 21 '12 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$ – Andreas Lauschke Dec 21 '12 at 20:10
  • $\begingroup$ I don't think this is so easy to put into a button, since you need EvaluationCell[] $\endgroup$ – Rolf Mertig Dec 21 '12 at 23:47
  • $\begingroup$ @RolfMertig in that case, ExperimentalPreviousCell[]` makes more sense $\endgroup$ – Rojo Dec 22 '12 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$
  • $\begingroup$ Most@ExperimentalCellRange[First, EvaluationCell[]]. Or with only documented functions, TakeWhile[Cells[], # =!= EvaluationCell[] &] == Most@ExperimentalCellRange[First, EvaluationCell[]] $\endgroup$ – Rojo Dec 21 '12 at 11:12
  • $\begingroup$ Sorry, I thought it was before hte evaluating cell, use SelectedCell[] instead for the selected cell $\endgroup$ – Rojo Dec 21 '12 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$ – Martin John Hadley Dec 21 '12 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 Dec 21 '12 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 Dec 21 '12 at 18:52

Your Answer

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

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