While [0.3](https://forum.nim-lang.org/t/10850) focused on correctness, the 
overall theme for 0.4 is to polish the output, making it more regular and less 
wasteful of indent and newlines.

The changes in formatting are enabled mainly by reusing the concepts of 
"prefer-things-on-one-line" and "don't-waste-a-line" features already present 
when rendering some nodes - in particular:
    
    
    # If the whole function call doesn't fit with `=` but fits on its own on a 
single line, do that:
    let reallylongvariablename =
      function(arg0, arg1, arg2)
    
    # ...otherwise, "begin" the function call on the same line as `=`
    let variable = somelongfunction(
      arg0 = value,
      arg1 = value2,
      arg2 = value3
    )
    
    
    Run

Similarly, when formatting infix expressions, preference is given to 
formattings that put the operator last while keeping operands on a line of 
their own, thus avoiding non-structural line breaks in common situation:
    
    
    # We could have fit "parts" of the expression after `and` here, but
    # that would not represent the structure well
    if L.buf[L.bufpos + 1] in {'0' .. '9'} and
         (L.bufpos - 1 == 0 or L.buf[L.bufpos - 1] in UnaryMinusWhitelist):
      discard
    
    
    Run

We also learned to stack dot calls, as commonly seen in "builder"-style API:s:
    
    
    let x =
      somevariable
      .function0(32)
      .function1(42)
    
    
    Run

When formatting, `nph` tries to keep apart "simple" things like literals and 
identifiers from complex expressions - when something is "simple", it will use 
a more compact formatting to ensure that things like lists of numbers don't end 
up taking too much vertical space - this release saw the addition of `.` to the 
list of "simple" things, such that introducing a module or object name 
(`mymodule.symbol`) doesn't cause an explosion.

Finally, [NeoVim](https://github.com/arnetheduck/nph/pull/38) editor 
integration was contributed by foxoman 🎉

Unless significant bugs appear, I'm hoping to keep the 0.4 formatting stable 
for some time for the format to sink in and for significant issues to be 
discovered, while at the same time avoiding disruption.

The plan is to increase the time between each release for each release that 
passes until we get to something that feels really good and deserves a "stable" 
moniker, which hopefully isn't too far off.

In terms of areas of future improvement and possible contribution, doc comments 
probably stand out - this work however should probably be undertaken in concert 
with doc generation tooling so that both `nph` and `nim doc` end up following 
similar conventions - the comment handling in the parser remains one of the 
most fragile aspects of automated formatting and documentation tooling alike 
and would greatly benefit from a holistic approach.

Reply via email to