2011-01-28 2 views
11

Est-ce que quelqu'un connaît une méthode existante de nettoyage automatique de l'indentation d'un script MATLAB/Octave? J'ai le code de quelqu'un d'autre (non, vraiment!), Et c'est horrible - aucune des boucles ou fonctions n'est indentée, et la moitié des autres lignes sont indentées à des profondeurs apparemment aléatoires. Le problème avec MATLAB est qu'il n'utilise pas d'accolades, donc les indenteurs de style C++ ne fonctionneront pas. Python pourrait, avec un peu de modification, que j'essaierai si je ne trouve pas de solution préexistante.Nettoyeur à indentation automatique pour MATLAB ou Octave?

Fondamentalement, il avait juste besoin de retrait des lignes après lignes commençant par function, for, if, while ... et les lignes désindenter commençant par end*, je pense ...

Précision: Comme souligné par Jonas, les utilisateurs de MATLAB peuvent simplement sélectionner tout, et ctrl+I pour améliorer l'indentation. Malheureusement, je n'ai pas accès à l'éditeur MATLAB, et il serait également intéressant de pouvoir auto-indenter un lot de fichiers en même temps.

+0

peut-être quelques pénétrateur pascals alors? – stefan

+0

Vous pouvez utiliser des services en ligne comme un [Code MATLAB Beautifier] (http://base-n.de/matlab/code_beautifier.html) – Valeriy

+0

Veuillez voir ma réponse concernant [MBeautifier] (https://stackoverflow.com/questions/ 23960822/comment-je-reformater-code-dans-matlab-editor/37362250 # 37362250) – DVarga

Répondre

15

CTRL+A (pour tout sélectionner), suivi de CTRL+I (indentation automatique) fera l'affaire dans l'éditeur Matlab.

+2

Vous obtenez un vote pour celui-là, car techniquement, il répond à la question. Malheureusement, j'utilise actuellement l'octave, donc je n'ai pas l'éditeur matlab. – naught101

+2

@ naught101: Merci pour l'upvote. Quelque chose comme [ceci] (http://www.mathworks.com/matlabcentral/fileexchange/21798-editing-matlab-files-in-vim) aide-t-il? – Jonas

+3

Emacs avec le mode octave peut le faire. Emacs ou Vim (comme dit par Jonas) + les macros peuvent le faire en batch (vous n'avez pas besoin d'ouvrir manuellement tous vos fichiers). –

5

Ah, j'aurais dû connaître emacs et vi aurait des réponses. Je devrais vraiment apprendre l'un d'eux. Quoi qu'il en soit, j'ai été frustré par le travail que je faisais et j'ai écrit ceci comme une activité de déplacement. Retirez le + '.test.m' pour remplacer les fichiers:

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

J'ai essayé la voie emacs, mais cela ne fonctionne pas, je suis nouveau à ubuntu et octave. Donc, j'ai pris la façon la plus simple: D, site en ligne qui indent le code pour moi et je peux copier/coller le nouveau code propre.

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

Questions connexes