Skip to main content

front end - Prompt a set of possible options


Recent versions of Mathematica dynamically prompt a list of possible options. For example, when typing


Plot[x, {x,0,1}, PlotStyle->


After typing the arrow, Mathematica prompt a list Gray, Dashed, Thick for choice. How to define similar behavior for user defined functions? For example,


Options[myFun] = {myOpt -> value};
myFun[OptionsPattern[]] := 1;

How to prompt a set of possible options, like opt1, opt2, opt3 right after typing


myFun[myOpt->

Answer



Thanks for asking this question; I might not have discovered this customizable area without it.


The auto-completion option values are automatically loaded on Front End start from:


FileNameJoin[{$InstallationDirectory, "SystemFiles", "FrontEnd",

"SystemResources", "FunctionalFrequency", "OptionValues"}]

This directory contains a series of Package (.m) files each with the name of a function, e.g. ArrayPlot.m. The file name itself determines that this will apply to the function ArrayPlot. It also contains an additional file that appears to apply to all functions: CommonOptions.m


The structure of each file is a list of Rules:


{Extension -> {"Automatic"}, Trig -> {"True", "False"}}


  • The right hand side of each rule is always a list of Strings or an empty list {}

  • Option values that are actual strings must be escaped: "\"string\""

  • Option names must be Symbols (thanks Kuba)



A special Rule form exists for icons within the menu, e.g. from ArrayPlot.m:


PlotTheme ->
{{"\"Web\"", "PlotTheme-ArrayPlot-Web.png"},
{"\"Minimal\"", "PlotTheme-ArrayPlot-Minimal.png"},
{"\"Detailed\"", "PlotTheme-ArrayPlot-Detailed.png"},
{"\"Business\"", "PlotTheme-ArrayPlot-Business.png"},
{"\"Marketing\"", "PlotTheme-ArrayPlot-Marketing.png"},
{"\"Scientific\"", "PlotTheme-ArrayPlot-Scientific.png"},
{"\"Monochrome\"", "PlotTheme-ArrayPlot-Monochrome.png"},

{"\"Classic\"", "PlotTheme-ArrayPlot-Classic.png"},
{"\"Default\"", "PlotTheme-ArrayPlot-Default.png"}}

Each of these icon files reside in:


FileNameJoin @ {$InstallationDirectory, "SystemFiles", "FrontEnd", 
"SystemResources", "Bitmaps", "Popups", "CodeCompletion", "Thumbnails"}

I have not checked to see if other paths are also searched.


As an example I created a new file foo.m in the OptionValues directory with the content:


{myOption -> {"Doc", "Grumpy", "Happy", "Sleepy", "Bashful", "Sneezy", "Dopey"}}


Now after (re)starting Mathematica:


enter image description here


Comments

Popular posts from this blog

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

mathematical optimization - Minimizing using indices, error: Part::pkspec1: The expression cannot be used as a part specification

I want to use Minimize where the variables to minimize are indices pointing into an array. Here a MWE that hopefully shows what my problem is. vars = u@# & /@ Range[3]; cons = Flatten@ { Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; Minimize[{Total@((vec1[[#]] - vec2[[u[#]]])^2 & /@ Range[1, 3]), cons}, vars, Integers] The error I get: Part::pkspec1: The expression u[1] cannot be used as a part specification. >> Answer Ok, it seems that one can get around Mathematica trying to evaluate vec2[[u[1]]] too early by using the function Indexed[vec2,u[1]] . The working MWE would then look like the following: vars = u@# & /@ Range[3]; cons = Flatten@{ Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; NMinimize[ {Total@((vec1[[#]] - Indexed[vec2, u[#]])^2 & /@ R...