在编辑器中自定义数据提示

时间:2015-11-20 13:59:10

标签: matlab

这不是一个问题,因为我有答案,但由于我找不到相关的来源,我会在这里发布问题和答案,以防你感兴趣。 (如果我忘记了我是怎么做的,也能够再找到它。)

我在查看一些代码时遇到了一个问题。代码中没有解释大量的变量,每次我想知道变量的含义我必须在数据文件中查看和/或从代码中完成的操作中猜出它们的含义。

无需说这非常费时,而且我搜索了减少时间的最佳方法。

首先,我将关于变量的所有解释都放在注释中,问题是它在脚本中添加了一个(巨大的!)很多行。

我也在MATLAB中使用“在编辑模式下启用数据提示”。当您将鼠标悬停在已经评估过的MATLAB变量名称上时,它会根据所有维度和至少其第一个值给出它的大小,这样就可以更容易地了解您正在操作的对象。 (见下图)

enter image description here

我想到的自然想法如下:是否有可能让MATLAB在数据提示中显示更多自定义信息?

答案是肯定的!

enter image description here

参见答案中的代码

3 个答案:

答案 0 :(得分:10)

为了实现这一点,我们需要进行一些预处理,即:

1)创建一个将变量名称链接到其描述的数据文件 (这是无聊的部分,虽然我已经不得不这样做才能理解代码。每次遇到新变量时只需添加一行)

我选择将这些数据保存在CSV文件中,其中第一列包含变量名称,第二列包含描述,例如

enter image description here

2)编辑MATLAB的函数datatipinfo(可以通过在MATLAB的命令窗口中键入edit datatipinfo来访问它的内部代码)

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

答案 1 :(得分:5)

通过稍微调整和对调用函数的一些修改,您还可以使用@BillBokeey's answer而无需任何外部依赖项。通过将结构数组放在与预览变量相同的工作空间中,可以将字符串存储在与变量同名的字段中,并将evalindatatipinfo中的现有逻辑一起使用@ 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

编辑:

您还可以对datatipinfo进行微调,以便在不修改prefix的情况下显示评论。似乎任何执行datatipinfo都会捕获命令窗口的所有输出,并将其显示在弹出窗口而不是命令窗口本身。

如果我们只用以下内容替换以前的try块:

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

并保留prefix,因为它在默认的MATLAB安装中,我们获得以下弹出窗口:

yay

这也包含在Gist中datatipinfo_noprefix.m

答案 2 :(得分:2)

另一种方法是将Matlab已定义的类(如double)子类化,并添加字符串属性。该字符串将出现在数据提示上。

如何使用其他属性进行子类化: http://fr.mathworks.com/help/matlab/matlab_oop/built-in-subclasses-with-properties.html

结果:enter image description here