![](/style/images/good.png)
![](/style/images/bad.png)
The Past and Future of Vim-go // Speaker Deck
source link: https://speakerdeck.com/farslan/the-past-and-future-of-vim-go
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Transcript
-
The Past and Future of Vim-go Fatih Arslan Sr. Software
Engineer @DigitalOcean
-
Me • Sr. Software Engineer @DigitalOcean • Creator of vim-go
• Go contributor, author of many popular Go packages (i.e: color, structs, etc..) • Tool maker (i.e: gomodifytags, motion, etc...) • Coffee and bag geek
-
Go Programming Language
-
Go programming language • Started in 2007 with Rob Pike,
Ken Thompson and Robert Griesemer • Open Source in 10 November, 2009 • Go 1.0 released in 28 March, 2012 • Simple, reliable and efficient
-
It started 8 years ago (2009)
- None
-
One year later (2010)
-
First commands (2011) :Import strings :ImportAs . strings :Drop strings
-
gofmt support was added (2011)
-
autoload/go folder (2011)
-
:make support (2013)
-
misc/vim removed from Go (2014)
-
Last state of misc/vim • Some commands to manipulate the
source • :Fmt, :Import, etc... • Syntax, compiler and indent support • Go file detection • Proper readme (before it was removed)
-
vim-go Go development plugin for vim
-
github.com/fatih/vim-go
-
How and why was vim-go created?
-
Too many (small) plugins
-
Too many plugins • https://github.com/Blackrush/vim-gocode • https://github.com/fsouza/go.vim • https://github.com/dgryski/vim-godef •
Go's misc/vim • etc...
-
No clear roadmap
-
misc/vim was missing features
-
Flaws • No coherent feature set, every plugin had its
own commands, etc.. • No docs/ folder • No code/build/test commands (only :make). • Binary paths are hard coded • No coherent UI across all plugin commands, some look under the cursor some do not • No autocompletion • etc...
-
A plan to fix it!
-
A plan to fix it 1. Start using misc/vim 2.
Integrate all plugins 3. Fix flaws & add missing features 4. Announce it
- None
-
2014
-
First vim-go commit
-
Naming is hard!
-
Naming is hard • First, it was called golang.vim •
Then renamed to go.vim (Because golang was wrong) • Finally changed to vim-go as I didn't like the .vim extension
-
Lack of documentation
-
Lack of documentation • Added docs/vim-go.txt file • Improved installations
steps to include pathogen, vim-plug, etc... • Added current existing features • Added information about commands and settings
-
Writing help files is not fun
- None
-
Usability fixes
-
Usability fixes • One command to download and install tools
:GoInstallBinaries • Coherent command interface (i.e: :GoFoo without argument and with argument) • Improved commands by using <bang> (for example :GoBuild! to avoid jumping to first error) • Added :Go prefix to all commands, i.e. :Import > :GoImport • Added go_ prefix to all global variables, i.e. g:bin_path > g:go_bin_path
- None
-
Under the hood improvements
-
Under the hood improvements • Prevent :make to produce binary
• Fixed not losing history on format (gofmt) • Still problematic • Added <Plug> mappings for provide custom mappings • Open cwindow after error or warning
-
Features & improvements
- None
-
New features: tooling • :GoRun, :GoBuild, :GoTest- run, build or
test your file • :GoLint, :GoVet, :GoErrcheck - linters and checkers • :GoCoverage - show code coverage (initial plugin by Yukinari Toyota) • :GoPlay - share your buffer to play.golang.org
-
New features: tooling (cont) • :GoDoc - show package documentation
• :GoInfo - show identifier information under the cursor • :GoDef - jump to a symbol/declaration (inital plugin by Damian Gryski) • :GoRename - refactor identifiers • ...
-
New features: misc • Ultisnippet/Neosnippet integration • Run :GoFmt automatically
on save • Windows OS support • Started to work on static analysis (via Oracle) • tagbar integration • ...
-
GoCoverage demo
-
2015
-
First release v1.0
-
After 1347 commits
-
Versioning changed
-
Versioniong • We started with v1.0 • Was increasing on
patch levels: • v1.0.1, v1.0.2, v1.0.2 • This was wrong, switched to minor levels: • v1.1, v1.2, v1.3, etc.. • Allowed us to release patch releases if needed (i.e v1.3.1)
-
Added Kindle e-book donation option
-
Kindle e-book donation (2014)
-
Kindle e-book donation • People started asking how to donate
• No money was needed, but I was reading a lot • Added public Kindle wish list • Received over 40 books
-
License added
-
License added • Distros started packaging vim-go • No license
meant no clear guidance • Added BSD 3-Clause license • Same as Go's own license • It's a very permissive license, but the name "vim-go" can't be used for advertisement or promotions.
-
New features & improvements
-
Improvements & features • Oracle support enabled (static analysis) •
Show function callees, callers • Show all references of an identifier • etc... • Improved syntax highlighting even more (build constraints, all operators) • Automatic GOPATH detection • gb, Godeps support
-
New Commands • :GoMetalinter (combines :GoLint, :GoErrcheck, :GoVet) • :GoTestCompile,
:GoTestFunc • Makes testing workflow more efficient • :GoPath • Show or change GOPATH
-
2016
-
NeoVim
-
NeoVim • Everything Async • :GoBuild, :GoTest, etc.. • Statusline
integration for commands (feedback loop) • Terminal support for :GoRun and :GoTest
- None
-
Donation changed to Patreon
- None
-
Changed donation to Patreon • I had now so many
Kindle books, I couldn't finish them • Started 1.5 years ago around April 2016 • $5, $10, $25 and $100 tiers • Most used is $5 tier
-
Donations per month
-
Why donation • Open source is free to use, but
doesn't mean it has free value • We spend our own time, a value that we can't buy • Donation helps us to buy value in other areas
-
Vim 8.0
-
Vim 8.0 • Everything Async for Vim! • :GoBuild, :GoTest,
etc.. • Better Statusline integration • A lot of Vim bugs in the beginning, wasn't quite ready • JSON encode/decode was useful for Go tooling integration
- None
-
has_job()
- None
-
Using tools written in Go
-
From Vim script to Go • Logic is replaced by
a binary, written in Go • More and more features are reimplemented again • Vim calls it via system() or job_start() • Tools return JSON or Vim script output (but not all of them)
- None
-
The power of AST • Go has an excellent parser
& scanner packages • Allows us to modify Go source code • Parser is very fast. It's not noticeable at all. • Direct access to AST (Abstract Syntax Tree)
-
AST based feature
-
package main type Server struct { Name string Port int
EnableLogs bool BaseDomain string Credentials struct { Username string Password string } } { "start": 3, "end": 12, "lines": [ "type Server struct {", " Name string `xml:\"name\"`", " Port int `xml:\"port\"`", " EnableLogs bool `xml:\"enable_logs\"`", " BaseDomain string `xml:\"base_domain\"`", " Credentials struct {", " Username string `xml:\"username\"`", " Password string `xml:\"password\"`", " } `xml:\"credentials\"`", "}" ] } Input JSON Output $ gomodifytags -file example.go -struct Server -add-tags json -format json
- None
-
Demo time! (selecting functions)
-
Advantages of AST based text objects • Anonymous functions are
supported • One liner functions can be selected easier • Cursor position can be anywhere as long as it makes sense • Comments are treated as a part of the function declaration
-
OS differences • Supporting Windows, Linux and Mac requires handling
edge cases • Tools output might be different • System specific commands are not the same (i.e opening a URL in Browser) • Paths, Path list separators, Line endings, etc.. are different based on the OS
-
example: Path differences $ echo $GOPATH /Users/fatih/go:/Users/fatih/Code/do > echo %GOPATH%
C:\go;C:\Code\do\go On Linux or macOS On Windows
-
Split a list of paths? " from vim-go/autoload/go/path.vim " Get
a list of current GOPATH's let go_paths = split($GOPATH, ":")
-
Split a list of paths? " from vim-go/autoload/go/path.vim " Get
a list of current GOPATH's let go_paths = split($GOPATH, ":") ['/Users/fatih/go', '/Users/fatih/Code/do'] On Linux or macOS ['C', '\go;C', '\Code\do\go'] On Windows
-
Split a list of paths (fix) " from vim-go/autoload/go/path.vim "
Get a list of current GOPATH's let go_paths = split($GOPATH, ":") let go_paths = split($GOPATH, go#util#PathListSep())
-
Split a list of paths (fix) " from vim-go/autoload/go/path.vim "
Get a list of current GOPATH's let go_paths = split($GOPATH, ":") let go_paths = split($GOPATH, go#util#PathListSep()) ['/Users/fatih/go', '/Users/fatih/Code/do'] On Linux or macOS ['C:\go', 'C:\Code\do\go'] On Windows
- None
- None
-
More competition
-
Competition • Go constantly improves • New features and fundamental
changes (i.e: default GOPATH, vendor/ folder) • Editors: vscode-go (Microsoft), gogland (JetBrains) • User base increases, it's getting harder and harder to maintain and improve it
-
New logo!
-
vim-go tutorial
- None
-
2017
-
Features & improvements
-
Features & improvements • New Commands — such as :GoModifyTags,
:GoFillStruct, :GoKeyify, etc... • Folding support (syntax based) • Travis CI test integration • Removed Wiki and Readme.md examples. Moved all to docs/vim-go.txt • Over 800 Issues were closed!
- None
-
Travis (CI) integration
-
$ cat .travis.yml language: go env: global: - DEPS=$HOME/deps -
PATH=$DEPS/bin:$PATH - PATCH="v8.0.0134" install: | git clone --branch $PATCH --depth 1 https://github.com/vim/vim cd vim ./configure --prefix=$DEPS --with-features=huge --disable-gui make make install cd - script: ./scripts/test.sh 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17
-
$ cat scripts/test.sh ... for test_file in ../autoload/go/*_test.vim do vim
-u NONE -S runtest.vim $test_file done if [ -f "test.log" ]; then cat test.log fi # if Failed exists, test failed if [ -f "FAILED" ]; then echo 2>&1 "FAIL" exit 1 fi echo 2>&1 "PASS" ... 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
-
Only _test.vim files are selected
-
In runtest.vim 1.Looking for functions that start with Test_ 2.Call
the test 3.If v:errors is not empty, populate error log file (test.log)
-
$ cat autoload/go/fmt_test.vim func Test_run_fmt() let actual_file = tempname() call
writefile(readfile("test-fixtures/fmt/hello.go"), actual_file) let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n") " run our code call go#fmt#run("gofmt", actual_file, "test-fixtures/fmt/hello.go") " this should now contain the formatted code let actual = join(readfile(actual_file), "\n") call assert_equal(expected, actual) endfunc 01 02 03 04 05 06 07 08 09 10 11 12 13 14
- None
-
Integrating vimhelplint
-
Integrating vimhelplint (cont.) • Runs on every pull request
-
Google Open Source Award
- None
-
Most used editor for Go
-
#1 preferred editor by Go developers
-
Collaborators
-
Two new core contributors
-
Stats
-
Github Stars ⭐ 2014 2015 2016 2017 now 0 1400
3800 5820 7403
-
Github stats (end of 2017 ...) $ Contributors 207 Forks
726 Commits 1889 Issues Closed 1464 ✅ Pull Requests Closed 637
-
2018 – ...
-
Future • Debugging • Most requested feature. • Problem? No
debugging API in Vim. • Works with server running in background, need async API • @mattn started working on it
-
Future 2 • Vim 8.0 Terminal integration • Better :GoRun
integration (reading from stdin) • Showing stdout/stderr in :GoTest • More vim specific features • Additional text objects, we have currently function • AST based syntax highlighting • Autocomplete still sucks, not sure how to fix it
-
Verdict
-
The bad • No sync between README.MD and docs/vim-go.txt •
Changelog was in Github Releases, moved to Changelog.md • Vim 7.4, Vim 8.0 and NeoVim 0.2 compatibility is hard • For advanced features, better UI is needed for better UX
-
The good • Go made it easy. Tooling that integrates
very well • Constant development and release • Listened to users • UX and UI is important
-
❤
-
Thanks! Fatih Arslan @fatih @fatih [email protected]
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK