2011-01-28 12 views
11

¿Alguien sabe de un método existente de limpieza automática de la sangría de un script de MATLAB/Octave? Tengo el código de otra persona (¡no, en realidad!), Y es horrible: ninguno de los bucles o funciones están sangrados, y la mitad de las otras líneas están sangradas a profundidades aparentemente aleatorias.¿Limpiador de muescas automatizado para MATLAB u Octave?

El problema con MATLAB es que no usa llaves, por lo que los modificadores de estilo C++ no van a funcionar. Python podría, con un poco de modificación, que intentaré si no puedo encontrar una solución preexistente.

Básicamente se había sólo tiene que sangrar líneas después de las líneas que comienzan con function, for, if, while ... y las líneas de deshacer la sangría comenzando con end*, creo ...

Aclaración: Como señalado por Jonas, los usuarios de MATLAB pueden simplemente seleccionar todo, y ctrl+I para mejorar la indentación. Desafortunadamente, no tengo acceso al editor de MATLAB, y también sería bueno poder autodefinir un lote de archivos a la vez.

+0

tal vez un pascal indenter entonces? – stefan

+0

Puede utilizar los servicios en línea como un [Embellecedor de códigos MATLAB] (http://base-n.de/matlab/code_beautifier.html) – Valeriy

+0

Consulte mi respuesta sobre [Embellecedor de MB] (https://stackoverflow.com/questions/ 23960822/how-can-i-reformat-code-in-matlab-editor/37362250 # 37362250) – DVarga

Respuesta

15

CTRL+A (para seleccionar todo), seguido de CTRL+I (para sangrar automáticamente) hará el truco en el editor de Matlab.

+2

Usted obtiene un voto positivo para eso, porque técnicamente responde a la pregunta. Desafortunadamente, en realidad estoy usando octava, así que no tengo el editor de matlab. – naught101

+2

@ naught101: Gracias por el voto popular. ¿Ayudaría algo como [esto] (http://www.mathworks.com/matlabcentral/fileexchange/21798-editing-matlab-files-in-vim)? – Jonas

+3

Emacs con modo de octava puede hacerlo. Emacs o Vim (como dice Jonas) + macros pueden hacerlo por lotes (no es necesario que abras manualmente todos tus archivos). –

5

Ah, debería haber sabido que emacs y vi tendrían respuestas. Realmente debería aprender uno de ellos. De todos modos, me sentí frustrado con el trabajo que estaba haciendo y escribí esto como una actividad de desplazamiento. Retire la + '.test.m' para reemplazar los archivos:

#!/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) 
1

me trataron de la manera emacs pero no funciona, soy nuevo en ubuntu y octava. Así que tomé la manera más fácil: D, sitio en línea que sangra el código para mí y puedo copiar/pegar el nuevo código de limpieza.

http://base-n.de/matlab/code_beautifier.html

Cuestiones relacionadas