function [] = whoms()
%WHOMS Lists variables in base workspace, with hypertext to clear them.
% When WHOMS displays the variable names, they are hyper-linked so that
% clicking on a variable name in the list will clear that variable from the
% base workspace. WHOMS also displays information about the workspace
% variables in a manner similar to WHOS.
% WHOMS does not return a value and takes no input argument.
%
% Example:
% To see what variables are in the base workspace, and gain easy
% access to clearing them, simply type:
%
% whoms
%
% See also clear, delete, whom.
%
% Author: Matt Fig
% Contact: popkenai@yahoo.com
% 7/14/2008
% Use a very unlikely dummy variable name in the base workspace...
evalin('base','WwWwWwWw123xyz = whos;')% So as not to overwrite something.
evalin('base','assignin(''caller'',''W'',WwWwWwWw123xyz)')% Get info here.
evalin('base','clear(''WwWwWwWw123xyz'')')% clear dummy variable in base.
if isempty(W), return, end % No variables in the workspace.
lngth = length(W); % Used to determine cell length.
[Name{1:lngth}] = deal(W.name); % Work with cell arrays.
mx = max(cellfun('length',Name)); % Find the maximum string length.
[Size{1:lngth}] = deal(W.size); % Fill the headings cells.
[Bytes{1:lngth}] = deal(W.bytes);
[Class{1:lngth}] = deal(W.class);
Attributes = cell(1,lngth); % This one needs more attention because W...
try
[Attsg{1:lngth}] = deal(W.global); % doesn't have an attributes field
[Attss{1:lngth}] = deal(W.sparse);
[Attsc{1:lngth}] = deal(W.complex);
Attributes(cell2mat(Attsg)) = {'global'};
Attributes(cell2mat(Attss)) = {'sparse'};
Attributes(cell2mat(Attsc)) = {'complex'};
catch
% The user has an older version of Matlab (like 6.5)
end
str = ['<a href="matlab:','clear(' ,'''','all','''',')','">',...
'CLEAR_ALL_VARIABLES','</a>'];
fprintf('\n%s\n',['Your variables are (click separately ',...
'to clear or ',str,'):'])
str = ['Name',repmat(' ',1,mx+3)]; % For the heading.
fprintf('\n %s%s %s %s %s\n\n',str,'Size','Bytes',...
'Class','Attributes')
ch = char(Name); % Get a character array from the cell.
chlnk = cell(size(ch,1),1); % Build a cell with hypertext.
for mm = 1:lngth % Build the links.
db = deblank(ch(mm,:)); % For the html label.
chlnk{mm} =['<a href="matlab:','clear(' ,'deblank(','''',ch(mm,:),...
'''','))','">',db,'</a>',' '];
end
chlnk = char(chlnk); % Need the padding to get display spacing correct.
for ii = 1:lngth
Sz = [num2str(Size{ii}(1)),'x',num2str(Size{ii}(2))]; % Formatting.
lSz = length(Sz); % Used in calculating the number of spaces needed.
Bts = int2str(Bytes{ii}); % Same as above.
lBts = length(Bts);
fprintf([' %s %s',repmat(' ',1,21-lSz-lBts),'%s %s %s\n'],...
chlnk(ii,:)',Sz,Bts,Class{ii},Attributes{ii}) % Print the lines.
end
fprintf('\n') % Provide a space between list and command prompt.