The Past and Future of Vim-go

B1019ca5714cf8e9951868d6bc517827?s=47 Fatih Arslan
November 04, 2017

The Past and Future of Vim-go

How did vim-go started and evolved throughout the years

B1019ca5714cf8e9951868d6bc517827?s=128

Fatih Arslan

November 04, 2017
Tweet

Transcript

  1. 2.

    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. 4.

    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. 6.
  4. 13.

    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)
  5. 21.

    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...
  6. 23.

    A plan to fix it 1. Start using misc/vim 2.

    Integrate all plugins 3. Fix flaws & add missing features 4. Announce it
  7. 24.
  8. 25.
  9. 28.

    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
  10. 30.

    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
  11. 32.
  12. 34.

    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
  13. 35.
  14. 37.

    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
  15. 39.
  16. 40.

    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
  17. 41.

    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 • ...
  18. 42.

    New features: misc • Ultisnippet/Neosnippet integration • Run :GoFmt automatically

    on save • Windows OS support • Started to work on static analysis (via Oracle) • tagbar integration • ...
  19. 44.
  20. 48.

    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)
  21. 51.

    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
  22. 53.

    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.
  23. 55.

    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
  24. 56.

    New Commands • :GoMetalinter (combines :GoLint, :GoErrcheck, :GoVet) • :GoTestCompile,

    :GoTestFunc • Makes testing workflow more efficient • :GoPath • Show or change GOPATH
  25. 57.
  26. 58.
  27. 59.

    NeoVim • Everything Async • :GoBuild, :GoTest, etc.. • Statusline

    integration for commands (feedback loop) • Terminal support for :GoRun and :GoTest
  28. 60.
  29. 62.
  30. 63.

    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
  31. 65.

    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
  32. 66.
  33. 67.

    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
  34. 68.
  35. 69.
  36. 70.
  37. 72.

    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)
  38. 73.
  39. 74.

    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)
  40. 76.

    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
  41. 77.
  42. 79.

    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
  43. 80.

    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
  44. 82.

    Split a list of paths? " from vim-go/autoload/go/path.vim " Get

    a list of current GOPATH's let go_paths = split($GOPATH, ":")
  45. 83.

    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
  46. 84.

    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())
  47. 85.

    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
  48. 86.
  49. 87.
  50. 89.

    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
  51. 90.
  52. 92.
  53. 93.
  54. 95.

    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!
  55. 96.
  56. 98.

    $ 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
  57. 99.

    $ 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
  58. 101.

    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)
  59. 102.

    $ 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
  60. 103.
  61. 107.
  62. 112.
  63. 114.

    Github stats (end of 2017 ...) $ Contributors 207 Forks

    726 Commits 1889 Issues Closed 1464 ✅ Pull Requests Closed 637
  64. 116.

    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
  65. 117.

    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
  66. 118.
  67. 119.

    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
  68. 120.

    The good • Go made it easy. Tooling that integrates

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