2015-11-20 4 views
9

Это не вопрос, потому что у меня есть ответ, но поскольку я не мог найти источники об этом, я отправлю вопрос вместе с ответом здесь, если это будет представлять интерес для тебя. (И также, чтобы иметь возможность найти его снова, если я забуду о том, как я это сделал).Настройка подсказок данных в редакторе

Я столкнулся с проблемой при просмотре кода. Огромное количество переменных не было описано в коде, и каждый раз, когда я хотел знать значение переменной, которую я должен был искать в файлах данных, и/или угадывать их значение из операций, которые были выполнены в коде.

Не нужно говорить, что это заняло много времени, и я искал лучший способ потерять меньше времени.

Прежде всего, я объясняю все переменные в комментариях, проблема заключается в том, что он добавляет (огромное!) Количество строк в скрипте.

Я также использую «Включить подсказки данных в режиме редактирования» в MATLAB. Когда вы наводите курсор на имя переменной MATLAB, которое уже было оценено, оно дает вам размер по всем измерениям и, по крайней мере, его первым значениям, что упрощает понимание того, какие объекты вы манипулируете. (См рисунка ниже)

enter image description here

Естественной мысль, что пришло мне на ум следующее: было бы возможно сделать MATLAB отображать некоторую более пользовательскую информацию в кончиках данных?

И да!

enter image description here

См код в ответ

ответ

10

Нам нужно будет сделать некоторые предварительной обработки для того, чтобы это работало, то есть:

1) Создайте файл данных, связывающую имена переменных их описание (Это скучная часть, хотя мне уже приходилось делать это, чтобы понять код. Просто добавьте строку каждый раз, когда вы сталкиваетесь с новой переменной)

Я решил сохранить эти данные в CSV-файле, где первый столбец содержит имена переменных, а второй содержит описания, например.

enter image description here

2) функция Edit MATLAB в datatipinfo (Это внутренний код можно получить, набрав edit datatipinfo в командном окне MATLAB в)

datatipinfo функция выглядит следующим образом:

function datatipinfo(val) 

% Some error checking/Initialization 


    function prefix=sizeType %#ok<DEFNU> All uses are in EVALC calls. 
     s = size(val); 
     D = numel(s); 
     if D == 2 
      theSize = [num2str(s(1)), 'x', num2str(s(2))]; 
     elseif D == 3 
      theSize = [num2str(s(1)), 'x', num2str(s(2)), 'x', ... 
       num2str(s(3))]; 
     else 
      theSize = [num2str(D) '-D']; 
     end 



     if isempty(val) == 0 
      prefix = [name ': ' theSize ' ' class(val)]; 
     else 
      prefix = [name ': empty ' theSize ' ' class(val)]; 
     end 

    end 

% Some other stuff 

end 

И это функция prefix, которую мы будем редактировать, чтобы делать то, что мы хотим сделать, а также некоторые файлы ирование и сравнение строк в фазе инициализации:

A) Фаза инициализации:

% Read data from csv file : 
fid = fopen('ToyVars.csv'); 
Data = textscan(fid, '%s%s','whitespace','','delimiter',';'); 
fclose(fid); 

B) Сравните имя переменной вы зависания на с именами переменных в данных

NameFound=0; 
% Get Variable Names and Corresponding comments  
TmpNames=Data{1,1}; 
TmpComments=Data{1,2}; 

% Loop through TmpNames. If a Name matches, assign corresponding comment to the variable Comment 

for ii=1:size(TmpNames,1) 

    if(isequal(char(TmpNames(ii))),name) 

     Comment=char(TmpComments(ii)); 
     NameFound=1; 

    end 

end 

C) Добавить комментарий в всплывающей подсказке, если NameFound==1

if NameFound 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val) ' : ' Comment]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ' : ' Comment]; 
    end 

else 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val)]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ]; 
    end 

end 

И вуаля!

enter image description here

5

С небольшой подстройкой и некоторыми изменениями в вызывающей функцию вы можете также использовать @BillBokeey's answer без каких-либо внешних зависимостей. Поместив массив структуры в ту же рабочую область, что и переменная, которую вы просматриваете, вы можете сохранить строку в поле с тем же именем, что и ваша переменная, и использовать evalin с существующей логикой в ​​datatipinfo, чтобы получить входы для модификаций @ BillBokeey.

Для моего теста я храню мои строки в структуре под названием mydatastrings:

mydatastrings.test = 'Test Variable'; 

В теле datatipinfo я добавил try блок:

NameFound = 0; 
try 
    Comment = evalin('caller', sprintf('mydatastrings.%s', name)); 
    NameFound = 1; 
end 

Наряду с @ BillBokey-х модификаций к вложенной функции prefix:

if NameFound 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val) ' : ' Comment]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ' : ' Comment]; 
    end 

else 

    if isempty(val) == 0 
     prefix = [name ': ' theSize ' ' class(val)]; 
    else 
     prefix = [name ': empty ' theSize ' ' class(val) ]; 
    end 

end 

И мы достигаем тех же результатов.

Полные файлы в this Gist


EDIT:

Вы также можете сделать минимальную корректировку datatipinfo для отображения комментария без изменения prefix. Кажется, что все выполненные datatipinfo также захватывает все выходы в окне команд и отображает их во всплывающем окне, а не в самом окне команды.

Если заменить предыдущий try блок с просто:

try 
    Comment = evalin('caller', sprintf('mydatastrings.%s', name)) 
end 

И оставить prefix как в по умолчанию MATLAB установки, мы получаем следующее всплывающее окно:

yay

Это также включен в Gist as datatipinfo_noprefix.m

2

Другой подход для подкласса уже определенного класса Matlab, такого как double, и добавить свойство строки. Эта строка появится на подсказке данных.

Как подкласс с дополнительным свойством: http://fr.mathworks.com/help/matlab/matlab_oop/built-in-subclasses-with-properties.html

Результат: enter image description here

+1

не знал, что, хороший друг! – BillBokeey