2009-09-25 2 views
19

Когда я использую emacs python-mode, если последний символ строки является открытой круглой скобкой, он откладывает следующую строку всего на один шаг от отступа предыдущей строки.Как управлять отступом после открытой скобки в Emacs

call_some_function(
    some_very_long_argument_that_I_want_to_put_on_its_own_line) 

Мне это нравится. Теперь в ecmascript-режиме (который я использую для actionscript 3) он всегда отступает до уровня предыдущей круглой скобки.

call_some_function(
        this_is_not_really_saving_me_any_horizontal_space); 

Как я могу сделать отступ в режиме ecmacript-mode, как python-mode в этом отношении?

ответ

18

Поскольку ecmascript-mode основана на CC-режиме, вы можете использовать c-set-offset, который позволяет настроить любой синтаксический символ это смещение с предпочтительным значением.

В вашем случае, перейдите к пункту, который отступ в неправильном уровне, ударил C-c C-o (или типа M-x c-set-offset), принять предложенный символ (arglist-intro), и установите его новое значение (например +, по умолчанию смещения) ,

Вы также можете сделать это программно в ваших dotemacs, например, с:

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

Спасибо! Этот крючок отлично работает и не требует от меня общения с другими режимами. Также я не знал о C-c C-o, это удобно. – lacker

+0

Как это можно добавить как модель в конце файла? например здесь http://stackoverflow.com/questions/5382475/emacs-modeline-at-the-end-of-file-in-one-line – alfC

3

ecmascript-mode, похоже, основывается на cc-mode. Если вы установили стиль отступа для cc-mode, он также будет работать для ecmascript-mode. У меня есть следующий код в моем .emacs. При использовании ECMAScript-режим он сдвигает по желанию:

;;{{{ 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

Будет хорошо, если вы выберете достаточные части и сосредоточьтесь на настройках отступов. –

0

Спасибо Török Габор, в моем случае я предпочел установить

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

Я искал что-то как это:

veryLongFunctionName (bar, bar, bar)

За мор e исчерпывающий список переменных: read emacs documentation

+0

Проверьте этот URL [http://stackoverflow.com/help), будет полезно повысить качество контента до –

+0

Я не совсем понимаю, что вы имеете в виду. URL указывает на страницу справки, но без какой-либо точности: что я должен там проверять? Что было не так в моем комментарии? – Meinew

Смежные вопросы