2010-11-27 19 views
16

J'utilise le mode python livré avec emacs 23. Je veux personnaliser l'auto-indentation des instructions multilignes. Par exemple actuellement emacs préfère les suivantesDans emacs python-mode personnaliser l'indentation de l'instruction multi-ligne

my_var = [ 
    'val1', 
    'val2', 
    'val3', 
    ] 

Je préférerais

my_var = [ 
    'val1', 
    'val2', 
    'val3', 
] 

En outre, lors de la création des fonctions avec une liste de fuite ou emacs dict préfère

my_func('first_arg', 'another_arg', { 
     'key1': val1, 
     'key2': val2, 
     }) 

Je voudrais voir

my_func('first_arg', 'another_arg', { 
    'key1': val1, 
    'key2': val2, 
}) 

Est-il possible de créer ces personnalisations en mode python dans emacs? Je ne trouve aucune documentation créant ces personnalisations.

+3

D'habitude, il suffit d'appuyer plusieurs fois sur 'TAB' jusqu'à ce qu'il s'arrête à la position désirée. – jfs

+0

Cela ne fonctionnera pas pour les lignes supplémentaires dans une instruction multiligne. –

+0

Il suffit d'appuyer sur 'TAB' pour la première et la dernière ligne d'une instruction multiligne. La première ligne définit le retrait pour toutes les lignes suivantes et vous appuyez sur 'TAB' à la dernière ligne pour modifier le retrait de la parenthèse fermante. – jfs

Répondre

1

Vous voudrez regarder python-mode.el à la fonction py-indent-line.

11

Quelque chose comme ça, peut-être?

(defadvice python-calculate-indentation (around outdent-closing-brackets) 
    "Handle lines beginning with a closing bracket and indent them so that 
they line up with the line containing the corresponding opening bracket." 
    (save-excursion 
    (beginning-of-line) 
    (let ((syntax (syntax-ppss))) 
     (if (and (not (eq 'string (syntax-ppss-context syntax))) 
       (python-continuation-line-p) 
       (cadr syntax) 
       (skip-syntax-forward "-") 
       (looking-at "\\s)")) 
      (progn 
      (forward-char 1) 
      (ignore-errors (backward-sexp)) 
      (setq ad-return-value (current-indentation))) 
     ad-do-it)))) 

(ad-activate 'python-calculate-indentation) 

Voir this similar question pour une discussion de certaines des fonctionnalités d'Emacs utilisées dans cette réponse.