MATLAB或Octave的自动缩进清理工具?

11

有没有现成的方法可以自动清除MATLAB/Octave脚本的缩进? 我有别人的代码(真的!), 它很糟糕 - 没有任何循环或函数进行缩进,而其他一半的行则缩进到表面上看起来是随机深度。

MATLAB的问题在于它不使用大括号,因此C++样式的缩进器不会起作用。Python的可能会有用,稍作修改即可,如果找不到现成的解决方案,我会尝试这个方法。

基本上,它只需要缩进以 functionforifwhile 开头的行,并使以 end* 开头的行取消缩进,我想...

澄清:如Jonas所指出的那样,MATLAB用户可以选择全部文本,然后按 ctrl+I 来美化缩进。不幸的是,我无法访问MATLAB编辑器,而且能够批量自动缩进一组文件也是不错的。


也许是一些Pascal缩进程序? - stefan
你可以使用在线服务,例如 MATLAB 代码美化器 - Valeriy
请查看我的答案,有关MBeautifier的问题。 - DVarga
4个回答

15

CTRL+A(全选),然后按CTRL+I(自动缩进)即可在Matlab编辑器中实现此功能。


2
你因为技术上回答了这个问题而获得了一票赞成。不幸的是,我实际上正在使用Octave,所以我没有Matlab编辑器。 - naught101
2
@naught101:感谢您的点赞。像这个这样的东西会有帮助吗? - Jonas
3
使用Emacs的Octave模式可以做到。根据Jonas所说,Emacs或Vim + 宏可以批量处理(无需手动打开所有文件)。 - Clement J.
1
你也可以使用emacs的matlab-mode :) - wizclown

5

啊,我应该知道emacs和vi会有答案。我真的应该学习其中之一。无论如何,我对我正在做的工作感到沮丧,所以写了这个东西来转移注意力。删除+ '.test.m'以替换文件:

#!/usr/bin/env python

import re, sys

def startswith(line=""):
    # these need some word-boundary condition, but \b isn't working
    ctrlstart = '\s*(function|if|while|for|switch)'
    ctrlcont = '\s*(elseif|else|case|catch|otherwise)'
    ctrlend = '\s*(end|endfunction|endif|endwhile|endfor|endswitch)'
    match = re.match(ctrlstart, line)
    if ( match != None ) :
        return ['start',  match.group(0)]
    match=re.match(ctrlcont, line) 
    if ( match!=None ) :
        return ['cont',  match.group(0)]
    match=re.match(ctrlend, line)
    if ( match!=None ) :
        return ['end',  match.group(0)]
    else :
        return [False,  None]

def main( filelist = list() ) :
    for filename in filelist:
        nextindent = 0
        indentmult = 2
        file = open(filename, 'r')
        filelines = file.readlines()
        for ind in range(0, len(filelines)) :
            indentlevel = nextindent
            match = startswith(filelines[ind])
            if match[0] == 'start' :
                nextindent += 1
            elif match[0] == 'cont' :
                indentlevel -= 1
            elif match[0] == 'end' :
                indentlevel -= 1
                nextindent -= 1
            elif match[0] == False :
                nextindent = indentlevel
            filelines[ind] = ' '*indentlevel*indentmult + filelines[ind].lstrip().rstrip() +'\n'
        outfile = open(filename + '.test.m', 'w')
        outfile.writelines(filelines)
        file.close()
        outfile.close()

args = []
for arg in sys.argv[1:] :
    args += [str(arg)]
main(args)

2
我尝试了emacs的方式,但它并没有起作用,我对ubuntu和octave都很陌生。因此我选择了最简单的方法:D,使用在线网站来整理我的代码,这样我就可以复制/粘贴新的清晰代码。 http://base-n.de/matlab/code_beautifier.html

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接