Как управлять отступом после открытой скобки в 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);
Как я могу сделать отступ в режиме ecmacript-mode, как python-mode в этом отношении?
Ответы
Ответ 1
Так как ecmascript-mode основан на режиме cc, вы можете использовать c-set-offset
, который позволяет настраивать любое смещение синтаксического символа с помощью предпочтительное значение.
В вашем случае перейдите к точке с отступом на неправильном уровне, нажмите C-c C-o
(или введите M-x c-set-offset
), примите предложенный символ (arglist-intro
) и установите для него новое значение (например, +
, смещение по умолчанию).
Вы также можете сделать это программно в своих точках, например:
(add-hook 'ecmascript-mode-hook
(lambda ()
(c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-close 0)))
Ответ 2
Режим ecmascript, похоже, основан на cc-режиме. Если вы установите стиль отступов для cc-mode,
он также будет работать в режиме ecmascript. У меня есть следующий код в моем .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)
)
;;}}}
Ответ 3
Спасибо Török Gábor, в моем случае я предпочел установить
(add-hook 'XXX-mode-hook
(lambda ()
(c-set-offset 'arglist-cont-nonempty '+)))
Я искал что-то вроде этого:
veryLongFunctionName (bar,
bar,
bar)
Для более полного списка переменных: прочитать документацию emacs