Я могу ответить на ваш первый запрос:
Из небольшой модификации самой функции who_user:
function nams = who_user1()
//get user variables
[nams,mem]=who('get'); //get all variables
p=predef(); //number of system variable
st=stacksize()
nams=nams(1:$-p+1);mem=mem(1:$-p+1);
//modifiable system variables
excluded=['demolist','scicos_pal','%scicos_menu',..
'%scicos_short','%helps','%helps_modules','MSDOS','who_user','%scicos_display_mode', ...
'%scicos_help'];
ke=grep(nams,excluded)
nams(ke)=[];mem(ke)=[];
n=size(nams,1);
if n==0 then return,end
//format names on n*10 characters
ll=length(nams)+2;m=int((ll-1)/10)+1;
for k=1:max(m)
ks=find(m==k);
if ks<>[] then nams(ks)=part(nams(ks),1:(k*10));end
end
endfunction
Эта функция должна дать вам список, который вы хотите (я изменил имя на who_user1).
Вы можете узнать, является ли конкретная переменная глобальной или нет, используя функцию isglobal (), но вам нужно передать переменную в isglobal (), а не строку, которая является именем переменной. Функция, которую я перечислил выше, возвращает вектор строк.
Альтернативный подход, который вы можете попробовать, состоит в том, чтобы переписать вышеуказанную функцию, чтобы она возвращала переменные (а не их имена) напрямую, используя varargout, а затем протестировать их на глобальность.