帮助格式化我的笔记本电脑.从'代码'样式到输入样式

Nas*_*ser 5 wolfram-mathematica

我觉得我做了些傻事.

我将我的单元格样式更改为"代码"并开始更改缩进并按照我喜欢的方式移动代码,(因为在"代码"单元格样式中更容易实现,因为笔记本界面不会妨碍).但经过一段时间的尝试后,我发现了这种风格的其他问题.

现在我将样式改回'输入'.但是现在所有的代码都包含了所有这些额外的空格,并且代码看起来不再像原来的"输入"样式那样好看.

我对代码进行了太多编辑和手动格式化.

有没有办法告诉Mathematica将代码"自动格式化"回默认输入样式?即删除所需的所有额外空间,按照它们的方式重新排列等等......

如果我必须亲手做到这一点,我将永远带我.我找不到这样的选项.我在菜单上尝试了很多选项,没有任何帮助.

PS.在Matlab中,这是微不足道的,只需选择所有代码,然后从菜单中选择"smart-ident",它就会这样做.

PS.我尝试过emacs Mathematica模式,他们也没有prety-print.

编辑

我试过这些:选择单元格,然后选择单元格 - >转换为,然后选择'输入窗体'并选择'输入窗体显示'.

这似乎已经删除了所有额外的空白区域.这很好.现在我只需要在所有正确的位置点击返回以将其恢复为原始形式.

至少这比手动删除空格要好得多.所以,灾难现在似乎已被遏制.

编辑

将"代码"样式转换回"标准格式"后的屏幕截图.很难读.

在此输入图像描述 谢谢,

编辑

为了确定问题是什么,给出了一些Mathematica代码,这些代码被"修复",并手动格式化,手动空间插入和手动插入返回,现在如果我只是将它放在具有默认样式的笔记本中,我希望它能够智能缩进到默认设置,并拥有所有换行等等......好像它最初是以默认样式编写的.即如果使用"输入"代码样式编写它将会是什么样的.

这是一个小函数,作为我手工格式化的一个例子.当我将它粘贴在这里时,它看起来格式不会更好.如果您将此代码复制到您的笔记本,默认样式,然后如何自动将其格式化回默认设置而不用手工完成?

If[Abs@omega <= $MachineEpsilon,
    (
      data = {{0, 0}};
      p    = ListPlot[data, Sequence@plotOptions]
     ),
    (
      driverPeriod            = 2. Pi/Abs@omega;
      valuesOfDriverAmplitude = 
    Range[aStart, aStart + aLen, aLen/aIntervals];
      timeValues              = 
    Range[initialDriverPeriod*driverPeriod, 
     finalDriverPeriod*driverPeriod, driverPeriod ];

      data  = 
    Table[0, {Length[valuesOfDriverAmplitude]}, {Length[timeValues ]}];
      total = Length[timeValues]*Length[valuesOfDriverAmplitude];
      bifurcationProgress = 0.;
      count = 0.;

      Do[
         (
           {x1, x2, x3} = 
      solve[q, valuesOfDriverAmplitude [[i]], omega, phase, 
       initialDriverPeriod*driverPeriod,
                                (finalDriverPeriod)*driverPeriod, x10,
        x20, isDamped, 4, 4];
           currentTorqueAmplitude = valuesOfDriverAmplitude[[i]];
           Do[
              (

       data[[i, j]] = {currentTorqueAmplitude, x2[timeValues[[j]]  ]};
                count      += 1;
                bifurcationProgress = count/total;
               ),
                {j, 1, Length[timeValues]}
              ]
          ),
         {i, 1, Length[valuesOfDriverAmplitude]}
         ];

     p = ListPlot[Flatten[data, 1], Sequence@plotOptions]
     )
  ];
Run Code Online (Sandbox Code Playgroud)

编辑 下午6点

1)将笔记本保存为m文件(mathematica包),名为aclFix.m 2)然后我做了以下

str=Import["aclFix.m")
Run Code Online (Sandbox Code Playgroud)

也试过了

str=Get["aclFix.m"];
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下,我得到的只是显示在屏幕上的实际Manipulate.下面显示的命令(StringReplace etc ....)对它不起作用,因为它不是一个字符串.我收到很多错误,例如

    StringReplace::strse: String or list of strings expected at position 1 in 
StringReplace[Manipulate[<<1>>,
{{aStart,0.9,},0,2,0.01,ImageSize->Tiny,ImagePadding->0,ControlPlacement->1},
{{aLen,0.2,},0.01,2,0.01,ImageSize->Tiny,ImagePadding->0,ControlPlacement->2},
<<45>>,SynchronousUpdating->False,ContinuousAction->False,<<6>>],
{(x_/;x==FromCharacterCode[32])..->,(x_/;x==<<17>>[9])..->}]. >>
Run Code Online (Sandbox Code Playgroud)

可能是我误解了解决方案..

编辑 凌晨1点

我将笔记本导出为"m"文件,将其导入为

str = Import["aclFix.m", "Text"];
Run Code Online (Sandbox Code Playgroud)

然后

code=StringReplace[str, {(x_ /; x == FromCharacterCode[32]) .. -> 
   "", (x_ /; x == FromCharacterCode[9]) .. -> ""}]
Run Code Online (Sandbox Code Playgroud)

然后

Export["fix.m", code]
Run Code Online (Sandbox Code Playgroud)

但它仍然是一个字符串.当我将其导回时,它仍然是一个字符串.我试过ToExpression [代码],但它没有做任何事情.如何将其转换为实际代码?这是使用文本编辑器查看.m的示例.我用上面的代码来测试它.可能我们在这附近了吗?

会更加注重它.

(* Created by Wolfram Mathematica 8.0 for Students - Personal Use Only : www.wolfram.com *)

"If[Abs@omega<=$MachineEpsilon,\n(\ndata={{0,0}};\np=ListPlot[data,Sequence@p\

lotOptions]\n),\n(\ndriverPeriod=2.Pi/Abs@omega;\nvaluesOfDriverAmplitude=\nR\

ange[aStart,aStart+aLen,aLen/aIntervals];\ntimeValues=\nRange[initialDriverPe\

riod*driverPeriod,\nfinalDriverPeriod*driverPeriod,driverPeriod];\n\ndata=\nT\

able[0,{Length[valuesOfDriverAmplitude]},{Length[timeValues]}];\ntotal=Length\

[timeValues]*Length[valuesOfDriverAmplitude];\nbifurcationProgress=0.;\ncount\

=0.;\n\nDo[\n(\n{x1,x2,x3}=\nsolve[q,valuesOfDriverAmplitude[[i]],omega,phase\

,\ninitialDriverPeriod*driverPeriod,\n(finalDriverPeriod)*driverPeriod,x10,\n\

x20,isDamped,4,4];\ncurrentTorqueAmplitude=valuesOfDriverAmplitude[[i]];\nDo[\

\n(\n\ndata[[i,j]]={currentTorqueAmplitude,x2[timeValues[[j]]]};\ncount+=1;\n\

bifurcationProgress=count/total;\n),\n{j,1,Length[timeValues]}\n]\n),\n{i,1,L\

ength[valuesOfDriverAmplitude]}\n];\n\np=ListPlot[Flatten[data,1],Sequence@pl\

otOptions]\n)\n];"
Run Code Online (Sandbox Code Playgroud)

acl*_*acl 5

有一个代码示例(不仅仅是视觉)会很有用.与此同时,也许这会奏效:

将代码保存在m文件中.然后将其导入变量str,然后运行它

StringReplace[str,
 {
  (x_ /; x == FromCharacterCode[32]) .. -> "",
  (x_ /; x == FromCharacterCode[9]) .. -> ""
  }
 ]
Run Code Online (Sandbox Code Playgroud)

并将结果保存到另一个m文件中.这样做是为了删除一个或多个空格或制表符的所有系列.因此,例如

str =
 "f[
    g[
        u   ]]"
Run Code Online (Sandbox Code Playgroud)

(包含空格和制表符)然后运行我给出的代码

f[
g[
u]]
Run Code Online (Sandbox Code Playgroud)

并且您可以将其保存回m文件中.

如果这不符合您的要求,那么如果您提供一段格式错误的代码可能会有所帮助.

(或者您可以尝试使用emacs中的交互式regexp-builder:m-x re-builder但如果您不熟悉regexp ,则可能不值得)