how to set matlab built in Editors Callback

조회 수: 5 (최근 30일)
Andreas Justin
Andreas Justin 2013년 3월 12일
I like to extend the matlab editor with a simple function.
If i press "(" the a function is called which automatically inserts ")" and move the cursor one to the left.
I tried to figure it out like it's done with the command window here: http://www.mathworks.com/matlabcentral/newsreader/view_thread/257842View thread
Matlab Version 8
EDIT{ it's nearly that what i want. it works with the code below (at least on Matlab 8)
i used some functios of Yair Altmans editor macro to get the hEditorPane: http://UndocumentedMatlab.com/blog/EditorMacro/
Done:
  • apply on all opened Editor (getAll Active Editors)
  • run at startup -> solution startup doc
  • apply on newly opened edtiors
I'll Test this function and extend it. if it's stable I'll post it in the file exchange. For now feel free to copy 'n' paste it
  댓글 수: 3
Andreas Justin
Andreas Justin 2013년 3월 25일
편집: Andreas Justin 2013년 3월 25일
following code allows to override the edit function. I have it in the startup file
if overloadEDIT
Matlab_extendEditorFunctionality(true)
addpath(matlabroot);
fid = fopen(fullfile(matlabroot,'edit.m'),'w');
fprintf(fid,['function edit(str)',char(13), 'if nargin < 1 || isempty(str)',char(13),...
'str='''';',char(13),'end',char(13), 'rmpath(matlabroot);',char(13),...
'edit(str);',char(13), 'addpath(matlabroot);',char(13),'Matlab_extendEditorFunctionality(true);']);
fclose(fid);
else
warning('off')
rmpath(matlabroot);
delete(fullfile(matlabroot,'edit.m'))
warning('on')
end

댓글을 달려면 로그인하십시오.

채택된 답변

Andreas Justin
Andreas Justin 2013년 3월 22일
function Matlab_extendEditorFunctionality(activateFlg)
%#ok<*NASGU>
%#ok<*AGROW>
%%--------------------------------------------------------------------------------------------
if nargin < 1 || isempty(activateFlg)
activateFlg = false;
activateFlg = true;
end
%%--------------------------------------------------------------------------------------------
jMainPane = [];
jEditor = com.mathworks.mde.desk.MLDesktop.getInstance.getGroupContainer('Editor');
for childIdx = 1 : jEditor.getComponentCount
componentClassName = regexprep(jEditor.getComponent(childIdx-1).class,'.*\.','');
if any(strcmp(componentClassName,{'DTMaximizedPane','DTFloatingPane','DTTiledPane'}))
jMainPane = jEditor.getComponent(childIdx-1);
break;
end
end
if isa(jMainPane,'com.mathworks.mwswing.desk.DTFloatingPane')
jMainPane = jMainPane.getComponent(0); % a com.mathworks.mwswing.desk.DTFloatingPane$2 object
end
for jj = 1:jMainPane.getComponentCount
hEditorPane = [];
jSyntaxTextPaneView = getDescendent(jMainPane.getComponent(jj-1),[0,0,1,0,0,0,0]);
if isa(jSyntaxTextPaneView,'com.mathworks.widgets.SyntaxTextPaneMultiView$1')
hEditorPane(1) = handle(getDescendent(jSyntaxTextPaneView.getComponent(1),[1,0,0]),'CallbackProperties');
hEditorPane(2) = handle(getDescendent(jSyntaxTextPaneView.getComponent(2),[1,0,0]),'CallbackProperties');
else
jEditorPane = getDescendent(jSyntaxTextPaneView,[1,0,0]);
hEditorPane = handle(jEditorPane,'CallbackProperties');
end
if activateFlg
set(hEditorPane ,'KeyTypedCallback',@(src,evnt)Editor_KeyTypedCallback(src,evnt))
else
set(hEditorPane ,'KeyTypedCallback','')
end
hEditorPaneArray(jj) = hEditorPane;
end
function child = getDescendent(child,listOfChildrenIdx)
if ~isempty(listOfChildrenIdx)
child = getDescendent(child.getComponent(listOfChildrenIdx(1)),listOfChildrenIdx(2:end));
end
function Editor_KeyTypedCallback(~,evnt, varargin)
keyPress = get(evnt,'keyChar');
if strcmp(keyPress,'(') || strcmp(keyPress,'"') || ...
strcmp(keyPress,'[') || strcmp(keyPress,'''') || ...
strcmp(keyPress,'{')
aE = matlab.desktop.editor.getActive;
pos = aE.Selection;
switch keyPress
case '('
putIn = ')';
case '"'
putIn = '"';
case '['
putIn = ']';
case '{'
putIn = '}';
case ''''
putIn = '''';
end
cursorPos = matlab.desktop.editor.positionInLineToIndex(aE, pos(1),pos(2));
% MyFunction(Input1,input2) if you missed a '(' it disables the auto input otherwise you would have to delete the
% closing bracket.
if any(strcmp(aE.Text(cursorPos-1),{'(','[','{','''','"'})) && ...
~isempty(regexp(aE.Text(cursorPos),['(\s|',char(13),')'],'match'))
else
putIn = '';
end
aE.insertTextAtPositionInLine(putIn,pos(1),pos(2));
aE.goToPositionInLine(pos(1),pos(2));
end

추가 답변 (1개)

Andreas Justin
Andreas Justin 2013년 3월 12일
편집: Andreas Justin 2013년 3월 12일
it's nearly that what i want. it works with this code below (at least on Matlab 8)
i used some functios of Yair Altmans editor macro to get the hEditorPane: http://UndocumentedMatlab.com/blog/EditorMacro/
ToDo:
  • apply on all opened Editor
  • run at startup -> solution startup doc
  • apply on newly opened edtiors -> solution? edit edit function
  • EDIT: { on active editor (file) }
function hEditorPane = getEditor
jEditor = com.mathworks.mde.desk.MLDesktop.getInstance.getGroupContainer('Editor');
jMainPane = [];
for childIdx = 1 : jEditor.getComponentCount
componentClassName = regexprep(jEditor.getComponent(childIdx-1).class,'.*\.','');
if any(strcmp(componentClassName,{'DTMaximizedPane','DTFloatingPane','DTTiledPane'}))
jMainPane = jEditor.getComponent(childIdx-1);
break;
end
end
if isa(jMainPane,'com.mathworks.mwswing.desk.DTFloatingPane')
jMainPane = jMainPane.getComponent(0); % a com.mathworks.mwswing.desk.DTFloatingPane$2 object
end
hEditorPane = [];
jSyntaxTextPaneView = getDescendent(jMainPane.getComponent(0),[0,0,1,0,0,0,0]);
if isa(jSyntaxTextPaneView,'com.mathworks.widgets.SyntaxTextPaneMultiView$1')
hEditorPane(1) = handle(getDescendent(jSyntaxTextPaneView.getComponent(1),[1,0,0]),'CallbackProperties');
hEditorPane(2) = handle(getDescendent(jSyntaxTextPaneView.getComponent(2),[1,0,0]),'CallbackProperties');
else
jEditorPane = getDescendent(jSyntaxTextPaneView,[1,0,0]);
hEditorPane = handle(jEditorPane,'CallbackProperties');
end
function child = getDescendent(child,listOfChildrenIdx)
if ~isempty(listOfChildrenIdx)
child = getDescendent(child.getComponent(listOfChildrenIdx(1)),listOfChildrenIdx(2:end));
end
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
set(hEditorPane ,'KeyTypedCallback',@(src,evnt)doSth_FUNCTION(src,evnt))
  댓글 수: 1
Andreas Justin
Andreas Justin 2013년 3월 21일
function hEditorPaneArray = getEditor
% desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
% jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor;
% jEditor.uiinspect
% clientTitles = desktop.getClientTitles;
% for ii = 1:numel(clientTitles)
% editorHandles{ii,1} = char(clientTitles(ii));
% end
% editorHandles(~Aid_SearchCell(editorHandles,'D\:\\')) = [];
% for ii = 1:numel(editorHandles)
% ed = desktop.getClient(editorHandles{ii});
% xEdView = ed.getComponent(0).getComponent(0)% getViewport.getComponent(0)
% h_ed = handle(xEdView,'CallbackProperties');
% set(h_ed, 'MouseEnteredCallback', {@disp,1});
% % set(h_cw, 'KeyPressedCallback', {@MyMatlabFunction,extraParam1}); %alternative
% end
%
% % You were fairly close:
% mde = com.mathworks.mde.desk.MLDesktop.getInstance;
% cw = mde.getClient('Command Window');
% xCmdWndView = cw.getComponent(0).getViewport.getComponent(0);
% h_cw = handle(xCmdWndView,'CallbackProperties');
% set(h_cw, 'KeyPressedCallback', @test1);
% set(h_cw, 'KeyPressedCallback', '');
% set(h_cw, 'KeyPressedCallback', {@MyMatlabFunction,extraParam1}...}); %alternative
% aE = matlab.desktop.editor.getAll;
% filenames = {aE.Filename}';
% aE.close
% for ii = 1:numel(filenames)
% edit(filenames{ii})
% end
jMainPane = [];
edit(aE(ii).Filename)
jEditor = com.mathworks.mde.desk.MLDesktop.getInstance.getGroupContainer('Editor');
for childIdx = 1 : jEditor.getComponentCount
componentClassName = regexprep(jEditor.getComponent(childIdx-1).class,'.*\.','');
if any(strcmp(componentClassName,{'DTMaximizedPane','DTFloatingPane','DTTiledPane'}))
jMainPane = jEditor.getComponent(childIdx-1);
break;
end
end
if isa(jMainPane,'com.mathworks.mwswing.desk.DTFloatingPane')
jMainPane = jMainPane.getComponent(0); % a com.mathworks.mwswing.desk.DTFloatingPane$2 object
end
for jj = 1:jMainPane.getComponentCount
hEditorPane = [];
jSyntaxTextPaneView = getDescendent(jMainPane.getComponent(jj-1),[0,0,1,0,0,0,0]);
if isa(jSyntaxTextPaneView,'com.mathworks.widgets.SyntaxTextPaneMultiView$1')
hEditorPane(1) = handle(getDescendent(jSyntaxTextPaneView.getComponent(1),[1,0,0]),'CallbackProperties');
hEditorPane(2) = handle(getDescendent(jSyntaxTextPaneView.getComponent(2),[1,0,0]),'CallbackProperties');
else
jEditorPane = getDescendent(jSyntaxTextPaneView,[1,0,0]);
hEditorPane = handle(jEditorPane,'CallbackProperties');
end
%set(hEditorPane ,'KeyTypedCallback',@(src,evnt)disp(1))
hEditorPaneArray(jj) = hEditorPane;
end
function child = getDescendent(child,listOfChildrenIdx)
if ~isempty(listOfChildrenIdx)
child = getDescendent(child.getComponent(listOfChildrenIdx(1)),listOfChildrenIdx(2:end));
end

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Function Creation에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by