Creating custom build system for MATLAB through Su

2020-05-17 10:58发布

I have been editing my .m files in Sublime Text 2 (henceforth referred to as Sublime for the remainder of my question) for quite some time now, and having recently become accustomed to using the build function in Sublime for running Python code, I was trying to setup something similar for MATLAB files. I am attempting to do this because I am tired of running my code and editing my code in separate windows.

Following the documentation, I tried using this very reasonable seeming code below, where the '-r' flag launches MATLAB to run my file, the "-nodesktop" flag launches MATLAB without the big hulking Java GUI, and the "-nosplash" flag launches MATLAB without the unnecessary splash screen. The selector allows for Sublime to automatically use this build system on m files, and the path variable sets the path to the directory that will launch MATLAB (directory found by running "which matlab").

I am aware that I can set an preferred text editor from within the MATLAB GUI, but I am not interested in doing that. I am interested in using Sublime as a build system in addition to a text editor.

{
    "cmd": ["matlab", "-r", "-nodesktop", "-nosplash", "$file_name"],
    "selector": "source.m",
    "path": "/usr/local/MATLAB/R2012a/bin"    
}

Upon running build on my errorless .m file, I find this error below, which doesn't make sense. I don't think it makes sense because have launched MATLAB with the standard command line options, and am receiving MATLAB internal errors, too.

/usr/local/MATLAB/R2012a/bin/matlab: 1: /usr/local/MATLAB/R2012a/bin/matlab: awk: not found
/usr/local/MATLAB/R2012a/bin/matlab: 1: /usr/local/MATLAB/R2012a/bin/matlab: expr: not found

Internal error 2: Could not determine the path of the
              MATLAB root directory.

                  original command path = /usr/local/MATLAB/R2012a/bin/matlab
                  current  command path = /usr/local/MATLAB/R2012a/bin/matlab

                  Please contact:

                      MathWorks Technical Support

                  for further assistance.

[Finished in 0.1s with exit code 1]

Has anybody else had problems like this invoking MATLAB scripts via an alternate build system? I have not tried to set up a build system for MATLAB in Sublime on any other operating system besides Ubuntu 12.04, if that information is useful.

It works now! Here is my Matlab.sublime-build:

{
    "cmd": ["/usr/local/MATLAB/R2012a/bin/matlab", "-nosplash", "<$file_name"],
    "selector": "source.m"
}

Update: I'm now hosting Sublime Text 2 R2012a build files for Linux and for Mac on my Github page as examples: https://github.com/jessebikman/Sublime-Text-2-build-Matlab-code

4条回答
我想做一个坏孩纸
2楼-- · 2020-05-17 11:34

Just a guess - I haven't used the build system in SublimeText - but you might need to put the -r option immediately before the filename. If you run matlab -r -nodesktop "mycommand", it starts up normally, tries to execute a file nodesktop, and fails.

The MATLAB installation path also (typically, unless you've installed it differently) has a lower-case r in r2012a. Maybe that's an issue.

The last thing I could suggest is to also use the -sd option, which specifies the MATLAB startup directory.

Hope those thoughts help!

查看更多
欢心
3楼-- · 2020-05-17 11:45

I am a sublime newbie, but this worked for me. I believe you have two problems:

  1. Figure out how to set the PATH environment (that Sublime sees) to be that of the unix command prompt. On a mac, I had to setup a file called environment.plist and add the path there. This should get rid of your awk and expr errors.

  2. Here is my matlab.sublime-build:

    { "cmd": ["/Applications/MATLAB_R2011b.app/bin/matlab","<$file_name"] }

Note the < just before $file_name.

This isn't perfect: adding the nodesktop and nosplash options lead to errors. As the build script stands now, the program runs fine in the terminal, but I still get the splash.

查看更多
不美不萌又怎样
4楼-- · 2020-05-17 11:45

just tried to get my Matlab code compiled through Sublime. Plugged in your sublime-build snippets and it works, thanks for that! However, I usually code computer vision related stuff where you kinda do this a lot:

    img = doImageConversion();
    imshow(img);
    pause;

    img = doAnotherImageConversion();
    imshow(img);
    pause;

The issue here is that sublime does not halt on pause instructions. You may overcome this by replacing the pauses by pause(3). Not quite satisfying though! To make the build actually halt I found these Matlab.sublime-build settings pretty handy:

{
    "cmd": ["xterm", "-e", "matlab", "-nosplash", "-nodesktop", "-r", "run $file_name; quit;"],
    "selector": "source.m"
}

This requires xterm to be installed on your linux distribution. Now Sublime will start the xterminal running the Matlab file over there, actually halt on pause instructions and quit in the end. I didn't test this snippet on older Matlab versions.

Cheers lustiz

查看更多
你好瞎i
5楼-- · 2020-05-17 11:54

My solution is much based on yours, but I added the try catch statement to avoid open matlab several times without closing it after an error, I created the command as:

{
"cmd": ["/Applications/MATLAB_R2014b.app/bin/matlab","-nosplash", "-nojvm", "-r", "cd $file_dir; try run $file_name; catch varException; display(varException); end; quit;"], "selector": "source.m"
}   

And if you are eager to understand the errors, use this other one with just the most recent stack printing of errors:

{
"cmd": ["/Applications/MATLAB_R2014b.app/bin/matlab","-nosplash", "-nojvm", "-r", "cd $file_dir; try run $file_name; catch varException; display(varException.message);display(varException.cause);display(varException.stack(1)); end; quit;"], "selector": "source.m"
}

Finally, if you are really into understanding all the errors, use this final version with full stack printing of errors:

{
    "cmd": ["/Applications/MATLAB_R2014b.app/bin/matlab","-nosplash", "-nojvm", "-r", "cd $file_dir; try run $file_name; catch varException; display(varException.message); display(varException.cause);for i = length(varException.stack):-1:1; display(varException.stack(i)); end; end; quit;"], "selector": "source.m"
}
查看更多
登录 后发表回答