Часть 1
Изменение стандартного макета MATLAB
Мы решили шесть перечисленных проблем, изменив макет рабочего стола на тот, который нам больше нравится. Я использую макет, который выглядит так по умолчанию:
Давайте воспроизведем это.
- Просто перетащите главное окно MATLAB туда, где вы хотите, например, разверните его. Решено!
- Щелкните значок стрелки прямо под красным выходом × в верхнем правом углу окна MATLAB, чтобы свернуть ленту. Решено!
- Перетащите заголовок панели "Текущая папка" (той части, где написано "Текущая папка") в нужное место. Вы можете положить его практически в любом месте. При перетаскивании вы видите тень панели, где она будет расположена, когда вы отпустите кнопку мыши. Вы можете расположить панель в другом месте или перетащить ее в верхний левый, левый верхний, правый верхний, верхний, нижний или любой другой заголовок другой панели, чтобы создать панель текущей папки с вкладками, которая по умолчанию закрыта. MATLAB называет это минимизированным. Когда панель свернута, она занимает гораздо меньше места и может быть открыта, нажав на вкладку или наведя курсор мыши на вкладку. Другое решение - полностью закрыть панель, удалив ее с рабочего стола MATLAB. Это можно сделать, сначала отсоединив панель, щелкнув правой кнопкой мыши заголовок → щелкните "Отменить" (или нажав Ctrl+Shift+U). Это открывает панель в отдельном окне. Закройте окно, и оно исчезнет. Если вы случайно потеряли подобное окно, вы можете восстановить его с помощью вкладки "Главная" главной ленты → нажмите "Макет" → снова включить текущую папку. Чтобы снова закрепить окно, нажмите на крошечную стрелку в верхнем правом углу окна панели → щелкните Dock (или нажмите Ctrl+Shift+D). Я поместил текущую папку в левую верхнюю вкладку.
- Я поместил Рабочую область рядом с вкладкой Текущая папка. Решено!
- Просто нажмите на × справа на панели желтого наконечника.
- Выберите папку, которую вы хотите использовать по умолчанию, и перейдите к ней, используя панель "Текущая папка" или адресную строку (на снимке экрана выше, это раскрывающийся список прямо под лентой с надписью ► C: ►). Чтобы установить его как путь по умолчанию, сначала скопируйте адрес. Я считаю, что в версиях MATLAB начиная с R2014b вы можете установить текущую папку по умолчанию в настройках MATLAB (найдите ее на вкладке Главная ленты → Настройки → Общие настройки → Начальная рабочая папка). Если вы используете более старую версию, вы можете установить текущую папку MATLAB по умолчанию с помощью команды
userpath(newpath)
, в которой newpath - это скопированный вами путь. Обратите внимание, что newpath
должен быть строкой, то есть заключаться в 'single straight apostrophes'
, а не в "двойные апострофы", которые вы могли скопировать. Решено!
История команд (доступ к которой осуществляется нажатием ↑ в окне команд) и редактор (нажмите Ctrl+N в окне команд, чтобы открыть ее), также были перемещены.
Рекомендуется сохранить этот макет, чтобы вы могли легко переключиться на него, если что-то или кто-то изменилось (например, когда несколько пользователей используют один и тот же MATLAB с разными макетами). Сделайте это с помощью вкладки «Главная» ленты → Макет → Сохранить макет → присвойте своему макету имя. Он сохраняется в виде XML-файла с именем <your layout name>MATLABLayout.xml
в каталоге настроек MATLAB, который можно найти с помощью команды prefdir
. Все настройки MATLAB, история команд, макет по умолчанию и т.д. Хранятся в этом каталоге. Это очень полезные знания для второй части этого ответа!
Большинство (если не все) другие предпочтения также хранятся там.
Теперь вторая часть моего ответа, которая отвечает на часть 2 моего вопроса.
Часть 2
Сохранение пользовательских настроек на компьютерах, которые их сбрасывают
Прежде всего: примените все свои пользовательские настройки и сохраните макет для желаемого рабочего стола MATLAB, как описано в части 1 этого ответа.
Теперь мы будем умно использовать файлы startup.m
, finish.m
и несколько файлов .bat.
startup.m
- это файл, который, если он присутствует в пути MATLAB, запускается при запуске, прежде чем вы получите контроль над окном MATLAB. Этот файл представляет собой скрипт, который можно использовать для любых действий. Мы установим его так, чтобы:
- Установите текущую папку в любой каталог, который мы хотим после запуска.
- Замените настройки MATLAB по умолчанию нашими собственными, сохраненными в части 1 этого ответа.
- Восстановите наш собственный макет рабочего стола MATLAB.
Первые два шага самые простые. В моем случае (на моем рабочем компьютере) путь по умолчанию просто забывался при каждом перезапуске компьютера. Поэтому я создал скрипт startup.m
и вставил в него следующий код.
(это идет в startup.m
)
%% set path
p = 'C:\Whatever\path\you\want\as\your\default\Current Folder';
cd(p)
Достаточно просто. Замените p
на любой путь к текущей папке, которую вы хотите.
Второй шаг сложнее. Это требует как сохранения, так и восстановления всех настроек в каталоге предпочтений MATLAB, который можно найти с помощью команды prefdir
. Для этого мы также используем finish.m
. Это скрипт, который автоматически запускается перед выходом из MATLAB. Выйти из MATLAB можно несколькими способами: щелкнуть по × главного окна MATLAB или использовать команду exit
или quit
. Полезно знать: если вы убьете MATLAB.exe с помощью диспетчера задач Windows или с помощью другой системной команды, которая убивает процесс, finish.m
не запустится. Убедитесь, что finish.m
находится в пути MATLAB, или вы добавляете путь к нему в путь MATLAB, используя addpath
в приведенном выше фрагменте кода для startup.m
. В противном случае, finish.m
не будет работать при выходе из MATLAB.
Мы заставим finish.m
скопировать все настройки, которые вы могли установить или изменить, а также ваши собственные макеты в папку, к которой у вас есть разрешения. Следующий код делает это.
(это идет в finish.m
)
%% backup MATLAB preferences, etc., see also: startup.m
p = 'path\to\your\preference backup folder';
copyfile([prefdir filesep '*'], p, 'f')
Это копирует все файлы в каталоге предпочтений MATLAB в выбранную вами резервную папку. Теперь мы startup.m
восстановить эти файлы. Поскольку startup.m
запускается раньше всего, он прекрасно восстанавливает все настройки, которые нам могут понадобиться. Следующий код делает это для нас.
(это идет в startup.m
)
%% restore MATLAB preferences, etc., see also: finish.m
p = 'path\to\your\preference backup folder'; % end without a file separator, i.e. '/', '\' or filesep
copyfile([p filesep '*'], prefdir, 'f')
В этом коде фрагмент p
должен быть установлен в тот же каталог, что и p
в finish.m
, поэтому MATLAB знает, куда скопировать файл.
Третий пункт в нашем списке - самый сложный. Простого копирования файла <your layout name>MATLABLayout.xml
с использованием предыдущего фрагмента кода в каталог настроек MATLAB недостаточно для восстановления макета. Вам необходимо восстановить его программно. Кроме того, в моей ситуации MATLAB требовал перезапуска перед применением макета. Это будет сделано с помощью следующих шагов.
Я нашел метод на недокументированном сайте MATLAB, который описывает многие функции MATLAB, которые не документированы и не поддерживаются разработчиками MATLAB. Они не просты в использовании и могут вести себя странно, но они могут делать очень мощные вещи.
Следующий код восстанавливает макет, который вы ранее сохранили как <your layout name>MATLABLayout.xml
.
(это идет в startup.m
)
%% restore your custom layout
layoutName = '<your layout name>';
desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
desktop.restoreLayout(layoutName);
Установите layoutName
на то, что вы назвали свой макет. Теперь к перезапускаемой части MATLAB.
Помните, что настройки MATLAB сбрасываются при каждой перезагрузке компьютера на рабочем месте. Путь к MATLAB по умолчанию (который можно найти с помощью команды path
) включает только каталоги, в которые у меня нет прав на запись. Это означает, что я не могу поместить startup.m
и finish.m
в путь MATLAB, так что после перезагрузки они все еще там. Как мне это решить? Я использую аккуратный трюк командной строки MATLAB.exe, чтобы скопировать startup.m
в папку по пути MATLAB, а затем запускаю startup.m
вручную.
Ярлык для MATLAB в моем меню «Пуск» также сбрасывается после перезагрузки, поэтому я использую файл .bat на рабочем столе для запуска MATLAB следующим образом.
(это происходит в MATLAB.bat
, который можно разместить в любом месте, к которому у вас есть легкий доступ, например на рабочем столе Windows или в личной папке)
@echo off
start path\to\matlab.exe -r "copyfile('path\to\startup.m', matlabroot), startup"
Это запустит MATLAB. Кроме того, -r
указывает MATLAB запускать все, что будет дальше, между "двойными апострофами" после того, как он завершил запуск (даже после запуска startup.m
, если он существовал, что не так в моей ситуации). Часть между апострофами - это код MATLAB, который указывает MATLAB скопировать сценарий startup.m
который мы создали, в место на пути MATLAB, в данном случае matlabroot
. Это может быть любой другой каталог по умолчанию пути MATLAB, или вы можете использовать addpath('path\to\add')
чтобы добавить любой путь к пути MATLAB. Это может добавить путь к нашему startup.m
. Последняя команда между апострофами - это просто вызов startup.m
, поэтому она выполняется.
Теперь скрипт установит желаемый путь, настройки и макет. Одна проблема все еще сохраняется: MATLAB требуется перезагрузка, чтобы фактически изменить макет. Это делается с помощью startup.m
, finish.m
и второго .bat файла.
Второй файл .bat уничтожит MATLAB через командную строку и снова запустит MATLAB. startup.m
должен знать, что он был сначала запущен, а затем запустить этот файл .bat. finish.m
должен очистить это знание. Вот что я сделал.
(это идет в restartup.bat
)
@echo off
taskkill /f /pid %1
start path\to\matlab.exe -r "copyfile('path\to\startup.m', matlabroot)"
Как видите, taskkill
убьет процесс с неизвестным (%1
) идентификатором процесса (/pid
). Этот идентификатор будет предоставлен при вызове этого файла .bat при startup.m
. Однако этот вызов не должен произойти, если MATLAB уже был перезапущен для восстановления макета и настроек. Таким образом, startup.m
должен создать память о том, что он уже запущен. Я сделал это следующим образом.
(это идет в startup.m
)
%% if startup hasn't run before, restart MATLAB
% sources:
% http://www.mathworks.com/matlabcentral/newsreader/view_thread/259557
% https://stackoverflow.com/a/92057
% this file is deleted by finish.m
name = 'hasStartedUp';
f = ['path\to\' name];
if ~exist(f,'file')
fid = fopen(f,'wt'); % create an empty file
fclose(fid);
pid = num2str(feature('getpid')); % get MATLAB's process ID
system(['path\to\restartup.bat ' pid]); % run restartup.bat
end
Память, которую я дал startup.m
является файлом, который, если он существует, предотвращает перезапуск MATLAB. Этот файл называется name
. Текущий идентификатор процесса MATLAB получается с помощью num2str(feature('getpid'))
. Это, в свою очередь, передается вызову restartup.bat
, который, в свою очередь, убивает процесс MATLAB. Помните, что это kill не вызывает finish.m
, поэтому мы удаляем файл памяти в этом скрипте, поэтому, если MATLAB завершается нормально, файл памяти исчезает, и MATLAB знает, что перезапустить при следующем запуске.
(это идет в finish.m
)
%% delete memory file from startup.m
f = 'path\to\hasStartedUp';
if exist(f,'file')
delete(f)
end
Бонус за долгое чтение: прочитайте здесь, как я отредактировал startup.m
чтобы открыть цифры по умолчанию в левой половине экрана. Теперь главное окно MATLAB может удобно располагаться на правой половине экрана, и окна рисунков не перекрывают его (что они и делают по умолчанию).
Теперь я решил и поэтому ответил на два моих вопроса! Я понимаю, что это довольно сложный ответ и, следовательно, трудное чтение, поэтому не стесняйтесь задавать любые вопросы и оставлять комментарии с предложениями с дальнейшим улучшением моих методов.