Automatisierter Einrückungsreiniger für MATLAB oder Octave? [abgeschlossen
-
26-10-2019 - |
Frage
Kennt jemand eine vorhandene Methode zur automatischen Reinigung der Einklebung eines Matlab-/Oktav -Skripts? Ich habe den Code eines anderen (nein, wirklich!) Und es ist schrecklich - keine der Schleifen oder Funktionen wird eingerückt, und die Hälfte der anderen Zeilen ist in scheinbar zufällige Tiefen eingerückt.
Das Problem mit MATLAB ist, dass es keine Klammern verwendet, sodass Einsiehrungen im C ++ -Stil nicht funktionieren. Python könnte mit ein wenig Modifikation versuchen, die ich versuchen werde, wenn ich keine bereits bestehende Lösung finden kann.
Grundsätzlich müsste es nur Zeilen nach Linien einstellen, beginnend mit function
, for
, if
, while
... und uneingeschränkte Linien beginnend mit end*
, Ich finde...
Klärung: Wie von Jonas hervorgehoben, können MATLAB -Benutzer einfach alle auswählen und ctrl+I
um die Eindrücke zu enthält. Leider habe ich keinen Zugriff auf den MATLAB-Editor, und es wäre auch schön, in der Lage zu sein, eine Reihe von Dateien gleichzeitig automatisch zu veranlassen.
Lösung
CTRL+A
(um alle auszuwählen), gefolgt von CTRL+I
(Um automatisch einzusetzen) wird den Trick im MATLAB -Editor ausführen.
Andere Tipps
Ah, ich hätte EMACs wissen sollen, und VI hätte Antworten. Ich sollte wirklich einen von ihnen lernen. Wie auch immer, ich war frustriert über die Arbeit, die ich gemacht habe, und schrieb dies als Verdrängungsaktivität. Entferne das + '.test.m'
zum Ersetzen von Dateien:
#!/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)
Ich habe den Emacs -Weg ausprobiert, aber es funktioniert nicht, ich bin neu in Ubuntu und Oktave. Also habe ich den einfachsten Weg eingenommen: D, Online -Site, die den Code für mich einnimmt, und ich kann den neuen sauberen Code kopieren/einfügen.
Hier ist ein VIM -Plugin, das automatisch eingerichtet und Syntax -Highlight für den Oktavcode eingerichtet hat