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

Bil*_*eey 9 matlab

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

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

没必要说这是非常耗时的,我搜索了减少时间的最佳方法.

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

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

在此输入图像描述

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

答案是肯定的!

在此输入图像描述

请参阅答案中的代码

Bil*_*eey 10

我们需要进行一些预处理才能使其正常工作,即:

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

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

在此输入图像描述

2)编辑MATLAB的功能datatipinfo(可以通过输入edit datatipinfoMATLAB的命令窗口访问它的内部代码)

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
Run Code Online (Sandbox Code Playgroud)

prefix是我们为了做我们想做的事情而编辑的功能,以及初始化阶段的一些文件扫描和字符串比较:

A)初始化阶段:

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

B)将您正在悬停的变量的名称与Data中的变量名称进行比较

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
Run Code Online (Sandbox Code Playgroud)

C)在datatip if中添加注释 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
Run Code Online (Sandbox Code Playgroud)

瞧!

在此输入图像描述


exc*_*aza 5

通过稍微调整和对调用函数的一些修改,您还可以使用@BillBokeey的答案,而无需任何外部依赖.通过将结构数组放在与预览变量相同的工作空间中,可以将字符串存储在与变量同名的字段中,并利用evalin现有逻辑datatipinfo输入@ BillBokeey的修改输入.

对于我的测试用例,我将我的字符串存储在一个名为的结构中mydatastrings:

mydatastrings.test = 'Test Variable';
Run Code Online (Sandbox Code Playgroud)

datatipinfo我的身体中添加了一个try块:

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

随着@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
Run Code Online (Sandbox Code Playgroud)

我们也取得了同样的成果.

完整文件在此Gist中


编辑:

您还可以进行最小调整datatipinfo以显示注释而无需修改prefix.似乎任何执行都会datatipinfo捕获命令窗口的所有输出,并在弹出窗口而不是命令窗口本身中显示它们.

如果我们try简单地替换上一个块:

try
    Comment = evalin('caller', sprintf('mydatastrings.%s', name))
end
Run Code Online (Sandbox Code Playgroud)

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

好极了

这也包含在Gist中 datatipinfo_noprefix.m