If you’re still using TextMate 2 in 2025 and developing with Go, this TextMate bundle will be a game-changer for you! 🚀
You need go installation:
brew install go golangci-lintCheck if your go installation is ok?
$ go version
go version go1.24.0 darwin/arm64Now clone this repo:
cd ~/Library/Application\ Support/TextMate/Bundles/
git clone git@github.com:vigo/textmate2-golang.git TextMate2-Golang.tmbundleAfter clone, the bundle should normally appear in the pull-down menu, meaning the installation is complete. If it doesn’t appear, restart TextMate.
You need to set TM_GO and TM_GOPATH TextMate variables:
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"$(command -v go)\"; name = \"TM_GO\"; }"
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"$(go env GOPATH)\"; name = \"TM_GOPATH\"; }"You need to set PATH manually from TextMate > Settings > Variables:
PATH "${TM_GOPATH}/bin:/opt/homebrew/bin:${PATH}"
You can also set manually from your global or project based .tm_properties
file, I prefer this way:
TM_GO=/path/to/go/libexec/bin/go # result of command -v go
TM_GOPATH=/path/to/go # result of go env GOPATH
PATH="${TM_GOPATH}/bin:/opt/homebrew/bin:${PATH}"
It’s not possible to execute shell command in
.tm_propertiestherefore you need to set values by your hand!
If you are an old/aged developer like me :) you can set bigger fonts via:
defaults write com.macromates.TextMate NSToolTipsFontSize 24You need to install go related tools, all are optional:
goimports: Auto adds required imports.gofumpt: Showsgofmterrors but stricter.golines: Breaks long lines even long comments.shadow: Checks variable shadowing.fieldalignment: Auto fixes struct field alignments.golangci-lint: Fastest linter for Go!
go install golang.org/x/tools/cmd/goimports@latest
go install mvdan.cc/gofumpt@latest
go install github.com/segmentio/golines@latest
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest
go install golang.org/x/tools/go/analysis/passes/fieldalignment/cmd/fieldalignment@latestYou can install tools according to your feature toggles with using ⌥ + I (Option + I).
Open your go projects and hit Save
-
goimports -
gofumpt -
golines -
go vet -
shadow -
fieldalignment -
golangci-lint -
goplsLSP - Go to error line
- Lots of snippets
- Go tools updater script
| Variable | Default Value | Description |
|---|---|---|
ENABLE_LOGGING |
Set this for bundle development purposes. | |
LOG_LEVEL |
"DEBUG" |
Set this for bundle development purposes. |
TM_GOLANG_HIDE_TOOL_INFO_ON_SUCCESS |
Toggle tool information on success message. | |
TM_GOLANG_TOOLTIP_LINE_LENGTH |
"100" |
Length of tool tip window |
TM_GOLANG_TOOLTIP_LEFT_PADDING |
"2" |
Left char padding of tool tip window |
TM_GOLANG_TOOLTIP_BORDER_CHAR |
"-" |
Line char of tool tip window |
TM_GO |
Path to your go binary (e.g: /opt/homebrew/opt/go/libexec/bin/go ) |
|
TM_GOPATH |
Your GOPATH from go env GOPATH (e.g: /Users/vigo/.local/go find the value via go env GOPATH ) |
|
TM_GOLANG_DISABLE |
Disable bundle | |
TM_GOLANG_DISABLE_GOIMPORTS |
Disable goimports auto fixes. |
|
TM_GOLANG_DISABLE_GOFUMPT |
Disable gofumpt checks. |
|
TM_GOLANG_DISABLE_GOLINES |
Disable golines fixes. |
|
TM_GOLANG_DISABLE_GOVET |
Disable go vet checks. |
|
TM_GOLANG_DISABLE_GOSHADOW |
Disable go vet with shadow checks. |
|
TM_GOLANG_DISABLE_FIELDALIGNMENT |
Disable fieldalignment auto fixes. |
|
TM_GOLANG_DISABLE_GOLANGCI_LINTER |
Disable golangci-lint checks. |
|
TM_GOIMPORTS_BINARY |
Optional, set if you have different installation. | |
TM_GOFUMPT_BINARY |
Optional, set if you have different installation. | |
TM_GOLINES_BINARY |
Optional, set if you have different installation. | |
TM_GOSHADOW_BINARY |
Optional, set if you have different installation. | |
TM_GOLANGCI_LINTER_BINARY |
Optional, set if you have different installation. | |
TM_GOFIELDALIGNMENT_BINARY |
Optional, set if you have different installation. | |
TM_GOLINES_MAX_LEN |
"100" |
Maximum line length for golines |
TM_GOLINES_TAB_LEN |
"4" |
Length of TAB for golines |
TM_GOLINES_SHORTEN_COMMENTS |
Enable shorten comments too! | |
GOLANGCI_LINTER_OPTIONS |
By pass linter config file, disable all and use only given options. |
To set your TextMate variables, go to TextMate > Settings > Variables and
set the values. Some variables only need to have any value assigned in order
to be activated. Such as:
TM_GOLANG_DISABLE 1
TM_GOLANG_DISABLE_GOIMPORTS 1
TM_GOLANG_DISABLE_GOFUMPT 1
TM_GOLANG_DISABLE_GOLINES 1
TM_GOLANG_DISABLE_GOVET 1
TM_GOLANG_DISABLE_GOSHADOW 1
TM_GOLANG_DISABLE_FIELDALIGNMENT 1
TM_GOIMPORTS_BINARY /path/to/goimports
TM_GOFUMPT_BINARY /path/to/gofumpt
TM_GOLINES_BINARY /path/to/golines
TM_GOSHADOW_BINARY /path/to/shadow
TM_GOFIELDALIGNMENT_BINARY /path/to/fieldalignment
TM_GOLANGCI_LINTER_BINARY /path/to/golangci-lint
TM_GOLINES_MAX_LEN 120
TM_GOLINES_TAB_LEN 2
TM_GOLINES_SHORTEN_COMMENTS 1
To disable this bundle, set TM_GOLANG_DISABLE from TextMate > Settings > Variables
or from .tm_properties (local or global)
TM_GOLANG_DISABLE=1
To set/toggle features from .tm_properties:
# development only
ENABLE_LOGGING=1
LOG_LEVEL=DEBUG # possible values are
# DEBUG, INFO, WARN, ERROR, FATAL
# disable feature(s)
# TM_GOLANG_DISABLE_GOIMPORTS=1
# TM_GOLANG_DISABLE_GOFUMPT=1
# TM_GOLANG_DISABLE_GOLINES=1
# TM_GOLANG_DISABLE_GOVET=1
# TM_GOLANG_DISABLE_GOSHADOW=1
# TM_GOLANG_DISABLE_FIELDALIGNMENT=1
# TM_GOLANG_DISABLE_GOLANGCI_LINTER=1
# custom params
# TM_GOLINES_MAX_LEN=120
# TM_GOLINES_TAB_LEN=2
# TM_GOLINES_SHORTEN_COMMENTS=1
# if you have custom binaries to set
# TM_GOIMPORTS_BINARY=/path/to/goimports
# TM_GOFUMPT_BINARY=/path/to/gofumpt
# TM_GOLINES_BINARY=/path/to/golines
# TM_GOSHADOW_BINARY=/path/to/shadow
# TM_GOFIELDALIGNMENT_BINARY=/path/to/fieldalignment
# TM_GOLANGCI_LINTER_BINARY=/path/to/golangci-lint
or with defaults command:
# disable bundle! nothing will work...
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE\"; }"
# example: enable logging
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"ENABLE_LOGGING\"; }"
# example: set log level
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"ERROR\"; name = \"LOG_LEVEL\"; }"
# disable goimports
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_GOIMPORTS\"; }"
# disable gofumpt
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_GOFUMPT\"; }"
# disable golines
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_GOLINES\"; }"
# disable govet
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_GOVET\"; }"
# disable shadow
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_GOSHADOW\"; }"
# disable fieldalignment
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_FIELDALIGNMENT\"; }"
# disable golangci-lint
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLANG_DISABLE_GOLANGCI_LINTER\"; }"
# set golines max line length
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"120\"; name = \"TM_GOLINES_MAX_LEN\"; }"
# set golines tab length
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"2\"; name = \"TM_GOLINES_TAB_LEN\"; }"
# enable golines for comments too!
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"1\"; name = \"TM_GOLINES_SHORTEN_COMMENTS\"; }"
# example: disable all golangci-lint checkers and use given options,
# only check: errcheck and gosimple errors.
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"-E errcheck -E gosimple\"; name = \"GOLANGCI_LINTER_OPTIONS\"; }"
# set custom path for goimports
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"/path/to/goimports\"; name = \"TM_GOIMPORTS_BINARY\"; }"
# set custom path for gofumpt
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"/path/to/gofumpt\"; name = \"TM_GOFUMPT_BINARY\"; }"
# set custom path for golines
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"/path/to/golines\"; name = \"TM_GOLINES_BINARY\"; }"
# set custom path for shadow
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"/path/to/shadow\"; name = \"TM_GOSHADOW_BINARY\"; }"
# set custom path for fieldalignment
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"/path/to/fieldalignment\"; name = \"TM_GOFIELDALIGNMENT_BINARY\"; }"
# set custom path for golangci-lint
defaults write com.macromates.TextMate environmentVariables \
-array-add "{enabled = 1; value = \"/path/to/golangci-lint\"; name = \"TM_GOLANGCI_LINTER_BINARY\"; }"| Hot Keys | Description |
|---|---|
| ⌥ + I | Install go tools. (option + I) |
| ⌥ + G | Go to error marked line/column. (option + G) |
| ⌥ + R | Fix imports, formatting w/o saving file. (option + R) |
| ⌥ + C | Create .golangci.yml file under project root. (option + C) |
| ⇥ Triggers | Description |
|---|---|
temp + ⇥ |
Create main package template |
fps + ⇥ |
fmt.Printf, fmt.Scanf, fmt.Sprintf |
prl + ⇥ |
fmt.Println |
prf + ⇥ |
fmt.Printf helpers |
spr + ⇥ |
fmt.Sprintf helpers |
fpr + ⇥ |
fmt.Fprintf |
erf + ⇥ |
fmt.Errorf |
log + ⇥ |
log helpers |
ctp + ⇥ |
Compile time proof |
ifer + ⇥ |
if err:= ...; err != nil |
vok + ⇥ |
val, ok := ...; ok { |
st + ⇥ |
struct helpers |
for + ⇥ |
for helpers |
Please set/enable the logger via setting ENABLE_LOGGING=1. Logs are written to
the /tmp/textmate-golang.log file. You can tail while running via;
tail -f /tmp/textmate-golang.log in another Terminal tab. You can see
live what’s going on. Please provide the log information for bug reporting.
After you fix the source code (next run) bundle removes those files if there
is no error. According to you bug report, you can tail or copy/paste the
contents of error file to issue.
Also, while running bundle script (which is TextMate’s default ruby 1.8.7), if error occurs, TextMate pops up an alert window. Please add that screen shot or try to copy error text from modal dialog.
Logger output should look like this:
[2025-03-01 17:03:59][TM-GOLANG][WARN][storage.rb->get_storage]: storage.get not found for 0F742219-9517-454F-93FE-9EEE602B426B (/tmp/textmate-golang-0F742219-9517-454F-93FE-9EEE602B426B.error)
[2025-03-01 17:03:59][TM-GOLANG][INFO][golang.rb->run_document_did_save]: did save
[2025-03-01 17:03:59][TM-GOLANG][INFO][golang.rb->run_document_did_save]: enabled_checkers: [true, true, true, true, true]
[2025-03-01 17:04:33][TM-GOLANG][WARN][storage.rb->destroy_storage]: storage.destroy not found for E2A58F4B-9845-4BD9-A231-CCC60D63D87B - (/tmp/textmate-golang-E2A58F4B-9845-4BD9-A231-CCC60D63D87B.error)
[2025-03-01 17:04:33][TM-GOLANG][WARN][storage.rb->destroy_storage]: storage.destroy not found for E2A58F4B-9845-4BD9-A231-CCC60D63D87B - (/tmp/textmate-golang-E2A58F4B-9845-4BD9-A231-CCC60D63D87B.goto)
[2025-03-01 17:04:33][TM-GOLANG][INFO][golang.rb->run_document_will_save]: will save
[2025-03-01 17:04:33][TM-GOLANG][WARN][storage.rb->get_storage]: storage.get not found for E2A58F4B-9845-4BD9-A231-CCC60D63D87B (/tmp/textmate-golang-E2A58F4B-9845-4BD9-A231-CCC60D63D87B.error)
[2025-03-01 17:04:33][TM-GOLANG][INFO][golang.rb->run_document_did_save]: did save
[2025-03-01 17:04:33][TM-GOLANG][INFO][golang.rb->run_document_did_save]: enabled_checkers: [true, true, true, true, true]
[2025-03-01 17:07:18][TM-GOLANG][WARN][storage.rb->destroy_storage]: storage.destroy not found for 77744A4B-FF5A-4226-B979-094B86F4C74D - (/tmp/textmate-golang-77744A4B-FF5A-4226-B979-094B86F4C74D.error)
Keep in mind that when logging is enabled, there may be some performance degradation due to file I/O operations.
If you are still using TextMate like me, I eagerly await your comments, bug reports, and feature requests.
You can read the whole story here.
- Uğur "vigo" Özyılmazel - Creator, maintainer
All PR’s are welcome!
fork(https://github.com/vigo/textmate2-golang/fork)- Create your
branch(git checkout -b my-features) commityours (git commit -am 'implement new features')pushyourbranch(git push origin my-features)- Than create a new Pull Request!
This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
This project is licensed under MIT


