11

MATLAB/Octave スクリプトのインデントを自動的にクリーニングする既存の方法を知っている人はいますか? 私は他の誰かのコードを持っています (いや、本当に!)、それはひどいです - ループや関数はどれもインデントされておらず、他の行の半分は明らかにランダムな深さにインデントされています.

MATLAB の問題は、中かっこを使用しないため、C++ スタイルのインデンターが機能しないことです。Python のものは、少し変更を加えると、既存の解決策が見つからない場合に試してみることができます。

function基本的には、for, ,ifで始まる行の後に行をインデントする必要があり、 で始まる行whileのインデントを解除する必要があるとend*思います...

明確化: Jonas が指摘したように、MATLAB ユーザーはすべてを選択してctrl+I、インデントを特定することができます。残念ながら、私は MATLAB エディターにアクセスできません。ファイルのバッチを一度に自動インデントできると便利です。

4

4 に答える 4

15

CTRL+A(すべてを選択する) に続いてCTRL+I(自動的にインデントする) は、Matlab エディターでトリックを行います。

于 2011-01-28T01:46:33.137 に答える
5

ああ、私は emacs と vi が答えを持っていることを知っていたはずです。私は本当にそのうちの1つを学ぶべきです。とにかく、私は自分がしている仕事に不満を感じ、これを避難活動として書きました。を削除し+ '.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)
于 2011-01-28T09:42:26.507 に答える