Как контролировать отступ после открывающей скобки в Emacs

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

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

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


person lacker    schedule 25.09.2009    source источник


Ответы (3)


Поскольку режим ecmascript основан на режиме 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)))
person viam0Zah    schedule 25.09.2009
comment
Спасибо! Этот хук работает отлично и не требует от меня возиться с другими режимами. Также я не знал о C-c C-o, это удобно. - person lacker; 25.09.2009
comment
как это можно добавить в качестве модели в конце файла? как здесь stackoverflow.com/questions/5382475/ - person alfC; 29.08.2011

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

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

;;}}}
person Ralph    schedule 25.09.2009
comment
Будет неплохо, если вы уберете достаточное количество частей и сосредоточитесь на настройке отступов. - person viam0Zah; 08.07.2010

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

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

Я искал что-то вроде этого:

veryLongFunctionName (bar, bar, bar)

Более полный список переменных: прочитайте документация по emacs

person Meinew    schedule 19.05.2016
comment
Пожалуйста, проверьте этот URL, он будет полезен для повышения качества вашего контента. - person Willie Cheng; 19.05.2016
comment
Я не очень понимаю, что вы имеете в виду. URL-адрес указывает на страницу справки, но без какой-либо точности: что я должен там проверить? Что не так в моем комментарии? - person Meinew; 19.05.2016
comment
Я также обнаружил, что мне нужно установить arglist-cont-nonempty, чтобы получить правильное поведение. - person Metamorphic; 19.01.2020