How to select and delete all Output cells in multiple notebooks programmatically without needing to (manually) opening them?
How to define a hot key for deleting all Output cells within a notebook from that notebook?
Without adressing the hotkey issue (you could add a menu entry, or simply put an appropriate Button
in your notebook), here is one variety that uses NotebookDelete
and can be modified to include different CellStyle
s as well. The first argument nb defines which notebook to work on, the second argument styles defines the styles of to-be-deleted cells:
CleanNotebook[nb_: SelectedNotebook[],styles_: {"Output"}] :=
(NotebookFind[nb, #, All, CellStyle];
NotebookDelete[nb];) & /@ styles
Together with NotebookOpen
, NotebookSave
and NotebookClose
and related functions you should be able to work on arbitrary notebooks programmatically.
Example:
docpath =
ToFileName[{$InstallationDirectory, "Documentation", "English",
"System"}, "ExampleData"];
nb = NotebookOpen[ToFileName[docpath, "document.nb"]]
CleanNotebook[nb]
Take care what other styles you choose, they´ll be gone for good...
Edit: You may also use the Option Visbible->False
to supress the opening of a window for this notebook. This seems useful for batch processing (especially if Dynamic
stuff is involved, because this will probably not trigger if invisible), but takes additional care to save and close programmatically because invisble windows do not show up in the menu bar.
Example:
doc = ToFileName[{$InstallationDirectory, "Documentation", "English",
"System", "ExampleData"}, "document.nb"];
bak = ToFileName[$TemporaryDirectory, "document_clean.nb"];
nb = NotebookOpen[doc, Visible -> False];
CleanNotebook[nb];
NotebookSave[nb, bak]
NotebookClose[nb]
NotebookOpen[doc];
NotebookOpen[bak, Visible -> True];
There is still an issue with the Visible
option being saved in the backup notebook and hiding when reopened (thus re-setting Visible->True
).
SelectedNotebook[]
should be nb
?
$\endgroup$
Commented
Nov 2, 2012 at 2:02
_String
expression) or that wrapped with NotebookOpen
?
$\endgroup$
Commented
Nov 2, 2012 at 2:32
NotebookOpen
it returns a NotebookObject
. This NotebookObject
can be used as a handle for subsequent actions. See edit.
$\endgroup$
Commented
Nov 2, 2012 at 6:57
This is how you do it through menus, As correctly noted in the comment this is equivalent to the shortcut ALT+C >> L >> ENTER.
Alt
+c
types in ç
for me.
$\endgroup$
Commented
Nov 2, 2012 at 1:09
Update December 6th: There is an updated version (plus a bug fix for M9) working on Windows, MacOSX and Linux available and installable by
Import["http://www.mertig.com/mykeys.m"]
On Windows (Mac does not work yet): Execute the following code in a notebook and restart Mathematica.
Then hitting F4 will delete all Output, Print and Message cells in the selected notebook, while pressing F8 will do so in all open notebooks which are not Wolfram Documentation notebooks. This was more difficult to program than it should be ...
$OverWriteUserBaseDirectoryKeyEventTranslations = True;
mymenuitems="
(* Delete all Output, Message and Print cells in the selected notebook *)
Item[KeyEvent[\"F4\"(*, Modifiers -> {\"Control\",\"Shift\"}*)],
KernelExecute[
Module[{nb = SelectedNotebook[]},
Scan[Function[c, If[NotebookFind[nb, c, All, CellStyle, AutoScroll -> False] =!= $Failed,
NotebookDelete[nb, AutoScroll -> False]]
],
{\"Message\", \"Output\", \"Print\"}
];
SelectionMove[nb,After,Notebook];
]
], MenuEvaluator -> Automatic ],\n
(* Delete all Output, Message and Print cells in all open notebooks *)
Item[KeyEvent[\"F8\"],
KernelExecute[
Module[{nbs = Notebooks[]},
Quiet[nbs = Select[nbs, Function[z, Not[StringMatchQ[ Replace[ NotebookFileName[z], $Failed :> \"\"],
\"*Wolfram*Documentation*\"]]]]];
Do[
Scan[Function[c, If[NotebookFind[nb, c, All, CellStyle, AutoScroll -> False] =!= $Failed,
NotebookDelete[nb, AutoScroll -> False]]
],
{\"Message\", \"Output\", \"Print\"}
];
SelectionMove[nb,After,Notebook],
{nb,nbs}]
]
], MenuEvaluator -> Automatic ],";
Quiet@CreateDirectory@FileNameJoin[{$UserBaseDirectory,"SystemFiles","FrontEnd","TextResources",$OperatingSystem}];
mykeyeventtrans=FileNameJoin[{$UserBaseDirectory,"SystemFiles","FrontEnd","TextResources",$OperatingSystem,"KeyEventTranslations.tr"}];
If[$OverWriteUserBaseDirectoryKeyEventTranslations===True,
If[FileExistsQ[mykeyeventtrans],DeleteFile@mykeyeventtrans];
CopyFile[FileNameJoin[{$InstallationDirectory,"SystemFiles","FrontEnd","TextResources",$OperatingSystem,"KeyEventTranslations.tr"}],mykeyeventtrans]
];
keytext=Import[mykeyeventtrans,"Text"];
mykeytext=StringReplace[keytext,"EventTranslations[{":>StringJoin["EventTranslations[{\n",mymenuitems,"\n"]];
Export[mykeyeventtrans,mykeytext,"Text"];
NotebookDelete[..]
use MathLink`CallFrontEnd[FrontEnd`SelectionAddCellTags[nb, {"$deleted"}]]
and then just before the last command SelectionMove[..]
insert this If[NotebookFind[nb, "$deleted", All, CellTags, AutoScroll -> False] =!= $Failed, MathLink`CallFrontEnd[FrontEnd`SelectionRemoveCellTags[nb, {"$deleted"}]]; FrontEndTokenExecute["Clear"]];
$\endgroup$
Yves Klett's answer is still pretty simple, but I thought I would add an alternative V9 solution using Cells
nb = EvaluationNotebook[]; (* change as desired *)
cells = Cells[nb, CellStyle -> {"Output"}];
CopyToClipboard @ NotebookRead @ cells; (* optional - saves cells for pasting *)
NotebookDelete[cells]
Beware: Pasting the cells back into the notebook will replace the current selection. It is not an "undo" command. It potentially could save an enormous amount of data, which you might not always want.
Here's a modification of Yves Klett's function CleanNotebook
, with an improvement suggested by @CarlWoll:
deleteStyle[nb_: SelectedNotebook[], styles_: {"Output"}] :=
With[{cells = Flatten[Cells[nb, CellStyle -> styles]]},
(* CopyToClipboard@NotebookRead@cells; (*optional*) *)
NotebookDelete[cells]
]
Again, there's no "undo" for this, so be careful.
Cells[nb, CellStyle -> {"Input", "Output"}]
selects both "Input" and "Output" cells, no need to use Map
.
$\endgroup$
Commented
Aug 26, 2017 at 0:37
CopyToClipboard
. On a Notebook of size 252 Mb the Yves Klett's CleanNotebook[]
takes 2.5 sec to evaluate and the FrontEnd takes 1.88 Gb of memory ("Private Set" according to Windows Task Manager), but deleteStyle[]
takes 64.2 sec to evaluate and the FrontEnd takes 2.43 Gb of memory (fresh session).
$\endgroup$
Commented
Aug 26, 2017 at 13:50
NotebookFind
+ NotebookDelete
approach and disappointing performance of the Cells
+ NotebookDelete
approach...
$\endgroup$
Commented
Aug 26, 2017 at 14:04
$UserBaseDirectory
. If the original is at$InstallationDirectory/foo/bar/file.tr
, then you mirror the tree and copy it to$UserBaseDirectory/foo/bar/file.tr
$\endgroup$