【问题标题】:Syntax Coloring In MathematicaMathematica 中的语法着色
【发布时间】:2011-05-25 20:30:48
【问题描述】:

f等用户自定义函数符号怎么可能在

  • f[x_] = 2 x

或可变符号如lotto in

  • 乐透 = 表[2, {10}];

自动着色?


在 M8 上的语法着色中没有提供此选项。

只有没有赋值的局部变量或全局符号。

【问题讨论】:

  • 这称为语法着色,根据this page,它在 Mathematica 5.2 或更早版本中不可用。你用的是什么版本?
  • 500,我不确定你想要的行为。您是否可以考虑扩展您的问题以包含您所期望的内容?
  • 您的意思是只有具有赋值的变量,还是您创建的任何符号名称的着色都可以接受? (对不起,我不使用 R 或 Matlab)
  • 正确的术语是符号,可以是变量、函数名、选项名等等。现在,您要为函数名称的only 符号着色吗?那将是困难的。或者,您只是想为一个或多个符号以与其他符号不同的颜色着色?在前面的问题中,也许难以理解地回答了这个问题。 (请将此评论的答案放在您的问题本身中;我没有为这个问题投票,因为我觉得它不清楚。)
  • 我认为这很难自动完成。您必须重新定义 SetSetDelayed 以检查它们是创建 DownValue(函数)还是 OwnValue(常量/变量),然后将 Symbol 移动到正确的上下文中。最好手动执行此操作...

标签: wolfram-mathematica syntax-highlighting


【解决方案1】:

这不是您所要求的,但它可能对您有用。

您可以使用以下方法按上下文突出显示符号:

SetOptions[$FrontEndSession, 
  AutoStyleOptions -> {"SymbolContextStyles" -> {"highlight`" -> Green}}
]

AppendTo[$ContextPath, "highlight`"];

现在,当您在上下文 highlight` 中创建符号时,它会自动变为绿色:

highlight`lotto ;

并且由于highlight`被附加到$ContextPath之后,这个符号就可以简单地使用了:

lotto


突出显示所有符号(变量)

如果您希望您创建的所有符号自动突出显示,请设置:

$Context = "highlight`"

之后,您创建的所有 符号都将属于上下文 highlight` 并接收颜色。

新的意思是之前没有在会话中使用过的,或者是Removed。

我想到一个更好的方法来避免可能的“阴影”问题,可能是为Global` 上下文本身设置突出显示。我没有考虑过这个的后果,但可以单独完成:

SetOptions[$FrontEndSession, 
  AutoStyleOptions -> {"SymbolContextStyles" -> {"Global`" -> Green}}
]

使用提示

  • 上下文highlight` 是完全任意的,您可以用不同的颜色突出显示多个上下文。

  • 您可以为包的上下文着色,例如Units`,以区分哪些符号属于该包。

【讨论】:

  • 非常有用,尤其是对于像mine这样的非标准评估函数! +1
  • 啊,很棒的技巧,谢谢您,Wizard 先生!
  • @500 这就是你想要的?好的。 :-)
  • @Mr.好吧,它的行为有点奇怪。我创建了一个新笔记本,打开的唯一一个粘贴了你的代码,然后高亮显示了`lotto;这是绿色的,我在下面输入的乐透变成红色,上面的第一个。
  • @500 是“上下文阴影”的标志,它表明您在运行该代码之前使用(只是在某处评估,甚至没有为其分配值)符号 lotto。基本上,您有两个符号,Global`lottohighlight`lotto,由于 Global` highlight` 都在 $ContextPath 中,Mathematica 不知道使用哪个符号。如果这让您感到困惑(这并不奇怪),请发布一个新问题,以便直接解决。我添加设置$Context = "highlight`" 的方法将不太容易出现此问题。
【解决方案2】:

这些变量在您为它们赋值后会自动着色。在默认的 Mathematica 设置下,lotto 在您指定值后立即将颜色从蓝色变为黑色。严格来说,根据您在Preferences / Appearance / Syntax Coloring / Other / Global symbols 下找到的设置,未分配的变量会被着色

如果您正在寻找一种为唯一定义是自身值的全局符号分配不同颜色的方法,那么我相信您不走运。据我所知,语法着色机制不区分自身值(“变量赋值”)、向下值(“函数定义”)和向上值(“表达式部分定义”)。

【讨论】:

  • 如果确定要实现这样的着色方案,则可能可以对前端进行编程,以通过更改单元格表达式和/或输入单元格的渲染来执行任意着色。
【解决方案3】:

正如我在上面的评论中所说,我认为这很难完全自动化。您必须 wrap SetSetDelayed 自动将变量移动到正确的上下文中,具体取决于它们是创建 OwnValue 还是 DownValue。

要手动执行此操作,只需简单编辑 Mr.Wizard's previous work...

SetOptions[$FrontEndSession, 
 AutoStyleOptions -> {"SymbolContextStyles" -> 
                       {"functions`" -> Green, "variables`" -> Pink}}]
$ContextPath = Join[$ContextPath, {"functions`", "variables`"}]//DeleteDuplicates;

variables`x;
functions`f;

这是你想要的吗?

【讨论】:

  • @Simon,这是我想要的,谢谢。我以为我做错了什么,但似乎存在上下文阴影问题。第一次使用后,所有名称都会变成红色:(。我将在我的问题中发布图像。
  • @500:尝试运行Remove["*`f", "*`x"],然后再次运行variables`x; functions`f;。也尝试使用新内核(运行Exit[])。
  • @西蒙! Remove["*f","*x"] 有效,谢谢!我还不确定如何使用新内核,但会研究一下!
  • 您会考虑使用解决方案 [列出所有用户定义的变量和函数] (stackoverflow.com/questions/6166027/…) 来实现自动化吗?
  • @Simon,对不起,我的评论格式还不能正确:(
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2014-10-30
  • 2011-07-29
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多