javaatom-editoruncrustify

How to indent properly after java lambda expression with uncrustify formatter?


I am using atom with atom-beautify and uncrustify to format my java files. I want the indentation of a lambda expression to only indent one level after an open brace, () -> {. I have tried adjusting the indent_continue property, but it goes crazy when I set it to zero. (using 4 spaces for indenting)

when indent_continue = 0, this happens:

public class Test {
    public static void runTest(Runnable code) { code.run(); }

    public static void main(String[] args) {
        runTest(() -> {
                    System.out.println("hello"); // <-- look at this line
                });                              // <-- this one too
    }
}

when indent_continue = 4, it double indents:

public class Test {
    public static void runTest(Runnable code) { code.run(); }

    public static void main(String[] args) {
        runTest(() -> {
                System.out.println("hello"); // <-- look at this line
            });                              // <-- this one too
    }
}

Desired result:

public class Test {
    public static void runTest(Runnable code) { code.run(); }

    public static void main(String[] args) {
        runTest(() -> {
            System.out.println("hello"); // <-- look at this line
        });                              // <-- this one too
    }
}

Current uncrustify.cfg

# -------------------------------------------------------------------------------------------------#
# Boilerplate: https://github.com/bengardner/uncrustify/blob/master/etc/defaults.cfg               #
# -------------------------------------------------------------------------------------------------#


## General
## -------------------------------------------------------------------------------------------------

# The type of line endings
newlines        = lf     # auto/lf/crlf/cr

# - 80 limit is completely deprecated
# - 100 is the new soft limit
# - 120 is hard limit
code_width      = 120

# empty_lines_max = nl_max - 1
nl_max          = 4


## UNICODE
## -------------------------------------------------------------------------------------------------
## Ideally ASCII, UTF-8 otherwise

# If the file contains bytes with values between 128 and 255, but is not UTF-8, then output as UTF-8
utf8_byte        = false

# Force the output encoding to UTF-8
utf8_force        = true


## Tabs
## -------------------------------------------------------------------------------------------------
## Always use 4 spaces

input_tab_size          = 4
output_tab_size         = 4

indent_with_tabs        = 0

# Comments that are not a brace level are indented with tabs on a tabstop.
# Requires indent_with_tabs        = 2. If false, will use spaces.
indent_cmt_with_tabs    = false

# Whether to use tabs for aligning
align_with_tabs         = false

# Whether to keep non-indenting tabs
align_keep_tabs         = false

# Whether to bump out to the next tab when aligning
align_on_tabstop        = false


## Indenting
## -------------------------------------------------------------------------------------------------

# The number of columns to indent per level.
# Usually 2, 3, 4, or 8.
indent_columns          = 4

# The continuation indent. If non-zero, this overrides the indent of '(' and '=' continuation indents.
# For FreeBSD, this is set to 4. Negative value is absolute and not increased for each ( level
indent_continue         = 0


## Spacing
## -------------------------------------------------------------------------------------------------

# Whether to balance spaces inside nested parens
sp_balance_nested_parens    = false


## Parentheses
## -------------------------------------------------------------------------------------------------

# Controls the indent of a close paren after a newline.
# 0: Indent to body level
# 1: Align under the open paren
# 2: Indent to the brace level
indent_paren_close      = 2


## Preprocessor
## -------------------------------------------------------------------------------------------------

# Control indent of preprocessors inside #if blocks at brace level 0
pp_indent                   = remove    # ignore/add/remove/force

# indent by 1 space
pp_space                    = add
pp_space_count              = 1

# indent pp at code level
pp_indent_at_level          = true
pp_define_at_level          = true

# Control whether to indent the code between #if, #else and #endif when not at file-level
pp_if_indent_code           = false

# # Align macro functions and variables together
# align_pp_define_together    = false

# The minimum space between label and value of a preprocessor define
align_pp_define_gap         = 0

# The span for aligning on '#define' bodies (0=don't align)
align_pp_define_span        = 2

# Add or remove space around preprocessor '##' concatenation operator. Default=Add
sp_pp_concat                = add       # ignore/add/remove/force

# Add or remove space after preprocessor '#' stringify operator. Also affects the '#@' charizing operator.
sp_pp_stringify             = ignore    # ignore/add/remove/force

# Add or remove space before preprocessor '#' stringify operator as in '#define x(y) L#y'.
#sp_before_pp_stringify      = ignore    # ignore/add/remove/force


# Template
# --------------------------------------------------------------------------------------------------

# Add or remove space in 'template <' vs 'template<'.
# If set to ignore, sp_before_angle is used.
sp_template_angle   = add     # ignore/add/remove/force

# Add or remove space before '<>'
sp_before_angle     = remove  # ignore/add/remove/force

# Add or remove space inside '<' and '>'
sp_inside_angle     = remove  # ignore/add/remove/force

# Add or remove space after '<>'
sp_after_angle      = add     # ignore/add/remove/force

# Add or remove space between '<>' and '(' as found in 'new List<byte>();'
sp_angle_paren      = remove  # ignore/add/remove/force

# Add or remove space between '<>' and a word as in 'List<byte> m;'
sp_angle_word       = add     # ignore/add/remove/force

# Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add
sp_angle_shift      = add     # ignore/add/remove/force





indent_align_string     = false

# Whether braces are indented to the body level
indent_braces           = false
# Disabled indenting function braces if indent_braces is true
indent_braces_no_func        = false
# Disabled indenting class braces if indent_braces is true
indent_braces_no_class        = false
# Disabled indenting struct braces if indent_braces is true
indent_braces_no_struct        = false
# Indent based on the size of the brace parent, i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc.
indent_brace_parent        = false

indent_namespace        = false
indent_extern        = false
indent_class        = true
indent_class_colon        = false
indent_else_if        = false
indent_var_def_cont        = true

indent_func_call_param        = false
indent_func_def_param        = false
indent_func_proto_param        = false
indent_func_class_param        = false
indent_func_ctor_var_param        = false
indent_func_param_double        = true

indent_template_param        = false
indent_relative_single_line_comments        = false
indent_col1_comment        = true
indent_access_spec_body        = false
indent_paren_nl        = false
indent_comma_paren        = false
indent_bool_paren        = false
indent_first_bool_expr        = false
indent_square_nl        = false
indent_preserve_sql        = false
indent_align_assign        = true

align_number_left        = true
align_func_params        = true
align_same_func_call_params        = false
align_var_def_colon        = false
align_var_def_attribute        = true
align_var_def_inline        = true
align_right_cmt_mix        = false
align_on_operator        = false
align_mix_var_proto        = false
align_single_line_func        = false
align_single_line_brace        = false
align_nl_cont        = false
align_left_shift        = true
align_oc_decl_colon        = false

nl_collapse_empty_body        = true
nl_assign_leave_one_liners        = true
nl_class_leave_one_liners        = true
nl_enum_leave_one_liners        = true
nl_getset_leave_one_liners        = true
nl_func_leave_one_liners        = true
nl_if_leave_one_liners        = true
nl_multi_line_cond        = true
nl_multi_line_define        = true
nl_before_case        = false
nl_after_case        = false
nl_after_return        = true
nl_after_semicolon        = true
nl_after_brace_open        = false
nl_after_brace_open_cmt        = false
nl_after_vbrace_open        = false
nl_after_vbrace_open_empty        = false
nl_after_brace_close        = false
nl_after_vbrace_close        = false
nl_define_macro        = false
nl_squeeze_ifdef        = false
nl_ds_struct_enum_cmt        = false
nl_ds_struct_enum_close_brace        = false
nl_create_if_one_liner        = false
nl_create_for_one_liner        = false
nl_create_while_one_liner        = false
ls_for_split_full        = true
ls_func_split_full        = false
nl_after_multiline_comment        = true
eat_blanks_after_open_brace        = true
eat_blanks_before_close_brace        = true
mod_full_brace_if_chain        = true
mod_pawn_semicolon        = false
mod_full_paren_if_bool        = false
mod_remove_extra_semicolon        = false
mod_sort_import        = false
mod_sort_using        = false
mod_sort_include        = false
mod_move_case_break        = false
mod_remove_empty_return        = true
cmt_indent_multi        = true
cmt_c_group        = false
cmt_c_nl_start        = false
cmt_c_nl_end        = false
cmt_cpp_group        = false
cmt_cpp_nl_start        = false
cmt_cpp_nl_end        = false
cmt_cpp_to_c        = false
cmt_star_cont        = true
cmt_multi_check_last        = true
cmt_insert_before_preproc        = false
indent_sing_line_comments        = 0
indent_switch_case        = 4
indent_case_shift        = 0

align_var_def_star_style        = 0
align_var_def_amp_style        = 1
align_assign_span        = 1
align_assign_thresh        = 8
align_enum_equ_span        = 3
align_var_struct_span        = 3
align_var_struct_gap        = 1
align_struct_init_span        = 2
align_right_cmt_span        = 2
align_right_cmt_gap        = 1
align_right_cmt_at_col        = 2

nl_end_of_file_min        = 1
nl_func_var_def_blk        = 1
nl_after_func_body        = 2
nl_after_func_body_one_liner        = 2
nl_before_block_comment        = 2
nl_after_struct        = 1
mod_full_brace_nl        = 1
mod_add_long_function_closebrace_comment        = 32
mod_add_long_ifdef_endif_comment        = 10
mod_add_long_ifdef_else_comment        = 10
sp_arith        = ignore
sp_assign        = force
sp_assign_default        = add
sp_enum_assign        = force
sp_bool        = force
sp_compare        = force
sp_before_ptr_star        = remove
sp_before_unnamed_ptr_star        = add
sp_between_ptr_star        = remove
sp_after_ptr_star        = add
sp_after_ptr_star_func        = force
sp_before_ptr_star_func        = force
sp_after_type        = force
sp_before_sparen        = force
sp_inside_sparen        = remove
sp_after_sparen        = add
sp_sparen_brace        = add
sp_special_semi        = remove
sp_before_semi        = remove
sp_before_semi_for_empty        = remove
sp_after_semi        = add
sp_after_semi_for_empty        = remove
sp_after_comma        = force
sp_before_comma        = remove
sp_before_case_colon        = remove
sp_after_operator        = add
sp_after_operator_sym        = add
sp_after_cast        = add
sp_inside_paren_cast        = remove
sp_sizeof_paren        = remove
sp_inside_braces_enum        = add
sp_inside_braces_struct        = add
sp_inside_braces        = add
sp_inside_braces_empty        = remove
sp_func_proto_paren        = remove
sp_func_def_paren        = remove
sp_inside_fparens        = remove
sp_inside_fparen        = remove
sp_fparen_brace        = add
sp_func_call_paren        = remove
sp_func_call_paren_empty        = remove
sp_func_call_user_paren        = remove
sp_return_paren        = add
sp_attribute_paren        = remove
sp_defined_paren        = remove
sp_macro        = add
sp_macro_func        = add
sp_else_brace        = add
sp_brace_else        = add
sp_brace_typedef        = add
sp_not        = remove
sp_inv        = remove
sp_addr        = remove
sp_member        = remove
sp_deref        = remove
sp_sign        = remove
sp_incdec        = remove
sp_before_nl_cont        = add
sp_cond_colon        = force
sp_cond_question        = force
sp_cmt_cpp_start        = add
nl_start_of_file        = remove
nl_end_of_file        = force
nl_assign_brace        = remove
nl_assign_square        = remove
nl_enum_brace        = remove
nl_struct_brace        = remove
nl_union_brace        = remove
nl_if_brace        = remove
nl_brace_else        = remove
nl_elseif_brace        = remove
nl_else_brace        = remove
nl_else_if        = remove
nl_for_brace        = remove
nl_while_brace        = remove
nl_do_brace        = remove
nl_brace_while        = remove
nl_switch_brace        = remove
nl_case_colon_brace        = remove
nl_func_type_name        = remove
nl_func_proto_type_name        = remove
nl_func_paren        = remove
nl_func_def_paren        = remove
nl_func_decl_empty        = remove
nl_func_def_empty        = remove
nl_fdef_brace        = remove
nl_return_expr        = remove
pos_arith        = lead
pos_assign        = trail
pos_bool        = trail
pos_conditional        = trail
pos_comma        = trail
pos_class_comma        = lead
pos_class_colon        = lead
mod_full_brace_do        = remove
mod_full_brace_for        = remove
mod_full_brace_function        = force
mod_full_brace_while        = remove
mod_paren_on_return        = ignore

# Misc
# --------------------------------------------------------------------------------------------------

# Allow interpreting '>=' and '>>=' as part of a template in 'void f(list<list<B>>=val);'.
# If true (default), 'assert(x<0 && y>=3)' will be broken.
# Improvements to template detection may make this option obsolete.
tok_split_gte       = false

Version Information:

Ubuntu 16.04.1 LTS
Atom    : 1.13.0
Electron: 1.3.13
Chrome  : 52.0.2743.82
Node    : 6.5.0
uncrustify: 0.59
atom-beautify: 0.29.17

Solution

  • On my system, Ubuntu 16.10 and Atom 1.14.1 (other versions were the same), I solved this by updating to latest uncrustify version 0.64.

    Since I was not keen for re-building uncrustify from source, I pulled a docker image of ubuntu:17.04, installed uncrustify to it and copied the compiled-and-ready-to-use binary from /usr/bin/uncrustify in the docker container in place of my host machine's /usr/bin/uncrustify.
    This worked perfectly for me and indentation is now as expected.