【问题标题】:Mathematica editor: Removing the right matching ']' automatically when the left '[' is removed?Mathematica 编辑器:删除左“[”时自动删除右匹配“]”?
【发布时间】:2011-09-02 12:32:39
【问题描述】:

在 Mathematica 编辑器(即笔记本)中,我一直发现的最困难的事情之一是当我想编辑一些长表达式,然后去删除某个表达式的左端“[”,然后我有机会删除正确的“]”,单元格中的代码将变得一团糟,因为它不再平衡,因此很难去追逐,现在挂起,右端“]”,因为它不再在原来的位置!

这是一个简单的例子,假设我们有这个

Text[Row[{PaddedForm[currentTime, {6, 3}, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}]}]]

现在说我想删除外部 Text[] 调用。所以我删除了“Text[”,在我有机会删除另一边的“]”之前,笔记本现在会到处乱扔东西,很难找到正确的“]”。对于长单元格(演示工作就是这种情况),代码可以大幅度移动,并且右侧的“]”也会消失,必须向下和向上滚动才能找到它。

有没有办法通过选项等设置它,这样当我删除左边的“[”时,Mathematica 会自动删除匹配的右边“]”?这也适用于 "(" 和 ")"。

这对我来说笔记本编辑器的使用确实是个大问题。无法告诉你我花了多少时间只看挂着的“]”。

谢谢 --纳赛尔

【问题讨论】:

  • 这是尽可能使用f@x 符号的原因之一
  • 该解决方案只有在您的初始表达式是平衡的情况下才有效,因为如果不是,您可以删除错误的关闭器。
  • @belisarius ,是的,我尽可能使用 f@,但如果我想将第二个参数传递给 f,则不能使用 f@,如 f[x,3]。那么 f@x 将不起作用,至少我不知道在这种情况下它会如何。
  • 那是只要你能部分:)
  • 好的,更新,有一种我想要的方法,所以这对我来说不再是问题,问题解决了。我要关闭这个问题吗?不知道怎么做。无论如何,这是解决方案,感谢 WReach,我发现当我将单元格的样式更改为 CODE 而不是输入时,现在 Mathematica 不再进行自动格式化,因此当我删除左侧的“[”时,代码确实在编辑过程中不会自动更改我的布局。所以,现在我可以看到右端“]”在哪里,因为它确实像以前一样跳来跳去。所以,问题解决了。从现在开始将使用代码样式。喜欢它不仅仅是输入。

标签: wolfram-mathematica


【解决方案1】:

我会考虑一种自动方法,但我目前使用以下方法处理:

  1. 将光标放在要删除的函数内的第一个标记上(在本例中为 Row)

  2. Ctrl+. 直到选中里面的所有内容(在本例中是两次)

  3. 复制

  4. 按一次Ctrl+. 将要删除的功能包含在选择中

  5. 粘贴

多做几次真的很快。


Andrew Moylan 建议使用这种鼠标变体:

这是我用于此常见操作的变体:

  • 三次单击“行”,Ctrl+C,三次单击“文本”,Ctrl+V,完成

【讨论】:

  • 这是我用于此常见操作的变体:三次单击“行”,Ctrl+C,三次单击“文本”,Ctrl+V,完成。
  • @Andrew 也可以。它本质上是等价的。我似乎倾向于使用键盘方法。实际上,这要好一点,因为您通过粘贴来消除删除。我将相应地改变我的答案和习惯。
  • @巫师先生。谢谢,但是当您在第二步中说时,请按直到选择所有内容,好吧,这仍然需要视觉/眼睛协调来计算事物以找到何时到达匹配的权利“]”。在长而复杂的表达式中,例如 Grid[{{Row[{[.... 等等......这将无济于事,因为仍然需要确保他们得到正确匹配的“]”。我真的认为这应该由编辑器自动化。选择左边的标记,然后删除,然后自动匹配的“]”消失了。如果没有匹配的“]”,则可能会发出哔哔声等。谢谢,纳赛尔
  • @Nasser 如果有“合同选择”命令,那么您可以选择要删除的函数的头部和主体,然后选择“合同”以保留要保留的部分,但我找不到这样的功能。我正在努力想出另一种可以用来自动化的方法。另外,您会发布一个复杂表达式的示例,以及您要删除的部分吗?我认为由于选择的扩展方式,它应该不难看到,但我也可能想得不好。
  • @Mr.向导:我不确定自动方法会那么简单。对我来说,除了您之前关于自动将[[ 转换为 的问题之外,这看起来像是一层复杂性,但我可能是错的。
【解决方案2】:

我刚刚在这里注册,现在我没有 MMA,所以这只是提议的解决方案的概述。 这是我在这里的第一个答案,所以请多多包涵。 顺便说一句……很高兴在这里看到很多数学组。 :-)

纳赛尔的问题/问题很常见。 我个人使用 Andrew 描述的相同技术。 用一个按钮更优雅地解决这个问题并不难。

创建一个带有操作按钮的小按钮调色板。 它会像这样工作:

  1. 你双击最外面的 功能(你想要的 删除)。因为你双击它 您将选择所有内容 最右边]。
  2. 您单击操作按钮。这 按钮中的代码将简单地得到 选择并提取 [] 对中的参数,然后它 将参数粘贴到 笔记本中的选择。没有 当然是评估论点。

就是这样。几行代码。

既然您已经完成了,您可能会在调色板中添加更多按钮。 例如:

  • 评论/取消评论的按钮 选择
  • 将 {} 或 () 包装到 选择
  • 将 fun[] 包装到 选择(可以选择有趣的 所以以后可以用 适当的功能)

所以你最终会创建自己的编程调色板。

【讨论】:

  • magma:你创造过这样的调色板吗?这应该是相当可行的,但如果你已经做到了,那么你可以省去我们其他人的努力,也许把代码放在Mma toolbag question
  • @Simon 不,我还没有做调色板。坦率地说,我一直使用 Moylan/Mr Wizard 描述的复制/粘贴技术
【解决方案3】:

如果你要删除一个只有一个参数的函数,你可以

  • 删除函数名
  • 在内部函数上使用 (Ctrl + ., Ctrl + .) 来选择其范围
  • 转到该范围的末尾并删除]

该网站还提供有关 Mathematica 中平衡括号的更多信息: http://reference.wolfram.com/mathematica/howto/BalanceBracketsAndBraces.html

(如果您要删除具有多个参数的函数,那么自动平衡可能无论如何都无济于事,因为您仍然必须追逐额外的参数。)

【讨论】:

  • 我使用了一个非常相似的顺序:Text[ 上的退格、右箭头、ctrl+.、ctrl+.、右箭头、退格。这假设内部表达式是格式良好的。这是在 V7 和 V8 中 - 早期版本不能很好地处理选择的右箭头。
【解决方案4】:

我不知道如何自动执行,但这里有一个建议可以帮助您直观地跟踪括号/括号并帮助您手动删除它们。

将代码分成多行,以便每个功能块在单独的行上打开和关闭(有点像 C、C++)。例如,您上面的代码看起来像

Text[
 Row[{
   PaddedForm[
    currentTime, {6, 3},
    NumberSigns -> {"", ""},
    NumberPadding -> {"0", "0"}
    ]
   }]
 ]

我在超过一行左右的代码块中使用它,尤其是在绘图时,很容易跟踪您提供的选项。

【讨论】:

  • 恭喜获得 6000 次代表 =)
  • 我走得更远。我通常什至平衡大括号,就像你在一行上留下的那些与 Row[ 及其右括号
  • @Sjoerd:是的,这样做可以保持一致性。这只是我使用 LevelScheme 的一个习惯。很多图形命令紧接着打开大括号,所以我开始将它们放在同一行,因为我认为它们是打开/关闭功能块的一部分
  • 顺便说一句,虽然我认为这是(不是这样?)常识,但在处理程序生成的代码时,它会让您失望,例如许多 Mathematica 函数返回的大型表达式。
  • @Sjoerd,我的意思是,如果你有一个用Solve 或任何其他无数函数生成的大表达式,并且你出于任何原因开始手动编辑它,你就不会去在一开始就为您准备好括号(除非我错过了一个选项)。维护我自己的输入代码没有太大问题,而是生成的代码,或者我从其他地方复制的代码。
【解决方案5】:

我在这里回答我自己的问题。 使用 CODE 作为单元格类型而不是 INPUT 为我解决了这个问题。 关闭。

【讨论】:

  • 纳赛尔,尊敬的,我不认为这是解决问题的办法。我相信这是一个很好的问题,并且应该对未来真正的、自动的解决方案持开放态度。
  • 好的,当然,我想在这里我应该自己关闭问题而不是让它打开。随意打开它。我不知道怎么做。我会删除我所做的答案吗?
  • 我认为您应该明确指出,“代码”单元格不能解决自动删除问题中括号部分的问题。它只会停止“输入”单元格中发生的自动代码包装/格式化。
【解决方案6】:

下面将添加键盘快捷键Shift+Backspace来删除当前光标位置最近的括号。它还在编辑菜单中添加了一个菜单项。

此函数获取当前剪贴板内容并删除第一个和最后一个“单词”。

cutClipboardBrackets:=Module[{nb},
 nb=CreateDocument[{},Visible->False,WindowSelected->False];
 NotebookWrite[nb,NotebookGet@ClipboardNotebook[]]
 SelectionMove[nb,All,CellContents];
 FrontEndExecute[FrontEndToken[nb,"MoveCellBeginning"]]          
 SelectionMove[nb,All,Word,1];
 NotebookDelete[nb];
 FrontEndExecute[FrontEndToken[nb,"MoveCellEnd"]];
 SelectionMove[nb,All,Word,1];
 NotebookDelete[nb];
 SelectionMove[nb,All,CellContents];
 FrontEndExecute[FrontEndToken[nb,"Copy"]];
];

这可用于删除括号,因为它们是复制FrontEndExecute[FrontEndToken[nb,"Balance"]] 时的第一个和最后一个单词。选择、剪切、删除附加括号和粘贴的功能是:

RemoveBrackets[nb_]:= ( 
 FrontEndExecute[FrontEndToken[nb,"Balance"]];
 FrontEndExecute[FrontEndToken[nb,"Cut"]];
 cutClipboardBrackets;
 FrontEndExecute[FrontEndToken[nb,"Paste"]];
);

最后我们可以保护函数并添加键盘快捷键(like here):

 Protect[cutClipboardBrackets,ClipboardBrackets];

 FrontEndExecute[
  FrontEnd`AddMenuCommands[
   "SelectAll",{Delimiter,MenuItem["Delete Outer Brackets",
     FrontEnd`KernelExecute[nb=CreateDocument[Null,Visible->False,WindowSelected->True];
  NotebookWrite[nb,Cell[BoxData[RowBox[{"RemoveBrackets[SelectedNotebook[]]"}]],"Input"]];
  SelectionMove[nb,Previous,Cell];
  SelectionEvaluate[nb];
  NotebookClose[nb]],
  MenuKey["Backspace",Modifiers->{"Shift"}],System`MenuEvaluator->Automatic]}]]

【讨论】:

  • @belisarius:是的,我有,这很棒。难道不能把像这样的老 Mathematica 问题移到那里吗? Funfact:您在我的第一个回答中欢迎我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2010-11-12
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
相关资源
最近更新 更多