Создание пользовательской системы сборки для MATLAB через Sublime Text 2 - программирование
Подтвердить что ты не робот

Создание пользовательской системы сборки для MATLAB через Sublime Text 2

Я редактировал мои .m файлы в Sublime Text 2 (в дальнейшем называемый Sublime для остальной части моего вопроса) уже довольно давно и недавно привык к использованию функции build в Sublime для запуска кода Python, Я пытался установить что-то подобное для файлов MATLAB. Я пытаюсь сделать это, потому что я устал запускать свой код и редактировать свой код в отдельных окнах.

Следуя документации, я попытался использовать этот очень разумный кажущийся код ниже, где флаг "-r" запускает MATLAB для запуска моего файла, флаг "-nodesktop" запускает MATLAB без большого неудобного графического интерфейса Java, а "- nosplash" запускает MATLAB без лишнего заставки. Селектор позволяет Sublime автоматически использовать эту систему сборки для m файлов, а переменная path устанавливает путь к каталогу, в котором будет запущен MATLAB (каталог найден, запущенный "which matlab" ).

Я знаю, что я могу установить предпочтительный текстовый редактор из GUI MATLAB, но я не заинтересован в этом. Я заинтересован в использовании Sublime как системы сборки в дополнение к текстовому редактору.

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

При запуске build на моем файле без ошибок .m, я нахожу эту ошибку ниже, что не имеет смысла. Я не думаю, что это имеет смысл, потому что запустил MATLAB со стандартными параметрами командной строки, и я также получаю внутренние ошибки MATLAB.

/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]

У кого-нибудь еще были проблемы с вызовом сценариев MATLAB через альтернативную систему сборки? Я не пытался настроить систему сборки для MATLAB в Sublime в любой другой операционной системе, кроме Ubuntu 12.04, если эта информация полезна.

Теперь он работает! Вот мой Matlab.sublime-build:

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

Обновление: теперь я размещаю файлы сборки Sublime Text 2 R2012a для Linux и Mac на моей странице Github в качестве примеров: https://github.com/jessebikman/Sublime-Text-2-build-Matlab-code

4b9b3361

Ответ 1

Я возвышенный новичок, но это сработало для меня. Я считаю, что у вас есть две проблемы:

  • Выясните, как установить среду PATH (что Sublime видит) в командной строке unix. На маке мне пришлось настроить файл с именем environment.plist и добавить туда путь. Это должно избавиться от ваших ошибок awk и expr.

  • Вот мой matlab.sublime-build:

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

Обратите внимание на < непосредственно перед $file_name.

Это не идеально: добавление параметров nodesktop и nosplash приводит к ошибкам. Поскольку сборка script стоит сейчас, программа отлично работает в терминале, но я все равно получаю всплеск.

Ответ 2

просто попытался получить мой код Matlab, скомпилированный через Sublime. Закрепляйте свои фрагменты sublime-build, и это работает, спасибо за это! Тем не менее, я обычно кодирую компьютерное зрение, связанное с тем, что вы делаете это много:

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

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

Проблема в том, что возвышенное не останавливается на инструкциях pause. Вы можете преодолеть это, заменив паузы на pause(3). Не совсем приятно! Чтобы сделать сборку фактически остановленной, я нашел эти параметры Matlab.sublime-build довольно удобными:

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

Для этого требуется установить xterm в дистрибутив Linux. Теперь Sublime запустит xterminal, запустив файл Matlab, фактически остановившись на инструкциях по паузе и закройте в конце. Я не тестировал этот фрагмент на более старых версиях Matlab.

Приветствия lustiz

Ответ 3

Догадка - я не использовал систему сборки в SublimeText, но вам может потребоваться поставить параметр -r непосредственно перед именем файла. Если вы запустите matlab -r -nodesktop "mycommand", он запускается нормально, пытается выполнить файл nodesktop и не работает.

Путь установки MATLAB также (как правило, если вы не установили его по-другому) имеет нижний регистр r в r2012a. Возможно, это проблема.

Последнее, что я мог бы предложить, - также использовать параметр -sd, который указывает каталог запуска MATLAB.

Надеюсь, что эти мысли помогут!

Ответ 4

Мое решение во многом основано на вашем, но я добавил оператор try catch, чтобы избежать нескольких открытий matlab, не закрывая его после ошибки, я создал команду как:

{
"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"
}   

И если вам не терпится понять ошибки, используйте этот другой, используя только самую последнюю печать ошибок:

{
"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"
}

Наконец, если вы действительно понимаете все ошибки, используйте эту финальную версию с полной печатью ошибок:

{
    "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"
}