# Adapting “Find and Replace” functionality to work with Patterns

I was thinking if there is something like Find and Replace (Crtl+F) functionality adapted to work with patterns.

Probably not, but it seems possible to create this with some effort and skills in low-level-notebook-programming.

My question is: if there is not such functionality bulid in, maybe someone have worked on this?

Example of what I'm thinking it should be able to do:

Text["test string"]


Style["test string", Bold]

-
NotebookRead@Cells[] and work with CellExpression is the final choice I like. –  HyperGroups Jun 14 '13 at 9:20
I suppose it would be nice if we can use regexes in the find/replace box... –  Ｊ. Ｍ. Jun 14 '13 at 14:23
It doesn't exactly answer your question, but you probably should know that such functionality is available in the Wolfram Workbench, but restricted to the package files if I remember correctly. It will also search a whole directory, if you want. As that is basically a Mathematica plugin for eclipse, you'll also have access to a search with regexes. –  Albert Retey Jun 15 '13 at 10:45

1. Parse cell objects to box data.
2. Use MakeExpression[boxes] to convert boxes to Unevaluated standard form expressions.
3. Find expressions that match the pattern p_.
4. Use ToString[expr, InputForm]] to convert the target expressions to strings in InputForm.
5. Find those strings in notebook and replace them to what you want (r_).

 NBReplace[p_, r_] :=
Cases[NotebookRead /@ Cells[], Cell[BoxData[content_], "Input", ___] :>
(Cases[MakeExpression[#, StandardForm],
target: p :>
(NotebookFind[SelectedNotebook[],
ToString[target, InputForm]];
NotebookWrite[SelectedNotebook[], ToString[r, InputForm]];
target-> r), Infinity] &) /@
If[ListQ[content], content, {content}]] // Flatten


Examples:

Style["test string", Bold]
NBReplace[Text[x_String], Style[x, Bold]]


results: Style["test string", Bold]

Also you can do:

Foo[1]
NBReplace[Foo[x_Integer], Bar[x + 5]]


results: Bar[6]

If you want to bind to a custom shortcut, see this: http://stackoverflow.com/questions/4209405/customizing-mathematica-shortcuts
Hope it makes sense, cheers :)

-
Thank You for those remarks. This link is also correct anticipation of my needs. :) –  Kuba Jun 14 '13 at 22:17

This is too long for a comment. It only deals with gettings strings that you may then use to search for your patterns.

It is a shame that ToString[boxes, InputForm] does not give you a string that you want, as the resulting expression will have a lot of braces in it. Otherwise, I'd start with

boxesToStringOrSimplyString[cell_] :=
If[StringQ[cell // First], cell[[1]],
ToString[cell[[1, 1]], InputForm]]



string expressions of the contents of cells.

Anyway, you can also get such string expressions by using copy to clipboard. But it seems quite silly to me :P

Cell["", "Text"] // CellPrint;
cells = Cells[];
storeCellObj = Cells[] // Last;
pasteCells = cells[[;; -3]];
nb = EvaluationNotebook[];

Do[
SelectionMove[pasteCells[[iii]], All, CellContents];
FrontEndExecute[FrontEndToken["Copy"]];
SelectionMove[storeCellObj, After, CellContents];
FrontEndExecute[FrontEndToken["Paste"]];
FrontEndExecute[FrontEndToken["Linebreak"]];
CopyToClipboard[iii];
FrontEndExecute[FrontEndToken["Paste"]];
FrontEndExecute[FrontEndToken["Linebreak"]];
,
{iii, 1, Length[pasteCells]}
]


To find nice FrontEndTokens, check out, from the folder, \$InstallationDirectory <> "/SystemFiles/FrontEnd/TextResources/<>"My system" the file KeyEventTranslations.tr. That's where I found the "Linebreak" token.

Another alternative is to save a .m file and to import that I think. There is also a menu item Clear Formatting that does almost what we want.

-
I knew it would lure You :) I'm going to test some things and then I will respond to Your post. –  Kuba Jun 14 '13 at 21:45
@Kuba alright! I'm sorry I did not put much explanation in. Note in particular that the CopyToClipboard thing works (for its silly purpose) if you put it in a fresh input cell in the bottom of your notebook. To get it into a textcell is nice as textcells don't use boxes. But it is quite silly, so I didn't want to spend too much time on it :) (and neither should you ;) ). But I think getting the right strings is crucial and I'm sure if there is a convenient way to get them. We'll see if somebody knows how :). –  Jacob Akkerboom Jun 14 '13 at 22:04
You are right, I'm not going to copy anything to clipbard. :) –  Kuba Jun 14 '13 at 22:11
@Kuba I was hoping my recent answer would help with this, but on closer look there is still a big gap to fill. Oh well :) –  Jacob Akkerboom Jul 22 '13 at 9:02
@Kuba oh there is no new version :). Just this remark, I felt things were related. Hope to catch you later. –  Jacob Akkerboom Jul 22 '13 at 9:06