Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Past and Future of Vim-go

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for Fatih Arslan Fatih Arslan
November 04, 2017

The Past and Future of Vim-go

How did vim-go started and evolved throughout the years

Avatar for Fatih Arslan

Fatih Arslan

November 04, 2017
Tweet

More Decks by Fatih Arslan

Other Decks in Technology

Transcript

  1. 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
  2. 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
  3. 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)
  4. 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...
  5. A plan to fix it 1. Start using misc/vim 2.

    Integrate all plugins 3. Fix flaws & add missing features 4. Announce it
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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 • ...
  12. New features: misc • Ultisnippet/Neosnippet integration • Run :GoFmt automatically

    on save • Windows OS support • Started to work on static analysis (via Oracle) • tagbar integration • ...
  13. 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)
  14. 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
  15. 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.
  16. 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
  17. New Commands • :GoMetalinter (combines :GoLint, :GoErrcheck, :GoVet) • :GoTestCompile,

    :GoTestFunc • Makes testing workflow more efficient • :GoPath • Show or change GOPATH
  18. NeoVim • Everything Async • :GoBuild, :GoTest, etc.. • Statusline

    integration for commands (feedback loop) • Terminal support for :GoRun and :GoTest
  19. 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
  20. 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
  21. 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
  22. 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)
  23. 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)
  24. 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
  25. 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
  26. 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
  27. Split a list of paths? " from vim-go/autoload/go/path.vim " Get

    a list of current GOPATH's let go_paths = split($GOPATH, ":")
  28. 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
  29. 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())
  30. 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
  31. 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
  32. 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!
  33. $ 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
  34. $ 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
  35. 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)
  36. $ 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
  37. Github stats (end of 2017 ...) $ Contributors 207 Forks

    726 Commits 1889 Issues Closed 1464 ✅ Pull Requests Closed 637
  38. 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
  39. 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
  40. 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
  41. The good • Go made it easy. Tooling that integrates

    very well • Constant development and release • Listened to users • UX and UI is important