2009-09-25 3 views
19

Lorsque j'utilise emacs python-mode, si le dernier caractère d'une ligne est une parenthèse ouverte, il indente la ligne suivante à un pas de l'indentation de la ligne précédente.Comment contrôler l'indentation après une parenthèse ouvrante dans Emacs

call_some_function(
    some_very_long_argument_that_I_want_to_put_on_its_own_line) 

J'aime ça. Maintenant en mode ecmascript (que j'utilise pour l'actionScript 3), il est toujours indenté au niveau de la parenthèse précédente. Comment puis-je faire un retrait en mode ecmascript comme le mode python à cet égard?

Répondre

18

Depuis ecmascript-mode est basé sur le mode cc, vous pouvez utiliser c-set-offset qui vous permet de personnaliser un symbole syntaxique est décalé par la valeur préférée.

Dans votre cas, allez au point qui est en retrait dans le mauvais niveau, appuyez sur C-c C-o (ou tapez M-x c-set-offset), accepter le symbole suggéré (arglist-intro), et définir une nouvelle valeur (par exemple +, le décalage par défaut) .

Vous pouvez aussi le faire par programme dans votre dotemacs, par exemple, avec:

(add-hook 'ecmascript-mode-hook 
      (lambda() 
      (c-set-offset 'arglist-intro '+) 
      (c-set-offset 'arglist-close 0))) 
+0

Merci! Ce crochet fonctionne parfaitement et ne nécessite pas de jouer avec d'autres modes. Aussi, je ne savais pas à propos de C-C C-o, c'est pratique. – lacker

+0

comment cela peut-il être ajouté en tant que modeline à la fin du fichier? comme ici http://stackoverflow.com/questions/5382475/emacs-modeline-at-the-end-of-file-in-one-line – alfC

3

ECMAScript mode semble être basé sur cc mode. Si vous définissez le style d'indentation pour cc-mode, il fonctionnera également pour ecmascript-mode. J'ai le code suivant dans mon .emacs. Quand j'utilise ECMAScript mode il indente comme vous le souhaitez:

;;{{{ c/c++ indent style variables 

(require 'cc-mode) 

(defconst my-c-style 
    '(
    (c-electric-pound-behavior  . 'alignleft) 
    (c-tab-always-indent   . t) 
    (c-hanging-braces-alist  . ((block-open) 
             (brace-list-open) 
             (substatement-open) 
             (defun-open before after) 
             (defun-close before after) 
            )) 
    (c-hanging-colons-alist  . ((member-init-intro before) 
             (inher-intro) 
             (case-label) 
             (access-label  after) 
             (label    after) 
             (access-key  after))) 
    (c-cleanup-list    . (scope-operator 
             empty-defun-braces 
             defun-close-semi)) 
    (c-offsets-alist    . ((arglist-close  . c-lineup-arglist) 
             (case-label   . 4) 
             (statement-case-intro . 4) 
             (access-label   . -4) 
             (label    . -) 
             (substatement-open . 0) 
             (block-open   . 0) 
             (knr-argdecl-intro . -))) 
    ) 
    "My C++/C Programming Style") 


; Customizations for both c-mode and c++-mode 
(defun my-c-mode-common-hook() 
    ; set up for my perferred indentation style, but only do it once 
    (c-add-style "My" my-c-style 'set-this-style) 
    ; we like auto-newline and hungry-delete 
    (c-toggle-auto-hungry-state 1) 
    ; keybindings for both C and C++. We can put these in c-mode-map 
    ; because c++-mode-map inherits it 
    (define-key c-mode-map "\C-m" 'newline-and-indent) 
    ; insert 8 tabs 
    (setq tab-width 8) 
) 

;;}}} 
+2

Ce sera bien si vous déplacez les pièces suffisantes, et se concentrer sur les personnalisations d'indentation. –

0

Merci Török Gábor, dans mon cas, je préférais de mettre

(add-hook 'XXX-mode-hook 
     (lambda() 
       (c-set-offset 'arglist-cont-nonempty '+))) 

Je cherchais quelque chose comme ceci:

veryLongFunctionName (bar, bar, bar)

Pour un mor e liste exhaustive de variables: read emacs documentation

+0

S'il vous plaît vérifier cette [URL] (http://stackoverflow.com/help) il sera utile de lever la qualité de votre contenu –

+0

Je ne comprends pas vraiment ce que vous voulez dire. L'URL pointe vers la page d'aide mais sans aucune précision: que dois-je vérifier ici? Qu'est-ce qui n'allait pas dans mon commentaire? – Meinew

Questions connexes