Emacs/Matlab:classdef/methods 块内的函数自动缩进
Emacs/Matlab: Auto-indentation of functions inside classdef/methods block
我在使用 classdef 样式的面向对象代码规范的 matlab 文件的 Emacs(v.24.3.1,matlab.el v.3.3.2)中遇到了自动缩进的几个问题。
在下面的第一个示例文件中,以标记为 %%%%% (1)
的行开头的部分缩进了太多。不正确的缩进一直持续到函数结束 end
.
在第二个文件中,%%%%% (2)
和 %%%%% (3)
处的函数递增缩进了一步。在这里,不正确的缩进一直持续到方法结束 end
。 (但是,如果我在前面的函数关闭 end
处删除注释,这个特殊问题就会消失。)
还有一个语法高亮问题(下面未显示),函数头 function modulus = get.Modulus(obj)
未被识别为函数头。
有人有修复建议吗?我的问题是配置问题,还是对应于 matlab.el?
中的错误
我已将我的 .emacs 缩减为仅包含以下行:
(add-to-list 'load-path "~/emacs/matlab-emacs")
(require 'matlab-load)
(setq matlab-indent-function-body t)
(setq matlab-functions-have-end t)
TestUnit.m:
classdef TestUnit
enumeration
mm (1)
pixels (2)
in (4)
end
methods
function s=asstring(p)
%ASSTRING Return string version of TestUnit object.
[a,b]=enumeration(p);
s=b{find(a==p,1,'first')}; %%%%% (1)
end
end
end
TensileData.m:
classdef TensileData
properties
Material = 'carbon steel';
SampleNumber = 0;
Stress
Strain
end
properties (Dependent)
Modulus
end
methods
function td = TensileData(material,samplenum,stress,strain)
if nargin > 0
td.Material = material;
td.SampleNumber = samplenum;
td.Stress = stress;
td.Strain = strain;
end
end % TensileData
end % methods
methods
function obj = set.Material(obj,material)
if ~(strcmpi(material,'aluminum') ||...
strcmpi(material,'stainless steel') ||...
strcmpi(material,'carbon steel'))
error('Material must be aluminum, stainless steel, or carbon steel')
end
obj.Material = material;
end % Material set function
function modulus = get.Modulus(obj) %%%%%% (2)
ind = find(obj.Strain > 0); % Find nonzero strain
modulus = mean(obj.Stress(ind)./obj.Strain(ind));
end % Modulus get function
function obj = clear(obj) %%%%%%% (3)
% Another test function
obj.Stress=[]; obj.Strain=[];
end
end % methods
end % classdef
以下内容是通过启动 emacs -Q TestUnit.m
后跟 M-x octave-mode
和 C-x h M-C\
生成的。以下关键字具有语法突出显示:end
、function
、asstring
,但没有 classdef
、enumeration
或 methods
.
classdef TestUnit
enumeration
mm (1)
pixels (2)
in (4)
end
methods
function s=asstring(p)
%ASSTRING Return string version of TestUnit object.
a=enumeration(p);
s=b{find(a==p,1,'first')};
end
end
end
FWIW,内置的八度模式似乎正确地缩进了你的第二个例子。在第一个示例中,它也会在您的 enumeration(p)
调用中被捕获。我有一个 octave.el 的暂定补丁,它修复了你的示例的缩进,但对 Matlab/Octave 了解不多 我不知道你的 "enumeration" 函数来自哪里,所以很难知道是什么将正确修复。是标准函数,还是自己定义?这是否也适用于其他关键字(例如,是否也可以有 "classdef" 函数)?
我在使用 classdef 样式的面向对象代码规范的 matlab 文件的 Emacs(v.24.3.1,matlab.el v.3.3.2)中遇到了自动缩进的几个问题。
在下面的第一个示例文件中,以标记为 %%%%% (1)
的行开头的部分缩进了太多。不正确的缩进一直持续到函数结束 end
.
在第二个文件中,%%%%% (2)
和 %%%%% (3)
处的函数递增缩进了一步。在这里,不正确的缩进一直持续到方法结束 end
。 (但是,如果我在前面的函数关闭 end
处删除注释,这个特殊问题就会消失。)
还有一个语法高亮问题(下面未显示),函数头 function modulus = get.Modulus(obj)
未被识别为函数头。
有人有修复建议吗?我的问题是配置问题,还是对应于 matlab.el?
中的错误我已将我的 .emacs 缩减为仅包含以下行:
(add-to-list 'load-path "~/emacs/matlab-emacs")
(require 'matlab-load)
(setq matlab-indent-function-body t)
(setq matlab-functions-have-end t)
TestUnit.m:
classdef TestUnit
enumeration
mm (1)
pixels (2)
in (4)
end
methods
function s=asstring(p)
%ASSTRING Return string version of TestUnit object.
[a,b]=enumeration(p);
s=b{find(a==p,1,'first')}; %%%%% (1)
end
end
end
TensileData.m:
classdef TensileData
properties
Material = 'carbon steel';
SampleNumber = 0;
Stress
Strain
end
properties (Dependent)
Modulus
end
methods
function td = TensileData(material,samplenum,stress,strain)
if nargin > 0
td.Material = material;
td.SampleNumber = samplenum;
td.Stress = stress;
td.Strain = strain;
end
end % TensileData
end % methods
methods
function obj = set.Material(obj,material)
if ~(strcmpi(material,'aluminum') ||...
strcmpi(material,'stainless steel') ||...
strcmpi(material,'carbon steel'))
error('Material must be aluminum, stainless steel, or carbon steel')
end
obj.Material = material;
end % Material set function
function modulus = get.Modulus(obj) %%%%%% (2)
ind = find(obj.Strain > 0); % Find nonzero strain
modulus = mean(obj.Stress(ind)./obj.Strain(ind));
end % Modulus get function
function obj = clear(obj) %%%%%%% (3)
% Another test function
obj.Stress=[]; obj.Strain=[];
end
end % methods
end % classdef
以下内容是通过启动 emacs -Q TestUnit.m
后跟 M-x octave-mode
和 C-x h M-C\
生成的。以下关键字具有语法突出显示:end
、function
、asstring
,但没有 classdef
、enumeration
或 methods
.
classdef TestUnit
enumeration
mm (1)
pixels (2)
in (4)
end
methods
function s=asstring(p)
%ASSTRING Return string version of TestUnit object.
a=enumeration(p);
s=b{find(a==p,1,'first')};
end
end
end
FWIW,内置的八度模式似乎正确地缩进了你的第二个例子。在第一个示例中,它也会在您的 enumeration(p)
调用中被捕获。我有一个 octave.el 的暂定补丁,它修复了你的示例的缩进,但对 Matlab/Octave 了解不多 我不知道你的 "enumeration" 函数来自哪里,所以很难知道是什么将正确修复。是标准函数,还是自己定义?这是否也适用于其他关键字(例如,是否也可以有 "classdef" 函数)?