.github
build(deps): bump actions/setup-go from 6 to 7 (#241)
cmd
feat: graceful parser (#144)
internal
chore: bump golangci-lint to 2.11 (#231)
testdata
spelling: https (#208)
core-test
build(deps): bump golang.org/x/mod from 0.33.0 to 0.37.0 (#236)
.editorconfig
Update .editorconfig to include defaults for go.work and go.work.sum as a reference for Go projects (#210)
.gitattributes
Update some dotfiles
.gitignore
Add /editorconfig to .gitignore
.gitmodules
Add core-test submodule
.golangci.yml
fix: address golangci-lint issues (#218)
.goreleaser.yml
prepare v2.6.3 (#204)
cached_parser.go
build(deps): bump golangci/golangci-lint-action from 6.5.2 to 8.0.0 (#211)
CHANGELOG.md
prepare v2.6.5 (#246)
CMakeLists.txt
chore: bump core-test to latest commit (#155)
config.go
chore: bump golangci-lint to 2.11 (#231)
definition.go
build(deps): bump golangci/golangci-lint-action from 6.5.2 to 8.0.0 (#211)
Dockerfile
prepare v2.6.3 (#204)
editorconfig_test.go
feat: replace go-multierror with Go 1.20 native joins (#156)
editorconfig.go
fix: address golangci-lint issues (#218)
fnmatch_test.go
build(deps): bump golang.org/x/mod from 0.20.0 to 0.21.0 (#194)
fnmatch.go
chore: bump golangci-lint to 2.11 (#231)
go.doc
fix ini generation (#46)
go.mod
build(deps): bump golang.org/x/mod from 0.40.0 to 0.41.0 (#245)
go.sum
build(deps): bump golang.org/x/mod from 0.40.0 to 0.41.0 (#245)
LICENSE
Update LICENSE
Makefile
build(deps): bump golang.org/x/mod from 0.33.0 to 0.37.0 (#236)
parser.go
spelling: whether (#209)
README.md
Enable syntax highlight for README blocks (#157)
simple_parser.go
chore: bump golangci-lint to 2.11 (#231)

Editorconfig Core Go

A Editorconfig file parser and manipulator for Go.

Missing features

Installing

We recommend the use of Go 1.17+ modules for this package. Lower versions, such as 1.13, should be fine.

Import by the same path. The package name you will use to access it is editorconfig.

import "github.com/editorconfig/editorconfig-core-go/v2"

Usage

Parse from a file

fp, err := os.Open("path/to/.editorconfig")
if err != nil {
	log.Fatal(err)
}
defer fp.Close()

editorConfig, err := editorconfig.Parse(fp)
if err != nil {
	log.Fatal(err)
}

Graceful parsing from a file

fp, err := os.Open("path/to/.editorconfig")
if err != nil {
	log.Fatal(err)
}
defer fp.Close()

editorConfig, warning, err := editorconfig.ParseGraceful(fp)
if err != nil {
	log.Fatal(err)
}

// Log the warning(s) encountered while reading the editorconfig file
if warning != nil {
	log.Print(warning)
}

Parse from slice of bytes

data := []byte("...")
editorConfig, err := editorconfig.ParseBytes(data)
if err != nil {
	log.Fatal(err)
}

Get definition to a given filename

This method builds a definition to a given filename. This definition is a merge of the properties with selectors that matched the given filename. The lasts sections of the file have preference over the priors.

def := editorConfig.GetDefinitionForFilename("my/file.go")

This definition have the following properties:

type Definition struct {
	Selector string

	Charset                string
	IndentStyle            string
	IndentSize             string
	TabWidth               int
	EndOfLine              string
	TrimTrailingWhitespace *bool
	InsertFinalNewline     *bool
	Raw                    map[string]string
}

Automatic search for .editorconfig files

If you want a definition of a file without having to manually parse the .editorconfig files, you can then use the static version of GetDefinitionForFilename:

def, err := editorconfig.GetDefinitionForFilename("foo/bar/baz/my-file.go")

In the example above, the package will automatically search for .editorconfig files on:

  • foo/bar/baz/.editorconfig
  • foo/baz/.editorconfig
  • foo/.editorconfig

Until it reaches a file with root = true or the root of the filesystem.

Generating a .editorconfig file

You can easily convert a Editorconfig struct to a compatible INI file:

// serialize to slice of bytes
data, err := editorConfig.Serialize()
if err != nil {
	log.Fatal(err)
}

// save directly to file
err := editorConfig.Save("path/to/.editorconfig")
if err != nil {
	log.Fatal(err)
}

Contributing

To run the tests:

go test -v ./...

To run the integration tests:

make test-core