Popularity
3.6
Growing
Activity
6.4
Declining
34
15
2

Programming language: Go
Tags: Code Analysis    

golines alternatives and similar packages

Based on the "Code Analysis" category

Do you think we are missing an alternative of golines or a related project?

Add another 'Code Analysis' Package

README

Circle CI Go Report Card GoDoc Coverage

golines

Golines is a golang formatter that shortens long lines, in addition to all of the formatting fixes done by gofmt.

Motivation

The standard golang formatting tools (gofmt, goimports, etc.) are great, but deliberately don't shorten long lines; instead, this is an activity left to developers.

While there are different tastes when it comes to line lengths in go, we've generally found that very long lines are more difficult to read than their shortened alternatives. As an example:

myMap := map[string]string{"first key": "first value", "second key": "second value", "third key": "third value", "fourth key": "fourth value", "fifth key": "fifth value"}

vs.

myMap := map[string]string{
    "first key": "first value",
    "second key": "second value",
    "third key": "third value",
    "fourth key": "fourth value",
    "fifth key": "fifth value",
}

We built golines to give go developers the option to automatically shorten long lines, like the one above, according to their preferences.

Examples

See this [before](_fixtures/end_to_end.go) and [after](fixtures/end_to_end_exp.go) view of a file with very long lines. More example pairs can be found in the [_fixtures](_fixtures) directory.

Usage

First, install the tool:

go get -u github.com/segmentio/golines

Then, run:

golines [paths to format]

The paths can be either directories or individual files. If no paths are provided, then input is taken from stdin (as with gofmt).

By default, the results are printed to stdout. To overwrite the existing files in place, use the -w flag.

Options

Some other options are described in the sections below. Run golines --help to see all available flags and settings.

Line length settings

By default, the tool tries to shorten lines that are longer than 100 columns and assumes that 1 tab = 4 columns. The latter can be changed via the -m and -t flags respectively.

Dry-run mode

Running the tool with the --dry-run flag will show pretty, git-style diffs via an embedded Python script.

Comment shortening

Shortening long comment lines is harder than shortening code because comments can have arbitrary structure and format. golines includes some basic logic for shortening single-line (i.e., //-prefixed) comments, but this is turned off by default since the quality isn't great. To enable this feature anyway, run with the --shorten-comments flag.

Custom formatters

By default, the tool will use goimports as the base formatter (if found), otherwise it will revert to gofmt. An explicit formatter can be set via the --base-formatter flag.

Generated files

By default, the tool will not format any files that look like they're generated. If you want to reformat these too, run with the --no-ignore-generated flag.

Struct tag reformatting

In addition to shortening long lines, the tool also aligns struct tag keys; see the associated [before](_fixtures/struct_tags.go) and [after](fixtures/struct_tags_exp.go) examples in the _fixtures directory. To turn this behavior off, run with --no-reformat-tags.

Developer Tooling Integration

vim-go

Add the following lines to your vimrc, substituting 128 with your preferred line length:

let g:go_fmt_command = "golines"
let g:go_fmt_options = {
    \ 'golines': '-m 128',
    \ }

Others

Coming soon.

How It Works

For each input source file, golines runs through the following process:

  1. Read the file, break it into lines
  2. Add a specially-formatted annotation (comment) to each line that's longer than the configured maximum
  3. Use Dave Brophy's excellent decorated syntax tree library to parse the code plus added annotations
  4. Do a depth-first traversal of the resulting tree, looking for nodes that have an annotation on them
  5. If a node is part of a line that's too long, shorten it by altering the newlines around the node and/or its children
  6. Repeat steps 2-5 until no more shortening can be done
  7. Run the base formatter (e.g., gofmt) over the results, write these to either stdout or the source file

Limitations

The tool has been tested on a variety of inputs, but it's not perfect. Among other examples, the handling of long lines in comments could be improved. If you see anything particularly egregious, please report via an issue.