图片缩略图

在Matlab编辑器和命令窗口中将一个宏分配给键盘按键

版本1.3.0.0 (11.4 KB) 实验后奥特曼
EditorMacro在Matlab编辑器和命令窗口中为请求的键绑定指定宏或动作
5.0
10评级

5下载

更新2011年1月31日

视图版本历史

查看许可协议

语法:
[bindingsList, actionsList] = EditorMacro(keystroke,宏,macroType)
[bindingsList, actionsList] = EditorMacro(bindingsList)

描述:
在Matlab编辑器和命令窗口的上下文中,将指定的宏分配给请求的键盘KEYSTROKE。

KEYSTROKE是键盘组合的字符串表示形式。可以识别特殊修饰符(Alt、Ctrl或Control、Shift、Meta、AltGraph),并用空格、破折号(-)、加号(+)或逗号(,)分隔。如果KEYSTROKE已经定义,那么它将被更新(覆盖)。

MACRO应该是Matlab的标准回调格式之一:'string', @FunctionHandle或{@FunctionHandle,arg1,…},或者几百个内置编辑器动作-名称中的任何一个-请阅读下面的MACROTYPE以获得完整的描述。要删除KEYSTROKE-MACRO定义,只需输入一个空的MACRO([],{}或")。

MACROTYPE是一个可选的输入参数,指定MACRO要执行的操作类型:

- 'text'(=默认值)表示如果宏是:
1.'string':该字符串将按原样插入当前字符串
编辑器插入符号的位置(或替换选定的编辑器文本)。
多行字符串可以使用嵌入的\n设置。
2.@FunctionHandle -指定的函数将被调用
并期望返回一个将被插入的字符串
进入编辑器文档,如上所述。
3.{@FunctionHandle, __arg1、…} -类似#2,但函数会
使用指定的参数调用。

- 'run'表示MACRO应该作为Matlab调用
命令,就像任何常规的Matlab回调。的
可接受的宏格式和函数输入参数
完全像上面的'text',除了没有输出
应为字符串,且无文本插入/替换
将完成,这对于非文本操作很有用。

此外,此宏类型接受所有可用的
(内置的)编辑器动作名称。有效的操作名称可以
通过请求ACTIONSLIST输出参数被列出。

BINDINGSLIST = EditorMacro返回当前定义的KEYSTROKE绑定的列表,作为一个四列单元数组:{KEYSTROKE,macro,type,class}。类信息表示一个内置的动作('编辑器菜单动作','编辑器本地动作','cmdwin本地动作'或'cmdwin菜单动作')或用户定义的动作('文本'或'用户定义的宏')。

BINDINGSLIST = EditorMacro(KEYSTROKE)以四列单元数组的形式返回指定KEYSTROKE的绑定列表:{KEYSTROKE, macro, type, class}。

BINDINGSLIST = EditorMacro(KEYSTROKE,MACRO)在定义一个特定的KEYSTROKE-MACRO绑定后返回绑定列表。

EditorMacro(BINDINGSLIST)可用于使用单个命令设置一组键绑定。BINDINGSLIST是从以前调用EditorMacro或通过手动构造返回的单元格数组。

[BINDINGSLIST,ACTIONSLIST]=EditorMacro(…)在ACTIONSLIST中返回所有可用内置操作和当前关联的键绑定的3列单元格数组:{actionName,keyBinding,class}。

使用例子:
bindingsList = EditorMacro;获取当前键绑定列表
bindingsList = EditorMacro('ctrl r');获取-R的绑定列表
(绑定、行动)= EditorMacro;%获取可用的内置动作-名称列表
EditorMacro (' Ctrl C转移”、“% % %主要评论% % % % % \ n \ n \ n % \ n ');
EditorMacro('Alt-x', 'try\n % Main code here\ncatch\n % Exception handling here\nend');
EditorMacro(任务管理C, @myCallbackFunction);% myCallbackFunction返回要插入的字符串
编辑宏('Alt control t', @(a,b)datestr(now), 'text');插入当前时间戳
EditorMacro('Shift-Control d', {@computeDiameter,3.14159}, '运行');
EditorMacro('Alt L', 'to lower-case', 'run') %内置操作:将文本转换为小写
EditorMacro('ctrl D','open-selection','run') %覆盖默认命令行窗口操作(=删除),以表现为在编辑器中(=打开选定的文件)

文件的帮助部分列出了一些已知的限制(=TODO for future versions)。

错误和建议:
EditorMacro在Matlab 6.0 (R12)到7.7(R2008b)上进行了测试。

注:不幸的是,我的Matlab 6计算机崩溃了,因为第一个版本,所以我不能再测试EditorMacro在Matlab 6,所以如果你发现问题,请直接给我发邮件。

请将错误发送给Yair Altman (altmany at gmail dot com)

警告:
此代码严重依赖于无文档记录和不受支持金宝app
Matlab功能。它工作在Matlab 6 & 7+,但使用在
你的自己的风险!

有关实施的技术说明可在以下网址找到:http://UndocumentedMatlab.com/blog/EditorMacro/

引用作为

实验后奥特曼(2021)。在Matlab编辑器和命令窗口中将一个宏分配给键盘按键(//www.tatmou.com/matlabcentral/fileexchange/24615-editormacro-assign-a-macro-to-a-keyboard-key-stroke-in-the-matlab-editor-and-command-window), MATLAB中央文件交换。检索

评论和评级(26

有人能帮助得到和设置matlab编辑器的上下文菜单吗?

sfreeman

仍然是来自Yair的优秀代码!
我对Yigal的代码做了更多的版本测试,它也在一些8。x版本(使用选项:EditorMacro('Ctrl Alt H', @someFcn, 'text')):

R2006b / 7.3 -失败
R2005b / 7.5 -失败
R2006a / 7.6 -失败
R2010bSP1/7.11.1通过
R2012b / 8.0通过
R2013b / 8.2失败
R2014a / 8.3通过
R2016a / 9.0通过
R2016b / 9.1通过
R2017b / 9.3通过

下面是我目前使用的getEditorPane函数:

% %得到EditorPane
函数hEditorPane = getEditorPane(jDocPane)

nVersion = sscanf(版本,' % d。');
如果nVersion(1) == 6
% Matlab 6(未完成测试)
hEditorPane = getDescendent (jDocPane (0, 0, 0, 0));
if isa(hEditorPane,'com.mathworks.mwt.MWButton') %边缘情况
hEditorPane = getDescendent (jDocPane [0 1 0,0]);
结束

mapname = " mapname "; mapname = " mapname "; mapname = " mapname ";
试一试
% Matlab 7(测试在R2010bSP1/7.11.1, R2012b/8.0;失败了
% R2006b/7.3, R2007b/7.5, R2008a/7.6, R2013b/8.2)
jSyntaxTextPaneView = getDescendent (jDocPane, (0, 0, 1, 0, 0, 0, 0));
如果isa (jSyntaxTextPaneView, com.mathworks.widgets.SyntaxTextPaneMultiView 1美元)
hEditorPane(1) =处理(getDescendent (jSyntaxTextPaneView.getComponent(1),(1,0,0)),“CallbackProperties”);
hEditorPane(2) =处理(getDescendent (jSyntaxTextPaneView.getComponent(2),(1,0,0)),“CallbackProperties”);
其他的
jEditorPane = getDescendent (jSyntaxTextPaneView (1,0,0));
hEditorPane =处理(jEditorPane CallbackProperties);
结束
抓住我
fprintf(2,'正确实现的EditorMacro:getEditorPane是缺失的!');
重播(我);
结束

其他的
试一试
% Matlab 8.3及以上(测试在R2014a/8.3, R2016a/9.0,
% R2016b / 9.1, R2017b / 9.3;失败R2013b / 8.2)
我们选择了错误的文档。
jDocPane = jDocPane.getParent.getComponent (1);
结束
jSyntaxTextPaneView = getDescendent (jDocPane, [0, 1, 0, 0, 0, 0, 1, 0, 0));
hEditorPane =处理(jSyntaxTextPaneView CallbackProperties);
抓住我
fprintf(2,'正确实现的EditorMacro:getEditorPane是缺失的!');
重播(我);
结束
结束

伊戈尔Shenkman

@Devin,我相信你有一个小问题-线路
如果isa (jDocPane, com.mathworks.widgets.desk.DTDocumentTabs)
应该只更新jDocPane,和jSyntaxTextPaneView, hEditorPane应该设置无论如何。
代码应该是这样的:

函数hEditorPane = getEditorPane(jDocPane)
版本=版本;
如果str2double(版本(1))= = 9
我们选择了错误的文档。
jDocPane = jDocPane.getParent.getComponent (1);
结束
jSyntaxTextPaneView = getDescendent (jDocPane, [0, 1, 0, 0, 0, 0, 1, 0, 0));
hEditorPane =处理(jSyntaxTextPaneView CallbackProperties);
其他的
试一试

% Matlab 7 TODO:适合ML 7.1-7.7:需要检查其他版本
jSyntaxTextPaneView = getDescendent (jDocPane, (0, 0, 1, 0, 0, 0, 0));
如果isa (jSyntaxTextPaneView, com.mathworks.widgets.SyntaxTextPaneMultiView 1美元)
hEditorPane(1) =处理(getDescendent (jSyntaxTextPaneView.getComponent(1),(1,0,0)),“CallbackProperties”);
hEditorPane(2) =处理(getDescendent (jSyntaxTextPaneView.getComponent(2),(1,0,0)),“CallbackProperties”);
其他的
jEditorPane = getDescendent (jSyntaxTextPaneView (1,0,0));
hEditorPane =处理(jEditorPane CallbackProperties);
结束

% Matlab 6
hEditorPane = getDescendent (jDocPane (0, 0, 0, 0));
if isa(hEditorPane,'com.mathworks.mwt.MWButton') %边缘情况
hEditorPane = getDescendent (jDocPane [0 1 0,0]);
结束
结束
结束

阿德温

修复R2016a(可能更早?),至少添加宏,是用下面的函数替换hEditorPane:
______________
函数hEditorPane = getEditorPane(jDocPane)
版本=版本;
如果str2double(版本(1))= = 9
我们选择了错误的文档。
jDocPane = jDocPane.getParent.getComponent (1);
jSyntaxTextPaneView = getDescendent (jDocPane, [0, 1, 0, 0, 0, 0, 1, 0, 0));
hEditorPane =处理(jSyntaxTextPaneView CallbackProperties);
结束
其他的
试一试

% Matlab 7 TODO:适合ML 7.1-7.7:需要检查其他版本
jSyntaxTextPaneView = getDescendent (jDocPane, (0, 0, 1, 0, 0, 0, 0));
如果isa (jSyntaxTextPaneView, com.mathworks.widgets.SyntaxTextPaneMultiView 1美元)
hEditorPane(1) =处理(getDescendent (jSyntaxTextPaneView.getComponent(1),(1,0,0)),“CallbackProperties”);
hEditorPane(2) =处理(getDescendent (jSyntaxTextPaneView.getComponent(2),(1,0,0)),“CallbackProperties”);
其他的
jEditorPane = getDescendent (jSyntaxTextPaneView (1,0,0));
hEditorPane =处理(jEditorPane CallbackProperties);
结束

% Matlab 6
hEditorPane = getDescendent (jDocPane (0, 0, 0, 0));
if isa(hEditorPane,'com.mathworks.mwt.MWButton') %边缘情况
hEditorPane = getDescendent (jDocPane [0 1 0,0]);
结束
结束
结束
___________

我不确定更早的版本,但可以尝试替换这一行。
如果str2double(版本(1))= = 9

如果str2double(版本(1))> 7

鲍里斯Capitanu

+1用于2014b兼容性
谢谢你!

泽维尔

我一直在考虑切换到外部编辑器一段时间,只是遇到了这个工具,它似乎提供了我正在寻找的所有功能……除非它在2014年似乎没有得到支持。金宝app
有人知道替代方案吗?

蒂埃里Dalon

在Windows上,使用meta或AltGraph的加速器似乎不起作用。

实验后奥特曼

@Jim -恐怕短期内不会…

吉姆·霍坎森

@Yair
是否计划更新此代码以配合matlab8 ?

蒂埃里Dalon

EditorMacro('ctrl D','open-selection','run')如示例中所示
使用Matlab>=8抛出一个错误。

亚历山德罗

它实现了它所承诺的功能,但遗憾的是,您只能在光标停留在编辑器和命令窗口时使用它。我想指定一个快捷键来关闭所有图形(“关闭所有”命令)

凯撒

Btillian !你真的会发布一个带有多按键绑定的版本吗?那太棒了!

实验后奥特曼

@Nicolas -请通过电子邮件联系我(altmany at gmail dot com) -我很乐意向你展示如何做到这一点,只要支付一小笔费用,以弥补我的时间和专业知识。

尼古拉。

伟大的工作,
有没有一种方法可以访问名字被高亮显示的数组?

例如,我希望能够显示所选图像:

函数DisplayImage (hDocument eventData)



图;
imshow (TheImageMatrix []);
结束

谢谢
N

对我不起作用。
当尝试从com变量获得属性时失败(在我的matlab 6.5.1中不存在,发布13)

大卫Gittins

Yair,我提到的问题可能的解决方法。我注释掉了第205行:

%此外,还为CW设置仪表,以捕捉用户的击键
%设置(jCmdWin KeyPressedCallback, {@keyPressedCallback、jEditor appdata, jCmdWin});

现在命令窗口中的选项卡完成功能似乎正常工作了,我仍然可以在编辑器中使用宏。我不能在命令窗口使用宏,但这对我来说很好,因为我只需要在编辑器中使用它们。

也许你可以添加一个“仅限编辑器”选项。

HTH

大卫Gittins

是啊,这太棒了,正是我想要的。。。

...但我不能用它!一旦绑定了任何宏,变量的制表符补全就会在命令窗口中停止工作。它只显示“未找到完成项”。文件的tab补全功能继续工作。

我想《莱斯》也发现了同样的问题
//www.tatmou.com/matlabcentral/fileexchange/25217-intelligent-code-completion-for-matlab

我在CentOS上运行R2010a。

D

大卫Gittins

安德烈·普戴耶夫

伟大的工作,这正是我在matlab界面中错过的东西——一个可定制的宏。

总结此处发布的示例,我提出以下异常管理解决方案:
-----------
函数trycatch (hDocument eventData)
在当前编辑器中获取选定文本
selectedText = char (hDocument.getSelectedText);

modifiedText = ['try' char(13) selectedText char(13)“抓住”char (13)“键盘”char (13)“结束”);

更新当前编辑器中的选择
hDocument.replaceSelection (modifiedText);
--------------

这将允许快速地将选定的文本块放入try-catch构造中

安德烈·普戴耶夫

实验后奥特曼

对于那些感兴趣的人,Perttu Ranta-aho提交了一组EditorMacro宏函数。提交的文件名为“TextTools”,可以在这里找到://www.tatmou.com/matlabcentral/fileexchange/25122

Ustun Ozgur

EditorMacro('Alt-x', 'try\n % Main code here\ncatch\n % Exception handling here\nend');

不工作在OS X与Matlab R2008b。

EditorMacro('Meta x', '尝试\n %主代码这里\ncatch\n %异常处理这里\nend');

然而工作。

朱利安

非常棒的工作,非常感谢分享这个非常有用和强大的功能。
对于那些对修改选定文本而不是在插入符号位置插入新文本感兴趣的用户,你可以使用jEditorPane方法"getSelectedText"和"replace eselection "。
例如,如果你想将当前编辑器中的选定文本转换为大写字符,你可以做如下操作:
---------------------------------------------------------------------------
函数Upper_Macro (hDocument eventData)
在当前编辑器中获取选定文本
selectedText = char (hDocument.getSelectedText);
如果isempty (selectedText)
返回;
结束
%修改所选文本为大写字符
modifiedText =上(selectedText);
更新当前编辑器中的选择
hDocument.replaceSelection (modifiedText);
---------------------------------------------------------------------------
然后简单地在命令窗口中运行:
> >宏= EditorMacro (@Upper_Macro ctrl-u”,“运行”);
---------------------------------------------------------------------------
再次感谢你,Yair !

群汉

哇!

杰克逊沈

我今天又试了一次。“神奇的”作品。
是的,用Matlab R2008A就可以了。
我必须说我喜欢这个功能。

杰克逊沈

出色的工作。它与R2009A(试用版)一起工作。
Brillian功能!(现在不适合我)。
不幸的是,它不能与我的R2008A一起工作。

MATLAB版本兼容性
创建与R12
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始打猎吧!