130

The Past and Future of Vim-go // Speaker Deck

 6 years ago
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

  1. The Past and Future of Vim-go Fatih Arslan Sr. Software

    Engineer @DigitalOcean

  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

  3. Go Programming Language

  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

  5. It started 8 years ago (2009)

  6. None
  7. One year later (2010)

  8. First commands (2011) :Import strings :ImportAs . strings :Drop strings

  9. gofmt support was added (2011)

  10. autoload/go folder (2011)

  11. :make support (2013)

  12. misc/vim removed from Go (2014)

  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)

  14. vim-go Go development plugin for vim

  15. github.com/fatih/vim-go

  16. How and why was vim-go created?

  17. Too many (small) plugins

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

  19. No clear roadmap

  20. misc/vim was missing features

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

  22. A plan to fix it!

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

    Integrate all plugins 3. Fix flaws & add missing features 4. Announce it

  24. None
  25. 2014

  26. First vim-go commit

  27. Naming is hard!

  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

  29. Lack of documentation

  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

  31. Writing help files is not fun

  32. None
  33. Usability fixes

  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

  35. None
  36. Under the hood improvements

  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

  38. Features & improvements

  39. None
  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

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

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

  43. GoCoverage demo

  44. 2015

  45. First release v1.0

  46. After 1347 commits

  47. Versioning changed

  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)

  49. Added Kindle e-book donation option

  50. Kindle e-book donation (2014)

  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

  52. License added

  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.

  54. New features & improvements

  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

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

    :GoTestFunc • Makes testing workflow more efficient • :GoPath • Show or change GOPATH

  57. 2016

  58. NeoVim

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

    integration for commands (feedback loop) • Terminal support for :GoRun and :GoTest

  60. None
  61. Donation changed to Patreon

  62. None
  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

  64. Donations per month

  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

  66. Vim 8.0

  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

  68. None
  69. has_job()

  70. None
  71. Using tools written in Go

  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)

  73. None
  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)

  75. AST based feature

  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

  77. None
  78. Demo time! (selecting functions)

  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

  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

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

  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, ":")

  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

  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())

  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

  86. None
  87. None
  88. More competition

  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

  90. New logo!

  91. vim-go tutorial

  92. None
  93. 2017

  94. Features & improvements

  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!

  96. None
  97. Travis (CI) integration

  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

  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

  100. Only _test.vim files are selected

  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)

  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

  103. None
  104. Integrating vimhelplint

  105. Integrating vimhelplint (cont.) • Runs on every pull request

  106. Google Open Source Award

  107. None
  108. Most used editor for Go

  109. #1 preferred editor by Go developers

  110. Collaborators

  111. Two new core contributors

  112. Stats

  113. Github Stars ⭐ 2014 2015 2016 2017 now 0 1400

    3800 5820 7403

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

    726 Commits 1889 Issues Closed 1464 ✅ Pull Requests Closed 637

  115. 2018 – ...

  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

  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

  118. Verdict

  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

  120. The good • Go made it easy. Tooling that integrates

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

  121. Thanks! Fatih Arslan @fatih @fatih [email protected]


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK