From c7496b281674ca5d9fc6adc558d4cc8a6f824631 Mon Sep 17 00:00:00 2001 From: Buddy Sandidge Date: Tue, 13 Feb 2018 12:04:22 -0800 Subject: [PATCH] Squashed 'vim/bundle/go/' changes from 3efc952a7..bf390af42 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bf390af42 New release: v1.16 e0f9c34ff Merge pull request #1626 from delphinus/feature/add-note-for-vim8 b670f2372 Add note for deoplete on Vim 8 6fb095f1d update CHANGELOG.md for #1611 19ae4ac25 Merge pull request #1611 from hiberabyss/master d6609168e verify 'vsplit' first c5d695482 also check whether mode contains 'vertical' 3a8cc93e5 Fix go#template#create() for directories that don't exist yet (#1618) 60a03b1ba fix errorformat for compilation errors (#1620) 7836e8a06 match vsplit instead of vertical ebe70faf6 improve neovim support f4b4ba13f Merge pull request #1583 from bhcleek/tests/test-output-parsing 40e2e1992 update changelog 6bfc9e2a6 Merge pull request #1613 from bhcleek/fix-neovim-tests 869928c83 Run all test files for Neovim, but skip :GoTest tests 3bc0099e4 Make sure all tests run in Neovim 978f01054 Merge pull request #1607 from Carpetsmoker/fillstruct-line 85c966323 change go_test_prepend_name to go_test_show_name 3f53d9bc7 add tests for test output parsing b8ad7d0eb Implement -line for fillstruct 0c98bdf53 Another Travis test 3df438c7d See if this get build on master b50d8f2c8 Fix installing `gocode` on Windows (#1606) 2a4272238 Append Go file type when creating temporary file (#1601) 7904a2776 Add support for denite.nvim about :GoDecls / :GoDeclsDir (#1604) 47251aa65 improve testing story (#1605) 21c262935 Update changelog.md 48c12aa1a Merge pull request #1597 from fatih/go-doc-url 2fe16b99f Support minisnip (#1589) 6366c6ef2 Code coverage reports with covimerage (#1586) 539cec678 Highlighting arguments (#1587) 7f4673573 Merge pull request #1602 from mocheryl/rename-usage-function a8af95cc2 Rename the usage function to make it callable 7938c88eb Update Changelog.md 3953d53e6 doc: use isnot instead of != for better safety 5daaaf640 guru: scope is not needed for describe mode (#1596) 07af1c520 doc: make godoc instance configurable bbe47d165 Revert "Use :sbuffer in :GoAlternate" (#1595) b870a052c Merge pull request #1592 from bhcleek/fix-vim-vint f63ac32c4 fix vim-vint installation c923e2927 update CHANGELOG.md for #1585 feee7fa82 Merge pull request #1585 from Carpetsmoker/test-alternate 8554d229a show compiler errors when :GoTest fails (#1588) 48ecb61af Use :sbuffer in :GoAlternate ccf98e095 Update CHANGELOG 974b2896c Remove g:go_autodetect_gopath (#1525) a9bf3cbaa Some small test running improvements (#1584) 6318e1aa0 Sync syntax from start after gofmt (#1582) c191a672e Fix :GoImpl completion (#1581) 432dc7f7f prepend test name to test errors (#1578) e2559cb3f update CHANGELOG.md (#1577) ca8ef8a9f Merge pull request #1513 from bhcleek/fix-test-error-processing 57ac640df improve test output handling 456186fd0 update CHANGELOG.md (#1573) bcd555d47 Merge pull request #1527 from bhcleek/fix-fugitive-errors a50c83146 Add test and fix Exec() call 4fe11eacf eliminate errors when trying to run a command in a directory that does not exist ebbc5b34d Add some VimScript lint tools (#1558) a81c1bd52 Merge pull request #1565 from bhcleek/changelog/1562-1563 e581f3f01 typo (#1569) c6ea0c1fe update CHANGELOG.md for #1562 c0d209cce Merge pull request #1562 from washtubs/master d79dd9cbe update CHANGELOG.md for #1563 90384c0ca Merge pull request #1563 from horgh/horgh/run-gometalinter-on-tests 770164ab2 Add --tests only when using the default gometalinter command 70ecda391 Pass --tests flag to gometalinter so that we lint test files d05d93a7e Make :GoTestCompile respect build tags ba6ce99a6 Expand test framework (#1548) bd35a4ec2 Add scripts/docker-test (#1550) 3eefef0b1 Merge pull request #1553 from wuzangsama/master 8ee54fa96 comment out err modeline d735fc9fc Merge pull request #1551 from bhcleek/docker-image-install-vim ee377102d run scripts directly instead of via make in Dockerfile 95584e32d install vim in the Docker image d27a937a3 Ask for "go env" (#1547) 7efc3fe06 Better testing (#1476) 40e02891d Fix UltiSnips gpl snippet (#1535) 44e7173aa add modeline to CHANGELOG.md (#1546) 4409db9b2 Merge pull request #1540 from bhcleek/changelog/1538 06ba514d0 update CHANGELOG.md 5a3a2319a Merge pull request #1538 from 'tmatias:toggle_same_ids_check_group' ee76970c5 improve go#guru#ClearSameIds readability d3832a4e1 check group in when toggling same ids 087899210 Display warning when people use an older Vim (#1524) cc93090b0 Add .editorconfig (#1523) b28351fdd Merge pull request #1528 from bhcleek/add-modelines 4a8e342e8 Merge pull request #1529 from fatih/fix-go-play 219b9a12c tool: fix :GoPlay by using the correct IsMac() function 448a95767 add missing modelines 51dbbc412 Merge pull request #1461 from bhcleek/gopath-autodetect-default 2e6b84757 disable g:go_autodetect_gopath by default faf628814 Merge pull request #1521 from bhcleek/changelog-1519 544c894c3 update changelog 0643e9ecc Merge pull request #1519 from bhcleek/fix-go-test-compile b2ffdaa8e do not try to run tests for :GoTestCompile 011dcadc0 normalize message output (#1512) f6196ad98 Update ChangeLog 112ea9090 Merge pull request #1465 from Carpetsmoker/rename-complete 57d60ff05 Also clarify docs a bit d3a07e2c3 Address PR feedback 172139cab Better prefill and completion for :GoRename 2f838940e Clarify documentation for g:go_play_browser_command (#1495) bd5bd982d edit issue template (#1502) f61f97fbb edit help file and function description (#1503) da4a86afa Update CHANGELOG 6ba5992fc Turnoff window resize if its still visible (#1488) 8ccaa5134 edit documentation (#1504) 863008a33 Fix util echo function: ensure l:msg is a list after split() (#1498) 96995056c Merge pull request #1492 from fatih/new-release 010d0cc59 New release: v1.15 4d518eef8 Merge pull request #1491 from fatih/update-changelog a0a528a0f Update CHANGELOG.md e3725d45a Merge pull request #1474 from bhcleek/close-gofmt-list-vim7.4 be4133a0b Merge pull request #1485 from cassiobotaro/master 1c1980fd6 ensure fmt list gets closed when title cannot be checked 7cb6d701c Fix #1484 GoDecls break when motion returns empty dcd3e3bfb Don't use `v:t_list`. (#1479) 54150c199 Fix GoInstallBinaries error message (#1478) 8914c7e39 Allow arguments for :Go{Install,Update}Binaries (#1467) 2a9c03edd Clarify the documentation for the guru scope. (#1466) ff2936872 Add go#util#Exec() (#1471) 620717490 Documentation for syntax highlighting (#1469) 78b7db128 Support fzf on GoDecls[Dir] (#1437) 458d23085 Merge pull request #1463 from bhcleek/better-assignment-highlight 09911f93f update CHANGELOG.md (#1451) 8fe9a2425 reduce goVarAssignment regex branches 40bdb6ab0 Implement :GoFillStruct (#1443) 0371da68c Show multiline errors (#1456) 40bf77e5f teach goVarAssign about all assignment operators 5e4ed05df Merge pull request #1460 from bhcleek/update-change-log-higlight-assignment 7a3316f59 update changelog 7a7af87f8 Merge pull request #1458 from xlucas/master 7fbccd9da Variable assignments syntax highlight 1e7560e0e Merge pull request #1453 from Carpetsmoker/fix-list-type-commands 6ce489126 Fix string comparison 2b2ffcdde Fix syntax for `s:default_list_type_commands` 2162c2fa1 Fix :GoBuild shell escaping (#1450) 5730b71ea Merge pull request #1449 from bhcleek/consolidate-list-type-command-keys b319ed975 Load ftplugin/html.vim for gohtmltmpl (#1442) 2b3610ff5 fix arguments to jobcontrol#s:spawn (#1448) 0ff17516c change GoModifyTags default list type ce9e0fcd8 refactor for maintainability 262fb6308 doc: add example for go_list_type_commands 6b7bab65a Update CHANGELOG.md df60f2652 support for customizable lists types (#1415) dfc89933c Update CHANGELOG.md eac41c98a Merge pull request #1439 from guns/fix-async-guru-data-race 17c03852f Parse messages from guru on close_cb, not exit_cb b71f2b757 Fix ChangeLog links (#1436) 5f0c5941b Fix go#package#FromPath() (#1435) 2d36a7882 Merge pull request #1434 from fatih/remove-brackets a5cdeb59d CHANGELOG.md: fix GH links syntax e287f9b83 Merge pull request #1433 from fatih/fix-issue-links 5ecd7966f CHANGELOG.md: fix markdown syntax to link to GH issues/pr's b88a5c989 Proof read documentation: "Intro", "Install", and README (#1432) f71d6e70a Update CHANGELOG 75d0e9f7a GoImpl: support relative (vendor) imports (#1322) 37e5082d4 Add support for unite.vim for :GoDecls / :GoDeclsDir (#1391) 54bcb5bfa Fix g:go_fold_enable, 'comment' value aa526f0fb Update CHANGELOG 9cce36bd8 Allow folding any comment (#1428) 0be825dd4 Vim syntax match for variable definitions (#1426) 5db7dd6a6 Load buffers with :GoDef relative to cwd (#1277) 506ddafc2 Add support of g:go_doc_command option (#1420) 67a3e972a Show output of vimhelplint failures (#1430) ea3346620 Remove accidentally committed file; update CHANGELOG 55a54f149 Merge branch 'pr-1414' 63c76f919 Update CHANGELOG.md b0ae2c584 Merge pull request #1386 from Carpetsmoker/goimpl 6d15159e8 Update CHANGELOG.md 18eba1a08 Merge pull request #1411 from kirstein/master cdd056ff8 Merge pull request #1377 from Carpetsmoker/fold-pkgcmt 8ba55ec3c Update Changelog.md fb2763465 Merge pull request #1422 from jasonkeene/ginkgo-faq 79f451448 Some small :GoImpl improvements 125d5caf3 Fold package-level comments c420b47cd Add FAQ entry for how to run focused ginkgo tests 117c33413 update comment b5271d098 Fix to fails of GoMetalinter result filepath in subdir. resolve #1413 79152447b term: exit insert mode 52c5b1f74 fmt: fix backwards compatibility with getqflist df99b193e Update CHANGELOG.md 9a433e5db Merge pull request #1407 from fatih/fix-autoclose-gofmt a9ad6b3f0 fmt.vim: only close quickfix if its belongs to gofmt dfd860471 Add initial commit 8eef8ea57 Add all release information to changelog 4fd3a60da Add old changelog (v1.3) 5939bdd8f Add old changelog (v1.4) 9391a575a Add old changelog (v1.5) 30d036a02 Update CHANGELOG.md ba09b8fef Merge pull request #1401 from fatih/gomodifytags-improvements e655a39ba Update CHANGELOG.md a0ecfabad Merge pull request #1400 from cfsalguero/issue-1396 386e81004 tags: use -modified flag and show errors 525fe8af9 Update CHANGELOG.md e8e49eac5 Merge pull request #1387 from Carpetsmoker/import-comments cf15171af Add demo link to syntax based folding 25d00acf3 New release: v1.14 5d5c96665 Updaste Changelog.md c9052d527 def: only show filename to prevent showing long paths 250c6397c Merge pull request #1385 from Carpetsmoker/godef-msg 78a87d866 Merge pull request #1384 from Carpetsmoker/fold-var 9c292d9ee Update CHANGELOG.md 9c49d42a0 Merge pull request #1394 from mikelue/master 239cbec81 Update CHANGELOG.md 6a470dac4 Update CHANGELOG.md ebdcf3ad9 Merge pull request #1382 from Carpetsmoker/lint d758e7f52 Update CHANGELOG.md 13b9eb578 Merge pull request #1381 from Carpetsmoker/vet 805334818 Document how to use a different Go binary (#1373) d4f931d7e Merge pull request #1395 from deltaskelta/doc-typo-fix e8cf579db Issue 1396 go#def#tab fails if file is already open 60db0a282 Typo fix c16c29a8a Complement the path of command for different situations of Cygwin environment ec6500bb4 Allow comments in import blocks 436bfd58f Show message when using :GoDef and opening a new buffer a683b6a38 Fixes for folding var/const blocks 2d91dbdcf Run :GoLint against the package of the open file f439c0cb5 Fix filepaths in the quickfix list for :GoVet 76cd99db6 Merge pull request #1356 from antoineco/master 8de2e7df9 Clarify :helpt prerequisite for using :help vim-go a35c51f3e Update CHANGELOG.md 68c70160f Merge pull request #1371 from Carpetsmoker/new-file 0da59fe21 Update CHANGELOG.md 629cd6d42 Merge pull request #1372 from Carpetsmoker/gofiles-types 3ba1fefa0 Update CHANGELOG.md 307180cd7 Merge pull request #1374 from Carpetsmoker/spaces 82f7e25c5 Update CHANGELOG.md 64bdf041f Merge pull request #1379 from Carpetsmoker/missing-gogetdoc 026728c51 Merge pull request #1378 from clee/fix-contributing-link 64bd8ddd3 Don't show window if "gogetdoc" command isn't found f8ce5e051 Fix link in CONTRIBUTING.md 6be1c2175 Preserve cursor column through formatting (#1369) 857eaa5b9 Fix various commands when GOPATH contains spaces. 702b1a490 Make :GoDef work if a file path contains spaces 3b7b37626 Allow specifying which filestypes to list for :GoFiles bd6c4562b Show correct message when editing a new file 2d89f0052 Merge pull request #1368 from anarchyrucks/patch-1 f95eb84f6 Fix typo 1575dcab2 Update CHANGELOG.md d5f55053f Fold import, var, and const blocks (#1339) 3b6270e06 Update CHANGELOG.md ab0df08ca Merge pull request #1367 from fatih/improve-cursor-replacement-fmt 838492059 fmt.vim: fix cursor staying on the same line when goimports is used ca1d7127b Update CHANGELOG.md e0e8032a7 Merge pull request #1366 from fatih/fix-multiple-src 02c5d8a57 path: fix autp detecting of GOPATH for import paths with string 'src' d98b80ecf Update CHANGELOG.md cc28ff699 Merge pull request #1365 from fatih/fix-gofmt-list e4e992a1c fmt.vim: default to quickfix list for showing errors d5979c91e Merge pull request #1364 from Carpetsmoker/hl-type dd6e15468 Don't add offset to goTypeConstructor. 82998ea2f Update CHANGELOG.md 872bef43d Merge pull request #1363 from fatih/fix-array-index 6d8b86ed9 path: fix gobin path for go => 1.7 bfcf8b057 Update CHANGELOG.md e56673862 Merge pull request #1361 from seanpile/keep_list_open 4e3f55be7 Update CHANGELOG.md b54de478e Merge pull request #1362 from fatih/fix-swap-file fd44242d5 fmt: fix blocking ui when swapfile is enabled 06987d569 Added ability to keep the quickfix/location list window open after successful operations instead of autoclosing 58bfea76b Update CHANGELOG.md 8b02779ba Merge pull request #1345 from fatih/include-func-variable 789ffb460 textobj: include function variable for anonymous functions f08fcab5c Update CHANGELOG.md 657d0937f Merge pull request #1338 from Carpetsmoker/fix-1282 2647e9bda Merge pull request #1340 from Carpetsmoker/vimhelplint 971f3071f Update CHANGELOG.md acd0be01a Merge pull request #1344 from robot-dreams/patch-1 1a946d9be Fix warning when goimports doesn't support srcdir 55ba44a57 Fix doc lint error f7df583a0 Add vimhelplint to Travis tests cfa9713eb Match zero-width in goTypeConstructor bcf3f23dd Update CHANGELOG.md 0a8af0caa Update CHANGELOG.md 4787f2762 Merge pull request #1335 from Carpetsmoker/go_doc_max_height 290887538 Update CHANGELOG.md 4fd118269 coverage.vim: add echo message for GoCoverage 837143b72 Merge pull request #1336 from rhysd/fix-typo 841457035 fix typos in docs, changelog and sources 2eb88b70a Add g:go_doc_max_height setting 3806c4e59 Update Changelog.md 2df21ebaf Merge pull request #1330 from fatih/go-build-cache e1c0d7b0b cmd: add -i flag to go build 182a9dd14 Add a note about the recent test refactor 7b93bae4b commands: expose :GoDecls{Dir} command to show a warning 147360e9a Update Changelog.md 91b159a7e Merge pull request #1326 from tmc/coverage-args f5898d3c8 Create CHANGELOG.md aefc0a2a0 Merge pull request #1327 from fatih/fix-echo-output-tesst 21cfbbc0d test: fix outputing message when test finishes b9bef683b coverage.vim: pass along arguments to coverage_job fec6321d2 Update CHANGELOG.md d75e17546 Fix syntastic help (#1323) 4f2bdd61a Update Changelog.md bf9cdc211 Update Changelog.md 913c181b8 Merge pull request #1321 from fatih/improve-import-path 15d3b3c86 package: improve import_path by using go list 61b897f14 Update CHANGELOG.md bc097c164 Merge pull request #1320 from fatih/cache-env-calls 52e5ad5cf Update CHANGELOG.md e2be1fa7e Update CHANGELOG.md a4b64e28e Merge pull request #1318 from bhcleek/feature-test-template f4be8f612 Use a different template for test files 4f04d680e New release: v1.13 b0a11f016 Improve caching for go env calls d2e1e1764 Update CHANGELOG.md 404dca66d Merge pull request #1319 from fatih/fix-def-tags 150b2cc05 def: fix passing build tags to guru 16e0ccf28 Update CHANGELOG.md 196792d20 Merge pull request #1317 from fatih/test-compile 21376e689 test.vim: more efficient compiling of test files 7fafcb14f fix coverage to use new test.vim file 9b3aa3f2d Update CHANGELOG.md 161bc4632 Merge pull request #1316 from fatih/fix-test-coloni 8f0029172 test.vim: fix messages with colons 57aaa95ac Merge pull request #1315 from fatih/standalone-test-parsing d2ff39ca7 test.vim: refactor to use its own parse function 76044c0c5 Merge pull request #1314 from fatih/refactor-parsing 8f9699486 Refactor all test related commands into test.vim 899b741f2 Merge pull request #1311 from tgrosinger/typo-fix 57e062a27 docs: fix typo in command 476239117 Update Changelog.md 60565da2d goimports fails when proj symlinked in GOPATH (#1310) aec329223 Update Changelog.md 0325c5e04 Specifies the type of list to use in GoMetaLinter, by go_list_type (#1309) aab6381ea Update Changelog.md 016c03c99 path: do not use a dedicated function for cygwin 3f5dd0a5a Add path convertion for native-win-vim with Cygwin support (#1092) 0235a8f85 Update Changelog.md 66b04e85d Merge pull request #1308 from fatih/improve-fmt-commands e6533efc8 fmt: change go_fmt_options's type to dict 00ab89e4d Update CHANGELOG.md b8a6dc963 Merge pull request #1296 from fatih/term-neovim-fix ff3c10ec4 Update CHANGELOG.md e63e16602 Merge pull request #1304 from fatih/add-listtype-support e3760a58d fmt: add support of 'go_list_type' for :GoFmt and :GoImports 8efd1dd73 Update CHANGELOG.md 66e3d342f Merge pull request #1301 from zkry/highlight-interface-struct-fix f8863b067 Fix the highlighting error by putting the interface\|struct section inside \( \) to correctly identify word boundries 403b9bb29 Merge pull request #1300 from robphoenix/master 276e7abc2 fix single spelling error in vim-go.txt 7b311be14 Update CHANGELOG.md 162e26369 do not jump to the quickfix window when gometalinter is executed (#1293) 1cc18529e Merge pull request #1299 from fatih/fix-tags-settings 07e055236 addtags: unify settings for case setting c1ae945f6 util: remove nonused go#util#AddTags function 4fda59601 term: fix cwd after running command 05efdfe80 Update CHANGELOG.md 2e1979847 Merge pull request #1295 from etdub/master fd7d4d40d Change GoLint command to lint the current directory instead of the current file (issue #1263) 7fb96896f Update CHANGELOG.md 26e61829c Merge pull request #1280 from fatih/fix-autodetect-gopath c609352bb path: return the unmodified GOPATH if autodetect is disabled 6f392c454 Update CONTRIBUTING.md 1143f398e Merge pull request #1279 from fatih/update-docs 8b7d743e5 docs: add new :GoDef mouse mappings 1c6ccb1f2 Update CHANGELOG.md eb739e185 Merge pull request #1264 from lilydjwg/master 4cdb20ca5 Update CHANGELOG.md f6554604f Add :GoAddTags transform (#1275) 8532385af Update CHANGELOG.md 8e0ddef60 Merge pull request #1276 from creaky/master d92a4f6f0 Updated code based on feedback and further analysis 27228dada Merge pull request #1278 from dorons/master 872e4e190 Fixed indent for 'ife' snippet b57ee9088 Update CHANGELOG.md 1a7887e32 Include keyify support (#1258) e9bb5eaa4 Fixed issue Vim-Go broken on freebsd #1224 aab745ece Update CHANGELOG.md cdffa16f5 Merge pull request #1268 from Foxboron/patch-1 f1c6f6649 Include if with inline error handling 78c2a9a0b support as well b4936d89b Update README.md ae5e0d887 Merge pull request #1255 from fatih/readme-improvement 580103e67 Simplify Readme.md 08d0c34d0 Update changelog.md c71c75e4c Merge pull request #1247 from pborzenkov/close-race 48e0660e2 Update Changelog and add docs for new gometalinter feature 18a5dad3c Merge pull request #1253 from redforks/master 882a1932e Add go_metalinter_excludes config variable 55906b13d Merge pull request #1250 from bradleyfalzon/patch-1 f16e5d9fe Minor typo in change log 26362e4bf New release: v1.12 c20e192ea Update CHANGELOG.md 7871cd94b Update CHANGELOG.md 727aed364 Merge pull request #1248 from fatih/default-gopath 6db12a966 Go 1.8 compatible GOPATH improvements 5c721a278 job: fix race between channel close and job exit 411981189 Update CHANGELOG.md b14621829 Merge pull request #1246 from fatih/fix-install-arg 58adebd7a cmd: we don't need to shellescape for jobs e0a7b12e1 Update CHANGELOG.md 5d684f6da Merge pull request #1235 from thsnr/master 58853d520 Update CHANGELOG.md a83c4c0bc Merge pull request #1242 from danielheller/godef-help-explicit-arguments cec0fc361 Update GoDef help: remove explicit arguments 1aa048b2d Allow trimming around comments in gotexttmpl syntax. 362e15ab4 Merge pull request #1233 from rigelrozanski/patch-1 8cb66af59 Updated Broken Link eb8adf52b Tidy up and fix typos 091a8c1f9 Update CHANGELOG.md 0586539e0 Add :GoBuildTags to set build tags (#1232) cf3aad953 Update CHANGELOG.md 03fc6a710 Add build tags support for gorename (#1225) b9c815626 Update CHANGELOG.md 71efb2e6d Set GOPATH for both possible go guru execution paths (#1193) 7ff6d8e06 Update CHANGELOG.md 92d0d07a6 Merge pull request #1195 from haleyrc/master 70aba7c27 Update CHANGELOG.md ac2f89b41 Merge pull request #1197 from jhillyerd/noshowdoc 7149f3eec Update CHANGELOG.md 468fa9823 Merge pull request #1199 from tarrant/master 9a9f010ec Update CHANGELOG.md 2fc67cd72 Merge pull request #1211 from cespare/goimports-options ded4d3169 Respect go_fmt_options when running goimports 4490a1f67 Fix whitespace and typo (#1201) 68f398b3b Update CHANGELOG.md a8a253bb8 Update CHANGELOG.md e4e5e2267 Merge pull request #1204 from fatih/gotags eca86e03f New GoTags improvements d3f90c21e Set the filename in the location-list d5d826a69 Document 'noshowmode' requirement for echo_go_info 884870e88 Modify the resize behavior for godoc 1425decf6 Update CHANGELOG.md fc1ab4052 Merge pull request #1194 from jblebrun/no-gopath-env-fix a4edbfc8e Ensure no trailing : in gopath 9b0362562 Update CHANGELOG.md 119eec1b3 Merge pull request #1177 from francescomari/guru-tags 0dacf2917 Update CHANGELOG.md 86834ce79 Merge pull request #1184 from mattn/non-utf8 9cb5965f5 Update CHANGELOG.md 6e832e6c0 Merge pull request #1185 from mattn/errl f6ad41d15 Update CHANGELOG.md a8592baf7 Merge pull request #1192 from vieiralucas/patch-1 375ce716c Update CHANGELOG.md 3c5f09de5 Merge pull request #1176 from joshuarubin/neovim_go_build_fixes d7860c34d Lowercase in mappings examples c29fac849 log.Fatal(err) is useful ddf3ad471 Support 'encoding != utf-8' 3e8551253 Correctly report the value of the 'g:go_guru_tags' variable 83296ac0b fix :GoBuild issues in neovim 3eb57ac3a New release: v1.11 07dabeb11 Update CHANGELOG.md 001cce799 Merge pull request #1174 from zmb3/zb-godoc-browser e3a760fd9 Fix :GoDocBrowser for third party package doc. ba08326b2 Update CHANGELOG.md 41f5fd135 Merge pull request #1146 from horgh/master 7635fc0eb Update CHANGELOG.md f9391628d Merge pull request #1152 from ismail/ismail-patch-1 8775ba7f5 Merge pull request #1168 from fatih/fix-docs e3e9fef6a Update CHANGELOG.md fba058f98 Merge pull request #1167 from fatih/disable-highlight 16ffe5d88 docs: fix unused feature 0a3b205c8 syntax: switch options to off 47447feea Update CHANGELOG.md 283fe500e Merge pull request #1160 from thsnr/master 10af7bc2a Use go_metalinter_command as List after split(). d7c628ff2 Merge pull request #1159 from fatih/godef-tests e27a00365 tests: add def_test.vim a9bc540b0 Update readme.md 73f707d46 Merge pull request #1158 from fatih/improve_tests b586c7e4f tests: add new test, update runttest.vim b27031ab0 Update CHANGELOG.md bd6e33ed4 Merge pull request #1157 from fatih/vim-go-tests 145893132 Add travis integration and initial test suite 7d3e4bc8b Merge pull request #1156 from bhcleek/fix-sameids-BufWinEnter ffe8fc402 clear buffer-local BufWinEnter properly fa7dc2eaa Update CHANGELOG.md edcd9c813 Merge pull request #1155 from bhcleek/fix-guru-async 7eeb2f87e use funcref() instead of function() for closures used as callbacks 407dcda3f If GOPATH is empty check for the value of go env GOPATH 95be72ddd go_metalinter_deadline applies in async mode now e46dd4dde Update CHANGELOG.md 708861202 Merge pull request #1133 from bhcleek/fix-godef-stack-pop 66c72b4ad def: indent d5abc9d80 Update CHANGELOG.md 054951253 Merge pull request #1132 from bhcleek/fix-godef-split 57e19fa7a Update CHANGELOG.md 398680c1f job: set explicit bang to avoid errors in case it's being used cd793b75a Update CHANGELOG.md 9f9b93767 Merge pull request #1124 from jimmyfrasche/master ca4b4437b Update CHANGELOG.md 86adc49b1 Merge pull request #1136 from jdhenke/master 0eaa355a7 Update CHANGELOG.md 8e44afc0f Merge pull request #1145 from entombedvirus/fix_jobcontrol_on_exit_err 709a4585e Update CHANGELOG.md e15c781d1 Merge pull request #1143 from kechako/fix-indentation-broken 69e2b2c66 Update CHANGELOG.md 7cde15acd Merge pull request #1141 from oystedal/oystedal/1140 39ebca3a1 fixes #1144: "E118: Too many arguments for function: 173_on_exit" d1f5dd3bd Update README.md a55c85338 Fix indentation broken when using a action with a minus sign like `{{-' d3c9fc07b Change default value of `g:go_asmfmt_autosave` to 0. 93984b340 fix bug in guru vim script 08c881dea Changelog.md: add requirement 66ce0c0d3 make requested changes to documentation and setting name 6bf649098 Merge pull request #1135 from fatih/fix-setloclist edacc3687 list: set title only for recent Vim versions 6094a38b2 allow popping from jump list when buffer is modified 973ba8c29 handle :GoDef from modified buffer 4a993be12 Update CHANGELOG.md 309c94fbe Merge pull request #1128 from fatih/fix-coverage-syntax 10a8ddcda coverage: no need to change turn on/off syntax eeae7b0bf Update CHANGELOG.md b882d1fa7 Merge pull request #1127 from fatih/fix-coverage 4aee04ff7 cmd: do not expand coverage arguments 6ee972ddd Update ISSUE_TEMPLATE.md d277006b4 Update CHANGELOG.md 01ec25cae Provide a descriptive quickfix/location list title. (#1004) 9e88616c2 Add option to use cwd as package name instead of template 96a07bd88 Update CHANGELOG.md cb88925a4 Merge pull request #1123 from pborzenkov/job-ccl 40344d43b job: close quickfix window if a job has succeeded c07e9e0a3 Update CHANGELOG.md 1a9f0ee2e Merge pull request #1122 from fatih/patch-echom-fix dd2a13642 path: use echom so it's showed when used completion 4944f0ef8 Update Changelog.md f60e4fd42 Merge pull request #1121 from pborzenkov/statusbar-update 5265ad2da Update CHANGELOG.md 7785d369c Merge pull request #1055 from svanharmelen/f-setlocal-updatetime 0996bdacb Add `g:go_updatetime` to configure a custom `updatetime` 79fa535b1 Always use full path as statusline target directory bf2110457 Update CHANGELOG.md b4adab50e Merge pull request #1120 from fatih/gometalinter-statusline c27297286 lint: add statusline support for GoMetaLinter d07982689 Update CHANGELOG.md dcbedd7b8 New release: v1.10 824f44ab8 Merge branch 'master' of https://github.com/fatih/vim-go 8df04a986 New release: v1.10 f3ee8cd5c Update CHANGELOG.md c0b180a52 Update CHANGELOG.md d9194b7d1 Update CHANGELOG.md c44f799be Merge pull request #1089 from tdilo/add-golint-plug-mapping 0b6d16c57 Merge pull request #1119 from fatih/goinfo-improvements 05f7fb837 info: add option to change underlying tool for :GoInfo cb8329a2b Update CHANGELOG.md b84f01ae9 Merge pull request #1033 from pborzenkov/coverage 2b34076d0 coverage: allow to run coverage on _test.go files in subdirs 7c27c6be9 Merge pull request #1118 from fatih/fix-wall d35e866a8 cmd: wall tries to write to unnamed buffer, neglect errors 3b6da4942 Merge pull request #1117 from fatih/test-func-fix 303c0a2bc cmd: fix :GoTestFunc for job API d3c4fb3d2 Merge branch 'master' of https://github.com/fatih/vim-go 505e726e2 Update README.md 75b6713bc Merge pull request #1114 from fatih/check-job 86c7e12f5 vim: require at least 8.0.0087 for +job features c212e28fa guru: do not use abort, is not compatible with old Vim versions b2ecbf8c0 Merge pull request #1110 from fatih/fix-new-variables b82060212 go: do not use new type variables 59c56f090 Merge pull request #1104 from fatih/vim-8.0-squash dc8073386 Add vim-8.0 support 362decf1a complete: disable unimported support 303667f4f Update CHANGELOG.md e198faaa7 Merge pull request #1100 from Alok/add-abort 37f828315 Update CHANGELOG.md de782e8ac Merge pull request #1101 from haya14busa/option-go_echo_type_info ec9f4ac3f Merge pull request #1102 from stamm/patch-1 26d766a27 typos in changelog 298520ce1 add an option to show type info when completion is done a822b9792 Add abort to every autoload function d85444b32 lint: add (go-lint) plug mapping 10c805b83 Update CHANGELOG.md fcd04ce1f Merge pull request #954 from fatih/fix-gocode-goroot 23c0cb00c Update CHANGELOG.md 42bc216cc Merge pull request #1067 from bhcleek/fix-sameids-change-buffer 0b631151f Update CHANGELOG.md be4eae0ba Merge pull request #1070 from svanharmelen/f-highlight-func-calls 64021135f Update CHANGELOG.md b76d55f52 Merge pull request #1075 from magicalbanana/allow-nested-struct-highlighting 936837ec0 Update CHANGELOG.md 8b73c3f71 Merge pull request #1084 from zmb3/unimported-packages 54b2650c4 Provide completions for unimported packages. 7461762f7 Update CHANGELOG.md 127ecfedd Merge pull request #1083 from fatih/fix-jumping-to-split-modified 54fa4679a def: do not open a split for modified file 80b0ca2d1 Make sure builtins are hightlighted correctly 31c13f672 Syntax nested structs 1f8e10ceb Merge pull request #1072 from hitjim/patch-1 f41f55323 Update license to credit Renee French for Gopher 8faedbebf Update CHANGELOG.md 977b68d22 Merge pull request #1048 from svanharmelen/f-highlight-func-calls a09d179d8 Clear most recent goSameId highlights groups bae1529cd util: add go#util#env function 6ca257751 Update CHANGELOG.md 32f9d2bf5 Merge pull request #1062 from lukatendai/master acab9b3f6 Update cmd.vim 2b19e6c18 Merge pull request #1047 from abhinav/patch-1 4bf1d139f skip go#util#Shelllist if nvim is being used 09522e50c Update CHANGELOG.md fc4f5a432 Merge pull request #1061 from egonelbre/master 4e3628042 Use transparent background for image. fecb68867 Update CHANGELOG.md 5fda1883f Merge pull request #1060 from fatih/assets 38ff97edc Add vim-go logo /cc @egonelbre d6c1ec9a4 Add assets dir with new logo from @egonelbre 8205e3542 Merge pull request #1052 from mattn/sock_type 86b1e7aa2 fix default sock type 961466fb2 Add support for highlighting function calls 7fd92a842 Update CHANGELOG.md ac4a9757d Merge pull request #1049 from nhooyr/syntax-fix 451f8a0da goPredefinedIdentifiers should link to goBoolean by default b14be232b Fix reference to go_highlight_{structs,interface} d9fa1bcca New release: v1.9 b52601889 Update CHANGELOG.md 417fd0ca7 Merge pull request #1046 from mattn/v8.0 168c4a4b3 better to use exists('*exepath') 8575d9e3c Fix bug in syntax highlighting (#1035) 0a25a0ddd Update CHANGELOG.md 8d6356616 Exclude iota and nil from goBoolean (#1030) c63c798f7 Update CHANGELOG.md a5222bfdc fmt: print full goimports path if it's not compatible 2aad0a8a6 Update CHANGELOG.md 495cf403c Merge pull request #1007 from magicalbanana/highlight-field-field 990916af8 Update CHANGELOG.md 1f143f3dc Merge pull request #1020 from kaneshin/patch-1 5b53a72bb Update CHANGELOG.md d5ac28c35 Merge pull request #1011 from ArkBriar/master 804130fc9 Update CHANGELOG.md 8de252ae9 allow :GoDoc on modified buffers (#1014) 9380cc445 Update CHANGELOG.md 31ea0aaf7 Merge pull request #1017 from fd0/add-hint-updatetime b76f8f501 Update CHANGELOG.md cbe7d101b Merge pull request #1029 from nhooyr/master 5d4fcaa47 Update CHANGELOG.md 0a66df41d Merge pull request #1023 from yyoshiki41/update/doc 4b9258e8a update jumplist in :GoDef c306de904 Add go_highlight_generate_tags in docs 313127ee4 Rename GoMetalinterAutoSaveToggle to GoMetaLinterAutoSaveToggle 63bdcdf65 Update CHANGELOG.md f1f6e71a3 Merge pull request #1016 from kisielk/patch-1 241818330 SameIds: Fix Sentence, add hint to 'updatetime' 41dfa207b set updatetime if g:go_auto_sameids is enabled d72ed3ab5 Fix syntax goFormatSpecifier: check '%%' 359a8c5ca Highlight nested fields or chained fields a4ba0a5b1 Update CHANGELOG.md 973724f6e Merge pull request #998 from bhcleek/sameid-autocmd a0edd32f7 Update CHANGELOG.md 4c2069649 Merge pull request #999 from umitkablan/master 2514a4221 Update CHANGELOG.md 67084f500 Merge pull request #1000 from fatih/add-gocode-socket-type d9c531fca complete: add g:go_gocode_socket_type setting a6e097cb9 Fixed Windows tagbar&GoCallers errors with g:go#use_vimproc=0. 7d1433761 Re-evaluate sameids after buffer is re-entered a0d769dd9 Update CHANGELOG.md e7f5e5756 Update CHANGELOG.md 37b95186a Fix :GoSameIds for light background, GUI, and after changing colour schemes (#983) ecac6556a util: do not clear the screen 99d5bf8e0 Update CHANGELOG.md 445e5bf10 use guru's -modified flag (#944) af2798046 Update CHANGELOG.md 49f4e2a34 Doc cleanup (#987) 7bcf1f554 Update CHANGELOG.md 011d76fbd Merge pull request #988 from Carpetsmoker/windows-shell 2dfd933c5 Use go#util#IsWin 53261bc0a More robust resetting of the shell. 3030ecc86 New release: v1.8 12b3f65a0 Update CHANGELOG.md 4f06fda92 Merge pull request #971 from fatih/gooaddtags 6e0d6c363 commands: add :GoAddTags 13affe57d fixed goField regexp (#981) 51930f327 Update CHANGELOG.md 7af695b1b add commands to toggle settings that control auto behavior (#945) 55fe1705d Escape all template path special characters (#966) d3fb314ea Update CHANGELOG.md 881a9cc0f Reset shell before running a command in go#util#System (#967) 9ed023b39 Merge pull request #972 from roxma/master b329b1c10 Merge pull request #974 from bhcleek/sameid-warning 6adfed303 Update CHANGELOG.md 4a403b6e3 Merge pull request #980 from fatih/fixes-from-wladh 7e30f82b5 Add guifg to go coverage syntax. 4c8a7046e Make GoInstall use detected $GOPATH 85a9d62e4 Merge pull request #979 from datanoise/master 59f38f020 link goPointerOperator and goVarArgs to goOperator. 5e36218d0 goVarArgs highlight groups is too gready. 7689ab482 add warning to GoSameIds when matchaddpos is unavailable bc2746c1e add SimpleAutoComplPop to the list 59a236108 Merge pull request #969 from vrischmann/master 62d6026b9 tool: use double quotes in PackageName for Windows compatibility 69e038e5c Update CHANGELOG.md a4c9c4e44 Merge pull request #968 from fatih/idawes-master d24cd35a1 doc: add more context 844cf27ca Consisten mappings and commands e272cf309 Merge branch 'auto-toggle' into idawes-master 271766d76 Merge branch 'master' of https://github.com/idawes/vim-go into idawes-master e977689a3 guru: add GoSameidsAutoToggle c8cf79257 Merge pull request #946 from bhcleek/buffer-sameids b7ac76ad7 Update CHANGELOG.md 1e7d0480a Merge pull request #962 from fatih/separate-coverage-syntax e648b71f6 syntax: add goCoverage specific highlights c3cd94941 Update README.md 368f72927 Update README.md 9754508b3 Merge pull request #958 from datanoise/master 7c096c20e go#fmt#Format fails on new unsaved files c5101afa6 Update CHANGELOG.md 4de469674 Merge pull request #957 from fatih/make-goimports-great-again 5fb42bd4e fmt: pass full name to -srcdir for upcoming new features 0faef8a43 refactor: use lowercase function names 2db19ffd2 Merge pull request #952 from magicalbanana/fix-setfperm d8eb1cdb7 Fixes the 'setfperm' issue 8ce50ff3e guru: make whicherrs usable for empty results 23abbac23 Update CHANGELOG.md 81bee4405 Merge pull request #948 from krishicks/guru-add-whicherrs 71aeea6d5 Merge pull request #949 from ArkBriar/master 1a38ce6c7 Merge pull request #942 from dobegor/patch-1 c38cb772d Update CHANGELOG.md 902f626c4 Merge pull request #922 from joegrasse/master 3a86d0f8a guru: add :GoWhicherrs 140a2ff75 Replace 'he=e-1' with '\ze' to avoid conflicts with other highlight plugins (e.g. luochen1990/rainbow). e53e6126f use CursorHold instead of CursorMove for go_auto_sameids 081f3423e Vim & Neovim now both support JSON 595df5118 Update CHANGELOG.md 684548da2 Merge pull request #937 from dangogh/yaml-tag 9fce7407a Merge pull request #939 from bhcleek/allow-disable-auto-features 96105a22a Merge pull request #938 from bhcleek/reduce-guru-what-flicker 94f579cdc Merge pull request #940 from bhcleek/customizable-goSameId-highlight 4801d2853 Add ToggleSameIds df02251e4 Neovim supports JSON, :GoSameIds now works. 3715a8908 allow goSameId highlight group to be overridden 30a6a2c6c allow auto features to be disabled without restarting Vim 7a312d97f reduce flicker when using go_auto_sameids 789de8e4e Update CHANGELOG.md 78a766756 Merge pull request #936 from fatih/bhcleek-master 41ae14a74 guru: improvements 6de8841f0 Add support to run Guru commands on umodified buffers 82ff2d872 add setting to automatically run :GoSameIds 16f3d7415 implement :GoSameIds f9549b752 add yaml tags completion 7fe846b1c Merge pull request #930 from datanoise/master ab01e7e5a Merge pull request #931 from svanburen/patch-1 7d1616ad4 Fix typo in docs 9816d691a small syntax fixes dede10f4a Update CHANGELOG.md 0b1fa09d9 Merge pull request #927 from fatih/json-snippet-case-type 153f2231e snippet: make json field tag expansion smarter 7876aaf55 snippets: make json snippet more smarter a049691f0 snippet: fix panic 01624ffc3 Update CHANGELOG.md 98d4f5eee Merge pull request #926 from fatih/add-snippet-err-panic cb442358b snippets: add errp for error panic 48d31eb2b Change setting name to something better and coherent with others 4778de4ae Update CHANGELOG.md d142f7db3 Merge pull request #918 from fatih/auto-create-template 23b7c2268 Fill the content of a new file automatically based on the context eb585ff6d Merge pull request #924 from tsne/fix-type-highlighting cd35ebdf5 fix highlight type keyword 2c5295871 Restore original files permissions 25bbb3135 Update CHANGELOG.md d3fb19d78 Merge pull request #920 from dobegor/master 498e709cf Fixed typo causing GoDocBrowser to fail 7c3414e5f Update CHANGELOG.md 50ceca52a Various improvements to syntax highlighting. (#917) ecfd5cff3 Update CHANGELOG.md 1a9cc7867 Merge pull request #915 from fatih/indentations-fixes 5a4abb592 style: use two spaces for all files a7a37517a Update CHANGELOG.md 1e9590dba Merge pull request #910 from fatih/def-modified-file 336e3b090 def: support modified files b12fd9bb5 Update CHANGELOG.md 9875a4690 Merge pull request #909 from fatih/fix-go-test-compile 1457e6e2c cmd: fix :GoTestCompile leaving behind artifacts 523d5a435 Update CHANGELOG.md 7b92adf89 Merge pull request #904 from fatih/fix-goimports-picking-srcdir 67489a688 fmt: fix goimports picking up -srcdir 6efcfb275 Update CHANGELOG.md 4f20c2524 Merge pull request #900 from fatih/fix-coverage-nvim f846d078e coverage: fix running coverage for neovim 76d295c19 Update CHANGELOG.md 478a23942 Merge pull request #897 from ryunix/fix-doc 1147bbc70 Update CHANGELOG.md a3452fdf2 Merge pull request #895 from mattn/fix-openbrowser 492e54bb2 Update CHANGELOG.md 8d73ed0bc Merge pull request #894 from mattn/godoc 85579cbd5 Fix doc 98fe1f95e escape # cf4f0ea1e open GodocView if argument is provided for :GoDoc 6a0c880df New Release: v1.7.1 0fd6f46e7 doc: fix wrong documentation about field and struct highlighting 8c9cbabfd Merge pull request #892 from ryunix/fix-typo ab62d6ddd Fix typo 191ba9a60 New release: v1.7 28e63a50b Update CHANGELOG.md 9b198271a Merge pull request #888 from fatih/go-def 10187323d def: add go_def_mode setting, we now support godef too 3c099cc66 cmd: check test files only for coverage 473c0bdfb Update CHANGELOG.md a284b6196 Merge pull request #854 from hhsnopek/hs.goField ae89f68f1 add goField 2f115dcf7 Update CHANGELOG.md e46c5efcd Merge pull request #883 from macb/get_update 04a0faae2 make go get -u configurable 211289683 Update CHANGELOG.md 28d6c0048 Increase compatibility with tcsh (#869) 684be5dfb Merge pull request #882 from yukidarake/fix-neosnippet-invalid-syntax 485d8ba3c Fix broken snippets c72fd199f Update CHANGELOG.md 99e06a043 cmd: fix showing SUCCESS for non tests b7147085c Revert wrong fix 8e0ea1266 cmd: run tests only if the test file exists e6a76161c cmd: fix runtime error for :GoCoverage acb2d8c91 docs: add docs for go-import and go-imports bc3726303 Update CHANGELOG.md 572617f16 Merge pull request #879 from fatih/do-not-create-test-binary be326e6a8 cmd: do not create test binary artifact for :GoTestCompile a9611d7d6 Properly use exepath for CheckBinPath (#864) b25dbfb23 Update CHANGELOG.md b74234bbd Merge pull request #878 from edganiukov/goimports-mapping 484ead33c added goimports mapping e9f44d933 fmt: use helper function to print warning 53c779f82 Update CHANGELOG.md 0a1f71faa Merge branch 'master' of https://github.com/fatih/vim-go 46da9d331 coverage: use color aliases for backwards compability 42c73c2a8 Update CHANGELOG.md 92632a024 def: quote the file argument completely for tcsh 8b1c0e93f Update CHANGELOG.md dc1496713 Merge pull request #862 from fatih/fix-lint-escape eb19cc520 textobj: escape files for motion as well c1e976135 Merge pull request #866 from trayo/master 76d43aca5 fixes typo d54819ddc Update CHANGELOG.md 5d5a5b228 Merge pull request #861 from DeepAnchor/master d909e2e41 lint: escape directory for shell invocation d570e89b4 Add non-standard workspaces to package path list 48cc65dfb Update CHANGELOG.md 8765cee38 Update CHANGELOG.md a3c0dab15 Merge pull request #856 from fatih/add-gocode-autobuild b0e00f631 complete: enable autobuild and propose-builtins 5c74881e0 Update CHANGELOG.md fea6ef317 Merge pull request #855 from fatih/fix-gorename 4311f5b18 rename: reload all files to reflect the new changes 1ec3373f2 Update CHANGELOG.md 96b0aa584 Merge pull request #847 from shawnps/patch-1 eb6ae9d1c use https in playground URL for GoPlay 1f2245335 impl: this is a better copy 5e589bba6 Update CHANGELOG.md 87a3bb954 impl: add vim-go-impl (#846) 1dfaae447 Added http to http handler snippet (#843) 78c56adc1 Update CHANGELOG.md 927e31ad2 add nnoremap :call go#def#Jump(spliā€¦ (#838) 2d9124f1a Updated `benchmark` snippet to use for loop (#840) 9f0cf00f6 path: do not exepath ca46f2d0a Update CHANGELOG.md 95f43b8ab Update CHANGELOG.md 62f8aa38e don't default to binaries in the PATH (#823) d2f22ba3d Update CHANGELOG.md ff70ed5b6 Snippets for Example and Benchmark (#836) 5a846f358 Document using quickfix list for syntastic (#834) 91ffc4108 Update CHANGELOG.md 7a5dc84aa Merge branch 'master' of https://github.com/fatih/vim-go bbe4357a6 mappings: fix freevars mapping 849a8bb0b guru: fix preventing printing the output twice 91ff811b6 Update CHANGELOG.md 36e96cd52 Update CHANGELOG.md 56ac0d7dc guru: fix providing meaningful error messages instead of showing "-1" e3ebd69d2 Update CHANGELOG.md 93831e8b3 guru: implements needs scope to function well 1ebda8368 Update CHANGELOG.md 2541180a5 Merge pull request #813 from fatih/fix-gohtmltmpl 4679725cf Update CHANGELOG.md 1469db423 Merge pull request #827 from fatih/fix-coverage-syntax 766e836bc coverage: fix for cases of syntax=off dcbe7cef6 Update CHANGELOG.md 42a782f38 Merge pull request #821 from sillyousu/master 6e2df56e7 Merge pull request #826 from mattn/fixes-824 7a8384acc exit code should be checked with 0 12e8bed78 pass -tags flag to guru dfb0ee1ec Update CHANGELOG.md f830d0dc1 use go#util#system(), go#util#shell_errors() instead of system(), v:shell_error (#801) e9df17fc7 Update CHANGELOG.md 08a9c7c70 Merge pull request #816 from andrewstuart/master ede2ec511 Add http handler snippets 480b7660f New release: v1.6 8a78ded14 def: reuse is a better word d439e855a ftplugin: add gohtmltmpl.vim a605c6216 Merge pull request #812 from fatih/coverage-improvements 7351848a2 coverage: add :GoCoverageClear and :GoCoverageToggle 4f67ae2dc Merge pull request #802 from sethvargo/patch-1 4c7967c08 Clarify that mappings are enabled by default b3fddb60f Merge branch 'master' of https://github.com/fatih/vim-go abd3d1490 doc: fix wording for (go-run) mapping fd10ba68f Handle windows paths (#799) 5c45ba9c4 coverage: check if matchaddpos exists a0f8bd34d def: fix selecting from tag stack c3fdca0e4 def: fix displaying guru errors cd473451e Update CHANGELOG 24aeacc43 def: jump to an existing buffer if its exist 58d73af73 Merge branch 'master' of https://github.com/fatih/vim-go 53e924411 def.vim: revert back mapping to ctrl-t c0f7d3ee8 Update CHANGELOG.md 16cc4d62c mappings: change CTRL-t to CTRL-T for compatibility cce10c75d guru: fix output format ab55541df def: use script local variable 3a596f5bf Update README.md 2e5996015 Merge pull request #781 from fatih/guru 3eac959bf Add support for new guru tool b97962689 Merge pull request #794 from cuzelac/master 985c0922a Update CHANGELOG.md 075cfb3a7 Update CHANGELOG.md fbc9b4e6c Update CHANGELOG.md 6d88d521b improve :GoDef and tag stack commands 449dc59a4 GoTestFunc: support testable examples 80f6cf8fa Add custom godef jump stack (fixes #667) (#776) 385a92f01 Update Changelog 7f248b206 Merge pull request #782 from fatih/godoc-improvement 160bedc2b syntax: remove not used godoc.vim f478b530c doc: use gogetdoc to display docs in a better way 9f2fac6cb Merge pull request #790 from fatih/coverage-term-fix 52dbc47b7 coverage: fix not working if go_term_enabled is set 5ce65295c coverage: open only if file exists a4f44db42 Merge pull request #746 from eliasgs/master 451cb1acc Update README.md f6c71e7c7 Update docs fe718fc9c Merge branch 'master' of https://github.com/fatih/vim-go dc98bc775 Update Readme.md aea106131 Merge pull request #787 from cespare/optional-format-highlight cc4584404 Remove whitespaces 952b75259 Add go_highlight_format_strings option for printf-style format strings 1ac0d1f8e Update Changelog e35dfca6c Remove artifact 407908ad6 Merge pull request #786 from fatih/t-yuki-vim-go-coverlay 0eff02604 coverage: improvements and integration into vim-go f92fac2fd Add vim-go-coverlay e93048420 fmt: use shellescape instead of fnameescape 5c282de1a Update CHANGELOG.md 1a82fb7d5 Add fix c4183771f term: close location list if cmd's result is successful ef9bc716a term: close location list if cmd's result is successful 230b1bb69 Update CHANGELOG.md 0ff0a2dde Add CHANGELOG.md 19cfa6fbb jobcontrol: add AddHandler and RemoveHandler API to catch on_exit callback for callers of caller git-subtree-dir: vim/bundle/go git-subtree-split: bf390af42c53ae217356d7763ac3e7767f0162a4 --- .coveragerc | 3 + .dockerignore | 2 + .editorconfig | 17 + .github/CONTRIBUTING.md | 15 +- .github/ISSUE_TEMPLATE.md | 30 +- .gitignore | 6 +- .travis.yml | 14 + .vintrc.yaml | 7 + CHANGELOG.md | 1093 ++++++++++ Dockerfile | 20 + LICENSE | 4 +- Makefile | 29 + README.md | 313 +-- assets/screenshot.png | Bin 0 -> 764721 bytes assets/vim-go.png | Bin 0 -> 29252 bytes assets/vim-go.svg | 821 ++++++++ autoload/ctrlp/decls.vim | 259 ++- autoload/fzf/decls.vim | 150 ++ autoload/go/alternate.vim | 4 +- autoload/go/asmfmt.vim | 27 +- autoload/go/cmd.vim | 534 +++-- autoload/go/complete.vim | 292 +-- autoload/go/coverage.vim | 375 ++++ autoload/go/decls.vim | 21 + autoload/go/def.vim | 398 +++- autoload/go/def_test.vim | 37 + autoload/go/doc.vim | 314 +-- autoload/go/fillstruct.vim | 62 + autoload/go/fillstruct_test.vim | 90 + autoload/go/fmt.vim | 390 ++-- autoload/go/fmt_test.vim | 49 + autoload/go/guru.vim | 628 ++++++ autoload/go/impl.vim | 140 ++ autoload/go/impl_test.vim | 37 + autoload/go/import.vim | 380 ++-- autoload/go/job.vim | 102 + autoload/go/jobcontrol.vim | 187 +- autoload/go/keyify.vim | 56 + autoload/go/lint.vim | 438 ++-- autoload/go/list.vim | 229 +- autoload/go/oracle.vim | 233 --- autoload/go/package.vim | 184 +- autoload/go/path.vim | 262 +-- autoload/go/play.vim | 121 +- autoload/go/rename.vim | 203 +- autoload/go/statusline.vim | 112 + autoload/go/tags.vim | 214 ++ autoload/go/tags_test.vim | 22 + autoload/go/template.vim | 53 + autoload/go/term.vim | 190 +- autoload/go/test-fixtures/def/jump.go | 7 + autoload/go/test-fixtures/fmt/hello.go | 7 + autoload/go/test-fixtures/fmt/hello_golden.go | 7 + .../go/test-fixtures/fmt/imports/goimports.go | 13 + .../fmt/imports/goimports_golden.go | 15 + .../vendor/gh.com/gi/foo-logging/logger.go | 12 + autoload/go/test-fixtures/fmt/src/imports | 1 + .../go/test-fixtures/tags/add_all_golden.go | 16 + .../go/test-fixtures/tags/add_all_input.go | 16 + .../test-fixtures/tags/remove_all_golden.go | 16 + .../go/test-fixtures/tags/remove_all_input.go | 16 + autoload/go/test-fixtures/test/.gitignore | 1 + .../test/src/compilerror/compilerror.go | 7 + .../test/src/play/mock/controller.go | 7 + .../test-fixtures/test/src/play/play_test.go | 58 + autoload/go/test.vim | 389 ++++ autoload/go/test_test.vim | 123 ++ autoload/go/textobj.vim | 38 +- autoload/go/tool.vim | 285 ++- autoload/go/tool_test.vim | 23 + autoload/go/ui.vim | 165 +- autoload/go/util.vim | 423 +++- autoload/go/vimproc.vim | 21 - autoload/gotest.vim | 105 + autoload/unite/sources/decls.vim | 70 + compiler/go.vim | 10 +- doc/vim-go.txt | 1845 ++++++++++++----- ftdetect/gofiletype.vim | 31 +- ftplugin/asm.vim | 4 +- ftplugin/go.vim | 112 +- ftplugin/go/commands.vim | 96 +- ftplugin/go/mappings.vim | 57 +- ftplugin/go/snippets.vim | 89 +- ftplugin/go/tagbar.vim | 74 +- ftplugin/gohtmltmpl.vim | 7 + gosnippets/UltiSnips/go.snippets | 69 +- gosnippets/minisnip/_go_eq | 3 + gosnippets/minisnip/_go_err | 3 + gosnippets/minisnip/_go_errt | 4 + gosnippets/minisnip/_go_errw | 3 + gosnippets/minisnip/_go_f | 3 + gosnippets/minisnip/_go_ff | 1 + gosnippets/minisnip/_go_fori | 3 + gosnippets/minisnip/_go_pkg | 2 + gosnippets/minisnip/_go_sp | 2 + gosnippets/snippets/go.snip | 53 + indent/go.vim | 80 +- indent/gohtmltmpl.vim | 6 +- plugin/go.vim | 365 ++-- rplugin/python3/denite/source/decls.py | 93 + scripts/docker-test | 13 + scripts/install-vim | 112 + scripts/lint | 88 + scripts/run-vim | 50 + scripts/runtest.vim | 103 + scripts/test | 101 + scripts/test.sh | 78 - syntax/go.vim | 315 ++- syntax/godefstack.vim | 20 + syntax/godoc.vim | 47 - syntax/gohtmltmpl.vim | 8 +- syntax/gotexttmpl.vim | 8 +- syntax/vimgo.vim | 4 +- templates/hello_world.go | 7 + templates/hello_world_test.go | 7 + test/gopath_test.vim | 55 + 116 files changed, 11248 insertions(+), 3791 deletions(-) create mode 100644 .coveragerc create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .travis.yml create mode 100644 .vintrc.yaml create mode 100644 CHANGELOG.md create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 assets/screenshot.png create mode 100644 assets/vim-go.png create mode 100644 assets/vim-go.svg create mode 100644 autoload/fzf/decls.vim create mode 100644 autoload/go/coverage.vim create mode 100644 autoload/go/decls.vim create mode 100644 autoload/go/def_test.vim create mode 100644 autoload/go/fillstruct.vim create mode 100644 autoload/go/fillstruct_test.vim create mode 100644 autoload/go/fmt_test.vim create mode 100644 autoload/go/guru.vim create mode 100644 autoload/go/impl.vim create mode 100644 autoload/go/impl_test.vim create mode 100644 autoload/go/job.vim create mode 100644 autoload/go/keyify.vim delete mode 100644 autoload/go/oracle.vim create mode 100644 autoload/go/statusline.vim create mode 100644 autoload/go/tags.vim create mode 100644 autoload/go/tags_test.vim create mode 100644 autoload/go/template.vim create mode 100644 autoload/go/test-fixtures/def/jump.go create mode 100644 autoload/go/test-fixtures/fmt/hello.go create mode 100644 autoload/go/test-fixtures/fmt/hello_golden.go create mode 100644 autoload/go/test-fixtures/fmt/imports/goimports.go create mode 100644 autoload/go/test-fixtures/fmt/imports/goimports_golden.go create mode 100644 autoload/go/test-fixtures/fmt/imports/vendor/gh.com/gi/foo-logging/logger.go create mode 120000 autoload/go/test-fixtures/fmt/src/imports create mode 100644 autoload/go/test-fixtures/tags/add_all_golden.go create mode 100644 autoload/go/test-fixtures/tags/add_all_input.go create mode 100644 autoload/go/test-fixtures/tags/remove_all_golden.go create mode 100644 autoload/go/test-fixtures/tags/remove_all_input.go create mode 100644 autoload/go/test-fixtures/test/.gitignore create mode 100644 autoload/go/test-fixtures/test/src/compilerror/compilerror.go create mode 100644 autoload/go/test-fixtures/test/src/play/mock/controller.go create mode 100644 autoload/go/test-fixtures/test/src/play/play_test.go create mode 100644 autoload/go/test.vim create mode 100644 autoload/go/test_test.vim create mode 100644 autoload/go/tool_test.vim delete mode 100644 autoload/go/vimproc.vim create mode 100644 autoload/gotest.vim create mode 100644 autoload/unite/sources/decls.vim create mode 100644 ftplugin/gohtmltmpl.vim create mode 100644 gosnippets/minisnip/_go_eq create mode 100644 gosnippets/minisnip/_go_err create mode 100644 gosnippets/minisnip/_go_errt create mode 100644 gosnippets/minisnip/_go_errw create mode 100644 gosnippets/minisnip/_go_f create mode 100644 gosnippets/minisnip/_go_ff create mode 100644 gosnippets/minisnip/_go_fori create mode 100644 gosnippets/minisnip/_go_pkg create mode 100644 gosnippets/minisnip/_go_sp create mode 100644 rplugin/python3/denite/source/decls.py create mode 100755 scripts/docker-test create mode 100755 scripts/install-vim create mode 100755 scripts/lint create mode 100755 scripts/run-vim create mode 100644 scripts/runtest.vim create mode 100755 scripts/test delete mode 100755 scripts/test.sh create mode 100644 syntax/godefstack.vim delete mode 100644 syntax/godoc.vim create mode 100644 templates/hello_world.go create mode 100644 templates/hello_world_test.go create mode 100644 test/gopath_test.vim diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..9f46ed7 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,3 @@ +[run] +plugins = covimerage +data_file = .coverage.covimerage diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f12dac2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.local/ +.git/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..2c22281 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# http://EditorConfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.go] +indent_style = tab +indent_size = 4 + +[Makefile] +indent_style = tab +indent_size = 8 diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 7266cce..edabf91 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,9 +1,12 @@ Thanks for improving vim-go! Before you dive in please read the following: 1. Please read our - [FAQ](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), it might - have answers for your problem -2. If you add a new feature please don't forget to update the documentation: - [doc/vim-go.txt](doc/vim-go.txt) -3. If it's a breaking change or exceed +100 lines please open an issue first - and describe the changes you want to make. + [Documentation](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt), + it might have a solution to your problem. +2. If you add a new feature then please don't forget to update the documentation: + [doc/vim-go.txt](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt). +3. If it's a breaking change or exceeds 100 lines of code then please open an + issue first and describe the changes you want to make. +4. See `:help go-development` for instructions on how to run and write tests. If + you add a new feature be sure you also include a test if feasible. + diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 0adaff3..dd376ee 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,28 +1,22 @@ -### Actual behavior +### What did you do? (required. The issue will be **closed** when not provided.) -Write here what's happening ... -### Expected behavior +### What did you expect to happen? -Write here what you're expecting ... -### Steps to reproduce: +### What happened instead? -Please create a reproducible case of your problem. Re produce it -with a minimal `vimrc` with all plugins disabled and only `vim-go` -enabled: -1. -2. -3. +### Configuration (**MUST** fill this out): -### Configuration +* Vim version (first two lines from `:version`): -Add here your current configuration and additional information that might be -useful, such as: +* Go version (`go version`): + +* Go environment (`go env`): + +* vim-go version: + +* `vimrc` you used to reproduce (use a *minimal* vimrc with other plugins disabled; do not link to a 2,000 line vimrc): -* `vimrc` you used to reproduce -* vim version: -* vim-go version -* go version diff --git a/.gitignore b/.gitignore index 926ccaa..5c64849 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -doc/tags +.DS_Store +/doc/tags +/.coverage.covimerage +/coverage.xml +*.pyc diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..fe50e85 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: go +notifications: + email: false +matrix: + include: + - env: SCRIPT="test -c" VIM_VERSION=vim-7.4 + - env: SCRIPT="test -c" VIM_VERSION=vim-8.0 + - env: SCRIPT="test -c" VIM_VERSION=nvim + - env: SCRIPT=lint VIM_VERSION=vim-8.0 +install: + - ./scripts/install-vim $VIM_VERSION + - pip install --user vim-vint covimerage codecov +script: + - ./scripts/$SCRIPT $VIM_VERSION diff --git a/.vintrc.yaml b/.vintrc.yaml new file mode 100644 index 0000000..32d7dec --- /dev/null +++ b/.vintrc.yaml @@ -0,0 +1,7 @@ +policies: + ProhibitUnnecessaryDoubleQuote: + enabled: false + ProhibitEqualTildeOperator: + enabled: false + ProhibitNoAbortFunction: + enabled: false diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..17d9b46 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1093 @@ +## unplanned + +## 1.16 - (December 29, 2017) + +FEATURES: + +* Add `g:go_doc_url` to change the `godoc` server from `godoc.org` to a custom + private instance. Currently only `godoc -http` instances are supported. + [[GH-1957]](https://github.com/fatih/vim-go/pull/1957). +* New setting `g:go_test_prepend_name` (off by default) to add the failing test + name to the output of `:GoTest` + [[GH-1578]](https://github.com/fatih/vim-go/pull/1578). +* Support [denite.vim](https://github.com/Shougo/denite.nvim) for `:GoDecls[Dir]` + [[GH-1604]](https://github.com/fatih/vim-go/pull/1604). + +IMPROVEMENTS: + +* `:GoRename` is a bit smarter when automatically pre-filling values, and what + gets pre-filled can be configured with `g:go_gorename_prefill` option. + In addition `:GoRename ` now lists some common options. + [[GH-1465]](https://github.com/fatih/vim-go/pull/1465). +* Add support for `g:go_build_tags` to the `:GoTest` family of functions. + [[GH-1562]](https://github.com/fatih/vim-go/pull/1562). +* Pass `--tests` to gometalinter when autosaving and when a custom gometalinter + command has not been set. + [[GH-1563]](https://github.com/fatih/vim-go/pull/1563). +* Do not spam messages when command is run in a directory that does not exist. + [[GH-1527]](https://github.com/fatih/vim-go/pull/1527). +* Run `syntax sync fromstart` after `:GoFmt`; this should make syntax + highlighting break slightly less often after formatting code + [[GH-1582]](https://github.com/fatih/vim-go/pull/1582). +* `:GoDescribe` doesn't require a scope anymore + [[GH-1596]](https://github.com/fatih/vim-go/pull/1596). +* Add some standard snippets for + [vim-minisnip](https://github.com/joereynolds/vim-minisnip) + [[GH-1589]](https://github.com/fatih/vim-go/pull/1589). +* `g:go_snippet_engine` now defaults to `automatic` to use the first installed + snippet engine it can find. + [[GH-1589]](https://github.com/fatih/vim-go/pull/1589). +* Make sure temporary files created for `:GoFmt` end with `.go` suffix as this + is required by some Go formatting tools + [[GH-1601]](https://github.com/fatih/vim-go/pull/1601). + +BUG FIXES: + +* Fix compatibility with Vim version before 7.4.1546 + [[GH-1498]](https://github.com/fatih/vim-go/pull/1498). +* Don't resize godoc window if it's already visible + [[GH-1488]](https://github.com/fatih/vim-go/pull/1488). +* `:GoTestCompile` produces a test binary again. The test binary will be + written to a temporary directory to avoid polluting the user's working + directory. [[GH-1519]](https://github.com/fatih/vim-go/pull/1519) +* Fix incorrect `:GoSameIdsToggle` behavior when there were match groups + present, but none were goSameId. + [[GH-1538]](https://github.com/fatih/vim-go/pull/1538) +* Fix `gpl` snippet for UltiSnips. + [[GH-1535]](https://github.com/fatih/vim-go/pull/1535) +* Fix test output processing to correctly handle panics and log statements. + [[GH-1513]](https://github.com/fatih/vim-go/pull/1513) +* `:GoImpl` tab-completion would sometimes stop working + [[GH-1581]](https://github.com/fatih/vim-go/pull/1581). +* Add `g:go_highlight_function_arguments` to highlight function arguments. + [[GH-1587]](https://github.com/fatih/vim-go/pull/1587). +* Fix installation of `gocode` on MS-Windows. + [[GH-1606]](https://github.com/fatih/vim-go/pull/1606). +* Fix template creation for files in directories that don't exist yet. + [[GH-1618]](https://github.com/fatih/vim-go/pull/1618). +* Fix behavior of terminal windows and resize terminal windows correctly for + all valid `g:go_term_mode` values. + [[GH-1611]](https://github.com/fatih/vim-go/pull/1611). + +BACKWARDS INCOMPATIBILITIES: + +* Display a warning for Vim versions older than 7.4.1689. Older versions may + still work, but are not supported. You can use `let g:go_version_warning = 0` + to disable the warning. + [[GH-1524]](https://github.com/fatih/vim-go/pull/1524). +* `g:go_autodetect_gopath` is *disabled* by default, as support for `vendor` has + been in Go for a while.
+ Also change the implementation for `g:go_autodetect_gopath`; instead of manually + setting it before every command it will now be set with the `BufEnter` event, + and reset with the `BufLeave` event. This means that `$GOPATH` will be + changed for all commands run from Vim. + [[GH-1461]](https://github.com/fatih/vim-go/pull/1461) and + [[GH-1525]](https://github.com/fatih/vim-go/pull/1525). +* Update `:GoFillStruct` to check the current line (vs. the exact cursor + position) for a struct literal to fill. To support this, fillstruct made + [backwards imcompatible + changes](https://github.com/davidrjenni/reftools/pull/8). + [[GH-1607]](https://github.com/fatih/vim-go/pull/1607). + +## 1.15 - (October 3, 2017) + +FEATURES: + +* Add `:GoFillStruct` to fill a struct with all fields; uses + [`fillstruct`](https://github.com/davidrjenni/reftools/tree/master/cmd/fillstruct) + [[GH-1443]](https://github.com/fatih/vim-go/pull/1443). + +IMPROVEMENTS: + +* `:GoAddTags` and `:GoRemoveTags` now continue to process if there are + malformed individual struct tags (run `:GoUpdateBinaries` to update + `gomodifiytags` binary) [[GH-1401]](https://github.com/fatih/vim-go/pull/1401) +* `:GoAddTags` and `:GoRemoveTags` now shows a location list if there are + malformed struct tags (run `:GoUpdateBinaries` to update `gomodifiytags` + binary) [[GH-1401]](https://github.com/fatih/vim-go/pull/1401) +* Add folding of the package-level comment (enabled by default) and/or any + other comments (disabled by default) [[GH-1377]](https://github.com/fatih/vim-go/pull/1377). + [[GH-1428]](https://github.com/fatih/vim-go/pull/1428). +* Allow using :GoImpl on the type and struct parts too. Makes it a wee bit + easier to use [[GH-1386]](https://github.com/fatih/vim-go/pull/1386) +* `:GoDef` sets the path of new buffers as relative to the current directory + when appropriate, instead of always using the full path [[GH-1277]](https://github.com/fatih/vim-go/pull/1277). +* Syntax highlighting for variable declarations and assignments (disabled by default) + [[GH-1426]](https://github.com/fatih/vim-go/pull/1426) and + [[GH-1458]](https://github.com/fatih/vim-go/pull/1458). +* Add support for `:GoDecls[Dir]` in [unite.vim](https://github.com/Shougo/unite.vim) + [[GH-1391]](https://github.com/fatih/vim-go/pull/1391). +* Add support for [fzf.vim](https://github.com/junegunn/fzf.vim) in + `GoDecls[Dir]`. + [[GH-1437]](https://github.com/fatih/vim-go/pull/1437). +* Support relative imports for `:GoImpl` [[GH-1322]](https://github.com/fatih/vim-go/pull/1322). +* A new `g:go_list_type_commands` setting is added to individually set the list type for each command [[GH-1415]](https://github.com/fatih/vim-go/pull/1415). As en example: + + let g:go_list_type_commands = {"GoBuild": "quickfix", "GoTest": "locationlist"} +* Show unexpected errors better by expanding newlines and tabs + [[GH-1456]](https://github.com/fatih/vim-go/pull/1456). +* `:GoInstallBinaries` and `:GoUpdateBinaries` can now install/update only the + selected binaries (e.g. `:GoUpdateBinaries guru golint`) + [[GH-1467]](https://github.com/fatih/vim-go/pull/1467). + +BUG FIXES: + +* `:GoFmt` now (again) uses `locationlist` to show formatting errors instead of + `quickfix`. To change back to `locationlist` you can change it with the + setting `let g:go_list_type_commands = { "GoFmt": locationlist" }` [[GH-1415]](https://github.com/fatih/vim-go/pull/1415) +* Include comments in import block when folding is enabled [[GH-1387]](https://github.com/fatih/vim-go/pull/1387) +* Fix opening definitions in tabs [[GH-1400]](https://github.com/fatih/vim-go/pull/1400) +* Fix accidentally closing quickfix window from other commands if :GoFmt or autosave format was called [[GH-1407]](https://github.com/fatih/vim-go/pull/1407) +* Fix entering into insert mode after for term mode in nvim [[GH-1411]](https://github.com/fatih/vim-go/pull/1411) +* When using :GoImpl on type foo struct{} it would work, but with: + + type foo struct{ + } + + or with a struct with fields, it would create the generated methods inside the + struct [[GH-1386]](https://github.com/fatih/vim-go/pull/1386) +* `:GoImpl` output would include extra newline, and error would include + trailing newline from shell command: `vim-go: invalid receiver: "} *}"<00>`. + Fixed with [[GH-1386]](https://github.com/fatih/vim-go/pull/1386) +* Run `:GoMetaLinter` against the package of the open file [[GH-1414]](https://github.com/fatih/vim-go/pull/1414). +* The `g:go_doc_command` and `g:go_doc_options` to configure the command for + `:GoDoc` were documented but never referenced [[GH-1420]](https://github.com/fatih/vim-go/pull/1420). +* `go#package#FromPath()` didn't work correctly [[GH-1435]](https://github.com/fatih/vim-go/pull/1435). +* Fix race condition for `guru` based commands [[GH-1439]](https://github.com/fatih/vim-go/pull/1439). +* The `gohtmltmpl` filetype now sources the `html` ftplugin, so that `matchit`, + completion, and some other things work better. + [[GH-1442]](https://github.com/fatih/vim-go/pull/1442) +* Fix `:GoBuild` shell escaping [[GH-1450]](https://github.com/fatih/vim-go/pull/1450). +* Ensure fmt list gets closed when title cannot be checked [[GH-1474]](https://github.com/fatih/vim-go/pull/1474). + +BACKWARDS INCOMPATIBILITIES: + +* `:GoMetaLinter` now runs against the package of the open file instead of the + current working directory. This is so all commands behave the same relative + to the current open buffer. [[GH-1414]](https://github.com/fatih/vim-go/pull/1414) + +* `:GoImpl` now requires [`impl`](https://github.com/josharian/impl) version + 3fb19c2c or newer (released June 13, 2017); use `:GoUpdateBinaries` to make + sure that you've got a recent version [[GH-1322]](https://github.com/fatih/vim-go/pull/1322) + +## 1.14 - (August 6, 2017) + +FEATURES: + +* We now have folding support based on Go syntax. To enable it you have to set + the following Vim setting: `set foldmethod=syntax`. Currently it folds blocks + (`{ }`), `import`, `var`, and `const` blocks, and package-level comments. + These can be individually disabled/enabled if desired. For more info please + read the documentation for the `g:go_fold_enable` setting. [[GH-1339]](https://github.com/fatih/vim-go/pull/1339) + [[GH-1377]](https://github.com/fatih/vim-go/pull/1377) +* `:GoFiles` accepts now an argument to change the type of files it can show. + By default it shows`.go source files` but now it can be changed to show + various kind of files. The full list can be seen via `go list --help` under + the `// Source Files` section [[GH-1372]](https://github.com/fatih/vim-go/pull/1372) i.e: + +``` +:GoFiles CgoFiles // shows .go sources files that import "C" +:GoFiles TestGoFiles // shows _test.go files in package +:GoFiles IgnoredGoFiles // shows .go sources ignored due to build constraints +etc.. +``` + +IMPROVEMENTS + +* Files created with `_test.go` extension have a new template with a ready to + go test function. The template can be changed with the + `g:go_template_test_file` setting. [[GH-1318]](https://github.com/fatih/vim-go/pull/1318) +* Improve performance for highly used operations by caching `go env` calls [[GH-1320]](https://github.com/fatih/vim-go/pull/1320) +* `:GoCoverage` can accept arguments now. i.e: `:GoCoverage -run TestFoo` [[GH-1326]](https://github.com/fatih/vim-go/pull/1326) +* `:GoDecls` and `:GoDeclsDir` shows a warning if [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim) is not installed +* `:GoBuild` now compiles the package with the `-i` flag added. This means that subsequent calls are much more faster due caching of packages [[GH-1330]](https://github.com/fatih/vim-go/pull/1330) +* `:GoCoverage` echos now the progress if `g:go_echo_command_info` is enabled [[GH-1333]](https://github.com/fatih/vim-go/pull/1333) +* Add `g:go_doc_max_height` setting to control the maximum height of the window created by `:GoDoc` and `K` mapping [[GH-1335]](https://github.com/fatih/vim-go/pull/1335) +* The `af` text object is able to include the assignment variable for anonymous functions. Can be disabled with `g:go_textobj_include_variable = 0` [[GH-1345]](https://github.com/fatih/vim-go/pull/1345) +* Add `g:go_list_autoclose` setting to prevent closing the quickfix/location list after zero items [[GH-1361]](https://github.com/fatih/vim-go/pull/1361) +* Cursor is now adjusted and locked to the correct line when `goimports` is used for autosave [[GH-1367]](https://github.com/fatih/vim-go/pull/1367) +* Complement the path of command for different situations of Cygwin environment [[GH-1394]](https://github.com/fatih/vim-go/pull/1394) +* Show message when using :GoDef and opening a new buffer [[GH-1385]](https://github.com/fatih/vim-go/pull/1385) + + +BUG FIXES: + +* Fix obtaining package's import path for the current directory. This fixes some issues we had if the user was using multiple GOPATH's [[GH-1321]](https://github.com/fatih/vim-go/pull/1321) +* Fix documentation for vim-go & syntastic integration for errcheck using [[GH-1323]](https://github.com/fatih/vim-go/pull/1323) +* Fix showing an output if a test has finished when `:GoTest` is called [[GH-1327]](https://github.com/fatih/vim-go/pull/1327) +* Fix warning when goimports doesn't support srcdir [[GH-1344]](https://github.com/fatih/vim-go/pull/1344) +* Fix broken code folding with go_highlight_types [[GH-1338]](https://github.com/fatih/vim-go/pull/1338) +* Fix blocking the ui when swapfile is enabled and `:GoFmt` is called (either manually or via autosave) [[GH-1362]](https://github.com/fatih/vim-go/pull/1362) +* Fix getting bin paths for binaries if GOPATH was not set and Go version =>1.7 was used [[GH-1363]](https://github.com/fatih/vim-go/pull/1363) +* Fix picking up the correct list type for showing `:GoFmt` errors [[GH-1365]](https://github.com/fatih/vim-go/pull/1365) +* Fix auto detecting of GOPATH for import paths with string 'src' (i.e: `GOPATH/src/github.com/foo/src/bar`) [[GH-1366]](https://github.com/fatih/vim-go/pull/1366) +* Fix showing an empty window if `gogetdoc` was not found [[GH-1379]](https://github.com/fatih/vim-go/pull/1379) +* Fix commands not being executed if paths would include spaces (binary name, GOPATH, file itself, etc..) [[GH-1374]](https://github.com/fatih/vim-go/pull/1374) +* Fix showing correct message when editing a new file [[GH-1371]](https://github.com/fatih/vim-go/pull/1371) +* Fix filepaths in the quickfix list for :GoVet [[GH-1381]](https://github.com/fatih/vim-go/pull/1381) +* Run :GoLint against the package of the open file [[GH-1382]](https://github.com/fatih/vim-go/pull/1382) + +BACKWARDS INCOMPATIBILITIES: + +* `:GoFmt` now uses `quickfix` to show formatting errors instead of + `locationlist`. To change back to `locationlist` you can change it with the + setting `let g:go_list_type = "locationlist"` [[GH-1365]](https://github.com/fatih/vim-go/pull/1365) +* `:GoLint` now runs against the package of the open file instead of the + current working directory. This is so all commands behave the same relative + to the current open buffer. For more info check the [comment + here](https://github.com/fatih/vim-go/issues/1375#issuecomment-317535953) + [[GH-1382]](https://github.com/fatih/vim-go/pull/1382) + +## 1.13 - (June 6, 2017) + +FEATURES: + +* New `:GoKeyify` command that turns unkeyed struct literals into keyed struct literals. [[GH-1258]](https://github.com/fatih/vim-go/pull/1258). i.e: + +``` +Example{"foo", "bar", "qux"} +``` + +will be converted to: + +``` +Example{ + foo: "foo", + bar: "bar", + qux: "qux", +} +``` + +Checkout the demo here: https://twitter.com/fatih/status/860410299714764802 + + +* New `g:go_addtags_transform` setting to change the transform rule (snakecase, camelcase, etc..) for `:GoAddTags` command [[GH-1275]](https://github.com/fatih/vim-go/pull/1275) +* New snippet shortcut assigned to `ife` that expands to `if err := foo(); err != nil { ... }` [[GH-1268]](https://github.com/fatih/vim-go/pull/1268) + +IMPROVEMENTS + +* :GoMetaLinter can now exclude linters with the new `g:go_metalinter_excludes` option [[GH-1253]](https://github.com/fatih/vim-go/pull/1253) +* Override `` mapping so `:GoDef` is used by default (as we do the same for `CTRL-]`, `gd`, etc. [[GH-1264]](https://github.com/fatih/vim-go/pull/1264) +* add support for `go_list_type` setting in `:GoFmt` and `:GoImports` commands [[GH-1304]](https://github.com/fatih/vim-go/pull/1304) +* add support for `go_list_type` setting in `:GoMetaLinter` commands [[GH-1309]](https://github.com/fatih/vim-go/pull/1309) +* `go_fmt_options` can be now a dictionary to allow us to specifcy the + options for multiple binaries [[GH-1308]](https://github.com/fatih/vim-go/pull/1308). i.e: + +``` + let g:go_fmt_options = { + \ 'gofmt': '-s', + \ 'goimports': '-local mycompany.com', + \ } +``` +* If win-vim(x64) with Cygwin is used, `cygpath` is used for constructing the paths [[GH-1092]](https://github.com/fatih/vim-go/pull/1092) + +BUG FIXES: + +* job: fix race between channel close and job exit [[GH-1247]](https://github.com/fatih/vim-go/pull/1247) +* internal: fix system calls when using tcsh [[GH-1276]](https://github.com/fatih/vim-go/pull/1276) +* path: return the unmodified GOPATH if autodetect is disabled [[GH-1280]](https://github.com/fatih/vim-go/pull/1280) +* fix jumping to quickfix window when autom gometalinter on save was enabled [[GH-1293]](https://github.com/fatih/vim-go/pull/1293) +* fix highlighting for `interface` and `structs` words when `go_highlight_types` is enabled [[GH-1301]](https://github.com/fatih/vim-go/pull/1301) +* fix cwd for running `:GoRun` when used with neovim [[GH-1296]](https://github.com/fatih/vim-go/pull/1296) +* `:GoFmt` handles files that are symlinked into GOPATH better (note that this behaviour is discouraged, but we're trying our best to handle all edge case :)) [[GH-1310]](https://github.com/fatih/vim-go/pull/1310) +* `:GoTest` is able to parse error messages that include a colon `:` [[GH-1316]](https://github.com/fatih/vim-go/pull/1316) +* `:GoTestCompile` under the hood doesn't produces a test binary anymore. Sometimes a race condition would happen which would not delete the test binary. [[GH-1317]](https://github.com/fatih/vim-go/pull/1317) +* `:GoDef` jumps now to definition for build tags defined with `:GoBuildTags` (only guru) [[GH-1319]](https://github.com/fatih/vim-go/pull/1319) + +BACKWARDS INCOMPATIBILITIES: + +* `:GoLint` works on the whole directory instead of the current file. To use it for the current file give it as an argument, i.e `:GoLint foo.go` [[GH-1295]](https://github.com/fatih/vim-go/pull/1295) +* `go_snippet_case_type` is removed in favor of the new `go_addtags_transform` setting [[GH-1299]](https://github.com/fatih/vim-go/pull/1299) +* `go_imports_bin` is removed to avoid confusion as it would lead to race + conditions when set to `gofmt` along with the usage of `go_fmt_command` + [[GH-1212]](https://github.com/fatih/vim-go/pull/1212) [[GH-1308]](https://github.com/fatih/vim-go/pull/1308) +* commands such as `:GoTest` has been refactored for easy maintainability. If + you use any custom script that was using the function `go#cmd#Test`, it + should be renamed to `go#test#Test` + +## 1.12 - (March 29, 2017) + +FEATURES: + +* New `:GoAddTags` and `:GoRemoveTags` command based on the tool + [gomodifytags](https://github.com/fatih/gomodifytags). This fixes many old + bugs that were due prior regexp based implementation. For the usage please + read the docs and checkout the demo at: + https://github.com/fatih/vim-go/pull/1204 [[GH-1204]](https://github.com/fatih/vim-go/pull/1204) +* Add new `errl` snippet that expands to [[GH-1185]](https://github.com/fatih/vim-go/pull/1185): + +``` +if err != nil { + log.Fatal(err) +} +``` +* New `:GoBuildTags` command to change build tags for tools such as `guru`, + `gorename`, etc ... There is also a new setting called `g:go_build_tags` + [[GH-1232]](https://github.com/fatih/vim-go/pull/1232) + +IMPROVEMENTS: + +* vim-go works now even if GOPATH is not set (starting with Go 1.8) [[GH-1248]](https://github.com/fatih/vim-go/pull/1248) +* Lowercase `` in mappings examples for consistent documentation across the README [[GH-1192]](https://github.com/fatih/vim-go/pull/1192) +* All of files should be written in utf-8 if the file will be passed to external command. [[GH-1184]](https://github.com/fatih/vim-go/pull/1184) +* `:GoAddTags` is now able to add options to existing tags with the syntax + `:GoAddTags key,option`, i.e: `:GoAddTags json,omitempty` [[GH-985]](https://github.com/fatih/vim-go/pull/985) +* Document 'noshowmode' requirement for echo_go_info [[GH-1197]](https://github.com/fatih/vim-go/pull/1197) +* Improve godoc view for vertical splits [[GH-1195]](https://github.com/fatih/vim-go/pull/1195) +* Set GOPATH for both possible go guru execution paths (sync and async) [[GH-1193]](https://github.com/fatih/vim-go/pull/1193) +* Improve docs for :GoDef usage [[GH-1242]](https://github.com/fatih/vim-go/pull/1242) +* Highlight trimming syntax for Go templates [[GH-1235]](https://github.com/fatih/vim-go/pull/1235) + +BUG FIXES: + +* Honor `g:go_echo_command_info` when dispatching builds in neovim [[GH-1176]](https://github.com/fatih/vim-go/pull/1176) +* Fix `:GoBuild` error in neovim due to invalid jobcontrol handler function + signatures (`s:on_stdout`, `s:on_stderr`)[[GH-1176]](https://github.com/fatih/vim-go/pull/1176) +* Update statusline before and after `go#jobcontrol#Spawn` command is executed [[GH-1176]](https://github.com/fatih/vim-go/pull/1176) +* Correctly report the value of the 'g:go_guru_tags' variable [[GH-1177]](https://github.com/fatih/vim-go/pull/1177) +* Ensure no trailing `:` exist in GOPATH detection if initial GOPATH is not set [[GH-1194]](https://github.com/fatih/vim-go/pull/1194) +* Fix `:GoAddTags` to allow modifying existing comments [[GH-984]](https://github.com/fatih/vim-go/pull/984) +* Fix `:GoAddTags` to work with nested structs [[GH-990]](https://github.com/fatih/vim-go/pull/990) +* Fix `:GoAddTags` adding tags twice for existing tags [[GH-1064]](https://github.com/fatih/vim-go/pull/1064) +* Fix `:GoAddTags` not working for fields of types `interface{}` [[GH-1091]](https://github.com/fatih/vim-go/pull/1091) +* Fix `:GoAddTags` not working for fields with one line comments [[GH-1181]](https://github.com/fatih/vim-go/pull/1181) +* Fix `:GoAddTags` not working if any field comment would contain `{}` [[GH-1189]](https://github.com/fatih/vim-go/pull/1189) +* Respect go_fmt_options when running goimports [[GH-1211]](https://github.com/fatih/vim-go/pull/1211) +* Set the filename in the location-list when there is an error with :GoFmt [[GH-1199]](https://github.com/fatih/vim-go/pull/1199) +* Fix `:GoInstall` to accept additional arguments if async mode was enabled [[GH-1246]](https://github.com/fatih/vim-go/pull/1246) + +BACKWARDS INCOMPATIBILITIES: + +* The command `:GoGuruTags` is removed in favour of the new command + `:GoBuildTags`. This command will be used now not just for `guru`, also for + all new commands such as `gorename` [[GH-1232]](https://github.com/fatih/vim-go/pull/1232) +* The setting `g:go_guru_tags` is removed in favour of the new setting + `g:go_build_tags` [[GH-1232]](https://github.com/fatih/vim-go/pull/1232) + + +## 1.11 - (January 9, 2017) + +FEATURES: + +* Travis test integration has been added. Now any file that is added as + `_test.vim` will be automatically tested in for every Pull Request + (just like how we add tests to Go with `_test.go`). Going forward this will + tremendously increase the stability and decrease the maintenance burden of + vim-go. [[GH-1157]](https://github.com/fatih/vim-go/pull/1157) +* Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [[GH-1055]](https://github.com/fatih/vim-go/pull/1055) +* Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [[GH-1124]](https://github.com/fatih/vim-go/pull/1124) + +IMPROVEMENTS: + +* Add `statusline` support for `:GoMetaLinter` [[GH-1120]](https://github.com/fatih/vim-go/pull/1120) +* Quickfix and Location lists contain now a descriptive title (requires at least Vim `7.4.2200`)[[GH-1004]](https://github.com/fatih/vim-go/pull/1004) +* Check `go env GOPATH` as well for `:GoInstallBinaries` as Go has now a default path for GOPATH ("~/go")starting with 1.8 [[GH-1152]](https://github.com/fatih/vim-go/pull/1152) +* `:GoDocBrowser` now also works on import paths [[GH-1174]](https://github.com/fatih/vim-go/pull/1174) + +BUG FIXES: + +* Always use full path to detect packages to be shown in statusline [[GH-1121]](https://github.com/fatih/vim-go/pull/1121) +* Use `echom` to persist errors in case of multiple echos [[GH-1122]](https://github.com/fatih/vim-go/pull/1122) +* Fix a race condition where a quickfix window was not closed if a job has succeeded [[GH-1123]](https://github.com/fatih/vim-go/pull/1123) +* Do not expand coverage arguments for non job execution of `:GoCoverage` [[GH-1127]](https://github.com/fatih/vim-go/pull/1127) +* `:GoCoverage` doesn't mess up custom syntax anymore [[GH-1128]](https://github.com/fatih/vim-go/pull/1128) +* Disable autoformat for `asm` files as they might be non Go ASM format [[GH-1141]](https://github.com/fatih/vim-go/pull/1141) +* Fix indentation broken when using a action with a minus sign like `{{-` [[GH-1143]](https://github.com/fatih/vim-go/pull/1143) +* Fix breaking Neovim change of passing less arguments to callbacks [[GH-1145]](https://github.com/fatih/vim-go/pull/1145) +* Fix `guru` commands if custom build tags were set [[GH-1136]](https://github.com/fatih/vim-go/pull/1136) +* Fix referencing a non defined variable for async commands when bang (!) was used +* Fix `:GoDef` failing for a modified buffer if `hidden` was not set [[GH-1132]](https://github.com/fatih/vim-go/pull/1132) +* Fix `:GoDefStack` to allow popping from jump list when buffer is modified [[GH-1133]](https://github.com/fatih/vim-go/pull/1133) +* Improve internal defining of functions and referencing them for async operations [[GH-1155]](https://github.com/fatih/vim-go/pull/1155) +* Fix `:GoMetaLinter` failing if `go_metalinter_command` is set. [[GH-1160]](https://github.com/fatih/vim-go/pull/1160) +* Fix `:GoMetaLinter`'s `go_metalinter_deadline` setting for async mode [[GH-1146]](https://github.com/fatih/vim-go/pull/1146) + +BACKWARDS INCOMPATIBILITIES: + +* The following syntax options are now disabled by default. If you're using them be sure to set them in your .vimrc [[GH-1167]](https://github.com/fatih/vim-go/pull/1167) + +```viml +g:go_highlight_array_whitespace_error +g:go_highlight_chan_whitespace_error +g:go_highlight_extra_types +g:go_highlight_space_tab_error +g:go_highlight_trailing_whitespace_error +``` + + + +## 1.10 (November 24, 2016) + +FEATURES: + +* **Vim 8.0 support!** This is the initial version to add Vim 8.0 based support to + all basic commands (check out below for more information). With time we'll + going to extend it to other commands. All the features are only enabled if + you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x. + If you see any problems, please open an issue. + +* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. +* `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully + async. Async means it doesn't block your UI anymore. If the command finished + it echoes the status. For a better experience use the statusline information + (more info below) + +* `:GoCoverage` and `:GoCoverageBrowser` commands are fully async. +* `:GoDef` is fully async if `guru` is used as command. +* `:GoRename` is fully async . + +* `:GoMetaLinter` is fully asnyc. Also works with the current autosave linting + feature. As a reminder, to enable auto linting on save either call + `:GoMetaLinterAutoSaveToggle` (temporary) or add `let + g:go_metalinter_autosave = 1` (persistent) to your virmc). + +* All `guru` commands run asynchronously if Vim 8.0 is being used. Current + Commands: + * GoImplements + * GoWhicherrs + * GoCallees + * GoDescribe + * GoCallers + * GoCallstack + * GoFreevars + * GoChannelPeers + * GoReferrers + +* `:GoSameIds` also runs asynchronously. This makes it useful especially for + auto sameids mode. In this mode it constantly evaluates the identifier under the + cursor whenever it's in hold position and then calls :GoSameIds. As a + reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary) + or add `let g:go_auto_sameids = 1` (persistent) to your vimrc. + +* `:GoInfo` is now non blocking and works in async mode if `guru` is used in + `g:go_info_mode`. This makes it useful especially for autoinfo mode. In this + mode it constantly evaluates the identifier under the cursor whenever it's in + hold position and then calls :GoInfo. As a reminder, to enable auto info + either call `:GoAutoTypeInfoToggle`(temporary) or add `let + g:go_auto_type_info = 1` (persistent) to your vimrc. To use `guru` instead of + `gocode` add following to your vimrc: `let g:go_info_mode = 'guru'` + + The `guru` is more accurate and reliabed due the usage of `guru` describe. It + doesn't rely on `pkg/` folder like `gocode` does. However it's slower than + `gocode` as there is no caching mechanism in `guru` yet. + +* **New**: Statusline function: `go#statusline#Show()` which can be plugged into + the statusline bar. Works only with vim 8.0. It shows all asynchronously + called functions status real time. Checkout it in action: + https://twitter.com/fatih/status/800473735467847680. To enable it add the + following to your `vimrc`. If you use lightline, airline, .. check out their + respective documentation on how to add a custom function: + +```viml +" go command status (requires vim-go) +set statusline+=%#goStatuslineColor# +set statusline+=%{go#statusline#Show()} +set statusline+=%* +``` + +IMPROVEMENTS: + +* **:GoDocBrowser** is now capable to to understand the identifier under the cursor (just like :GoDoc) +* Function calls are now highlighted as well when `g:go_highlight_functions` is enabled [[GH-1048]](https://github.com/fatih/vim-go/pull/1048) +* Add completion support for un-imported packages. This allows to complete even + if the package is not imported. By default it's disabled, enable by adding + `let g:go_gocode_unimported_packages = 1` [[GH-1084]](https://github.com/fatih/vim-go/pull/1084) +* Tools that embeds GOROOT into their binaries do not work when people update + their Go version and the GOROOT contains the vesion as part of their path + (i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more + info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now + fixed by introducing automatic GOROOT set/unset before each tool invoke. + [[GH-954]](https://github.com/fatih/vim-go/pull/954) +* Added new setting `g:go_echo_go_info` to enable/disable printing identifier + information when completion is done [[GH-1101]](https://github.com/fatih/vim-go/pull/1101) +* Added new `go_echo_command_info` setting is added, which is enabled by + default. It's just a switch for disabling messages of commands, such as + `:GoBuild`, `:GoTest`, etc.. Useful to *disable* if `go#statusline#Show()` is + being used in Statusline, to prevent to see duplicates notifications. +* goSameId highlighting is now linked to `Search`, which is much more clear as + it changes according to the users colorscheme +* Add plug mapping `(go-lint)` for :GoLint [[GH-1089]](https://github.com/fatih/vim-go/pull/1089) + + +BUG FIXES: + +* Change back nil and iota highlighting color to the old type [[GH-1049]](https://github.com/fatih/vim-go/pull/1049) +* Fix passing arguments to `:GoBuild` while using NeoVim [[GH-1062]](https://github.com/fatih/vim-go/pull/1062) +* Do not open a split if `:GoDef` is used on a modified file [[GH-1083]](https://github.com/fatih/vim-go/pull/1083) +* Highlight nested structs correctly [[GH-1075]](https://github.com/fatih/vim-go/pull/1075) +* Highlight builtin functions correctly if `g:go_highlight_functions` is enabled [[GH-1070]](https://github.com/fatih/vim-go/pull/1070) +* Fix `:GoSameIds` highlighting if a new buffer is opened in the same window [[GH-1067]](https://github.com/fatih/vim-go/pull/1067) +* Internal: add `abort` to all vim function to return in case of errors [[GH-1100]](https://github.com/fatih/vim-go/pull/1100) +* Fix `:GoCoverage` to be executed if working dir is not inside the test dir [[GH-1033]](https://github.com/fatih/vim-go/pull/1033) + +BACKWARDS INCOMPATIBILITIES: + +* remove vim-dispatch and vimproc.vim support. vim 8.0 has now the necessary + API to invoke async jobs and timers. Going forward we should use those. Also + this will remove the burden to maintain compatibility with those plugins. + +* `go#jobcontrol#Statusline()` is removed in favor of the new, global and + extensible `go#statusline#Show()` + +## 1.9 (September 13, 2016) + +IMPROVEMENTS: + +* **guru** uses now the `-modified` flag, which allows us use guru on modified + buffers as well. This affects all commands where `guru` is used. Such as + `:GoDef`, `:GoReferrers`, etc.. [[GH-944]](https://github.com/fatih/vim-go/pull/944) +* **:GoDoc** uses now the `-modified` flag under the hood (for `gogetdoc), which allows us to get documentation for the identifier under the cursor ina modified buffer. [[GH-1014]](https://github.com/fatih/vim-go/pull/1014) +* Cleanup and improve documentation [[GH-987]](https://github.com/fatih/vim-go/pull/987) +* Add new `g:go_gocode_socket_type` setting to change the underlying socket type passed to `gocode`. Useful to fallback to `tcp` on cases such as Bash on Windows [[GH-1000]](https://github.com/fatih/vim-go/pull/1000) +* `:GoSameIds` is now automatically re-evaluated in cases of buffer reloads (such as `:GoRename`) [[GH-998]](https://github.com/fatih/vim-go/pull/998) +* Improve docs about `go_auto_sameids` [[GH-1017]](https://github.com/fatih/vim-go/pull/1017) +* Improve error message by printing the full path if an incompatible `goimports` is being used [[GH-1006]](https://github.com/fatih/vim-go/pull/1006) +* `iota` and `nil` are now highlighted correctly and are not treated as booleans [[GH-1030]](https://github.com/fatih/vim-go/pull/1030) + +BUG FIXES: + +* Fix system calls on Windows [[GH-988]](https://github.com/fatih/vim-go/pull/988) +* Fix :GoSameIds and :GoCoverage for light background and after changing color schemes [[GH-983]](https://github.com/fatih/vim-go/pull/983) +* Fix TagBar and `GoCallers` for Windows user [[GH-999]](https://github.com/fatih/vim-go/pull/999) +* Set updatetime for for `auto_sameids` feature as well [[GH-1016]](https://github.com/fatih/vim-go/pull/1016) +* Update docs about missing `go_highlight_generate_tags` setting [[GH-1023]](https://github.com/fatih/vim-go/pull/1023) +* Fix updating the jumplist if `:GoDef` is used [[GH-1029]](https://github.com/fatih/vim-go/pull/1029) +* Fix highlighting literal percent sign (`%%`) in strings [[GH-1011]](https://github.com/fatih/vim-go/pull/1011) +* Fix highlighting of nested fields [[GH-1007]](https://github.com/fatih/vim-go/pull/1007) +* Fix checking for `exepath` feature for the upcoming vim 8.0 release [[GH-1046]](https://github.com/fatih/vim-go/pull/1046) + +BACKWARDS INCOMPATIBILITIES: + +* Rename `GoMetalinterAutoSaveToggle` to `GoMetaLinterAutoSaveToggle` to make it compatible with the existing `:GoMetaLinter` command [[GH-1020]](https://github.com/fatih/vim-go/pull/1020) + +## 1.8 (July 31, 2016) + +FEATURES: +* New **`:GoAddTags`** command that adds field tags for the fields of a struct automatically based on the field names. Checkout the demo to see it in action: https://twitter.com/fatih/status/759822857773907968 [[GH-971]](https://github.com/fatih/vim-go/pull/971) +* The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Together with `:GoAddTags` it gives `vim-go` users flexible ways of populating a field tag. Checkout the demo to see it in action: https://twitter.com/fatih/status/754477622042689536 [[GH-927]](https://github.com/fatih/vim-go/pull/927) +* New **`:GoSameIds`** command. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically (with `:GoSameIdsAutoToggle` or `g:go_auto_sameids`). Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [[GH-936]](https://github.com/fatih/vim-go/pull/936) +* New **`:GoWhicherrs`** command. It shows all possible values of the selected error variable. [[GH-948]](https://github.com/fatih/vim-go/pull/948) +* Add new `errp` snippet to expand an `if err != nil { panic() }` clause [[GH-926]](https://github.com/fatih/vim-go/pull/926) +* If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [[GH-918]](https://github.com/fatih/vim-go/pull/918) +* Added new toggle commands to enable/disable feature that run for your + automatic. For example if you have `let g:go_auto_type_info = 1` enabled, you + can now easily enable/disable it on the fly. Support added with the following + commands: `:GoAutoTypeInfoToggle`, `:GoFmtAutoSaveToggle`, + `:GoAsmFmtAutoSaveToggle`, `:GoMetalinterAutoSaveToggle`, + `:GoTemplateAutoCreateToggle` [[GH-945]](https://github.com/fatih/vim-go/pull/945) + + +IMPROVEMENTS: +* `:GoDoc` accepts arguments now which are passed directly to `godoc`. So usages like `:GoDoc flag` works again (it was changed in previous versions [[GH-894]](https://github.com/fatih/vim-go/pull/894) +* `:GoDef` works now for modified files as well [[GH-910]](https://github.com/fatih/vim-go/pull/910) +* Internal: pass filename to the `--srcdir` flag to enable upcoming `goimports` features [[GH-957]](https://github.com/fatih/vim-go/pull/957) +* Internal: fix indentations on all files to **2-spaces/no tabs**. This is now the default vim-go style across all VimL files [[GH-915]](https://github.com/fatih/vim-go/pull/915) +* Internal: autocmd settings can be now dynamically enabled/disabled [[GH-939]](https://github.com/fatih/vim-go/pull/939) +* Internal: automatically detect `GOPATH` for :GoInstall [[GH-980]](https://github.com/fatih/vim-go/pull/980) +* Internal: shell executions uses now by default `sh` and then resets it back to the user preference. [[GH-967]](https://github.com/fatih/vim-go/pull/967) +* Syntax: improved syntax highglighting performance for methods, fields, structs and interface type declarations [[GH-917]](https://github.com/fatih/vim-go/pull/917) +* Syntax: moved `:GoCoverage` highlight definition into go's syntax file for more customizability [[GH-962]](https://github.com/fatih/vim-go/pull/962) + + +BUG FIXES: + +* Escape `#` characters when opening URL's, as it's handled as alternative file in vim [[GH-895]](https://github.com/fatih/vim-go/pull/895) +* Fix typos in `doc/vim-go.txt` about usages of syntax highglightings [[GH-897]](https://github.com/fatih/vim-go/pull/897) +* Fix `:GoCoverage` not running for Neovim [[GH-899]](https://github.com/fatih/vim-go/pull/899) +* Fix `:GoFmt` not picking up `-srcdir` if the command was set to use `goimports` [[GH-904]](https://github.com/fatih/vim-go/pull/904) +* Fix `:GoTestCompile` to not leave behind artifacts if the cwd and the test files's directory do not match [[GH-909]](https://github.com/fatih/vim-go/pull/909) +* Fix `:GoDocBrowser` to not fail if godoc doesn't exist [[GH-920]](https://github.com/fatih/vim-go/pull/920) +* Fix `:GoFmt` to not change the permissions of saved file. Now original file permissions are restored [[GH-922]](https://github.com/fatih/vim-go/pull/922) + +BACKWARDS INCOMPATIBILITIES: + +* `g:go_highlight_structs` and `g:go_highlight_interface` are removed in favor of `g:go_highlight_types` [[GH-917]](https://github.com/fatih/vim-go/pull/917) + + +## 1.7.1 (June 7, 2016) + +BUG FIXES: +* Fixed typo in `syntax/go.vim` file from `go:go_highlight_fields` to `g:go_highlight_fields` + +## 1.7 (June 7, 2016) + +FEATURES: + +* New **`:GoImpl`** command that generates method stubs for implementing an interface. Checkout the [demo](https://twitter.com/fatih/status/729991365581545472) to see how it works. [[GH-846]](https://github.com/fatih/vim-go/pull/846) +* `godef` support is added back as an optional setting. By default `:GoDef` still uses `guru`, but can be changed to `godef` by adding the option: `let g:go_def_mode = 'godef'` [[GH-888]](https://github.com/fatih/vim-go/pull/888) +* New `` and `]>` shortcuts to split current window and jumpt to the identifier under cursor. [[GH-838]](https://github.com/fatih/vim-go/pull/838) +* New syntax setting" `g:go_highlight_fields` that highlights struct field references [[GH-854]](https://github.com/fatih/vim-go/pull/854) + +IMPROVEMENTS: + +* Invoking `:GoRename` now reloads all files to reflect new changes automatically [[GH-855]](https://github.com/fatih/vim-go/pull/855) +* Calling `:GoTestCompile` does not create any temporary binary file anymore [[GH-879]](https://github.com/fatih/vim-go/pull/879) +* Enable passing the `-tags` flag to `:GoDef`. Now you can pass build tags to `:GoDef` via `:GoGuruTags` or `g:go_guru_tags` +* Internal refactoring to use custom `system()` function that wraps both the standard `system()` call and `vimproc`. Now all system calls will take advantage and will use `vimproc` if installed. [[GH-801]](https://github.com/fatih/vim-go/pull/801) +* Completion enables now `gocode`'s `autobuild` and `propose-builtins` flags automatically. With these settings packages will be automatically build to get the freshest completion candidates and builtin keywords will be showed as well. By defaults these settings are enabled. Settings can be disabled/enabled via `g:go_gocode_autobuild` and `g:go_gocode_propose_builtins`. [[GH-815]](https://github.com/fatih/vim-go/pull/815) +* Added new `http.HandlerFunc` snippets with `hf` and `hhf` shortcuts [[GH-816]](https://github.com/fatih/vim-go/pull/816) +* Added new `Example` and `Benchmark` snippets with `example` and `benchmark` shortcuts [[GH-836]](https://github.com/fatih/vim-go/pull/836) +* Search tool binaries first in `GOBIN` and then in `PATH` as most of vim-go users installs it to `GOBIN` mostly [[GH-823]](https://github.com/fatih/vim-go/pull/823) +* Improve `guru` based commands by providing automatically detected GOPATHS, such as `gb`, `godep` to be used if possible [[GH-861]](https://github.com/fatih/vim-go/pull/861) +* Add `(go-imports)` mapping to make it assignable to other keys [[GH-878]](https://github.com/fatih/vim-go/pull/878) +* Increase compatibility with tcsh [[GH-869]](https://github.com/fatih/vim-go/pull/869) +* Improve `:GoInstallBinaries` for GOPATH's which don't have packages that work well with `go get -u`. We have a new `g:go_get_update` setting to disable it. By default it's enabled. [[GH-883]](https://github.com/fatih/vim-go/pull/883) + + + +BUG FIXES: +* Fix `(go-freevars)` plug mapping to work as in visual mode instead of noncompatible normal mode [[GH-832]](https://github.com/fatih/vim-go/pull/832) +* Commands based on guru now shows a more meaningful error message instead of just showing the exit status (-1) +* Fix `:GoCoverage` accidentally enabling syntax highlighting for users who don't use syntax (i.e syntax off) [[GH-827]](https://github.com/fatih/vim-go/pull/827) +* Fix `:GoCoverage` colors to work for xterm as well [[GH-863]](https://github.com/fatih/vim-go/pull/863) +* Fix commenting out block of texts for Go templates (filetype gothtmltmpl) [[GH-813]](https://github.com/fatih/vim-go/pull/813) +* Fix `:GoImplements` failing because of an empty scope definition. Now we default to current package to make it usable. +* Fix `:GoPlay` posting to non HTTPS url. [[GH-847]](https://github.com/fatih/vim-go/pull/847) +* Fix escaping the filenames for lint and motion commands [[GH-862]](https://github.com/fatih/vim-go/pull/862) +* Fix escaping the filename to `:GoDef` completely for tcsh [[GH-868]](https://github.com/fatih/vim-go/pull/868) +* Fix showing SUCCESS for `go test` related commands if no test files are available [[GH-859]](https://github.com/fatih/vim-go/pull/859) + + + +## 1.6 (April 25, 2016) + +FEATURES: + +* New `CHANGELOG.md` file (which you're reading now). This will make it easier + for me to track changes and release versions +* **`:GoCoverage`** is now highlighting the current source file for + covered/uncovered lines. If called again it runs the tests and updates the + annotation. Use `:GoCoverageClear` to clear the coverage annotation. + This is a pretty good addition to vim-go and I suggest to check out the gif + that shows it in action: https://twitter.com/fatih/status/716722650383564800 + [[GH-786]](https://github.com/fatih/vim-go/pull/786) +* **`:GoCoverageToggle`** just like `:GoCoverage` but acts as a toggle. If run + again it clears the annotation. +* **`:GoCoverageBrowser`** opens a new annotated HTML page. This is the old + `:GoCoverage` behavior [[GH-786]](https://github.com/fatih/vim-go/pull/786) +* **`:GoDoc`** uses now [gogetdoc](https://github.com/zmb3/gogetdoc) to + lookup and display the comment documentation for the identifier under the + cursor. This is more superior as it support looking up dot imports, named + imports and imports where package name and file name are different [[GH-782]](https://github.com/fatih/vim-go/pull/782) +* **`guru support`**: `oracle` is replaced by the new tool `guru`. `oracle.vim` + is therefore renamed to `guru.vim`. I've also refactored the code to make it + much more easier to maintain and add additional features in future (such as + upcoming JSON decoding). vim-go is now fully compatible with `guru`. Please + be sure you have installed `guru`. You can easily do it with + `:GoInstallBinaries`. +* **`:GoDef`** uses now `guru definition` under the hood instead of `godef`. + This fixes the following issues: 1. dot imports 2. vendor imports 3. folder + != package name imports. The tool `godef` is also deprecated and not used + anymore. +* **`:GoDef`** does have now history of the call stack. This means you can + easily jump back to your last entry. This can be done with the new command + `:GoDefPop` or the mapping `CTRL-t`. To see the stack and jump between entries + you can use the new command `:GoDefStack`, which shows the list of all stack + entries. To reset the stack list anytime you can call `:GoDefStackClear` + [[GH-776]](https://github.com/fatih/vim-go/pull/776) + +IMPROVEMENTS: + +* **`:GoCoverage`** is executed asynchronously when used within Neovim [[GH-686]](https://github.com/fatih/vim-go/pull/686) +* **`:GoTestFunc`** supports now testable examples [[GH-794]](https://github.com/fatih/vim-go/pull/794) +* **`:GoDef`** can jump to existing buffers instead of opening a new window + (split, vsplit or tab). By default it's disabled to not break the old + behavior, can be enabled with `let g:go_def_reuse_buffer = 1` + +BUG FIXES: + +* Fix not showing documentation for dot, named and package/file name being different imports [[GH-332]](https://github.com/fatih/vim-go/pull/332) +* Term mode: fix closing location list if result is successful after a failed attempt [[GH-768]](https://github.com/fatih/vim-go/pull/768) +* Syntax: fix gotexttmpl identifier highlighting [[GH-778]](https://github.com/fatih/vim-go/pull/778) +* Doc: fix wrong wording for `go-run` mapping. It's for the whole main package, + not for the current file + +BACKWARDS INCOMPATIBILITIES: + +* `:GoDef` doesn't accept any identifier as an argument. This is not suported + via `guru definition` and also was not widely used either. Also with this, we + significantly simplified the existing def.vim code +* `:GoOracleScope` and `:GoOracleTags` are deprecated in favor of + `:GoGuruScope` and `:GoGuruTags`. Also `g:go_oracle_scope` is renamed to + `g:go_guru_scope` +* `g:go_guru_scope` accepts a variable in type of `list` instead of `string`. + i.g: `let g:go_guru_scope = ["github.com/fatih/structs", "golang.org/x/tools/..."]` + + +## 1.5 (Mar 16, 2016) + +FEATURES: +* Introducing code name "motion". A new whole way of moving + around and navigating [[GH-765]](https://github.com/fatih/vim-go/pull/765). Checkout the following new changes: + * A vim-go specific tool, called [motion](https://github.com/fatih/motion) is being developed which + provides us the underlying foundation for the following and upcoming + new features. + * `]]` and `[[` motions can be used to jump between functions + * `if` and `af` are improved and implement from scratch. It has now + support for literal functions, comments of functions, better cursor + position support and more stable. + * New `:GoDecls` and `:GoDeclsDir` commands that are available if + `ctrlp.vim` is installed. Once called one can easily jump to any generic declaration available. + * I wrote two blog posts about these new features in more detail. I recommend you to read it: [Treating Go types as objects in Vim](https://medium.com/@farslan/treating-go-types-as-objects-in-vim-ed6b3fad9287#.mbwaisevp) and [Navigation between functions and types in vim-go](https://medium.com/@farslan/navigation-between-functions-and-types-in-vim-go-f9dd7de8ca37#.2sdf8tbbe) +* A new `:GoAlternate` command that toggles to the test + file of the current file. It also has new appropriate mappings to open the + alternate file in split or tabs. [[GH-704]](https://github.com/fatih/vim-go/pull/704) +* Now commands can choose whether they want to open a + `quickfix` or a `location list` via the setting `g:go_list_type`. Also all + the commands have now some sensible settings, some will open a qf window, + some will open a location list [[GH-700]](https://github.com/fatih/vim-go/pull/700) + +IMPROVEMENTS: + +* Add support for goimport's new `-srcdir`. Goimports now succesfully suports `vendor/` folders with this release. [[GH-735]](https://github.com/fatih/vim-go/pull/735) +* Add `g:go_gorename_prefill` setting which disabled pre filling the argument for `:GoRename` [[GH-711]](https://github.com/fatih/vim-go/pull/711) +* Improve `:GoRun` to complete to filenames [[GH-742]](https://github.com/fatih/vim-go/pull/742) +* Highlight `//go:generate` comment directives [[GH-757]](https://github.com/fatih/vim-go/pull/757) +* Indent code in Go HTML templates [[GH-709]](https://github.com/fatih/vim-go/pull/709) +* Improve negative numbers of all types, octals, imaginary numbers with exponents [[GH-752]](https://github.com/fatih/vim-go/pull/752) +* Improved internal usage of retrieving offsets [[GH-762]](https://github.com/fatih/vim-go/pull/762) +* Improve by substitute all backslashes to slashes for filename [[GH-703]](https://github.com/fatih/vim-go/pull/703) +* Improve internal Go package path function [[GH-702]](https://github.com/fatih/vim-go/pull/702) +* Improved typo and grammar errors in docs [[GH-714]](https://github.com/fatih/vim-go/pull/714) +* Improved internal `:GoInfo` automatic call [[GH-759]](https://github.com/fatih/vim-go/pull/759) + +BUG FIXES: + +* Fix oracle scope not working if trailing slash exists in scope [[GH-751]](https://github.com/fatih/vim-go/pull/751) +* Fix `:GoErrCheck` checking abspath [[GH-671]](https://github.com/fatih/vim-go/pull/671) +* Fix `:GoInstall` correctly parsing errors [[GH-692]](https://github.com/fatih/vim-go/pull/692) +* Fix `:GoInstall` correctly parsing errors [[GH-692]](https://github.com/fatih/vim-go/pull/692) +* Fix `:GoTestFunc` for neovim [[GH-695]](https://github.com/fatih/vim-go/pull/695) +* Fix `:GoRun` accepting arguments for neovim [[GH-730]](https://github.com/fatih/vim-go/pull/730) +* Fix `go run` mappings not working [[GH-542]](https://github.com/fatih/vim-go/pull/542) +* Fix autodetect gopath picking up non existing GB vendor folder +* Fix gofmt errors showing per buffer instead of per script [[GH-721]](https://github.com/fatih/vim-go/pull/721) +* Fix some of the neosnippet snippets + +## 1.4 (Jan 18, 2016) + +FEATURES: + +* You waited for it for a long time. And here you have it: **Neovim support!** + This is a huge feature. It's fully compatible with Vim and kicks only in if + vim-go is being used within Neovim. Checkout the full list of changes + [[GH-607]](https://github.com/fatih/vim-go/pull/607): + * An async launcher and base foundation was implemented for the `go` command. + This will be used in the future for all upcoming subcommands of the `go` + tool. + * `:GoBuild` is now called asynchronously (it doesn't block the UI anymore). + * A new `go#jobcontrol#Statusline()` can be used to plug into the statusline. + This will show the status of the job running asynchronously. The statusline + is improved to show the status per package instead of file. Assume you have + three files open, all belonging to the same package, if the package build + (`:GoBuild`) is successful, all statusline's will be empty (means SUCCESS), + if it fails all files statusline's will show `FAILED`. + * `:GoRun` opens a new vertical terminal emulator inside Neovim and runs the + command there. The terminal mode can be changed with `g:go_term_mode`, + which is by default `vsplit`. Current options are `vsplit, split or tab`. + We also have three new mappings to open `:GoRun` command in different + terminal split modes: `(go-run-vertical)`, `(go-run-split)` + and `(go-run-tab)` + * `:GoTest`, `:GoTestFunc` and `:GoTestCompile` opens and runs in a new + terminal. The view mode (split,vertical, tab) is defined with + `g:go_term_mode`. The `g:go_term_enabled` setting can be use to change the + behavior of `:GoTestXXX` commands .If set to `1`, it opens the test + commands inside a terminal, if not it runs them in background just like + `:GoBuild` and displays the result in the statusline. + * We have two settings for terminal sizes: `g:go_term_height` and + `g:go_term_width`. By default a vertical or horizontal view is equally + splitted by vim automatically. However with these settings we can for + example have a terminal with a smaller height when we split it + horizontally. + * If a command inside the term fails (such as `go run`, `go test` ...) we + parse now the errors and list them inside a location list. +* Instead of quickfix window, vim-go now uses the `location list` feature of + Vim. These are associated with each window independently of each other. This + enables us to have multiple, independent location lists per window (example + usages: `:GoBuild` with errors that needs to be fixed, `:GoLint` with + warnings that we want to check, `:GoReferrers` with a list of referred + identifiers) [[GH-626]](https://github.com/fatih/vim-go/pull/626) +* a new **`:AsmFmt`** command which is integrated to work with [asmfmt](https://github.com/klauspost/asmfmt) [[GH-673]](https://github.com/fatih/vim-go/pull/673) +* the full identifier information of a completed identifier is echoed in + statusline. This is very useful to see a function signatures arguments. + [[GH-685]](https://github.com/fatih/vim-go/pull/685) + +IMPROVEMENTS: + +* Improve `:GoFmt` by checking if the binary is indeed installed on the system [[GH-617]](https://github.com/fatih/vim-go/pull/617) +* Improve `:GoMetaLinter` by adding the option to run the metalinter on save + and adding the option to limit the output to the currently active buffer. Set + `let g:go_metalinter_autosave = 1` to enable autosave and use `let + g:go_metalinter_autosave_enabled = ['vet', 'golint']` to change your options. + [[GH-631]](https://github.com/fatih/vim-go/pull/631) +* Improved `:GoDef`. If `vimproc` is installed `godef` will make use of it [[GH-670]](https://github.com/fatih/vim-go/pull/670) +* Improve completion of godoce when vimproc is used [[GH-620]](https://github.com/fatih/vim-go/pull/620) +* Improve internal error matching prodecure to not match false positives [[GH-618]](https://github.com/fatih/vim-go/pull/618) +* A new option to highlight interface variables with `go_highlight_interfaces` [[GH-681]](https://github.com/fatih/vim-go/pull/681) + +BUG FIXES + +* Fix `:GoFmt` changing the fileformat of the current buffer [[GH-615]](https://github.com/fatih/vim-go/pull/615) +* Fix `:GoRename` to output the original error if parsing fails [[GH-675]](https://github.com/fatih/vim-go/pull/675) +* Fix `:GoTest` to output the original error if parsing fails [[GH-676]](https://github.com/fatih/vim-go/pull/676) +* Fixed `fmt.Fprintln` not to highlight as builtin [[GH-628]](https://github.com/fatih/vim-go/pull/628) +* Fixed wrong highlighting of channels of channels [[GH-678]](https://github.com/fatih/vim-go/pull/678) + +## 1.3 (Nov 22, 2015) + +FEATURES: + +* A new `:GoOracleTags` command was added to pass build tags to Oracle's `-tags` flag. [[GH-573]](https://github.com/fatih/vim-go/pull/573) + +IMPROVEMENTS: + +* Change `:GoTest` command to timeout after 10 seconds. Vim UI is blocking and + tests with large running times makes Vim blocking for a long time. This is + also customizable with the new option `g:go_test_timeout`. [[GH-578]](https://github.com/fatih/vim-go/pull/578) +* Improve `:GoRename` to collect and populate quickfix window with errors. + [[GH-577]](https://github.com/fatih/vim-go/pull/577) +* Improve `:GoRun` by dropping bad filenames from quickfix window. This allows + us to have only valid entries which can be jumped to [[GH-547]](https://github.com/fatih/vim-go/pull/547) +* Improve `:GoMetaLinter` quickfix output by using absolute paths. This enables + us to jump to errors for all cases. [[GH-565]](https://github.com/fatih/vim-go/pull/565) +* Improve `:GoMetaLinter` command by adding a new option + `g:go_metalinter_deadline` which cancels the linters after 5 seconds + (previous default). [[GH-576]](https://github.com/fatih/vim-go/pull/576) +* Improve `:GoMetaLinter` by jumping to the first encountered error from the quickfix window. +* Automatically resize quickfix window based on the number of errors [[GH-602]](https://github.com/fatih/vim-go/pull/602) +* Improve build constraints to show invalid cases (such as `// +buildfoo`, not + having an empty line between the package statement, etc..). Also add missing + `GOARCH` values sucha s `arm64`. There are many other useful improvements, + for more detail please have a look at + [[GH-589]](https://github.com/fatih/vim-go/pull/589) +* Add support for all values of `GOARCH` [[GH-601]](https://github.com/fatih/vim-go/pull/601) +* Add note about Syntastic usage as this problem comes up a lot [[GH-580]](https://github.com/fatih/vim-go/pull/580) +* Add note about `:GoUpdateBinaries` [[GH-606]](https://github.com/fatih/vim-go/pull/606) + +BUG FIXES: + +* Fixed `:GoErrCheck` showing the correct output when executed inside the source folder [[GH-564]](https://github.com/fatih/vim-go/pull/564) +* Fixed `:GoBuild` by not using `/dev/null` anymore for build output (not + supported by `go`). We pass a temporary file now. [[GH-567]](https://github.com/fatih/vim-go/pull/567) +* Fixed `:GoFmt` passing `g:go_fmt_options` options to `goimports`. This option + is only valid with `gofmt`. [[GH-590]](https://github.com/fatih/vim-go/pull/590) +* Fix vim-go for `cygwin` users. [[GH-575]](https://github.com/fatih/vim-go/pull/575) +* Fixed identifier in template files to be highlighted correctly [[GH-559]](https://github.com/fatih/vim-go/pull/559) +* Fixed character region in template files to be highlighted correctly [[GH-603]](https://github.com/fatih/vim-go/pull/603) +* Fixed variables in template files to be highlighted correctly [[GH-611]](https://github.com/fatih/vim-go/pull/611) +* Do not treat builtins as keywords. Now `make` will not highlighted but + `make()` will be highlighted (gh-605) + +## 1.2 (Oct 2, 2015) + +FEATURES: + +* A new `:GoMetaLinter` command which invokes [gometalinter](https://github.com/alecthomas/gometalinter). Please check the PR [[GH-553]](https://github.com/fatih/vim-go/pull/553) for more detail on customizing and usage of `:GoMetaLinter`. + +IMPROVEMENTS: + +* Improve `:GoImport` to trim spaces when including import paths of form `"fmt "` +* Avoid setting `filetype` twice. Previously it was doing it twice, which was expensive +* Improve handling of GOPATH's with trailing `/` characters, such as `/home/user/go/` +* Add a new `g:go_highlight_string_spellcheck` feature, which is enabled by feature. Now if spell is enabled, go strings are also checked. +* Specify our limited but functional [gb](http://getgb.io/) support + +BUG FIXES: +* Fixed `:GoRun` to display errors when `g:go_dispatch_enabled` was enabled +* Fixed `:GoDrop` displaying "Not enough arguments" (regression) +* Fixed `:GoErrCheck` not showing `PASS` message if the command was successful +* Fixed `:GoErrCheck` not executing in the directory of the currently edited file +* Close quickfix window after a successful second round of `:GoInstall` +* Fix passing files rather than packages to certain oracle commands. +* Escape files passed to oracle command. This could lead to some serious things. +* Clear `g:go_oracle_scope` when the scope was reseted. Previously it was set to empty string, which was causing false positives. +* Correct various misspellings. + +## 1.1 (Jul 25, 2015) + +With this release the version will now increase in `minor` levels. So the next +release will be `1.2`, the other one `1.3`, etc.. This provides us more +flexibility (like releasing patch versions if needed). + +FEATURES: +* A new `:GoGenerate` command is now available which can be used to invoke `go generate` within vim +* Vim-go didn't had any license, now we use BSD 3-Clause License (the same as Go). This is needed for Linux distributions to package vim-go and is also something that people asked for. + +IMPROVEMENTS: +* Improve commands `GoRun, GoTest{,Func,Compile}, GoCoverage, + GoGenerate, GoErrcheck, GoLint, and GoVet` to handle multiple arguments. + Previously this feature was limited to only certain commands. What this means + is, for example `:GoVet . -all` will invoke `go tool vet . -all` + automatically instead of plan `go vet`. This is one of the big changes in + this release, so give it a try :) +* Improved `:GoFmt` command, which now uses the `-w` flag to + write to the source code directly, instead of outputting it to stdout. This + makes `:GoFmt` much more faster than the current implementation. This is one + of the big changes in this release, so feedback is welcome! +* Improve `:GoImport` to have a `!` feature. Now when when called + with a `!` appended it will go get it. i.e: `:GoImport! + github.com/fatih/color`. Useful if `:GoImport` fails and you want to download + it. +* Automatic GOPATH detections can now detect `gb` vendored folders. Some commands should now work without any problem when invoked on a `gb` project. +* All command arguments are now properly escaped for shell invocation. +* Added the `-f` flag to :GoInstallBinaries command to support `git url..insteadOf` configuration +* Improve width and precision highlighting, such as `%s %5s %-5s %5.5f %.5f` +* Show an error if a region is not selected when `:GoFreeVars` is called + +BUG FIXES: +* Fix`:GoDef` for files containing spaces. We know escape the files before passing to `:GoDef` +* Fix `:GoFmt` not picking up the correct GOPATH when the fmt command was set to `goimports` +* Fix and simplify README.md, add Wiki reference +* Fixed tagbar integration to show correct imports. + + +## 1.0.5 (May 26, 2015) + +FEATURES: +* A new `:GoOracleScope` is added to change the oracle scope on-the-fly. It + accepts import paths as arguments. If no arguments are passed it prints the + current custom oracle scope. `:GoOracleScope` also supports completion of + import paths, so it's very fast and handy to use. `:GoOracleScope ""` clears + the current custom scope. +* A new `:GoPath` command that displays the current `GOPATH`. A path can be + passed to change the `GOPATH` (i.e `:GoPath ~/foo/src`). `:GoPath ""` clears + and resets the `GOPATH` to the initial value. +* A new "autodetect GOPATH" feature is added. This automatically detects if the + project is using `godep` or is under a `src` root directory which is not in + `GOPATH` and changes/modifies the `GOPATH` so all commands work based on this + GOPATH. What this means is, commands such as `:GoDef`, `:GoBuild`, etc.. will + include the Godeps folder. For example any go-to-definition via `:GoDef` will + jump to the source code inside Godeps. This is enabled by default, but can + disabled with `let g:go_autodetect_gopath = 0`. This new feature is also the + foundation for other tools such as `gb` or `wgo`. + +IMPROVEMENTS: +* Improve `:GoFmt` (gofmt and goimports) speed. Now it's 2x faster than the previous implementation. +* Add Dispatch support for `:GoBuild` and `:GoRun`. For more info about + dispatch see https://github.com/tpope/vim-dispatch . By default it's + disabled, to enable it add `let g:go_dispatch_enabled = 1` to your vimrc. +* Add support for the bang `!` attribute for all `go` tool commands. What this + does it, if `:GoBuild` is called it will jump to the error. But `:GoBuild!` + will not jump to any error. This has the same behavior as the internal + `:make` command in vim. We had this feature already for `:GoBuild` and + `:GoRun`. But not for `:GoInstall`, `:GoTest`, etc.. Now all commands are + unified. +* Add autojump to error for `:GoInstall`. +* Add autowrite feature for `:GoInstall`, `:GoTestXXX` functions and `:GoVet` +* Support `git url..insteadOf` and custom import paths of binaries. This + improves the commands `:GoInstallBinaries` and `:GoUpdateBinaries`. +* Add support for highlighting go templates with `*.tmpl` extensions. Based on + the work from @cespare from https://github.com/cespare/vim-go-templates + +BUG FIXES: +* Fix clearing the status bar when `:GoErrCheck` is called +* Fix godocNotFound to not match 'os' pkg contents. This improves the command + `:GoDoc` +* Fix parsing and jumping to error locations when used Vim from a different + directory than the current buffer's directory +* Fix completion showing duplicates paths for completion results, such as + github.com/fatih/color and github.com/fatih/color/. + +## 1.0.4 (Apr 28, 2015) + +FEATURES: + +* A new `:GoTestFunc` command (with appropriate + mappings) is added. Run tests function which surrounds the current cursor + location. Useful to test single tests. +* Highlight all Go operators. Previously not all + operators were highlighted. As previously, to highlight options, enable it + with by setting `g:go_highlight_operators` to 1 in your vimrc. + +IMPROVEMENTS: + +* Improved certain `:GoDoc` usages to show a better error message +* Improved `:GoRename` to have a default value for rename input. Avoids retyping similar words. +* Synced with latest Oracle version. `callgraph` is removed. +* Removed our custom referrers mode. New version of oracle now displays the matching lines. + +BUG FIXES: + +* Fixed the internal `executeInDir` function which was failing when ignorelist was not set properly. +* Fixed trailing slash for package completion with `:GoImport` +* Fixed paths in error list for Windows users. +* Fixed not showing "import cycle not allowed" error message when called `:GoBuild` or `:GoRun` +* Fixed users using vimproc requiring arguments to functions to be escaped. +* Fixed depth for test snippets +* Fixed neosnippet support loading snippet files the second time if necessary. + +## 1.0.3 (Mar 7, 2015) + +FEATURES: +* A new `:GoTestCompile` command (with appropriate mappings) is added. Useful to compile a test binary or show/fix compile errors in quickfix window + +IMPROVEMENTS: +* `referrer` mode is improved to show referring lines in the quickfix window +* A new `errt` snippet is added, which expands to `if err != nil { t.Fatal(err) }` +* A new `errh` snippet is added, useful to be used in a `http.Handler` +* UltiSnips snippets are improved to take advance of Vim's `Visual` mode. For example selecting a block and typing `if` will create an if scope around the block. +* Cleanup README.md + +BUG FIXES: +* Fix trimming brackets if completion was invoked on a previous completion +* Fix Oracle scope settings. Added docs about usage. +* Fixed previously broken `var` and `vars` snippets +* Fix duplicate docs +* Fix fallback binary path for Windows users. The fallback mechanism is used to discover the necessary Go tools, such as `godef`, `gocode`, etc... + +## 1.0.2 (Feb 17, 2015) + +FEATURES: + +* New snippets are added, mostly for testing ( [changes](https://github.com/fatih/vim-go/pull/321/files)) + +IMPROVEMENTS: + +* Enable all Oracle commands. Docs, mappings and commands are also added. It uses Quickfix list instead of a custom UI. +* Clarify installation process in Readme, add instructions for vim-plug, NeoBundle and manual. + +BUG FIXES: + +* Fix shiftwidth parsing, it was broken in the previous release for old Vim versions +* Fix experimantal mode + + +## 1.0.1 (Feb 9, 2015) + +FEATURES: + +* New feature to highlight build constraints (disabled by default) + +IMPROVEMENTS: + +* Updated godef import path +* Updated Readme for possible problems with `csh` +* Documentation for text objects are updated, typo fixes are merged +* If vimproc is installed, Windows users will use it for autocompletion +* Improve UltiSnips snippets to pick Visual selection (demo: http://quick.as/0dvigz5) +* Packages with extensions, like "gopkg.in/yaml.v2" can be now displayed +* Packages with different import paths, like "github.com/bitly/go-simplejson" can be now displayed + +BUG FIXES: + +* Fatal errors are now parsed successfully and populated to quickfix list +* Shiftwidth is changed to use shiftwidth() function. Fixes usage with plugins like vim-sleuth and possible mis usage (like setting shiftwidth to zero) +* Added a new [Donation](https://github.com/fatih/vim-go#donations) section to Readme, for those who ask for it. +* Fix parsing of errcheck error syntax +* Fix consistency between Neosnippet and UltiSnips snippets + + +## 1.0 (Dec 24, 2014) + +We don't tag any changes or releases, so let's start with `1.0`. Our Windows +support is now in a good shape, tons of bugs are fixed, many new features and +improvements is being added and it's getting better with each day (thanks to +the community contributions). + +## 0.0 (Mar 24, 2014) + +Initial commit: https://github.com/fatih/vim-go/commit/78c5caa82c111c50e9c219f222d65b07694f8f5a + + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e7ff629 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM golang:1.9.2 + +RUN apt-get update -y && \ + apt-get install -y build-essential curl git libncurses5-dev python3-pip && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN pip3 install vim-vint + +RUN useradd -ms /bin/bash -d /vim-go vim-go +USER vim-go + +COPY . /vim-go/ +WORKDIR /vim-go + +RUN scripts/install-vim vim-7.4 +RUN scripts/install-vim vim-8.0 +RUN scripts/install-vim nvim + +ENTRYPOINT ["make"] diff --git a/LICENSE b/LICENSE index e9cc0dc..d9493d4 100644 --- a/LICENSE +++ b/LICENSE @@ -25,7 +25,7 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + This software includes some portions from Go. Go is used under the terms of the BSD like license. @@ -56,3 +56,5 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The Go gopher was designed by Renee French. http://reneefrench.blogspot.com/ The design is licensed under the Creative Commons 3.0 Attributions license. Read this article for more details: https://blog.golang.org/gopher diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..54978e8 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +VIMS ?= vim-7.4 vim-8.0 nvim + +all: install test lint + +install: + @echo "==> Installing Vims: $(VIMS)" + @for vim in $(VIMS); do \ + ./scripts/install-vim $$vim; \ + done + +test: + @echo "==> Running tests for $(VIMS)" + @for vim in $(VIMS); do \ + ./scripts/test $$vim; \ + done + +lint: + @echo "==> Running linting tools" + @./scripts/lint vim-8.0 + +docker: + @echo "==> Building/starting Docker container" + @./scripts/docker-test + +clean: + @echo "==> Cleaning /tmp/vim-go-test" + @rm -rf /tmp/vim-go-test + +.PHONY: all test install clean lint docker diff --git a/README.md b/README.md index 8614d87..8566224 100644 --- a/README.md +++ b/README.md @@ -1,282 +1,71 @@ -# vim-go - -Go (golang) support for Vim, which comes with pre-defined sensible settings (like -auto gofmt on save), with autocomplete, snippet support, improved syntax -highlighting, go toolchain commands, and more. If needed vim-go installs all -necessary binaries for providing seamless Vim integration with current -commands. It's highly customizable and each individual feature can be -disabled/enabled easily. - -![vim-go](https://dl.dropboxusercontent.com/u/174404/vim-go-2.png) - +# vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go) +

+ Vim-go logo +

## Features -* Improved Syntax highlighting with items such as Functions, Operators, Methods. -* Auto completion support via `gocode` -* Better `gofmt` on save, which keeps cursor position and doesn't break your undo - history -* Go to symbol/declaration with `:GoDef` -* Look up documentation with `:GoDoc` inside Vim or open it in browser -* Automatically import packages via `:GoImport` or plug it into autosave -* Compile your package with `:GoBuild`, install it with `:GoInstall` or test - them with `:GoTest` (also supports running single tests via `:GoTestFunc`) -* Quickly execute your current file/files with `:GoRun` -* Automatic `GOPATH` detection based on the directory structure (i.e. `gb` - projects, `godep` vendored projects) -* Change or display `GOPATH` with `:GoPath` -* Create a coverage profile and display annotated source code in browser to see - which functions are covered with `:GoCoverage` -* Call `gometalinter` with `:GoMetaLinter`, which invokes all possible linters - (golint, vet, errcheck, deadcode, etc..) and shows the warnings/errors -* Lint your code with `:GoLint` -* Run your code through `:GoVet` to catch static errors -* Advanced source analysis tools utilizing oracle, such as `:GoImplements`, - `:GoCallees`, and `:GoReferrers` -* Precise type-safe renaming of identifiers with `:GoRename` -* List all source files and dependencies -* Unchecked error checking with `:GoErrCheck` -* Integrated and improved snippets, supporting `ultisnips` or `neosnippet` -* Share your current code to [play.golang.org](http://play.golang.org) with `:GoPlay` -* On-the-fly type information about the word under the cursor. Plug it into - your custom vim function. -* Go asm formatting on save -* Tagbar support to show tags of the source code in a sidebar with `gotags` -* Custom vim text objects such as `a function` or `inner function` - list. -* A async launcher for the go command is implemented for Neovim, fully async - building and testing (beta). -* Integrated with the Neovim terminal, launch `:GoRun` and other go commands - in their own new terminal. (beta) -* Alternate between implementation and test code with `:GoAlternate` - -## Donation - -People have asked for this for a long time, now you can be a fully supporter by [being a patron](https://www.patreon.com/fatih)! This is fully optional and is just a way to support vim-go's ongoing development directly. Thanks! - -[https://www.patreon.com/fatih](https://www.patreon.com/fatih) +This plugin adds Go language support for Vim, with the following main features: + +* Compile your package with `:GoBuild`, install it with `:GoInstall` or test it + with `:GoTest`. Run a single tests with `:GoTestFunc`). +* Quickly execute your current file(s) with `:GoRun`. +* Improved syntax highlighting and folding. +* Completion support via `gocode`. +* `gofmt` or `goimports` on save keeps the cursor position and undo history. +* Go to symbol/declaration with `:GoDef`. +* Look up documentation with `:GoDoc` or `:GoDocBrowser`. +* Easily import packages via `:GoImport`, remove them via `:GoDrop`. +* Automatic `GOPATH` detection which works with `gb` and `godep`. Change or + display `GOPATH` with `:GoPath`. +* See which code is covered by tests with `:GoCoverage`. +* Add or remove tags on struct fields with `:GoAddTags` and `:GoRemoveTags`. +* Call `gometalinter` with `:GoMetaLinter` to invoke all possible linters + (`golint`, `vet`, `errcheck`, `deadcode`, etc.) and put the result in the + quickfix or location list. +* Lint your code with `:GoLint`, run your code through `:GoVet` to catch static + errors, or make sure errors are checked with `:GoErrCheck`. +* Advanced source analysis tools utilizing `guru`, such as `:GoImplements`, + `:GoCallees`, and `:GoReferrers`. +* Precise type-safe renaming of identifiers with `:GoRename`. +* ... and many more! Please see [doc/vim-go.txt](doc/vim-go.txt) for more + information. ## Install -Vim-go follows the standard runtime path structure, so I highly recommend to -use a common and well known plugin manager to install vim-go. Do not use vim-go -with other Go oriented vim plugins. For Pathogen just clone the repo. For other -plugin managers add the appropriate lines and execute the plugin's install -command. +The [**latest stable release**](https://github.com/fatih/vim-go/releases/latest) is the +recommended version to use. If you choose to use the master branch instead, +please do so with caution; it is a _development_ branch. + +vim-go follows the standard runtime path structure. Below are some helper lines +for popular package managers: -* [Pathogen](https://github.com/tpope/vim-pathogen) +* [Vim 8 packages](http://vimhelp.appspot.com/repeat.txt.html#packages) + * `git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go` +* [Pathogen](https://github.com/tpope/vim-pathogen) * `git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go` -* [vim-plug](https://github.com/junegunn/vim-plug) +* [vim-plug](https://github.com/junegunn/vim-plug) * `Plug 'fatih/vim-go'` -* [NeoBundle](https://github.com/Shougo/neobundle.vim) - * `NeoBundle 'fatih/vim-go'` -* [Vundle](https://github.com/gmarik/vundle) - * `Plugin 'fatih/vim-go'` -Please be sure all necessary binaries are installed (such as `gocode`, `godef`, -`goimports`, etc.). You can easily install them with the included -`:GoInstallBinaries` command. If invoked, all necessary binaries will be -automatically downloaded and installed to your `$GOBIN` environment (if not set -it will use `$GOPATH/bin`). Note that this command requires `git` for fetching -the individual Go packages. Additionally, use `:GoUpdateBinaries` to update the -installed binaries. +You will also need to install all the necessary binaries. vim-go makes it easy +to install all of them by providing a command, `:GoInstallBinaries`, which will +`go get` all the required binaries. -### Optional - -* Autocompletion is enabled by default via ``. To get real-time -completion (completion by type) install: -[neocomplete](https://github.com/Shougo/neocomplete.vim) for Vim or -[deoplete](https://github.com/Shougo/deoplete.nvim) and -[deoplete-go](https://github.com/zchee/deoplete-go) for NeoVim -* To display source code tag information on a sidebar install -[tagbar](https://github.com/majutsushi/tagbar). -* For snippet features install: -[neosnippet](https://github.com/Shougo/neosnippet.vim) or -[ultisnips](https://github.com/SirVer/ultisnips). -* Screenshot color scheme is a slightly modified molokai: - [fatih/molokai](https://github.com/fatih/molokai). -* For a better documentation viewer checkout: - [go-explorer](https://github.com/garyburd/go-explorer). +Check out the Install section in [the documentation](doc/vim-go.txt) for more +detailed instructions (`:help go-install`). ## Usage -Many of the plugin's [features](#features) are enabled by default. There are no -additional settings needed. All usages and commands are listed in -`doc/vim-go.txt`. Note that help tags needs to be populated. Check your plugin -manager settings to generate the documentation (some do it automatically). -After that just open the help page to see all commands: - - :help vim-go - -## Mappings - -vim-go has several `` mappings which can be used to create custom -mappings. Below are some examples you might find useful: - -Run commands such as `go run` for the current file with `r` or `go -build` and `go test` for the current package with `b` and `t` -respectively. Display beautifully annotated source code to see which functions -are covered with `c`. - -```vim -au FileType go nmap r (go-run) -au FileType go nmap b (go-build) -au FileType go nmap t (go-test) -au FileType go nmap c (go-coverage) -``` - -By default the mapping `gd` is enabled, which opens the target identifier in -current buffer. You can also open the definition/declaration, in a new vertical, -horizontal, or tab, for the word under your cursor: - -```vim -au FileType go nmap ds (go-def-split) -au FileType go nmap dv (go-def-vertical) -au FileType go nmap dt (go-def-tab) -``` - -Open the relevant Godoc for the word under the cursor with `gd` or open -it vertically with `gv` - -```vim -au FileType go nmap gd (go-doc) -au FileType go nmap gv (go-doc-vertical) -``` - -Or open the Godoc in browser - -```vim -au FileType go nmap gb (go-doc-browser) -``` - -Show a list of interfaces which is implemented by the type under your cursor -with `s` - -```vim -au FileType go nmap s (go-implements) -``` - -Show type info for the word under your cursor with `i` (useful if you -have disabled auto showing type info via `g:go_auto_type_info`) - -```vim -au FileType go nmap i (go-info) -``` - -Rename the identifier under the cursor to a new name - -```vim -au FileType go nmap e (go-rename) -``` - -More `` mappings can be seen with `:he go-mappings`. Also these are just -recommendations, you are free to create more advanced mappings or functions -based on `:he go-commands`. - -## Settings -Below are some settings you might find useful. For the full list see `:he -go-settings`. - -By default syntax-highlighting for Functions, Methods and Structs is disabled. -To change it: -```vim -let g:go_highlight_functions = 1 -let g:go_highlight_methods = 1 -let g:go_highlight_structs = 1 -let g:go_highlight_interfaces = 1 -let g:go_highlight_operators = 1 -let g:go_highlight_build_constraints = 1 -``` - -Enable goimports to automatically insert import paths instead of gofmt: - -```vim -let g:go_fmt_command = "goimports" -``` - -By default vim-go shows errors for the fmt command, to disable it: - -```vim -let g:go_fmt_fail_silently = 1 -``` - -Disable auto fmt on save: - -```vim -let g:go_fmt_autosave = 0 -``` - -Disable opening browser after posting your snippet to `play.golang.org`: - -```vim -let g:go_play_open_browser = 0 -``` - -By default when `:GoInstallBinaries` is called, the binaries are installed to -`$GOBIN` or `$GOPATH/bin`. To change it: - -```vim -let g:go_bin_path = expand("~/.gotools") -let g:go_bin_path = "/home/fatih/.mypath" "or give absolute path -``` - -### Using with Neovim (beta) - -Note: Neovim currently is not a first class citizen for vim-go. You are free -to open bugs but I'm not going to look at them. Even though I'm using Neovim -myself, Neovim itself is still alpha. So vim-go might not work well as good as -in Vim. I'm happy to accept pull requests or very detailed bug reports. - - -Run `:GoRun` in a new tab, horizontal split or vertical split terminal - -```vim -au FileType go nmap rt (go-run-tab) -au FileType go nmap rs (go-run-split) -au FileType go nmap rv (go-run-vertical) -``` - -By default new terminals are opened in a vertical split. To change it - -```vim -let g:go_term_mode = "split" -``` - -By default the testing commands run asynchronously in the background and -display results with `go#jobcontrol#Statusline()`. To make them run in a new -terminal - -```vim -let g:go_term_enabled = 1 -``` - -### Using with Syntastic -Sometimes when using both `vim-go` and `syntastic` Vim will start lagging while -saving and opening files. The following fixes this: - -```vim -let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck'] -let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] } -``` - -## More info - -Check out the [Wiki](https://github.com/fatih/vim-go/wiki) page for more -information. It includes -[Screencasts](https://github.com/fatih/vim-go/wiki/Screencasts), an [FAQ -section](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), and many -other [various pieces](https://github.com/fatih/vim-go/wiki) of information. +The full documentation can be found at [doc/vim-go.txt](doc/vim-go.txt). You can +display it from within Vim with `:help vim-go`. -## Credits +Depending on your installation method, you may have to generate the plugin's +[`help tags`](http://vimhelp.appspot.com/helphelp.txt.html#%3Ahelptags) +manually (e.g. `:helptags ALL`). -* Go Authors for official vim plugins -* Gocode, Godef, Golint, Oracle, Goimports, Gotags, Errcheck projects and - authors of those projects. -* Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode, - vim-godef) -* [Contributors](https://github.com/fatih/vim-go/graphs/contributors) of vim-go +We also have an [official vim-go tutorial](https://github.com/fatih/vim-go-tutorial). ## License -The BSD 3-Clause License - see `LICENSE` for more details +The BSD 3-Clause License - see [`LICENSE`](LICENSE) for more details diff --git a/assets/screenshot.png b/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2923d7f67ce76b4a294ce1fdda2091188be49d GIT binary patch literal 764721 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 z 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"`gi`Y9&bi*7=ub;2Aup7MFjYe?Cgk^9 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

WvhVj7 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

^1ZHn1Ck2S~l6I?pfB>6}dN=ykdpN6_N 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Ík6#$ipkQkxAu2TAe%G(^0-ESV(|q@n?`UaV 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 O>^XS>oM2DB|NKAUGDv;^ literal 0 HcmV?d00001 diff --git a/assets/vim-go.png b/assets/vim-go.png new file mode 100644 index 0000000000000000000000000000000000000000..cb26e2c073ecba2bf5f97686dc3b8184868ab12f GIT binary patch literal 29252 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/autoload/ctrlp/decls.vim b/autoload/ctrlp/decls.vim index a57d09d..00ecb89 100644 --- a/autoload/ctrlp/decls.vim +++ b/autoload/ctrlp/decls.vim @@ -1,26 +1,26 @@ let s:go_decls_var = { - \ 'init': 'ctrlp#decls#init()', - \ 'exit': 'ctrlp#decls#exit()', - \ 'enter': 'ctrlp#decls#enter()', - \ 'accept': 'ctrlp#decls#accept', - \ 'lname': 'declarations', - \ 'sname': 'decls', - \ 'type': 'tabs', - \} + \ 'init': 'ctrlp#decls#init()', + \ 'exit': 'ctrlp#decls#exit()', + \ 'enter': 'ctrlp#decls#enter()', + \ 'accept': 'ctrlp#decls#accept', + \ 'lname': 'declarations', + \ 'sname': 'decls', + \ 'type': 'tabs', + \} if exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) - let g:ctrlp_ext_vars = add(g:ctrlp_ext_vars, s:go_decls_var) + let g:ctrlp_ext_vars = add(g:ctrlp_ext_vars, s:go_decls_var) else - let g:ctrlp_ext_vars = [s:go_decls_var] + let g:ctrlp_ext_vars = [s:go_decls_var] endif -function! ctrlp#decls#init() - cal s:enable_syntax() - return s:decls +function! ctrlp#decls#init() abort + cal s:enable_syntax() + return s:decls endfunction -function! ctrlp#decls#exit() - unlet! s:decls s:current_dir s:target +function! ctrlp#decls#exit() abort + unlet! s:decls s:current_dir s:target endfunction " The action to perform on the selected string @@ -28,131 +28,128 @@ endfunction " a:mode the mode that has been chosen by pressing or " the values are 'e', 'v', 't' and 'h', respectively " a:str the selected string -function! ctrlp#decls#accept(mode, str) - let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' - let dir = getcwd() - try - " we jump to the file directory so we can get the fullpath via fnamemodify - " below - execute cd . s:current_dir - - let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') - - " i.e: main.go - let filename = vals[1] - let line = vals[2] - let col = vals[3] - - " i.e: /Users/fatih/vim-go/main.go - let filepath = fnamemodify(filename, ":p") - - " acceptile is a very versatile method, - call ctrlp#acceptfile(a:mode, filepath) - call cursor(line, col) - silent! norm! zvzz - finally - "jump back to old dir - execute cd . fnameescape(dir) - endtry +function! ctrlp#decls#accept(mode, str) abort + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + " we jump to the file directory so we can get the fullpath via fnamemodify + " below + execute cd . s:current_dir + + let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') + + " i.e: main.go + let filename = vals[1] + let line = vals[2] + let col = vals[3] + + " i.e: /Users/fatih/vim-go/main.go + let filepath = fnamemodify(filename, ":p") + + " acceptile is a very versatile method, + call ctrlp#acceptfile(a:mode, filepath) + call cursor(line, col) + silent! norm! zvzz + finally + "jump back to old dir + execute cd . fnameescape(dir) + endtry endfunction -function! ctrlp#decls#enter() - let s:current_dir = fnameescape(expand('%:p:h')) - let s:decls = [] - - let bin_path = go#path#CheckBinPath('motion') - if empty(bin_path) - return - endif - let command = printf("%s -format vim -mode decls", bin_path) - let command .= " -include ". get(g:, "go_decls_includes", "func,type") - - call go#cmd#autowrite() - - if s:mode == 0 - " current file mode - let fname = expand("%:p") - if exists('s:target') - let fname = s:target - endif - - let command .= printf(" -file %s", fname) - else - " all functions mode - let dir = expand("%:p:h") - if exists('s:target') - let dir = s:target - endif - - let command .= printf(" -dir %s", dir) - endif - - let out = system(command) - if v:shell_error != 0 - call go#util#EchoError(out) - return - endif - - if exists("l:tmpname") - call delete(l:tmpname) - endif - - let result = eval(out) - if type(result) != 4 || !has_key(result, 'decls') - return - endif - - let decls = result.decls - - " find the maximum function name - let max_len = 0 - for decl in decls - if len(decl.ident)> max_len - let max_len = len(decl.ident) - endif - endfor - - for decl in decls - " paddings - let space = " " - for i in range(max_len - len(decl.ident)) - let space .= " " - endfor - - call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", - \ decl.ident . space, - \ decl.keyword, - \ fnamemodify(decl.filename, ":t"), - \ decl.line, - \ decl.col, - \ decl.full, - \)) - endfor +function! ctrlp#decls#enter() abort + let s:current_dir = fnameescape(expand('%:p:h')) + let s:decls = [] + + let bin_path = go#path#CheckBinPath('motion') + if empty(bin_path) + return + endif + let command = printf("%s -format vim -mode decls", bin_path) + let command .= " -include ". get(g:, "go_decls_includes", "func,type") + + call go#cmd#autowrite() + + if s:mode == 0 + " current file mode + let fname = expand("%:p") + if exists('s:target') + let fname = s:target + endif + + let command .= printf(" -file %s", fname) + else + " all functions mode + let dir = expand("%:p:h") + if exists('s:target') + let dir = s:target + endif + + let command .= printf(" -dir %s", dir) + endif + + let out = go#util#System(command) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + let result = eval(out) + if type(result) != 4 || !has_key(result, 'decls') + return + endif + + let decls = result.decls + + " find the maximum function name + let max_len = 0 + for decl in decls + if len(decl.ident)> max_len + let max_len = len(decl.ident) + endif + endfor + + for decl in decls + " paddings + let space = " " + for i in range(max_len - len(decl.ident)) + let space .= " " + endfor + + call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", + \ decl.ident . space, + \ decl.keyword, + \ fnamemodify(decl.filename, ":t"), + \ decl.line, + \ decl.col, + \ decl.full, + \)) + endfor endfunc -function! s:enable_syntax() - if !(has('syntax') && exists('g:syntax_on')) - return - endif +function! s:enable_syntax() abort + if !(has('syntax') && exists('g:syntax_on')) + return + endif - syntax match CtrlPIdent '\zs\h\+\ze\s' - syntax match CtrlPKeyword '\zs[^\t|]\+\ze|[^|]\+:\d\+:\d\+|' - syntax match CtrlPFilename '|\zs[^|]\+:\d\+:\d\+\ze|' - syntax match CtrlPSignature '\zs\t.*\ze$' contains=CtrlPKeyWord,CtrlPFilename + syntax match CtrlPIdent '\zs\h\+\ze\s' + syntax match CtrlPKeyword '\zs[^\t|]\+\ze|[^|]\+:\d\+:\d\+|' + syntax match CtrlPFilename '|\zs[^|]\+:\d\+:\d\+\ze|' + syntax match CtrlPSignature '\zs\t.*\ze$' contains=CtrlPKeyWord,CtrlPFilename - highlight link CtrlPIdent Function - highlight link CtrlPKeyword Keyword - highlight link CtrlPFilename SpecialComment - highlight link CtrlPSignature Comment + highlight link CtrlPIdent Function + highlight link CtrlPKeyword Keyword + highlight link CtrlPFilename SpecialComment + highlight link CtrlPSignature Comment endfunction let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -function! ctrlp#decls#cmd(mode, ...) - let s:mode = a:mode - if a:0 && !empty(a:1) - let s:target = a:1 - endif - return s:id +function! ctrlp#decls#cmd(mode, ...) abort + let s:mode = a:mode + if a:0 && !empty(a:1) + let s:target = a:1 + endif + return s:id endfunction +" vim: sw=2 ts=2 et diff --git a/autoload/fzf/decls.vim b/autoload/fzf/decls.vim new file mode 100644 index 0000000..255320e --- /dev/null +++ b/autoload/fzf/decls.vim @@ -0,0 +1,150 @@ +function! s:code(group, attr) abort + let code = synIDattr(synIDtrans(hlID(a:group)), a:attr, "cterm") + if code =~ '^[0-9]\+$' + return code + endif +endfunction + +function! s:color(str, group) abort + let fg = s:code(a:group, "fg") + let bg = s:code(a:group, "bg") + let bold = s:code(a:group, "bold") + let italic = s:code(a:group, "italic") + let reverse = s:code(a:group, "reverse") + let underline = s:code(a:group, "underline") + let color = (empty(fg) ? "" : ("38;5;".fg)) . + \ (empty(bg) ? "" : (";48;5;".bg)) . + \ (empty(bold) ? "" : ";1") . + \ (empty(italic) ? "" : ";3") . + \ (empty(reverse) ? "" : ";7") . + \ (empty(underline) ? "" : ";4") + return printf("\x1b[%sm%s\x1b[m", color, a:str) +endfunction + +function! s:sink(str) abort + if len(a:str) < 2 + return + endif + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + " we jump to the file directory so we can get the fullpath via fnamemodify + " below + execute cd . fnameescape(s:current_dir) + + let vals = matchlist(a:str[1], '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') + + " i.e: main.go + let filename = vals[1] + let line = vals[2] + let col = vals[3] + + " i.e: /Users/fatih/vim-go/main.go + let filepath = fnamemodify(filename, ":p") + + let cmd = get({'ctrl-x': 'split', + \ 'ctrl-v': 'vertical split', + \ 'ctrl-t': 'tabe'}, a:str[0], 'e') + execute cmd fnameescape(filepath) + call cursor(line, col) + silent! norm! zvzz + finally + "jump back to old dir + execute cd . fnameescape(dir) + endtry +endfunction + +function! s:source(mode,...) abort + let s:current_dir = expand('%:p:h') + let ret_decls = [] + + let bin_path = go#path#CheckBinPath('motion') + if empty(bin_path) + return + endif + let command = printf("%s -format vim -mode decls", bin_path) + let command .= " -include ". get(g:, "go_decls_includes", "func,type") + + call go#cmd#autowrite() + + if a:mode == 0 + " current file mode + let fname = expand("%:p") + if a:0 && !empty(a:1) + let fname = a:1 + endif + + let command .= printf(" -file %s", shellescape(fname)) + else + " all functions mode + if a:0 && !empty(a:1) + let s:current_dir = a:1 + endif + + let command .= printf(" -dir %s", shellescape(s:current_dir)) + endif + + let out = go#util#System(command) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + let result = eval(out) + if type(result) != 4 || !has_key(result, 'decls') + return ret_decls + endif + + let decls = result.decls + + " find the maximum function name + let max_len = 0 + for decl in decls + if len(decl.ident)> max_len + let max_len = len(decl.ident) + endif + endfor + + for decl in decls + " paddings + let space = " " + for i in range(max_len - len(decl.ident)) + let space .= " " + endfor + + let pos = printf("|%s:%s:%s|", + \ fnamemodify(decl.filename, ":t"), + \ decl.line, + \ decl.col + \) + call add(ret_decls, printf("%s\t%s %s\t%s", + \ s:color(decl.ident . space, "Function"), + \ s:color(decl.keyword, "Keyword"), + \ s:color(pos, "SpecialComment"), + \ s:color(decl.full, "Comment"), + \)) + endfor + + return ret_decls +endfunc + +function! fzf#decls#cmd(...) abort + let normal_fg = s:code("Normal", "fg") + let normal_bg = s:code("Normal", "bg") + let cursor_fg = s:code("CursorLine", "fg") + let cursor_bg = s:code("CursorLine", "bg") + let colors = printf(" --color %s%s%s%s%s", + \ &background, + \ empty(normal_fg) ? "" : (",fg:".normal_fg), + \ empty(normal_bg) ? "" : (",bg:".normal_bg), + \ empty(cursor_fg) ? "" : (",fg+:".cursor_fg), + \ empty(cursor_bg) ? "" : (",bg+:".cursor_bg), + \) + call fzf#run(fzf#wrap('GoDecls', { + \ 'source': call('source', a:000), + \ 'options': '-n 1 --ansi --prompt "GoDecls> " --expect=ctrl-t,ctrl-v,ctrl-x'.colors, + \ 'sink*': function('s:sink') + \ })) +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/alternate.vim b/autoload/go/alternate.vim index 1de6a69..f2cb210 100644 --- a/autoload/go/alternate.vim +++ b/autoload/go/alternate.vim @@ -4,7 +4,7 @@ if !exists("g:go_alternate_mode") endif " Test alternates between the implementation of code and the test code. -function! go#alternate#Switch(bang, cmd) +function! go#alternate#Switch(bang, cmd) abort let file = expand('%') if empty(file) call go#util#EchoError("no buffer name") @@ -28,3 +28,5 @@ function! go#alternate#Switch(bang, cmd) execute ":" . a:cmd . " " . alt_file endif endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/asmfmt.vim b/autoload/go/asmfmt.vim index 0b42794..cc8acd3 100644 --- a/autoload/go/asmfmt.vim +++ b/autoload/go/asmfmt.vim @@ -11,7 +11,7 @@ " " Options: " -" g:go_asmfmt_autosave [default=1] +" g:go_asmfmt_autosave [default=0] " " Flag to automatically call :Fmt when file is saved. @@ -19,29 +19,33 @@ let s:got_fmt_error = 0 " This is a trimmed-down version of the logic in fmt.vim. -function! go#asmfmt#Format() +function! go#asmfmt#Format() abort " Save state. let l:curw = winsaveview() " Write the current buffer to a tempfile. let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) " Run asmfmt. let path = go#path#CheckBinPath("asmfmt") if empty(path) return endif - let out = system(path . ' -w ' . l:tmpname) + let out = go#util#System(path . ' -w ' . l:tmpname) " If there's no error, replace the current file with the output. - if v:shell_error == 0 + if go#util#ShellError() == 0 " Remove undo point caused by BufWritePre. try | silent undojoin | catch | endtry " Replace the current file with the temp file; then reload the buffer. let old_fileformat = &fileformat + " save old file permissions + let original_fperm = getfperm(expand('%')) call rename(l:tmpname, expand('%')) + " restore old file permissions + call setfperm(expand('%'), original_fperm) silent edit! let &fileformat = old_fileformat let &syntax = &syntax @@ -50,3 +54,16 @@ function! go#asmfmt#Format() " Restore the cursor/window positions. call winrestview(l:curw) endfunction + +function! go#asmfmt#ToggleAsmFmtAutoSave() abort + if get(g:, "go_asmfmt_autosave", 0) + let g:go_asmfmt_autosave = 1 + call go#util#EchoProgress("auto asmfmt enabled") + return + end + + let g:go_asmfmt_autosave = 0 + call go#util#EchoProgress("auto asmfmt disabled") +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/cmd.vim b/autoload/go/cmd.vim index c90a053..a867607 100644 --- a/autoload/go/cmd.vim +++ b/autoload/go/cmd.vim @@ -1,365 +1,311 @@ -if !exists("g:go_dispatch_enabled") - let g:go_dispatch_enabled = 0 -endif - -function! go#cmd#autowrite() - if &autowrite == 1 - silent wall - endif +function! go#cmd#autowrite() abort + if &autowrite == 1 + silent! wall + endif endfunction - -" Build builds the source code without producting any output binary. We live in +" Build builds the source code without producing any output binary. We live in " an editor so the best is to build it to catch errors and fix them. By " default it tries to call simply 'go build', but it first tries to get all " dependent files for the current folder and passes it to go build. -function! go#cmd#Build(bang, ...) - " expand all wildcards(i.e: '%' to the current file name) - let goargs = map(copy(a:000), "expand(v:val)") - - " escape all shell arguments before we pass it to make - let goargs = go#util#Shelllist(goargs, 1) +function! go#cmd#Build(bang, ...) abort + " Create our command arguments. go build discards any results when it + " compiles multiple packages. So we pass the `errors` package just as an + " placeholder with the current folder (indicated with '.'). We also pass -i + " that tries to install the dependencies, this has the side effect that it + " caches the build results, so every other build is faster. + let args = + \ ["build"] + + \ map(copy(a:000), "expand(v:val)") + + \ ["-i", ".", "errors"] + + " Vim async. + if go#util#has_job() + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("building dispatched ...") + endif - " create our command arguments. go build discards any results when it - " compiles multiple packages. So we pass the `errors` package just as an - " placeholder with the current folder (indicated with '.') - let args = ["build"] + goargs + [".", "errors"] + call s:cmd_job({ + \ 'cmd': ['go'] + args, + \ 'bang': a:bang, + \ 'for': 'GoBuild', + \}) - " if we have nvim, call it asynchronously and return early ;) - if has('nvim') - call go#util#EchoProgress("building dispatched ...") - call go#jobcontrol#Spawn(a:bang, "build", args) - return + " Nvim async. + elseif has('nvim') + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("building dispatched ...") endif - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() + call go#jobcontrol#Spawn(a:bang, "build", "GoBuild", args) + + " Vim 7.4 without async + else let default_makeprg = &makeprg - let &makeprg = "go " . join(args, ' ') + let &makeprg = "go " . join(go#util#Shelllist(args), ' ') - let l:listtype = go#list#Type("quickfix") + let l:listtype = go#list#Type("GoBuild") " execute make inside the source folder so we can parse the errors " correctly let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' let dir = getcwd() try - execute cd . fnameescape(expand("%:p:h")) - if g:go_dispatch_enabled && exists(':Make') == 2 - call go#util#EchoProgress("building dispatched ...") - silent! exe 'Make' - elseif l:listtype == "locationlist" - silent! exe 'lmake!' - else - silent! exe 'make!' - endif - redraw! + execute cd . fnameescape(expand("%:p:h")) + if l:listtype == "locationlist" + silent! exe 'lmake!' + else + silent! exe 'make!' + endif + redraw! finally - execute cd . fnameescape(dir) + execute cd . fnameescape(dir) endtry let errors = go#list#Get(l:listtype) call go#list#Window(l:listtype, len(errors)) - - if !empty(errors) - if !a:bang - call go#list#JumpToFirst(l:listtype) - endif + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) else - call go#util#EchoSuccess("[build] SUCCESS") + call go#util#EchoSuccess("[build] SUCCESS") endif let &makeprg = default_makeprg - let $GOPATH = old_gopath + endif endfunction -" Run runs the current file (and their dependencies if any) in a new terminal. -function! go#cmd#RunTerm(bang, mode, files) - if empty(a:files) - let cmd = "go run ". go#util#Shelljoin(go#tool#Files()) +" BuildTags sets or shows the current build tags used for tools +function! go#cmd#BuildTags(bang, ...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_build_tags + call go#util#EchoSuccess("build tags are cleared") else - let cmd = "go run ". go#util#Shelljoin(map(copy(a:files), "expand(v:val)"), 1) + let g:go_build_tags = a:1 + call go#util#EchoSuccess("build tags are changed to: ". a:1) endif - call go#term#newmode(a:bang, cmd, a:mode) -endfunction -" Run runs the current file (and their dependencies if any) and outputs it. -" This is intented to test small programs and play with them. It's not -" suitable for long running apps, because vim is blocking by default and -" calling long running apps will block the whole UI. -function! go#cmd#Run(bang, ...) - if has('nvim') - call go#cmd#RunTerm(a:bang, '', a:000) - return - endif + return + endif - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() - - if go#util#IsWin() - exec '!go run ' . go#util#Shelljoin(go#tool#Files()) - if v:shell_error - redraws! | echon "vim-go: [run] " | echohl ErrorMsg | echon "FAILED"| echohl None - else - redraws! | echon "vim-go: [run] " | echohl Function | echon "SUCCESS"| echohl None - endif + if !exists('g:go_build_tags') + call go#util#EchoSuccess("build tags are not set") + else + call go#util#EchoSuccess("current build tags: ". g:go_build_tags) + endif +endfunction - let $GOPATH = old_gopath - return - endif - " :make expands '%' and '#' wildcards, so they must also be escaped - let default_makeprg = &makeprg - if a:0 == 0 - let &makeprg = 'go run ' . go#util#Shelljoin(go#tool#Files(), 1) - else - let &makeprg = "go run " . go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) - endif - - let l:listtype = go#list#Type("quickfix") +" Run runs the current file (and their dependencies if any) in a new terminal. +function! go#cmd#RunTerm(bang, mode, files) abort + if empty(a:files) + let cmd = "go run ". go#util#Shelljoin(go#tool#Files()) + else + let cmd = "go run ". go#util#Shelljoin(map(copy(a:files), "expand(v:val)"), 1) + endif + call go#term#newmode(a:bang, cmd, a:mode) +endfunction - if g:go_dispatch_enabled && exists(':Make') == 2 - silent! exe 'Make' - elseif l:listtype == "locationlist" - exe 'lmake!' +" Run runs the current file (and their dependencies if any) and outputs it. +" This is intended to test small programs and play with them. It's not +" suitable for long running apps, because vim is blocking by default and +" calling long running apps will block the whole UI. +function! go#cmd#Run(bang, ...) abort + if has('nvim') + call go#cmd#RunTerm(a:bang, '', a:000) + return + endif + + if go#util#has_job() + " NOTE(arslan): 'term': 'open' case is not implement for +jobs. This means + " executions waiting for stdin will not work. That's why we don't do + " anything. Once this is implemented we're going to make :GoRun async + endif + + if go#util#IsWin() + exec '!go run ' . go#util#Shelljoin(go#tool#Files()) + if v:shell_error + redraws! | echon "vim-go: [run] " | echohl ErrorMsg | echon "FAILED"| echohl None else - exe 'make!' + redraws! | echon "vim-go: [run] " | echohl Function | echon "SUCCESS"| echohl None endif - let items = go#list#Get(l:listtype) - let errors = go#tool#FilterValids(items) - - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) && !a:bang - call go#list#JumpToFirst(l:listtype) - endif + return + endif - let $GOPATH = old_gopath - let &makeprg = default_makeprg -endfunction + " :make expands '%' and '#' wildcards, so they must also be escaped + let default_makeprg = &makeprg + if a:0 == 0 + let &makeprg = 'go run ' . go#util#Shelljoin(go#tool#Files(), 1) + else + let &makeprg = "go run " . go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) + endif -" Install installs the package by simple calling 'go install'. If any argument -" is given(which are passed directly to 'go install') it tries to install those -" packages. Errors are populated in the location window. -function! go#cmd#Install(bang, ...) - let default_makeprg = &makeprg + let l:listtype = go#list#Type("GoRun") - " :make expands '%' and '#' wildcards, so they must also be escaped - let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) - let &makeprg = "go install " . goargs + if l:listtype == "locationlist" + exe 'lmake!' + else + exe 'make!' + endif - let l:listtype = go#list#Type("quickfix") - " execute make inside the source folder so we can parse the errors - " correctly - let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' - let dir = getcwd() - try - execute cd . fnameescape(expand("%:p:h")) - if g:go_dispatch_enabled && exists(':Make') == 2 - call go#util#EchoProgress("building dispatched ...") - silent! exe 'Make' - elseif l:listtype == "locationlist" - silent! exe 'lmake!' - else - silent! exe 'make!' - endif - redraw! - finally - execute cd . fnameescape(dir) - endtry + let items = go#list#Get(l:listtype) + let errors = go#tool#FilterValids(items) - let errors = go#list#Get(l:listtype) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) - if !a:bang - call go#list#JumpToFirst(l:listtype) - endif - else - redraws! | echon "vim-go: " | echohl Function | echon "installed to ". $GOPATH | echohl None - endif + call go#list#Populate(l:listtype, errors, &makeprg) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + endif - let &makeprg = default_makeprg + let &makeprg = default_makeprg endfunction -" Test runs `go test` in the current directory. If compile is true, it'll -" compile the tests instead of running them (useful to catch errors in the -" test files). Any other argument is appendend to the final `go test` command -function! go#cmd#Test(bang, compile, ...) - let args = ["test"] - - " don't run the test, only compile it. Useful to capture and fix errors or - " to create a test binary. - if a:compile - call add(args, "-c") - endif - - if a:0 - " expand all wildcards(i.e: '%' to the current file name) - let goargs = map(copy(a:000), "expand(v:val)") - - call extend(args, goargs, 1) - else - " only add this if no custom flags are passed - let timeout = get(g:, 'go_test_timeout', '10s') - call add(args, printf("-timeout=%s", timeout)) - endif - - if a:compile - echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None - else - echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None - endif +" Install installs the package by simple calling 'go install'. If any argument +" is given(which are passed directly to 'go install') it tries to install +" those packages. Errors are populated in the location window. +function! go#cmd#Install(bang, ...) abort + " use vim's job functionality to call it asynchronously + if go#util#has_job() + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") - if has('nvim') - if get(g:, 'go_term_enabled', 0) - call go#term#new(a:bang, ["go"] + args) - else - call go#jobcontrol#Spawn(a:bang, "test", args) - endif - return + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("installing dispatched ...") endif - call go#cmd#autowrite() - redraw - - let command = "go " . join(args, ' ') - - let out = go#tool#ExecuteInDir(command) - - let l:listtype = "quickfix" - - if v:shell_error - let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' - let dir = getcwd() - try - execute cd fnameescape(expand("%:p:h")) - let errors = go#tool#ParseErrors(split(out, '\n')) - let errors = go#tool#FilterValids(errors) - finally - execute cd . fnameescape(dir) - endtry - - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) && !a:bang - call go#list#JumpToFirst(l:listtype) - elseif empty(errors) - " failed to parse errors, output the original content - call go#util#EchoError(out) - endif - echon "vim-go: " | echohl ErrorMsg | echon "[test] FAIL" | echohl None + call s:cmd_job({ + \ 'cmd': ['go', 'install'] + goargs, + \ 'bang': a:bang, + \ 'for': 'GoInstall', + \}) + return + endif + + let default_makeprg = &makeprg + + " :make expands '%' and '#' wildcards, so they must also be escaped + let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) + let &makeprg = "go install " . goargs + + let l:listtype = go#list#Type("GoInstall") + " execute make inside the source folder so we can parse the errors + " correctly + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + if l:listtype == "locationlist" + silent! exe 'lmake!' else - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - - if a:compile - echon "vim-go: " | echohl Function | echon "[test] SUCCESS" | echohl None - else - echon "vim-go: " | echohl Function | echon "[test] PASS" | echohl None - endif + silent! exe 'make!' endif + redraw! + finally + execute cd . fnameescape(dir) + endtry + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + else + call go#util#EchoSuccess("installed to ". go#path#Default()) + endif + + let &makeprg = default_makeprg endfunction -" Testfunc runs a single test that surrounds the current cursor position. -" Arguments are passed to the `go test` command. -function! go#cmd#TestFunc(bang, ...) - " search flags legend (used only) - " 'b' search backward instead of forward - " 'c' accept a match at the cursor position - " 'n' do Not move the cursor - " 'W' don't wrap around the end of the file - " - " for the full list - " :help search - let test = search("func Test", "bcnW") - - if test == 0 - echo "vim-go: [test] no test found immediate to cursor" - return - end - - let line = getline(test) - let name = split(split(line, " ")[1], "(")[0] - let args = [a:bang, 0, "-run", name . "$"] - - if a:0 - call extend(args, a:000) +" Generate runs 'go generate' in similar fashion to go#cmd#Build() +function! go#cmd#Generate(bang, ...) abort + let default_makeprg = &makeprg + + " :make expands '%' and '#' wildcards, so they must also be escaped + let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) + if go#util#ShellError() != 0 + let &makeprg = "go generate " . goargs + else + let gofiles = go#util#Shelljoin(go#tool#Files(), 1) + let &makeprg = "go generate " . goargs . ' ' . gofiles + endif + + let l:listtype = go#list#Type("GoGenerate") + + echon "vim-go: " | echohl Identifier | echon "generating ..."| echohl None + if l:listtype == "locationlist" + silent! exe 'lmake!' + else + silent! exe 'make!' + endif + redraw! + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) + if !a:bang + call go#list#JumpToFirst(l:listtype) endif + else + redraws! | echon "vim-go: " | echohl Function | echon "[generate] SUCCESS"| echohl None + endif - call call('go#cmd#Test', args) + let &makeprg = default_makeprg endfunction -" Coverage creates a new cover profile with 'go test -coverprofile' and opens -" a new HTML coverage page from that profile. -function! go#cmd#Coverage(bang, ...) - let l:tmpname=tempname() +" --------------------- +" | Vim job callbacks | +" --------------------- - let command = "go test -coverprofile=" . l:tmpname . ' ' . go#util#Shelljoin(a:000) +function s:cmd_job(args) abort + let status_dir = expand('%:p:h') + let started_at = reltime() + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': a:args.cmd[1], + \ 'state': "started", + \}) - let l:listtype = "quickfix" - call go#cmd#autowrite() - let out = go#tool#ExecuteInDir(command) - if v:shell_error - let errors = go#tool#ParseErrors(split(out, '\n')) - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) && !a:bang - call go#list#JumpToFirst(l:listtype) - endif - else - " clear previous location list - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) + " autowrite is not enabled for jobs + call go#cmd#autowrite() - let openHTML = 'go tool cover -html='.l:tmpname - call go#tool#ExecuteInDir(openHTML) - endif + function! s:error_info_cb(job, exit_status, data) closure abort + let status = { + \ 'desc': 'last status', + \ 'type': a:args.cmd[1], + \ 'state': "success", + \ } - call delete(l:tmpname) -endfunction + if a:exit_status + let status.state = "failed" + endif -" Generate runs 'go generate' in similar fashion to go#cmd#Build() -function! go#cmd#Generate(bang, ...) - let default_makeprg = &makeprg + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() + call go#statusline#Update(status_dir, status) + endfunction - " :make expands '%' and '#' wildcards, so they must also be escaped - let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) - if v:shell_error - let &makeprg = "go generate " . goargs - else - let gofiles = go#util#Shelljoin(go#tool#Files(), 1) - let &makeprg = "go generate " . goargs . ' ' . gofiles - endif + let a:args.error_info_cb = funcref('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) - let l:listtype = go#list#Type("quickfix") + let start_options = { + \ 'callback': callbacks.callback, + \ 'exit_cb': callbacks.exit_cb, + \ } - echon "vim-go: " | echohl Identifier | echon "generating ..."| echohl None - if g:go_dispatch_enabled && exists(':Make') == 2 - silent! exe 'Make' - elseif l:listtype == "locationlist" - silent! exe 'lmake!' - else - silent! exe 'make!' - endif - redraw! + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir - let errors = go#list#Get(l:listtype) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) - if !a:bang - call go#list#JumpToFirst(l:listtype) - endif - else - redraws! | echon "vim-go: " | echohl Function | echon "[generate] SUCCESS"| echohl None - endif + call job_start(a:args.cmd, start_options) - let &makeprg = default_makeprg - let $GOPATH = old_gopath + " post start + execute cd . fnameescape(dir) endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/complete.vim b/autoload/go/complete.vim index 9937e5d..32ac360 100644 --- a/autoload/go/complete.vim +++ b/autoload/go/complete.vim @@ -1,170 +1,172 @@ -if !exists("g:go_gocode_bin") - let g:go_gocode_bin = "gocode" -endif +let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix' +function! s:gocodeCurrentBuffer() abort + let file = tempname() + call writefile(go#util#GetLines(), file) + return file +endfunction -fu! s:gocodeCurrentBuffer() - let buf = getline(1, '$') +function! s:gocodeCommand(cmd, preargs, args) abort + for i in range(0, len(a:args) - 1) + let a:args[i] = go#util#Shellescape(a:args[i]) + endfor + for i in range(0, len(a:preargs) - 1) + let a:preargs[i] = go#util#Shellescape(a:preargs[i]) + endfor + + let bin_path = go#path#CheckBinPath("gocode") + if empty(bin_path) + return + endif + + " We might hit cache problems, as gocode doesn't handle different GOPATHs + " well. See: https://github.com/nsf/gocode/issues/239 + let old_goroot = $GOROOT + let $GOROOT = go#util#env("goroot") + + try + let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type) + let cmd = printf('%s -sock %s %s %s %s', + \ go#util#Shellescape(bin_path), + \ socket_type, + \ join(a:preargs), + \ go#util#Shellescape(a:cmd), + \ join(a:args) + \ ) + + let result = go#util#System(cmd) + finally + let $GOROOT = old_goroot + endtry + + if go#util#ShellError() != 0 + return "[\"0\", []]" + else if &encoding != 'utf-8' - let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') - endif - if &l:fileformat == 'dos' - " XXX: line2byte() depend on 'fileformat' option. - " so if fileformat is 'dos', 'buf' must include '\r'. - let buf = map(buf, 'v:val."\r"') + let result = iconv(result, 'utf-8', &encoding) endif - let file = tempname() - call writefile(buf, file) - - return file -endf - -if go#vimproc#has_vimproc() - let s:vim_system = get(g:, 'gocomplete#system_function', 'vimproc#system2') - let s:vim_shell_error = get(g:, 'gocomplete#shell_error_function', 'vimproc#get_last_status') -else - let s:vim_system = get(g:, 'gocomplete#system_function', 'system') - let s:vim_shell_error = '' -endif - -fu! s:shell_error() - if empty(s:vim_shell_error) - return v:shell_error - endif - return call(s:vim_shell_error, []) -endf - -fu! s:system(str, ...) - return call(s:vim_system, [a:str] + a:000) -endf - -fu! s:gocodeShellescape(arg) - if go#vimproc#has_vimproc() - return vimproc#shellescape(a:arg) - endif - try - let ssl_save = &shellslash - set noshellslash - return shellescape(a:arg) - finally - let &shellslash = ssl_save - endtry -endf - -fu! s:gocodeCommand(cmd, preargs, args) - for i in range(0, len(a:args) - 1) - let a:args[i] = s:gocodeShellescape(a:args[i]) - endfor - for i in range(0, len(a:preargs) - 1) - let a:preargs[i] = s:gocodeShellescape(a:preargs[i]) - endfor - - let bin_path = go#path#CheckBinPath(g:go_gocode_bin) - if empty(bin_path) - return - endif - - " we might hit cache problems, as gocode doesn't handle well different - " GOPATHS: https://github.com/nsf/gocode/issues/239 - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() + return result + endif +endfunction - let result = s:system(printf('%s %s %s %s', s:gocodeShellescape(bin_path), join(a:preargs), s:gocodeShellescape(a:cmd), join(a:args))) +function! s:gocodeCurrentBufferOpt(filename) abort + return '-in=' . a:filename +endfunction - let $GOPATH = old_gopath +let s:optionsEnabled = 0 +function! s:gocodeEnableOptions() abort + if s:optionsEnabled + return + endif - if s:shell_error() != 0 - return "[\"0\", []]" - else - if &encoding != 'utf-8' - let result = iconv(result, 'utf-8', &encoding) - endif - return result - endif -endf + let bin_path = go#path#CheckBinPath("gocode") + if empty(bin_path) + return + endif -fu! s:gocodeCurrentBufferOpt(filename) - return '-in=' . a:filename -endf + let s:optionsEnabled = 1 -fu! s:gocodeAutocomplete() - let filename = s:gocodeCurrentBuffer() - let result = s:gocodeCommand('autocomplete', - \ [s:gocodeCurrentBufferOpt(filename), '-f=vim'], - \ [expand('%:p'), go#util#OffsetCursor()]) - call delete(filename) - return result -endf + call go#util#System(printf('%s set propose-builtins %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_propose_builtins', 1)))) + call go#util#System(printf('%s set autobuild %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_autobuild', 1)))) + call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 0)))) +endfunction -function! go#complete#GetInfo() - let offset = go#util#OffsetCursor()+1 - let filename = s:gocodeCurrentBuffer() - let result = s:gocodeCommand('autocomplete', - \ [s:gocodeCurrentBufferOpt(filename), '-f=godit'], - \ [expand('%:p'), offset]) - call delete(filename) - - " first line is: Charcount,,NumberOfCandidates, i.e: 8,,1 - " following lines are candiates, i.e: func foo(name string),,foo( - let out = split(result, '\n') - - " no candidates are found - if len(out) == 1 - return "" - endif +function! s:toBool(val) abort + if a:val | return 'true ' | else | return 'false' | endif +endfunction - " only one candiate is found - if len(out) == 2 - return split(out[1], ',,')[0] - endif +function! s:gocodeAutocomplete() abort + call s:gocodeEnableOptions() - " to many candidates are available, pick one that maches the word under the - " cursor - let infos = [] - for info in out[1:] - call add(infos, split(info, ',,')[0]) - endfor + let filename = s:gocodeCurrentBuffer() + let result = s:gocodeCommand('autocomplete', + \ [s:gocodeCurrentBufferOpt(filename), '-f=vim'], + \ [expand('%:p'), go#util#OffsetCursor()]) + call delete(filename) + return result +endfunction - let wordMatch = '\<' . expand("") . '\>' - " escape single quotes in wordMatch before passing it to filter - let wordMatch = substitute(wordMatch, "'", "''", "g") - let filtered = filter(infos, "v:val =~ '".wordMatch."'") +function! go#complete#GetInfo() abort + let offset = go#util#OffsetCursor()+1 + let filename = s:gocodeCurrentBuffer() + let result = s:gocodeCommand('autocomplete', + \ [s:gocodeCurrentBufferOpt(filename), '-f=godit'], + \ [expand('%:p'), offset]) + call delete(filename) - if len(filtered) == 1 - return filtered[0] - endif + " first line is: Charcount,,NumberOfCandidates, i.e: 8,,1 + " following lines are candiates, i.e: func foo(name string),,foo( + let out = split(result, '\n') + " no candidates are found + if len(out) == 1 return "" + endif + + " only one candidate is found + if len(out) == 2 + return split(out[1], ',,')[0] + endif + + " to many candidates are available, pick one that maches the word under the + " cursor + let infos = [] + for info in out[1:] + call add(infos, split(info, ',,')[0]) + endfor + + let wordMatch = '\<' . expand("") . '\>' + " escape single quotes in wordMatch before passing it to filter + let wordMatch = substitute(wordMatch, "'", "''", "g") + let filtered = filter(infos, "v:val =~ '".wordMatch."'") + + if len(filtered) == 1 + return filtered[0] + endif + + return "" endfunction -function! go#complete#Info(auto) - " auto is true if we were called by g:go_auto_type_info's autocmd - let result = go#complete#GetInfo() - if !empty(result) - " if auto, and the result is a PANIC by gocode, hide it - if a:auto && result ==# 'PANIC PANIC PANIC' | return | endif - echo "vim-go: " | echohl Function | echon result | echohl None - endif +function! go#complete#Info(auto) abort + " auto is true if we were called by g:go_auto_type_info's autocmd + let result = go#complete#GetInfo() + if !empty(result) + " if auto, and the result is a PANIC by gocode, hide it + if a:auto && result ==# 'PANIC PANIC PANIC' | return | endif + echo "vim-go: " | echohl Function | echon result | echohl None + endif endfunction -function! s:trim_bracket(val) - let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '') - return a:val +function! s:trim_bracket(val) abort + let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '') + return a:val endfunction -fu! go#complete#Complete(findstart, base) - "findstart = 1 when we need to get the text length - if a:findstart == 1 - execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete() - return col('.') - g:gocomplete_completions[0] - 1 - "findstart = 0 when we need to return the list of completions - else - let s = getline(".")[col('.') - 1] - if s =~ '[(){}\{\}]' - return map(copy(g:gocomplete_completions[1]), 's:trim_bracket(v:val)') - endif - return g:gocomplete_completions[1] +function! go#complete#Complete(findstart, base) abort + "findstart = 1 when we need to get the text length + if a:findstart == 1 + execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete() + return col('.') - g:gocomplete_completions[0] - 1 + "findstart = 0 when we need to return the list of completions + else + let s = getline(".")[col('.') - 1] + if s =~ '[(){}\{\}]' + return map(copy(g:gocomplete_completions[1]), 's:trim_bracket(v:val)') endif + return g:gocomplete_completions[1] + endif endf -" vim:ts=4:sw=4:et +function! go#complete#ToggleAutoTypeInfo() abort + if get(g:, "go_auto_type_info", 0) + let g:go_auto_type_info = 0 + call go#util#EchoProgress("auto type info disabled") + return + end + + let g:go_auto_type_info = 1 + call go#util#EchoProgress("auto type info enabled") +endfunction + + +" vim: sw=2 ts=2 et diff --git a/autoload/go/coverage.vim b/autoload/go/coverage.vim new file mode 100644 index 0000000..882f819 --- /dev/null +++ b/autoload/go/coverage.vim @@ -0,0 +1,375 @@ +let s:toggle = 0 + +" Buffer creates a new cover profile with 'go test -coverprofile' and changes +" the current buffers highlighting to show covered and uncovered sections of +" the code. If run again it clears the annotation. +function! go#coverage#BufferToggle(bang, ...) abort + if s:toggle + call go#coverage#Clear() + return + endif + + if a:0 == 0 + return call(function('go#coverage#Buffer'), [a:bang]) + endif + + return call(function('go#coverage#Buffer'), [a:bang] + a:000) +endfunction + +" Buffer creates a new cover profile with 'go test -coverprofile' and changes +" the current buffers highlighting to show covered and uncovered sections of +" the code. Calling it again reruns the tests and shows the last updated +" coverage. +function! go#coverage#Buffer(bang, ...) abort + " we use matchaddpos() which was introduce with 7.4.330, be sure we have + " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 + if !exists("*matchaddpos") + call go#util#EchoError("GoCoverage is supported with Vim version 7.4-330 or later") + return -1 + endif + + " check if there is any test file, if not we just return + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + if empty(glob("*_test.go")) + call go#util#EchoError("no test files available") + return + endif + finally + execute cd . fnameescape(dir) + endtry + + let s:toggle = 1 + let l:tmpname = tempname() + + if get(g:, 'go_echo_command_info', 1) + echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None + endif + + if go#util#has_job() + call s:coverage_job({ + \ 'cmd': ['go', 'test', '-coverprofile', l:tmpname] + a:000, + \ 'custom_cb': function('s:coverage_callback', [l:tmpname]), + \ 'bang': a:bang, + \ 'for': 'GoTest', + \ }) + return + endif + + let args = [a:bang, 0, "-coverprofile", l:tmpname] + if a:0 + call extend(args, a:000) + endif + + let disabled_term = 0 + if get(g:, 'go_term_enabled') + let disabled_term = 1 + let g:go_term_enabled = 0 + endif + + let id = call('go#test#Test', args) + + if disabled_term + let g:go_term_enabled = 1 + endif + + if has('nvim') + call go#jobcontrol#AddHandler(function('s:coverage_handler')) + let s:coverage_handler_jobs[id] = l:tmpname + return + endif + + if go#util#ShellError() == 0 + call go#coverage#overlay(l:tmpname) + endif + + call delete(l:tmpname) +endfunction + +" Clear clears and resets the buffer annotation matches +function! go#coverage#Clear() abort + call clearmatches() + + if exists("s:toggle") | let s:toggle = 0 | endif + + " remove the autocmd we defined + augroup vim-go-coverage + autocmd! + augroup end +endfunction + +" Browser creates a new cover profile with 'go test -coverprofile' and opens +" a new HTML coverage page from that profile in a new browser +function! go#coverage#Browser(bang, ...) abort + let l:tmpname = tempname() + if go#util#has_job() + call s:coverage_job({ + \ 'cmd': ['go', 'test', '-coverprofile', l:tmpname], + \ 'custom_cb': function('s:coverage_browser_callback', [l:tmpname]), + \ 'bang': a:bang, + \ 'for': 'GoTest', + \ }) + return + endif + + let args = [a:bang, 0, "-coverprofile", l:tmpname] + if a:0 + call extend(args, a:000) + endif + + let id = call('go#test#Test', args) + if has('nvim') + call go#jobcontrol#AddHandler(function('s:coverage_browser_handler')) + let s:coverage_browser_handler_jobs[id] = l:tmpname + return + endif + + + if go#util#ShellError() == 0 + let openHTML = 'go tool cover -html='.l:tmpname + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(l:tmpname) +endfunction + +" Parses a single line from the cover file generated via go test -coverprofile +" and returns a single coverage profile block. +function! go#coverage#parsegocoverline(line) abort + " file:startline.col,endline.col numstmt count + let mx = '\([^:]\+\):\(\d\+\)\.\(\d\+\),\(\d\+\)\.\(\d\+\)\s\(\d\+\)\s\(\d\+\)' + let tokens = matchlist(a:line, mx) + let ret = {} + let ret.file = tokens[1] + let ret.startline = str2nr(tokens[2]) + let ret.startcol = str2nr(tokens[3]) + let ret.endline = str2nr(tokens[4]) + let ret.endcol = str2nr(tokens[5]) + let ret.numstmt = tokens[6] + let ret.cnt = tokens[7] + return ret +endfunction + +" Generates matches to be added to matchaddpos for the given coverage profile +" block +function! go#coverage#genmatch(cov) abort + let color = 'goCoverageCovered' + if a:cov.cnt == 0 + let color = 'goCoverageUncover' + endif + + let matches = [] + + " if start and end are the same, also specify the byte length + " example: foo.go:92.2,92.65 1 0 + if a:cov.startline == a:cov.endline + call add(matches, { + \ 'group': color, + \ 'pos': [[a:cov.startline, a:cov.startcol, a:cov.endcol - a:cov.startcol]], + \ 'priority': 2, + \ }) + return matches + endif + + " add start columns. Because we don't know the length of the of + " the line, we assume it is at maximum 200 bytes. I know this is hacky, + " but that's only way of fixing the issue + call add(matches, { + \ 'group': color, + \ 'pos': [[a:cov.startline, a:cov.startcol, 200]], + \ 'priority': 2, + \ }) + + " and then the remaining lines + let start_line = a:cov.startline + while start_line < a:cov.endline + let start_line += 1 + call add(matches, { + \ 'group': color, + \ 'pos': [[start_line]], + \ 'priority': 2, + \ }) + endwhile + + " finally end columns + call add(matches, { + \ 'group': color, + \ 'pos': [[a:cov.endline, a:cov.endcol-1]], + \ 'priority': 2, + \ }) + + return matches +endfunction + +" Reads the given coverprofile file and annotates the current buffer +function! go#coverage#overlay(file) abort + if !filereadable(a:file) + return + endif + let lines = readfile(a:file) + + " cover mode, by default it's 'set'. Just here for debugging purposes + let mode = lines[0] + + " contains matches for matchaddpos() + let matches = [] + + " first mark all lines as goCoverageNormalText. We use a custom group to not + " interfere with other buffers highlightings. Because the priority is + " lower than the cover and uncover matches, it'll be overridden. + let cnt = 1 + while cnt <= line('$') + call add(matches, {'group': 'goCoverageNormalText', 'pos': [cnt], 'priority': 1}) + let cnt += 1 + endwhile + + let fname = expand('%') + + " when called for a _test.go file, run the coverage for the actuall file + " file + if fname =~# '^\f\+_test\.go$' + let l:root = split(fname, '_test.go$')[0] + let fname = l:root . ".go" + + if !filereadable(fname) + call go#util#EchoError("couldn't find ".fname) + return + endif + + " open the alternate file to show the coverage + exe ":edit ". fnamemodify(fname, ":p") + endif + + " cov.file includes only the filename itself, without full path + let fname = fnamemodify(fname, ":t") + + for line in lines[1:] + let cov = go#coverage#parsegocoverline(line) + + " TODO(arslan): for now only include the coverage for the current + " buffer + if fname != fnamemodify(cov.file, ':t') + continue + endif + + call extend(matches, go#coverage#genmatch(cov)) + endfor + + " clear the matches if we leave the buffer + augroup vim-go-coverage + autocmd! + autocmd BufWinLeave call go#coverage#Clear() + augroup end + + for m in matches + call matchaddpos(m.group, m.pos) + endfor +endfunction + + +" --------------------- +" | Vim job callbacks | +" --------------------- +" +function s:coverage_job(args) + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let status_dir = expand('%:p:h') + function! s:error_info_cb(job, exit_status, data) closure + let status = { + \ 'desc': 'last status', + \ 'type': "coverage", + \ 'state': "finished", + \ } + + if a:exit_status + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + endfunction + + let a:args.error_info_cb = funcref('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'exit_cb': callbacks.exit_cb, + \ } + + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "coverage", + \ 'state': "started", + \}) + + call job_start(a:args.cmd, start_options) + + " post start + execute cd . fnameescape(dir) +endfunction + +" coverage_callback is called when the coverage execution is finished +function! s:coverage_callback(coverfile, job, exit_status, data) + if a:exit_status == 0 + call go#coverage#overlay(a:coverfile) + endif + + call delete(a:coverfile) +endfunction + +function! s:coverage_browser_callback(coverfile, job, exit_status, data) + if a:exit_status == 0 + let openHTML = 'go tool cover -html='.a:coverfile + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(a:coverfile) +endfunction + +" ----------------------- +" | Neovim job handlers | +" ----------------------- + +let s:coverage_handler_jobs = {} +let s:coverage_browser_handler_jobs = {} + +function! s:coverage_handler(job, exit_status, data) abort + if !has_key(s:coverage_handler_jobs, a:job.id) + return + endif + let l:tmpname = s:coverage_handler_jobs[a:job.id] + if a:exit_status == 0 + call go#coverage#overlay(l:tmpname) + endif + + call delete(l:tmpname) + unlet s:coverage_handler_jobs[a:job.id] +endfunction + +function! s:coverage_browser_handler(job, exit_status, data) abort + if !has_key(s:coverage_browser_handler_jobs, a:job.id) + return + endif + + let l:tmpname = s:coverage_browser_handler_jobs[a:job.id] + if a:exit_status == 0 + let openHTML = 'go tool cover -html='.l:tmpname + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(l:tmpname) + unlet s:coverage_browser_handler_jobs[a:job.id] +endfunction + + +" vim: sw=2 ts=2 et diff --git a/autoload/go/decls.vim b/autoload/go/decls.vim new file mode 100644 index 0000000..493bbd3 --- /dev/null +++ b/autoload/go/decls.vim @@ -0,0 +1,21 @@ +if !exists('g:go_decls_mode') + let g:go_decls_mode = '' +endif + +function! go#decls#Decls(mode, ...) abort + if g:go_decls_mode == 'ctrlp' + call ctrlp#init(call("ctrlp#decls#cmd", [a:mode] + a:000)) + elseif g:go_decls_mode == 'fzf' + call call("fzf#decls#cmd", [a:mode] + a:000) + else + if globpath(&rtp, 'plugin/ctrlp.vim') != "" + call ctrlp#init(call("ctrlp#decls#cmd", [a:mode] + a:000)) + elseif globpath(&rtp, 'plugin/fzf.vim') != "" + call call("fzf#decls#cmd", [a:mode] + a:000) + else + call go#util#EchoError("neither ctrlp.vim nor fzf.vim are installed. Please install either one") + end + end +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/def.vim b/autoload/go/def.vim index 0928702..f2383c9 100644 --- a/autoload/go/def.vim +++ b/autoload/go/def.vim @@ -1,111 +1,317 @@ -if !exists("g:go_godef_bin") - let g:go_godef_bin = "godef" -endif - -if go#vimproc#has_vimproc() - let s:vim_system = get(g:, 'gocomplete#system_function', 'vimproc#system2') -else - let s:vim_system = get(g:, 'gocomplete#system_function', 'system') -endif - -fu! s:system(str, ...) - return call(s:vim_system, [a:str] + a:000) -endf - -" modified and improved version of vim-godef -function! go#def#Jump(...) - if !len(a:000) - let arg = "-o=" . go#util#OffsetCursor() - else - let arg = a:1 - endif - - let bin_path = go#path#CheckBinPath(g:go_godef_bin) - if empty(bin_path) - return - endif - - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() - - let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') - let command = bin_path . " -f=" . shellescape(fname) . " -i " . shellescape(arg) - - " get output of godef - let out = s:system(command, join(getbufline(bufnr('%'), 1, '$'), go#util#LineEnding())) - - " jump to it - call s:godefJump(out, "") - let $GOPATH = old_gopath +let s:go_stack = [] +let s:go_stack_level = 0 + +function! go#def#Jump(mode) abort + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + + " so guru right now is slow for some people. previously we were using + " godef which also has it's own quirks. But this issue come up so many + " times I've decided to support both. By default we still use guru as it + " covers all edge cases, but now anyone can switch to godef if they wish + let bin_name = get(g:, 'go_def_mode', 'guru') + if bin_name == 'godef' + if &modified + " Write current unsaved buffer to a temp file and use the modified content + let l:tmpname = tempname() + call writefile(go#util#GetLines(), l:tmpname) + let fname = l:tmpname + endif + + let bin_path = go#path#CheckBinPath("godef") + if empty(bin_path) + return + endif + let command = printf("%s -f=%s -o=%s -t", go#util#Shellescape(bin_path), + \ go#util#Shellescape(fname), go#util#OffsetCursor()) + let out = go#util#System(command) + if exists("l:tmpname") + call delete(l:tmpname) + endif + elseif bin_name == 'guru' + let bin_path = go#path#CheckBinPath("guru") + if empty(bin_path) + return + endif + + let cmd = [bin_path] + let stdin_content = "" + + if &modified + let content = join(go#util#GetLines(), "\n") + let stdin_content = fname . "\n" . strlen(content) . "\n" . content + call add(cmd, "-modified") + endif + + if exists('g:go_build_tags') + let tags = get(g:, 'go_build_tags') + call extend(cmd, ["-tags", tags]) + endif + + let fname = fname.':#'.go#util#OffsetCursor() + call extend(cmd, ["definition", fname]) + + if go#util#has_job() + let l:spawn_args = { + \ 'cmd': cmd, + \ 'custom_cb': function('s:jump_to_declaration_cb', [a:mode, bin_name]), + \ } + + if &modified + let l:spawn_args.input = stdin_content + endif + + call go#util#EchoProgress("searching declaration ...") + + call s:def_job(spawn_args) + return + endif + + let command = join(cmd, " ") + if &modified + let out = go#util#System(command, stdin_content) + else + let out = go#util#System(command) + endif + else + call go#util#EchoError('go_def_mode value: '. bin_name .' is not valid. Valid values are: [godef, guru]') + return + endif + + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + call go#def#jump_to_declaration(out, a:mode, bin_name) +endfunction + +function! s:jump_to_declaration_cb(mode, bin_name, job, exit_status, data) abort + if a:exit_status != 0 + return + endif + + call go#def#jump_to_declaration(a:data[0], a:mode, a:bin_name) + call go#util#EchoSuccess(fnamemodify(a:data[0], ":t")) +endfunction + +function! go#def#jump_to_declaration(out, mode, bin_name) abort + let final_out = a:out + if a:bin_name == "godef" + " append the type information to the same line so our we can parse it. + " This makes it compatible with guru output. + let final_out = join(split(a:out, '\n'), ':') + endif + + " strip line ending + let out = split(final_out, go#util#LineEnding())[0] + if go#util#IsWin() + let parts = split(out, '\(^[a-zA-Z]\)\@,:navigate :jump ,q:exit'] - let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') - let command = bin_path . " -f=" . shellescape(fname) . " -i " . shellescape(arg) + let i = 0 + while i < len(s:go_stack) + let entry = s:go_stack[i] + let prefix = "" - " get output of godef - let out = s:system(command, join(getbufline(bufnr('%'), 1, '$'), go#util#LineEnding())) + if i == s:go_stack_level + let prefix = ">" + else + let prefix = " " + endif - call s:godefJump(out, a:mode) - let $GOPATH = old_gopath + call add(stackOut, printf("%s %d %s|%d col %d|%s", + \ prefix, i+1, entry["file"], entry["line"], entry["col"], entry["ident"])) + let i += 1 + endwhile + + if s:go_stack_level == i + call add(stackOut, "> ") + endif + + call go#ui#OpenWindow("GoDef Stack", stackOut, "godefstack") + + noremap :call go#def#SelectStackEntry() + noremap :call go#ui#CloseWindow() + noremap q :call go#ui#CloseWindow() endfunction +function! go#def#StackClear(...) abort + let s:go_stack = [] + let s:go_stack_level = 0 +endfunction + +function! go#def#StackPop(...) abort + if len(s:go_stack) == 0 + call go#util#EchoError("godef stack empty") + return + endif + + if s:go_stack_level == 0 + call go#util#EchoError("at bottom of the godef stack") + return + endif -function! s:getOffset() - return "-o=" . go#util#OffsetCursor() + if !len(a:000) + let numPop = 1 + else + let numPop = a:1 + endif + + let newLevel = str2nr(s:go_stack_level) - str2nr(numPop) + call go#def#Stack(newLevel + 1) +endfunction + +function! go#def#Stack(...) abort + if len(s:go_stack) == 0 + call go#util#EchoError("godef stack empty") + return + endif + + if !len(a:000) + " Display interactive stack + call go#def#StackUI() + return + else + let jumpTarget = a:1 + endif + + if jumpTarget !~ '^\d\+$' + if jumpTarget !~ '^\s*$' + call go#util#EchoError("location must be a number") + endif + return + endif + + let jumpTarget = str2nr(jumpTarget) - 1 + + if jumpTarget >= 0 && jumpTarget < len(s:go_stack) + let s:go_stack_level = jumpTarget + let target = s:go_stack[s:go_stack_level] + + " jump + if expand('%:p') != target["file"] + if &modified + exec 'hide edit' target["file"] + else + exec 'edit' target["file"] + endif + endif + call cursor(target["line"], target["col"]) + normal! zz + else + call go#util#EchoError("invalid location. Try :GoDefStack to see the list of valid entries") + endif endfunction +function s:def_job(args) abort + function! s:error_info_cb(job, exit_status, data) closure + " do not print anything during async definition search&jump + endfunction + + let a:args.error_info_cb = funcref('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) -function! s:godefJump(out, mode) - let old_errorformat = &errorformat - let &errorformat = "%f:%l:%c" - - if a:out =~ 'godef: ' - let out = substitute(a:out, go#util#LineEnding() . '$', '', '') - echom out - else - let parts = split(a:out, ':') - " parts[0] contains filename - let fileName = parts[0] - - " put the error format into location list so we can jump automatically to - " it - lgetexpr a:out - - " needed for restoring back user setting this is because there are two - " modes of switchbuf which we need based on the split mode - let old_switchbuf = &switchbuf - - if a:mode == "tab" - let &switchbuf = "usetab" - - if bufloaded(fileName) == 0 - tab split - endif - else - if a:mode == "split" - split - elseif a:mode == "vsplit" - vsplit - endif - endif - - " jump to file now - sil ll 1 - normal! zz - - let &switchbuf = old_switchbuf - end - let &errorformat = old_errorformat + let start_options = { + \ 'callback': callbacks.callback, + \ 'exit_cb': callbacks.exit_cb, + \ } + + if &modified + let l:tmpname = tempname() + call writefile(split(a:args.input, "\n"), l:tmpname, "b") + let l:start_options.in_io = "file" + let l:start_options.in_name = l:tmpname + endif + + call job_start(a:args.cmd, start_options) endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/def_test.vim b/autoload/go/def_test.vim new file mode 100644 index 0000000..7e69b12 --- /dev/null +++ b/autoload/go/def_test.vim @@ -0,0 +1,37 @@ +func! Test_jump_to_declaration_guru() abort + try + let l:filename = 'def/jump.go' + let lnum = 5 + let col = 6 + let l:tmp = gotest#load_fixture(l:filename) + + let guru_out = printf("%s:%d:%d: defined here as func main", filename, lnum, col) + call go#def#jump_to_declaration(guru_out, "", 'guru') + + call assert_equal(filename, bufname("%")) + call assert_equal(lnum, getcurpos()[1]) + call assert_equal(col, getcurpos()[2]) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +func! Test_jump_to_declaration_godef() abort + try + let filename = 'def/jump.go' + let lnum = 5 + let col = 6 + let l:tmp = gotest#load_fixture(l:filename) + + let godef_out = printf("%s:%d:%d\ndefined here as func main", filename, lnum, col) + call go#def#jump_to_declaration(godef_out, "", 'godef') + + call assert_equal(filename, bufname("%")) + call assert_equal(lnum, getcurpos()[1]) + call assert_equal(col, getcurpos()[2]) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +" vim: sw=2 ts=2 et diff --git a/autoload/go/doc.vim b/autoload/go/doc.vim index ab10725..7c2f53d 100644 --- a/autoload/go/doc.vim +++ b/autoload/go/doc.vim @@ -1,171 +1,229 @@ " Copyright 2011 The Go Authors. All rights reserved. " Use of this source code is governed by a BSD-style " license that can be found in the LICENSE file. -" -" godoc.vim: Vim command to see godoc. -" -" -" Commands: -" -" :GoDoc -" -" Open the relevant Godoc for either the word[s] passed to the command or -" the, by default, the word under the cursor. -" -" Options: -" -" g:go_godoc_commands [default=1] -" -" Flag to indicate whether to enable the commands listed above. let s:buf_nr = -1 if !exists("g:go_doc_command") - let g:go_doc_command = "godoc" + let g:go_doc_command = ["godoc"] endif -if !exists("g:go_doc_options") - let g:go_doc_options = "" -endif - -" returns the package and exported name. exported name might be empty. -" ie: fmt and Println -" ie: github.com/fatih/set and New -function! s:godocWord(args) - if !executable('godoc') - echohl WarningMsg - echo "godoc command not found." - echo " install with: go get golang.org/x/tools/cmd/godoc" - echohl None - return [] +function! go#doc#OpenBrowser(...) abort + " check if we have gogetdoc as it gives us more and accurate information. + " Only supported if we have json_decode as it's not worth to parse the plain + " non-json output of gogetdoc + let bin_path = go#path#CheckBinPath('gogetdoc') + if !empty(bin_path) && exists('*json_decode') + let json_out = s:gogetdoc(1) + if go#util#ShellError() != 0 + call go#util#EchoError(json_out) + return endif - if !len(a:args) - let oldiskeyword = &iskeyword - setlocal iskeyword+=. - let word = expand('') - let &iskeyword = oldiskeyword - let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g') - let words = split(word, '\.\ze[^./]\+$') - else - let words = a:args + let out = json_decode(json_out) + if type(out) != type({}) + call go#util#EchoError("gogetdoc output is malformed") endif - if !len(words) - return [] + let import = out["import"] + let name = out["name"] + let decl = out["decl"] + + let godoc_url = get(g:, 'go_doc_url', 'https://godoc.org') + if godoc_url isnot 'https://godoc.org' + " strip last '/' character if available + let last_char = strlen(godoc_url) - 1 + if godoc_url[last_char] == '/' + let godoc_url = strpart(godoc_url, 0, last_char) + endif + + " custom godoc installations expects it + let godoc_url .= "/pkg" endif - let pkg = words[0] - if len(words) == 1 - let exported_name = "" - else - let exported_name = words[1] + let godoc_url .= "/" . import + if decl !~ "^package" + let godoc_url .= "#" . name endif - let packages = go#tool#Imports() + echo godoc_url - if has_key(packages, pkg) - let pkg = packages[pkg] - endif + call go#tool#OpenBrowser(godoc_url) + return + endif - return [pkg, exported_name] -endfunction + let pkgs = s:godocWord(a:000) + if empty(pkgs) + return + endif -function! s:godocNotFound(content) - if len(a:content) == 0 - return 1 - endif + let pkg = pkgs[0] + let exported_name = pkgs[1] - return a:content =~# '^.*: no such file or directory\n$' + " example url: https://godoc.org/github.com/fatih/set#Set + let godoc_url = "https://godoc.org/" . pkg . "#" . exported_name + call go#tool#OpenBrowser(godoc_url) endfunction -function! go#doc#OpenBrowser(...) - let pkgs = s:godocWord(a:000) - if empty(pkgs) - return +function! go#doc#Open(newmode, mode, ...) abort + " With argument: run "godoc [arg]". + if len(a:000) + if empty(go#path#CheckBinPath(g:go_doc_command[0])) + return endif - let pkg = pkgs[0] - let exported_name = pkgs[1] + let command = printf("%s %s", go#util#Shelljoin(g:go_doc_command), join(a:000, ' ')) + let out = go#util#System(command) + " Without argument: run gogetdoc on cursor position. + else + let out = s:gogetdoc(0) + if out == -1 + return + endif + endif - " example url: https://godoc.org/github.com/fatih/set#Set - let godoc_url = "https://godoc.org/" . pkg . "#" . exported_name - call go#tool#OpenBrowser(godoc_url) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + call s:GodocView(a:newmode, a:mode, out) endfunction -function! go#doc#Open(newmode, mode, ...) - let pkgs = s:godocWord(a:000) - if empty(pkgs) - return +function! s:GodocView(newposition, position, content) abort + " reuse existing buffer window if it exists otherwise create a new one + let is_visible = bufexists(s:buf_nr) && bufwinnr(s:buf_nr) != -1 + if !bufexists(s:buf_nr) + execute a:newposition + sil file `="[Godoc]"` + let s:buf_nr = bufnr('%') + elseif bufwinnr(s:buf_nr) == -1 + execute a:position + execute s:buf_nr . 'buffer' + elseif bufwinnr(s:buf_nr) != bufwinnr('%') + execute bufwinnr(s:buf_nr) . 'wincmd w' + endif + + " if window was not visible then resize it + if !is_visible + if a:position == "split" + " cap window height to 20, but resize it for smaller contents + let max_height = get(g:, "go_doc_max_height", 20) + let content_height = len(split(a:content, "\n")) + if content_height > max_height + exe 'resize ' . max_height + else + exe 'resize ' . content_height + endif + else + " set a sane maximum width for vertical splits. In this case the minimum + " that fits the godoc for package http without extra linebreaks and line + " numbers on + exe 'vertical resize 84' endif + endif + + setlocal filetype=godoc + setlocal bufhidden=delete + setlocal buftype=nofile + setlocal noswapfile + setlocal nobuflisted + setlocal nocursorline + setlocal nocursorcolumn + setlocal iskeyword+=: + setlocal iskeyword-=- + + setlocal modifiable + %delete _ + call append(0, split(a:content, "\n")) + sil $delete _ + setlocal nomodifiable + sil normal! gg + + " close easily with or enter + noremap :close + noremap :close +endfunction - let pkg = pkgs[0] - let exported_name = pkgs[1] +function! s:gogetdoc(json) abort + " check if we have 'gogetdoc' and use it automatically + let bin_path = go#path#CheckBinPath('gogetdoc') + if empty(bin_path) + return -1 + endif - let command = g:go_doc_command . ' ' . g:go_doc_options . ' ' . pkg + let cmd = [go#util#Shellescape(bin_path)] - silent! let content = system(command) - if v:shell_error || s:godocNotFound(content) - echo 'No documentation found for "' . pkg . '".' - return -1 - endif + let offset = go#util#OffsetCursor() + let fname = expand("%:p:gs!\\!/!") + let pos = shellescape(fname.':#'.offset) - call s:GodocView(a:newmode, a:mode, content) + let cmd += ["-pos", pos] + if a:json + let cmd += ["-json"] + endif - if exported_name == '' - silent! normal! gg - return -1 - endif - - " jump to the specified name - if search('^func ' . exported_name . '(') - silent! normal! zt - return -1 - endif + let command = join(cmd, " ") - if search('^type ' . exported_name) - silent! normal! zt - return -1 - endif + if &modified + let command .= " -modified" + let out = go#util#System(command, go#util#archive()) + else + let out = go#util#System(command) + endif - if search('^\%(const\|var\|type\|\s\+\) ' . pkg . '\s\+=\s') - silent! normal! zt - return -1 - endif + return out +endfunction - " nothing found, jump to top - silent! normal! gg +" returns the package and exported name. exported name might be empty. +" ie: fmt and Println +" ie: github.com/fatih/set and New +function! s:godocWord(args) abort + if !executable('godoc') + let msg = "godoc command not found." + let msg .= " install with: go get golang.org/x/tools/cmd/godoc" + call go#util#EchoWarning(msg) + return [] + endif + + if !len(a:args) + let oldiskeyword = &iskeyword + setlocal iskeyword+=. + let word = expand('') + let &iskeyword = oldiskeyword + let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g') + let words = split(word, '\.\ze[^./]\+$') + else + let words = a:args + endif + + if !len(words) + return [] + endif + + let pkg = words[0] + if len(words) == 1 + let exported_name = "" + else + let exported_name = words[1] + endif + + let packages = go#tool#Imports() + + if has_key(packages, pkg) + let pkg = packages[pkg] + endif + + return [pkg, exported_name] endfunction -function! s:GodocView(newposition, position, content) - " reuse existing buffer window if it exists otherwise create a new one - if !bufexists(s:buf_nr) - execute a:newposition - sil file `="[Godoc]"` - let s:buf_nr = bufnr('%') - elseif bufwinnr(s:buf_nr) == -1 - execute a:position - execute s:buf_nr . 'buffer' - elseif bufwinnr(s:buf_nr) != bufwinnr('%') - execute bufwinnr(s:buf_nr) . 'wincmd w' - endif +function! s:godocNotFound(content) abort + if len(a:content) == 0 + return 1 + endif - setlocal filetype=godoc - setlocal bufhidden=delete - setlocal buftype=nofile - setlocal noswapfile - setlocal nobuflisted - setlocal nocursorline - setlocal nocursorcolumn - setlocal iskeyword+=: - setlocal iskeyword-=- - - setlocal modifiable - %delete _ - call append(0, split(a:content, "\n")) - sil $delete _ - setlocal nomodifiable + return a:content =~# '^.*: no such file or directory\n$' endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/fillstruct.vim b/autoload/go/fillstruct.vim new file mode 100644 index 0000000..ec88a76 --- /dev/null +++ b/autoload/go/fillstruct.vim @@ -0,0 +1,62 @@ +function! go#fillstruct#FillStruct() abort + let l:cmd = ['fillstruct', + \ '-file', bufname(''), + \ '-offset', go#util#OffsetCursor(), + \ '-line', line('.')] + + " Read from stdin if modified. + if &modified + call add(l:cmd, '-modified') + let [l:out, l:err] = go#util#Exec(l:cmd, go#util#archive()) + else + let [l:out, l:err] = go#util#Exec(l:cmd) + endif + + if l:err + call go#util#EchoError(l:out) + return + endif + + try + let l:json = json_decode(l:out) + catch + call go#util#EchoError(l:out) + return + endtry + + " Output is array: + "[ + " {"start": 92, "end": 106, "code": "mail.Address{\n\tName: \"\",\n\tAddress: \"\",\n}"}, + " {...second struct...} + " ] + + let l:pos = getpos('.') + + try + for l:struct in l:json + let l:code = split(l:struct['code'], "\n") + + " Add any code before/after the struct. + exe l:struct['start'] . 'go' + let l:code[0] = getline('.')[:col('.')-1] . l:code[0] + exe l:struct['end'] . 'go' + let l:code[len(l:code)-1] .= getline('.')[col('.'):] + + " Indent every line except the first one; makes it look nice. + let l:indent = repeat("\t", indent('.') / &tabstop) + for l:i in range(1, len(l:code)-1) + let l:code[l:i] = l:indent . l:code[l:i] + endfor + + " Out with the old ... + exe 'normal! ' . l:struct['start'] . 'gov' . l:struct['end'] . 'gox' + " ... in with the new. + call setline('.', l:code[0]) + call append('.', l:code[1:]) + endfor + finally + call setpos('.', l:pos) + endtry +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/fillstruct_test.vim b/autoload/go/fillstruct_test.vim new file mode 100644 index 0000000..d677ab7 --- /dev/null +++ b/autoload/go/fillstruct_test.vim @@ -0,0 +1,90 @@ +func! Test_fillstruct() abort + try + let l:tmp = gotest#write_file('a/a.go', [ + \ 'package a', + \ 'import "net/mail"', + \ "var addr = mail.\x1fAddress{}"]) + + call go#fillstruct#FillStruct() + call gotest#assert_buffer(1, [ + \ 'var addr = mail.Address{', + \ '\tName: "",', + \ '\tAddress: "",', + \ '}']) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +func! Test_fillstruct_line() abort + try + let l:tmp = gotest#write_file('a/a.go', [ + \ 'package a', + \ 'import "net/mail"', + \ "\x1f" . 'var addr = mail.Address{}']) + + call go#fillstruct#FillStruct() + call gotest#assert_buffer(1, [ + \ 'var addr = mail.Address{', + \ '\tName: "",', + \ '\tAddress: "",', + \ '}']) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +func! Test_fillstruct_two_line() abort + try + let l:tmp = gotest#write_file('a/a.go', [ + \ 'package a', + \ 'import (', + \ '"fmt"', + \ '"net/mail"', + \ ')', + \ "\x1f" . 'func x() { fmt.Println(mail.Address{}, mail.Address{}) }']) + + call go#fillstruct#FillStruct() + call gotest#assert_buffer(1, [ + \ 'import (', + \ '"fmt"', + \ '"net/mail"', + \ ')', + \ 'func x() { fmt.Println(mail.Address{', + \ '\tName: "",', + \ '\tAddress: "",', + \ '}, mail.Address{', + \ '\tName: "",', + \ '\tAddress: "",', + \ '}) }']) + finally + "call delete(l:tmp, 'rf') + endtry +endfunc + +func! Test_fillstruct_two_cursor() abort + try + let l:tmp = gotest#write_file('a/a.go', [ + \ 'package a', + \ 'import (', + \ '"fmt"', + \ '"net/mail"', + \ ')', + \ "func x() { fmt.Println(mail.Address{}, mail.Ad\x1fdress{}) }"]) + + call go#fillstruct#FillStruct() + call gotest#assert_buffer(1, [ + \ 'import (', + \ '"fmt"', + \ '"net/mail"', + \ ')', + \ 'func x() { fmt.Println(mail.Address{}, mail.Address{', + \ '\tName: "",', + \ '\tAddress: "",', + \ '}) }']) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +" vim: sw=2 ts=2 et diff --git a/autoload/go/fmt.vim b/autoload/go/fmt.vim index 56c6ee7..42d0419 100644 --- a/autoload/go/fmt.vim +++ b/autoload/go/fmt.vim @@ -2,48 +2,26 @@ " Use of this source code is governed by a BSD-style " license that can be found in the LICENSE file. " -" fmt.vim: Vim command to format Go files with gofmt. -" -" This filetype plugin add a new commands for go buffers: -" -" :Fmt -" -" Filter the current Go buffer through gofmt. -" It tries to preserve cursor position and avoids -" replacing the buffer with stderr output. -" -" Options: -" -" g:go_fmt_command [default="gofmt"] -" -" Flag naming the gofmt executable to use. -" -" g:go_fmt_autosave [default=1] -" -" Flag to auto call :Fmt when saved file -" +" fmt.vim: Vim command to format Go files with gofmt (and gofmt compatible +" toorls, such as goimports). if !exists("g:go_fmt_command") - let g:go_fmt_command = "gofmt" + let g:go_fmt_command = "gofmt" endif -if !exists("g:go_goimports_bin") - let g:go_goimports_bin = "goimports" +if !exists('g:go_fmt_options') + let g:go_fmt_options = '' endif if !exists('g:go_fmt_fail_silently') - let g:go_fmt_fail_silently = 0 -endif - -if !exists('g:go_fmt_options') - let g:go_fmt_options = '' + let g:go_fmt_fail_silently = 0 endif if !exists("g:go_fmt_experimental") - let g:go_fmt_experimental = 0 + let g:go_fmt_experimental = 0 endif -" we have those problems : +" we have those problems : " http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree " http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1 " @@ -51,160 +29,240 @@ endif " it doesn't undo changes and break undo history. If you are here reading " this and have VimL experience, please look at the function for " improvements, patches are welcome :) -function! go#fmt#Format(withGoimport) - if g:go_fmt_experimental == 1 - " Using winsaveview to save/restore cursor state has the problem of - " closing folds on save: - " https://github.com/fatih/vim-go/issues/502 - " One fix is to use mkview instead. Unfortunately, this sometimes causes - " other bad side effects: - " https://github.com/fatih/vim-go/issues/728 - " and still closes all folds if foldlevel>0: - " https://github.com/fatih/vim-go/issues/732 - let l:curw = {} - try - mkview! - catch - let l:curw=winsaveview() - endtry +function! go#fmt#Format(withGoimport) abort + if g:go_fmt_experimental == 1 + " Using winsaveview to save/restore cursor state has the problem of + " closing folds on save: + " https://github.com/fatih/vim-go/issues/502 + " One fix is to use mkview instead. Unfortunately, this sometimes causes + " other bad side effects: + " https://github.com/fatih/vim-go/issues/728 + " and still closes all folds if foldlevel>0: + " https://github.com/fatih/vim-go/issues/732 + let l:curw = {} + try + mkview! + catch + let l:curw = winsaveview() + endtry + + " save our undo file to be restored after we are done. This is needed to + " prevent an additional undo jump due to BufWritePre auto command and also + " restore 'redo' history because it's getting being destroyed every + " BufWritePre + let tmpundofile = tempname() + exe 'wundo! ' . tmpundofile + else + " Save cursor position and many other things. + let l:curw = winsaveview() + endif + + " Write current unsaved buffer to a temp file + let l:tmpname = tempname() . '.go' + call writefile(go#util#GetLines(), l:tmpname) + if go#util#IsWin() + let l:tmpname = tr(l:tmpname, '\', '/') + endif + + let bin_name = g:go_fmt_command + if a:withGoimport == 1 + let bin_name = "goimports" + endif + + let current_col = col('.') + let out = go#fmt#run(bin_name, l:tmpname, expand('%')) + let diff_offset = len(readfile(l:tmpname)) - line('$') + + if go#util#ShellError() == 0 + call go#fmt#update_file(l:tmpname, expand('%')) + elseif g:go_fmt_fail_silently == 0 + let errors = s:parse_errors(expand('%'), out) + call s:show_errors(errors) + endif + + " We didn't use the temp file, so clean up + call delete(l:tmpname) + + if g:go_fmt_experimental == 1 + " restore our undo history + silent! exe 'rundo ' . tmpundofile + call delete(tmpundofile) + + " Restore our cursor/windows positions, folds, etc. + if empty(l:curw) + silent! loadview else - " Save cursor position and many other things. - let l:curw=winsaveview() + call winrestview(l:curw) endif + else + " Restore our cursor/windows positions. + call winrestview(l:curw) + endif - " Write current unsaved buffer to a temp file - let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) - - if g:go_fmt_experimental == 1 - " save our undo file to be restored after we are done. This is needed to - " prevent an additional undo jump due to BufWritePre auto command and also - " restore 'redo' history because it's getting being destroyed every - " BufWritePre - let tmpundofile=tempname() - exe 'wundo! ' . tmpundofile - endif + " be smart and jump to the line the new statement was added/removed + call cursor(line('.') + diff_offset, current_col) - " get the command first so we can test it - let fmt_command = g:go_fmt_command - if a:withGoimport == 1 - let fmt_command = g:go_goimports_bin - endif + " Syntax highlighting breaks less often. + syntax sync fromstart +endfunction - " check if the user has installed command binary. - " For example if it's goimports, let us check if it's installed, - " if not the user get's a warning via go#path#CheckBinPath() - let bin_path = go#path#CheckBinPath(fmt_command) - if empty(bin_path) - return - endif +" update_file updates the target file with the given formatted source +function! go#fmt#update_file(source, target) + " remove undo point caused via BufWritePre + try | silent undojoin | catch | endtry - if fmt_command != "gofmt" - " change GOPATH too, so goimports can pick up the correct library - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() + let old_fileformat = &fileformat + if exists("*getfperm") + " save file permissions + let original_fperm = getfperm(a:target) + endif - let fmt_command = bin_path - endif + call rename(a:source, a:target) - " populate the final command with user based fmt options - let command = fmt_command . ' -w ' - if a:withGoimport != 1 - let command = command . g:go_fmt_options - endif + " restore file permissions + if exists("*setfperm") && original_fperm != '' + call setfperm(a:target , original_fperm) + endif - if fmt_command == "goimports" - if !exists('b:goimports_vendor_compatible') - let out = system("goimports --help") - if out !~ "-srcdir" - echohl WarningMsg - echomsg "vim-go: goimports does not support srcdir." - echomsg " update with: :GoUpdateBinaries" - echohl None - else - let b:goimports_vendor_compatible = 1 - endif - endif - - if exists('b:goimports_vendor_compatible') && b:goimports_vendor_compatible - let command = command . '-srcdir ' . fnameescape(expand("%:p:h")) - endif - endif + " reload buffer to reflect latest changes + silent edit! + + let &fileformat = old_fileformat + let &syntax = &syntax - " execute our command... - let out = system(command . " " . l:tmpname) + let l:listtype = go#list#Type("GoFmt") - if fmt_command != "gofmt" - let $GOPATH = old_gopath + " the title information was introduced with 7.4-2200 + " https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640 + if has('patch-7.4.2200') + " clean up previous list + if l:listtype == "quickfix" + let l:list_title = getqflist({'title': 1}) + else + let l:list_title = getloclist(0, {'title': 1}) endif + else + " can't check the title, so assume that the list was for go fmt. + let l:list_title = {'title': 'Format'} + endif + + if has_key(l:list_title, "title") && l:list_title['title'] == "Format" + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + endif +endfunction + +" run runs the gofmt/goimport command for the given source file and returns +" the output of the executed command. Target is the real file to be formatted. +function! go#fmt#run(bin_name, source, target) + let cmd = s:fmt_cmd(a:bin_name, a:source, a:target) + if empty(cmd) + return + endif + + let command = join(cmd, " ") + + " execute our command... + let out = go#util#System(command) + + return out +endfunction + +" fmt_cmd returns a dict that contains the command to execute gofmt (or +" goimports). args is dict with +function! s:fmt_cmd(bin_name, source, target) + " check if the user has installed command binary. + " For example if it's goimports, let us check if it's installed, + " if not the user get's a warning via go#path#CheckBinPath() + let bin_path = go#path#CheckBinPath(a:bin_name) + if empty(bin_path) + return [] + endif - let l:listtype = "locationlist" - "if there is no error on the temp file replace the output with the current - "file (if this fails, we can always check the outputs first line with: - "splitted =~ 'package \w\+') - if v:shell_error == 0 - " remove undo point caused via BufWritePre - try | silent undojoin | catch | endtry - - " Replace current file with temp file, then reload buffer - let old_fileformat = &fileformat - call rename(l:tmpname, expand('%')) - silent edit! - let &fileformat = old_fileformat - let &syntax = &syntax - - " clean up previous location list, but only if it's due to fmt - if exists('b:got_fmt_error') && b:got_fmt_error - let b:got_fmt_error = 0 - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - endif - elseif g:go_fmt_fail_silently == 0 - let splitted = split(out, '\n') - "otherwise get the errors and put them to location list - let errors = [] - for line in splitted - let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') - if !empty(tokens) - call add(errors, {"filename": @%, - \"lnum": tokens[2], - \"col": tokens[3], - \"text": tokens[4]}) - endif - endfor - if empty(errors) - % | " Couldn't detect gofmt error format, output errors - endif - if !empty(errors) - call go#list#Populate(l:listtype, errors) - echohl Error | echomsg "Gofmt returned error" | echohl None - endif - - let b:got_fmt_error = 1 - call go#list#Window(l:listtype, len(errors)) - - " We didn't use the temp file, so clean up - call delete(l:tmpname) + " start constructing the command + let bin_path = go#util#Shellescape(bin_path) + let cmd = [bin_path] + call add(cmd, "-w") + + " add the options for binary (if any). go_fmt_options was by default of type + " string, however to allow customization it's now a dictionary of binary + " name mapping to options. + let opts = g:go_fmt_options + if type(g:go_fmt_options) == type({}) + let opts = has_key(g:go_fmt_options, a:bin_name) ? g:go_fmt_options[a:bin_name] : "" + endif + call extend(cmd, split(opts, " ")) + + if a:bin_name == "goimports" + " lazy check if goimports support `-srcdir`. We should eventually remove + " this in the future + if !exists('b:goimports_vendor_compatible') + let out = go#util#System(bin_path . " --help") + if out !~ "-srcdir" + call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", bin_path)) + else + let b:goimports_vendor_compatible = 1 + endif endif - if g:go_fmt_experimental == 1 - " restore our undo history - silent! exe 'rundo ' . tmpundofile - call delete(tmpundofile) + if exists('b:goimports_vendor_compatible') && b:goimports_vendor_compatible + let ssl_save = &shellslash + set noshellslash + " use the filename without the fully qualified name if the tree is + " symlinked into the GOPATH, goimports won't work properly. + call extend(cmd, ["-srcdir", shellescape(a:target)]) + let &shellslash = ssl_save endif + endif - if g:go_fmt_experimental == 1 - " Restore our cursor/windows positions, folds, etc. - if empty(l:curw) - silent! loadview - else - call winrestview(l:curw) - endif - else - " Restore our cursor/windows positions. - call winrestview(l:curw) + call add(cmd, a:source) + return cmd +endfunction + +" parse_errors parses the given errors and returns a list of parsed errors +function! s:parse_errors(filename, content) abort + let splitted = split(a:content, '\n') + + " list of errors to be put into location list + let errors = [] + for line in splitted + let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') + if !empty(tokens) + call add(errors,{ + \"filename": a:filename, + \"lnum": tokens[2], + \"col": tokens[3], + \"text": tokens[4], + \ }) endif + endfor + + return errors +endfunction + +" show_errors opens a location list and shows the given errors. If the given +" errors is empty, it closes the the location list +function! s:show_errors(errors) abort + let l:listtype = go#list#Type("GoFmt") + if !empty(a:errors) + call go#list#Populate(l:listtype, a:errors, 'Format') + echohl Error | echomsg "Gofmt returned error" | echohl None + endif + + " this closes the window if there are no errors or it opens + " it if there is any + call go#list#Window(l:listtype, len(a:errors)) endfunction +function! go#fmt#ToggleFmtAutoSave() abort + if get(g:, "go_fmt_autosave", 1) + let g:go_fmt_autosave = 0 + call go#util#EchoProgress("auto fmt disabled") + return + end + + let g:go_fmt_autosave = 1 + call go#util#EchoProgress("auto fmt enabled") +endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/fmt_test.vim b/autoload/go/fmt_test.vim new file mode 100644 index 0000000..2adbfba --- /dev/null +++ b/autoload/go/fmt_test.vim @@ -0,0 +1,49 @@ +func! Test_run_fmt() abort + 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 + +func! Test_update_file() abort + let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n") + let source_file = tempname() + call writefile(readfile("test-fixtures/fmt/hello_golden.go"), source_file) + + let target_file = tempname() + call writefile([""], target_file) + + " update_file now + call go#fmt#update_file(source_file, target_file) + + " this should now contain the formatted code + let actual = join(readfile(target_file), "\n") + + call assert_equal(expected, actual) +endfunc + +func! Test_goimports() abort + let $GOPATH = 'test-fixtures/fmt/' + let actual_file = tempname() + call writefile(readfile("test-fixtures/fmt/src/imports/goimports.go"), actual_file) + + let expected = join(readfile("test-fixtures/fmt/src/imports/goimports_golden.go"), "\n") + + " run our code + call go#fmt#run("goimports", actual_file, "test-fixtures/fmt/src/imports/goimports.go") + + " this should now contain the formatted code + let actual = join(readfile(actual_file), "\n") + + call assert_equal(expected, actual) +endfunc + +" vim: sw=2 ts=2 et diff --git a/autoload/go/guru.vim b/autoload/go/guru.vim new file mode 100644 index 0000000..c252090 --- /dev/null +++ b/autoload/go/guru.vim @@ -0,0 +1,628 @@ +" guru.vim -- Vim integration for the Go guru. + +" guru_cmd returns a dict that contains the command to execute guru. args +" is dict with following options: +" mode : guru mode, such as 'implements' +" format : output format, either 'plain' or 'json' +" needs_scope : if 1, adds the current package to the scope +" selected : if 1, means it's a range of selection, otherwise it picks up the +" offset under the cursor +" example output: +" {'cmd' : ['guru', '-json', 'implements', 'demo/demo.go:#66']} +function! s:guru_cmd(args) range abort + let mode = a:args.mode + let format = a:args.format + let needs_scope = a:args.needs_scope + let selected = a:args.selected + + let result = {} + let pkg = go#package#ImportPath() + + " this is important, check it! + if pkg == -1 && needs_scope + return {'err': "current directory is not inside of a valid GOPATH"} + endif + + "return with a warning if the binary doesn't exist + let bin_path = go#path#CheckBinPath("guru") + if empty(bin_path) + return {'err': "bin path not found"} + endif + + " start constructing the command + let cmd = [bin_path] + + let filename = fnamemodify(expand("%"), ':p:gs?\\?/?') + if &modified + let result.stdin_content = go#util#archive() + call add(cmd, "-modified") + endif + + " enable outputting in json format + if format == "json" + call add(cmd, "-json") + endif + + " check for any tags + if exists('g:go_build_tags') + let tags = get(g:, 'go_build_tags') + call extend(cmd, ["-tags", tags]) + let result.tags = tags + endif + + " some modes require scope to be defined (such as callers). For these we + " choose a sensible setting, which is using the current file's package + let scopes = [] + if needs_scope + let scopes = [pkg] + endif + + " check for any user defined scope setting. users can define the scope, + " in package pattern form. examples: + " golang.org/x/tools/cmd/guru # a single package + " golang.org/x/tools/... # all packages beneath dir + " ... # the entire workspace. + if exists('g:go_guru_scope') + " check that the setting is of type list + if type(get(g:, 'go_guru_scope')) != type([]) + return {'err' : "go_guru_scope should of type list"} + endif + + let scopes = get(g:, 'go_guru_scope') + endif + + " now add the scope to our command if there is any + if !empty(scopes) + " strip trailing slashes for each path in scoped. bug: + " https://github.com/golang/go/issues/14584 + let scopes = go#util#StripTrailingSlash(scopes) + + " create shell-safe entries of the list + if !go#util#has_job() | let scopes = go#util#Shelllist(scopes) | endif + + " guru expect a comma-separated list of patterns, construct it + let l:scope = join(scopes, ",") + let result.scope = l:scope + call extend(cmd, ["-scope", l:scope]) + endif + + let pos = printf("#%s", go#util#OffsetCursor()) + if selected != -1 + " means we have a range, get it + let pos1 = go#util#Offset(line("'<"), col("'<")) + let pos2 = go#util#Offset(line("'>"), col("'>")) + let pos = printf("#%s,#%s", pos1, pos2) + endif + + let filename .= ':'.pos + call extend(cmd, [mode, filename]) + + let result.cmd = cmd + return result +endfunction + +" sync_guru runs guru in sync mode with the given arguments +function! s:sync_guru(args) abort + let result = s:guru_cmd(a:args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return -1 + endif + + if !has_key(a:args, 'disable_progress') + if a:args.needs_scope + call go#util#EchoProgress("analysing with scope ". result.scope . + \ " (see ':help go-guru-scope' if this doesn't work)...") + elseif a:args.mode !=# 'what' + " the query might take time, let us give some feedback + call go#util#EchoProgress("analysing ...") + endif + endif + + + " run, forrest run!!! + let command = join(result.cmd, " ") + if has_key(result, 'stdin_content') + let out = go#util#System(command, result.stdin_content) + else + let out = go#util#System(command) + endif + + if has_key(a:args, 'custom_parse') + call a:args.custom_parse(go#util#ShellError(), out) + else + call s:parse_guru_output(go#util#ShellError(), out, a:args.mode) + endif + + return out +endfunc + +" async_guru runs guru in async mode with the given arguments +function! s:async_guru(args) abort + let result = s:guru_cmd(a:args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return + endif + + let status_dir = expand('%:p:h') + let statusline_type = printf("%s", a:args.mode) + + if !has_key(a:args, 'disable_progress') + if a:args.needs_scope + call go#util#EchoProgress("analysing with scope " . result.scope . + \ " (see ':help go-guru-scope' if this doesn't work)...") + endif + endif + + let messages = [] + function! s:callback(chan, msg) closure + call add(messages, a:msg) + endfunction + + let status = {} + let exitval = 0 + + function! s:exit_cb(job, exitval) closure + let status = { + \ 'desc': 'last status', + \ 'type': statusline_type, + \ 'state': "finished", + \ } + + if a:exitval + let exitval = a:exitval + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + endfunction + + function! s:close_cb(ch) closure + let out = join(messages, "\n") + + if has_key(a:args, 'custom_parse') + call a:args.custom_parse(exitval, out) + else + call s:parse_guru_output(exitval, out, a:args.mode) + endif + endfunction + + let start_options = { + \ 'callback': funcref("s:callback"), + \ 'exit_cb': funcref("s:exit_cb"), + \ 'close_cb': funcref("s:close_cb"), + \ } + + if has_key(result, 'stdin_content') + let l:tmpname = tempname() + call writefile(split(result.stdin_content, "\n"), l:tmpname, "b") + let l:start_options.in_io = "file" + let l:start_options.in_name = l:tmpname + endif + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': statusline_type, + \ 'state': "analysing", + \}) + + return job_start(result.cmd, start_options) +endfunc + +" run_guru runs the given guru argument +function! s:run_guru(args) abort + if go#util#has_job() + let res = s:async_guru(a:args) + else + let res = s:sync_guru(a:args) + endif + + return res +endfunction + +" Show 'implements' relation for selected package +function! go#guru#Implements(selected) abort + let args = { + \ 'mode': 'implements', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Report the possible constants, global variables, and concrete types that may +" appear in a value of type error +function! go#guru#Whicherrs(selected) abort + let args = { + \ 'mode': 'whicherrs', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + + " TODO(arslan): handle empty case for both sync/async + " if empty(out.out) + " call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope") + " return + " endif + call s:run_guru(args) +endfunction + +" Describe selected syntax: definition, methods, etc +function! go#guru#Describe(selected) abort + let args = { + \ 'mode': 'describe', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +function! go#guru#DescribeInfo() abort + " json_encode() and friends are introduced with this patch (7.4.1304) + " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ + " nvim: https://github.com/neovim/neovim/pull/4131 + if !exists("*json_decode") + call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.") + return + endif + + function! s:info(exit_val, output) + if a:exit_val != 0 + return + endif + + if a:output[0] !=# '{' + return + endif + + if empty(a:output) || type(a:output) != type("") + return + endif + + let result = json_decode(a:output) + if type(result) != type({}) + call go#util#EchoError(printf("malformed output from guru: %s", a:output)) + return + endif + + if !has_key(result, 'detail') + " if there is no detail check if there is a description and print it + if has_key(result, "desc") + call go#util#EchoInfo(result["desc"]) + return + endif + + call go#util#EchoError("detail key is missing. Please open a bug report on vim-go repo.") + return + endif + + let detail = result['detail'] + let info = "" + + " guru gives different information based on the detail mode. Let try to + " extract the most useful information + + if detail == "value" + if !has_key(result, 'value') + call go#util#EchoError("value key is missing. Please open a bug report on vim-go repo.") + return + endif + + let val = result["value"] + if !has_key(val, 'type') + call go#util#EchoError("type key is missing (value.type). Please open a bug report on vim-go repo.") + return + endif + + let info = val["type"] + elseif detail == "type" + if !has_key(result, 'type') + call go#util#EchoError("type key is missing. Please open a bug report on vim-go repo.") + return + endif + + let type = result["type"] + if !has_key(type, 'type') + call go#util#EchoError("type key is missing (type.type). Please open a bug report on vim-go repo.") + return + endif + + let info = type["type"] + elseif detail == "package" + if !has_key(result, 'package') + call go#util#EchoError("package key is missing. Please open a bug report on vim-go repo.") + return + endif + + let package = result["package"] + if !has_key(package, 'path') + call go#util#EchoError("path key is missing (package.path). Please open a bug report on vim-go repo.") + return + endif + + let info = printf("package %s", package["path"]) + elseif detail == "unknown" + let info = result["desc"] + else + call go#util#EchoError(printf("unknown detail mode found '%s'. Please open a bug report on vim-go repo", detail)) + return + endif + + call go#util#EchoInfo(info) + endfunction + + let args = { + \ 'mode': 'describe', + \ 'format': 'json', + \ 'selected': -1, + \ 'needs_scope': 0, + \ 'custom_parse': function('s:info'), + \ 'disable_progress': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show possible targets of selected function call +function! go#guru#Callees(selected) abort + let args = { + \ 'mode': 'callees', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show possible callers of selected function +function! go#guru#Callers(selected) abort + let args = { + \ 'mode': 'callers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show path from callgraph root to selected function +function! go#guru#Callstack(selected) abort + let args = { + \ 'mode': 'callstack', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show free variables of selection +function! go#guru#Freevars(selected) abort + " Freevars requires a selection + if a:selected == -1 + call go#util#EchoError("GoFreevars requires a selection (range) of code") + return + endif + + let args = { + \ 'mode': 'freevars', + \ 'format': 'plain', + \ 'selected': 1, + \ 'needs_scope': 0, + \ } + + call s:run_guru(args) +endfunction + +" Show send/receive corresponding to selected channel op +function! go#guru#ChannelPeers(selected) abort + let args = { + \ 'mode': 'peers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show all refs to entity denoted by selected identifier +function! go#guru#Referrers(selected) abort + let args = { + \ 'mode': 'referrers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 0, + \ } + + call s:run_guru(args) +endfunction + +function! go#guru#SameIdsTimer() abort + call timer_start(200, function('go#guru#SameIds'), {'repeat': -1}) +endfunction + +function! go#guru#SameIds() abort + " we use matchaddpos() which was introduce with 7.4.330, be sure we have + " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 + if !exists("*matchaddpos") + call go#util#EchoError("GoSameIds requires 'matchaddpos'. Update your Vim/Neovim version.") + return + endif + + " json_encode() and friends are introduced with this patch (7.4.1304) + " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ + " nvim: https://github.com/neovim/neovim/pull/4131 + if !exists("*json_decode") + call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.") + return + endif + + let args = { + \ 'mode': 'what', + \ 'format': 'json', + \ 'selected': -1, + \ 'needs_scope': 0, + \ 'custom_parse': function('s:same_ids_highlight'), + \ } + + call s:run_guru(args) +endfunction + +function! s:same_ids_highlight(exit_val, output) abort + call go#guru#ClearSameIds() " run after calling guru to reduce flicker. + + if a:output[0] !=# '{' + if !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError(a:output) + endif + return + endif + + let result = json_decode(a:output) + if type(result) != type({}) && !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError("malformed output from guru") + return + endif + + if !has_key(result, 'sameids') + if !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError("no same_ids founds for the given identifier") + endif + return + endif + + let poslen = 0 + for enclosing in result['enclosing'] + if enclosing['desc'] == 'identifier' + let poslen = enclosing['end'] - enclosing['start'] + break + endif + endfor + + " return when there's no identifier to highlight. + if poslen == 0 + return + endif + + let same_ids = result['sameids'] + " highlight the lines + for item in same_ids + let pos = split(item, ':') + call matchaddpos('goSameId', [[str2nr(pos[-2]), str2nr(pos[-1]), str2nr(poslen)]]) + endfor + + if get(g:, "go_auto_sameids", 0) + " re-apply SameIds at the current cursor position at the time the buffer + " is redisplayed: e.g. :edit, :GoRename, etc. + augroup vim-go-sameids + autocmd! + autocmd BufWinEnter nested call go#guru#SameIds() + augroup end + endif +endfunction + +" ClearSameIds returns 0 when it removes goSameId groups and non-zero if no +" goSameId groups are found. +function! go#guru#ClearSameIds() abort + let l:cleared = 0 + + let m = getmatches() + for item in m + if item['group'] == 'goSameId' + call matchdelete(item['id']) + let l:cleared = 1 + endif + endfor + + if !l:cleared + return 1 + endif + + " remove the autocmds we defined + augroup vim-go-sameids + autocmd! + augroup end + + return 0 +endfunction + +function! go#guru#ToggleSameIds() abort + if go#guru#ClearSameIds() != 0 + call go#guru#SameIds() + endif +endfunction + +function! go#guru#AutoToogleSameIds() abort + if get(g:, "go_auto_sameids", 0) + call go#util#EchoProgress("sameids auto highlighting disabled") + call go#guru#ClearSameIds() + let g:go_auto_sameids = 0 + return + endif + + call go#util#EchoSuccess("sameids auto highlighting enabled") + let g:go_auto_sameids = 1 +endfunction + + +"""""""""""""""""""""""""""""""""""""""" +"" HELPER FUNCTIONS +"""""""""""""""""""""""""""""""""""""""" + +" This uses Vim's errorformat to parse the output from Guru's 'plain output +" and put it into location list. I believe using errorformat is much more +" easier to use. If we need more power we can always switch back to parse it +" via regex. Match two possible styles of errorformats: +" +" 'file:line.col-line2.col2: message' +" 'file:line:col: message' +" +" We discard line2 and col2 for the first errorformat, because it's not +" useful and location only has the ability to show one line and column +" number +function! s:parse_guru_output(exit_val, output, title) abort + if a:exit_val + call go#util#EchoError(a:output) + return + endif + + let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m" + let l:listtype = go#list#Type("_guru") + call go#list#ParseFormat(l:listtype, errformat, a:output, a:title) + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) +endfun + +function! go#guru#Scope(...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_guru_scope + call go#util#EchoSuccess("guru scope is cleared") + else + let g:go_guru_scope = a:000 + call go#util#EchoSuccess("guru scope changed to: ". join(a:000, ",")) + endif + + return + endif + + if !exists('g:go_guru_scope') + call go#util#EchoError("guru scope is not set") + else + call go#util#EchoSuccess("current guru scope: ". join(g:go_guru_scope, ",")) + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/impl.vim b/autoload/go/impl.vim new file mode 100644 index 0000000..73707fa --- /dev/null +++ b/autoload/go/impl.vim @@ -0,0 +1,140 @@ +function! go#impl#Impl(...) abort + let recv = "" + let iface = "" + let interactive = 0 + + let pos = getpos('.') + + if a:0 is 0 + " Interactive mode if user didn't pass any arguments. + let recv = s:getReceiver() + let iface = input("vim-go: generating method stubs for interface: ") + redraw! + if empty(iface) + call go#util#EchoError('usage: interface type is not provided') + return + endif + elseif a:0 is 1 + " we assume the user only passed the interface type, + " i.e: ':GoImpl io.Writer' + let recv = s:getReceiver() + let iface = a:1 + elseif a:0 > 2 + " user passed receiver and interface type both, + " i.e: 'GoImpl f *Foo io.Writer' + let recv = join(a:000[:-2], ' ') + let iface = a:000[-1] + else + call go#util#EchoError('usage: GoImpl {receiver} {interface}') + return + endif + + " Make sure we put the generated code *after* the struct. + if getline(".") =~ "struct " + normal! $% + endif + + try + let dirname = fnameescape(expand('%:p:h')) + let [result, err] = go#util#Exec(['impl', '-dir', dirname, recv, iface]) + let result = substitute(result, "\n*$", "", "") + if err + call go#util#EchoError(result) + return + endif + + if result is# '' + return + end + + put ='' + silent put =result + finally + call setpos('.', pos) + endtry +endfunction + +function! s:getReceiver() + let receiveType = expand("") + if receiveType == "type" + normal! w + let receiveType = expand("") + elseif receiveType == "struct" + normal! ge + let receiveType = expand("") + endif + return printf("%s *%s", tolower(receiveType)[0], receiveType) +endfunction + +if exists('*uniq') + function! s:uniq(list) + return uniq(a:list) + endfunction +else + " Note: Believe that the list is sorted + function! s:uniq(list) + let i = len(a:list) - 1 + while 0 < i + if a:list[i-1] ==# a:list[i] + call remove(a:list, i) + let i -= 2 + else + let i -= 1 + endif + endwhile + return a:list + endfunction +endif + +function! s:root_dirs() abort + let dirs = [] + let root = go#util#env("goroot") + if root !=# '' && isdirectory(root) + call add(dirs, root) + endif + + let paths = map(split(go#util#env("gopath"), go#util#PathListSep()), "substitute(v:val, '\\\\', '/', 'g')") + if !empty(filter(paths, 'isdirectory(v:val)')) + call extend(dirs, paths) + endif + + return dirs +endfunction + +function! s:go_packages(dirs) abort + let pkgs = [] + for d in a:dirs + let pkg_root = expand(d . '/pkg/' . go#util#osarch()) + call extend(pkgs, split(globpath(pkg_root, '**/*.a', 1), "\n")) + endfor + return map(pkgs, "fnamemodify(v:val, ':t:r')") +endfunction + +function! s:interface_list(pkg) abort + let [contents, err] = go#util#Exec(['go', 'doc', a:pkg]) + if err + return [] + endif + + let contents = split(contents, "\n") + call filter(contents, 'v:val =~# ''^type\s\+\h\w*\s\+interface''') + return map(contents, 'a:pkg . "." . matchstr(v:val, ''^type\s\+\zs\h\w*\ze\s\+interface'')') +endfunction + +" Complete package and interface for {interface} +function! go#impl#Complete(arglead, cmdline, cursorpos) abort + let words = split(a:cmdline, '\s\+', 1) + if words[-1] ==# '' + return s:uniq(sort(s:go_packages(s:root_dirs()))) + elseif words[-1] =~# '^\h\w*$' + return s:uniq(sort(filter(s:go_packages(s:root_dirs()), 'stridx(v:val, words[-1]) == 0'))) + elseif words[-1] =~# '^\h\w*\.\%(\h\w*\)\=$' + let [pkg, interface] = split(words[-1], '\.', 1) + echomsg pkg + return s:uniq(sort(filter(s:interface_list(pkg), 'v:val =~? words[-1]'))) + else + return [] + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/impl_test.vim b/autoload/go/impl_test.vim new file mode 100644 index 0000000..c417cd4 --- /dev/null +++ b/autoload/go/impl_test.vim @@ -0,0 +1,37 @@ +func! Test_impl() abort + try + let l:tmp = gotest#write_file('a/a.go', [ + \ 'package a', + \ '', + \ '']) + + call go#impl#Impl('r', 'reader', 'io.Reader') + call gotest#assert_buffer(1, [ + \ 'func (r reader) Read(p []byte) (n int, err error) {', + \ ' panic("not implemented")', + \ '}']) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +func! Test_impl_get() abort + try + let l:tmp = gotest#write_file('a/a.go', [ + \ 'package a', + \ '', + \ 'type reader struct {}']) + + call go#impl#Impl('io.Reader') + call gotest#assert_buffer(0, [ + \ 'package a', + \ '', + \ 'type reader struct {}', + \ '', + \ 'func (r *reader) Read(p []byte) (n int, err error) {', + \ ' panic("not implemented")', + \ '}']) + finally + call delete(l:tmp, 'rf') + endtry +endfunc diff --git a/autoload/go/import.vim b/autoload/go/import.vim index 2660099..8d9e8d4 100644 --- a/autoload/go/import.vim +++ b/autoload/go/import.vim @@ -4,210 +4,210 @@ " " Check out the docs for more information at /doc/vim-go.txt " -function! go#import#SwitchImport(enabled, localname, path, bang) - let view = winsaveview() - let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '') - - " Quotes are not necessary, so remove them if provided. - if path[0] == '"' - let path = strpart(path, 1) - endif - if path[len(path)-1] == '"' - let path = strpart(path, 0, len(path) - 1) +function! go#import#SwitchImport(enabled, localname, path, bang) abort + let view = winsaveview() + let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '') + + " Quotes are not necessary, so remove them if provided. + if path[0] == '"' + let path = strpart(path, 1) + endif + if path[len(path)-1] == '"' + let path = strpart(path, 0, len(path) - 1) + endif + + " if given a trailing slash, eg. `github.com/user/pkg/`, remove it + if path[len(path)-1] == '/' + let path = strpart(path, 0, len(path) - 1) + endif + + if path == '' + call s:Error('Import path not provided') + return + endif + + if a:bang == "!" + let out = go#util#System("go get -u -v ".shellescape(path)) + if go#util#ShellError() != 0 + call s:Error("Can't find import: " . path . ":" . out) endif - - " if given a trailing slash, eg. `github.com/user/pkg/`, remove it - if path[len(path)-1] == '/' - let path = strpart(path, 0, len(path) - 1) - endif - - if path == '' - call s:Error('Import path not provided') - return - endif - - if a:bang == "!" - let out = system("go get -u -v ".shellescape(path)) - if v:shell_error - call s:Error("Can't find import: " . path . ":" . out) + endif + let exists = go#tool#Exists(path) + if exists == -1 + call s:Error("Can't find import: " . path) + return + endif + + " Extract any site prefix (e.g. github.com/). + " If other imports with the same prefix are grouped separately, + " we will add this new import with them. + " Only up to and including the first slash is used. + let siteprefix = matchstr(path, "^[^/]*/") + + let qpath = '"' . path . '"' + if a:localname != '' + let qlocalpath = a:localname . ' ' . qpath + else + let qlocalpath = qpath + endif + let indentstr = 0 + let packageline = -1 " Position of package name statement + let appendline = -1 " Position to introduce new import + let deleteline = -1 " Position of line with existing import + let linesdelta = 0 " Lines added/removed + + " Find proper place to add/remove import. + let line = 0 + while line <= line('$') + let linestr = getline(line) + + if linestr =~# '^package\s' + let packageline = line + let appendline = line + + elseif linestr =~# '^import\s\+(' + let appendstr = qlocalpath + let indentstr = 1 + let appendline = line + let firstblank = -1 + let lastprefix = "" + while line <= line("$") + let line = line + 1 + let linestr = getline(line) + let m = matchlist(getline(line), '^\()\|\(\s\+\)\(\S*\s*\)"\(.\+\)"\)') + if empty(m) + if siteprefix == "" && a:enabled + " must be in the first group + break + endif + " record this position, but keep looking + if firstblank < 0 + let firstblank = line + endif + continue endif - endif - let exists = go#tool#Exists(path) - if exists == -1 - call s:Error("Can't find import: " . path) - return - endif + if m[1] == ')' + " if there's no match, add it to the first group + if appendline < 0 && firstblank >= 0 + let appendline = firstblank + endif + break + endif + let lastprefix = matchstr(m[4], "^[^/]*/") + if a:localname != '' && m[3] != '' + let qlocalpath = printf('%-' . (len(m[3])-1) . 's %s', a:localname, qpath) + endif + let appendstr = m[2] . qlocalpath + let indentstr = 0 + if m[4] == path + let appendline = -1 + let deleteline = line + break + elseif m[4] < path + " don't set candidate position if we have a site prefix, + " we've passed a blank line, and this doesn't share the same + " site prefix. + if siteprefix == "" || firstblank < 0 || match(m[4], "^" . siteprefix) >= 0 + let appendline = line + endif + elseif siteprefix != "" && match(m[4], "^" . siteprefix) >= 0 + " first entry of site group + let appendline = line - 1 + break + endif + endwhile + break + + elseif linestr =~# '^import ' + if appendline == packageline + let appendstr = 'import ' . qlocalpath + let appendline = line - 1 + endif + let m = matchlist(linestr, '^import\(\s\+\)\(\S*\s*\)"\(.\+\)"') + if !empty(m) + if m[3] == path + let appendline = -1 + let deleteline = line + break + endif + if m[3] < path + let appendline = line + endif + if a:localname != '' && m[2] != '' + let qlocalpath = printf("%s %" . len(m[2])-1 . "s", a:localname, qpath) + endif + let appendstr = 'import' . m[1] . qlocalpath + endif - " Extract any site prefix (e.g. github.com/). - " If other imports with the same prefix are grouped separately, - " we will add this new import with them. - " Only up to and including the first slash is used. - let siteprefix = matchstr(path, "^[^/]*/") + elseif linestr =~# '^\(var\|const\|type\|func\)\>' + break - let qpath = '"' . path . '"' - if a:localname != '' - let qlocalpath = a:localname . ' ' . qpath + endif + let line = line + 1 + endwhile + + " Append or remove the package import, as requested. + if a:enabled + if deleteline != -1 + call s:Error(qpath . ' already being imported') + elseif appendline == -1 + call s:Error('No package line found') else - let qlocalpath = qpath + if appendline == packageline + call append(appendline + 0, '') + call append(appendline + 1, 'import (') + call append(appendline + 2, ')') + let appendline += 2 + let linesdelta += 3 + let appendstr = qlocalpath + let indentstr = 1 + endif + call append(appendline, appendstr) + execute appendline + 1 + if indentstr + execute 'normal! >>' + endif + let linesdelta += 1 endif - let indentstr = 0 - let packageline = -1 " Position of package name statement - let appendline = -1 " Position to introduce new import - let deleteline = -1 " Position of line with existing import - let linesdelta = 0 " Lines added/removed - - " Find proper place to add/remove import. - let line = 0 - while line <= line('$') - let linestr = getline(line) - - if linestr =~# '^package\s' - let packageline = line - let appendline = line - - elseif linestr =~# '^import\s\+(' - let appendstr = qlocalpath - let indentstr = 1 - let appendline = line - let firstblank = -1 - let lastprefix = "" - while line <= line("$") - let line = line + 1 - let linestr = getline(line) - let m = matchlist(getline(line), '^\()\|\(\s\+\)\(\S*\s*\)"\(.\+\)"\)') - if empty(m) - if siteprefix == "" && a:enabled - " must be in the first group - break - endif - " record this position, but keep looking - if firstblank < 0 - let firstblank = line - endif - continue - endif - if m[1] == ')' - " if there's no match, add it to the first group - if appendline < 0 && firstblank >= 0 - let appendline = firstblank - endif - break - endif - let lastprefix = matchstr(m[4], "^[^/]*/") - if a:localname != '' && m[3] != '' - let qlocalpath = printf('%-' . (len(m[3])-1) . 's %s', a:localname, qpath) - endif - let appendstr = m[2] . qlocalpath - let indentstr = 0 - if m[4] == path - let appendline = -1 - let deleteline = line - break - elseif m[4] < path - " don't set candidate position if we have a site prefix, - " we've passed a blank line, and this doesn't share the same - " site prefix. - if siteprefix == "" || firstblank < 0 || match(m[4], "^" . siteprefix) >= 0 - let appendline = line - endif - elseif siteprefix != "" && match(m[4], "^" . siteprefix) >= 0 - " first entry of site group - let appendline = line - 1 - break - endif - endwhile - break - - elseif linestr =~# '^import ' - if appendline == packageline - let appendstr = 'import ' . qlocalpath - let appendline = line - 1 - endif - let m = matchlist(linestr, '^import\(\s\+\)\(\S*\s*\)"\(.\+\)"') - if !empty(m) - if m[3] == path - let appendline = -1 - let deleteline = line - break - endif - if m[3] < path - let appendline = line - endif - if a:localname != '' && m[2] != '' - let qlocalpath = printf("%s %" . len(m[2])-1 . "s", a:localname, qpath) - endif - let appendstr = 'import' . m[1] . qlocalpath - endif - - elseif linestr =~# '^\(var\|const\|type\|func\)\>' - break - - endif - let line = line + 1 - endwhile - - " Append or remove the package import, as requested. - if a:enabled - if deleteline != -1 - call s:Error(qpath . ' already being imported') - elseif appendline == -1 - call s:Error('No package line found') - else - if appendline == packageline - call append(appendline + 0, '') - call append(appendline + 1, 'import (') - call append(appendline + 2, ')') - let appendline += 2 - let linesdelta += 3 - let appendstr = qlocalpath - let indentstr = 1 - endif - call append(appendline, appendstr) - execute appendline + 1 - if indentstr - execute 'normal! >>' - endif - let linesdelta += 1 - endif + else + if deleteline == -1 + call s:Error(qpath . ' not being imported') else - if deleteline == -1 - call s:Error(qpath . ' not being imported') - else - execute deleteline . 'd' - let linesdelta -= 1 - - if getline(deleteline-1) =~# '^import\s\+(' && getline(deleteline) =~# '^)' - " Delete empty import block - let deleteline -= 1 - execute deleteline . "d" - execute deleteline . "d" - let linesdelta -= 2 - endif - - if getline(deleteline) == '' && getline(deleteline - 1) == '' - " Delete spacing for removed line too. - execute deleteline . "d" - let linesdelta -= 1 - endif - endif + execute deleteline . 'd' + let linesdelta -= 1 + + if getline(deleteline-1) =~# '^import\s\+(' && getline(deleteline) =~# '^)' + " Delete empty import block + let deleteline -= 1 + execute deleteline . "d" + execute deleteline . "d" + let linesdelta -= 2 + endif + + if getline(deleteline) == '' && getline(deleteline - 1) == '' + " Delete spacing for removed line too. + execute deleteline . "d" + let linesdelta -= 1 + endif endif + endif - " Adjust view for any changes. - let view.lnum += linesdelta - let view.topline += linesdelta - if view.topline < 0 - let view.topline = 0 - endif + " Adjust view for any changes. + let view.lnum += linesdelta + let view.topline += linesdelta + if view.topline < 0 + let view.topline = 0 + endif - " Put buffer back where it was. - call winrestview(view) + " Put buffer back where it was. + call winrestview(view) endfunction -function! s:Error(s) - echohl Error | echo a:s | echohl None +function! s:Error(s) abort + echohl Error | echo a:s | echohl None endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/job.vim b/autoload/go/job.vim new file mode 100644 index 0000000..965f20d --- /dev/null +++ b/autoload/go/job.vim @@ -0,0 +1,102 @@ +" Spawn returns callbacks to be used with job_start. It's abstracted to be +" used with various go command, such as build, test, install, etc.. This avoid +" us to write the same callback over and over for some commands. It's fully +" customizable so each command can change it to it's own logic. +function go#job#Spawn(args) + let cbs = { + \ 'winnr': winnr(), + \ 'dir': getcwd(), + \ 'jobdir': fnameescape(expand("%:p:h")), + \ 'messages': [], + \ 'args': a:args.cmd, + \ 'bang': 0, + \ 'for': "_job", + \ } + + if has_key(a:args, 'bang') + let cbs.bang = a:args.bang + endif + + if has_key(a:args, 'for') + let cbs.for = a:args.for + endif + + " add final callback to be called if async job is finished + " The signature should be in form: func(job, exit_status, messages) + if has_key(a:args, 'custom_cb') + let cbs.custom_cb = a:args.custom_cb + endif + + if has_key(a:args, 'error_info_cb') + let cbs.error_info_cb = a:args.error_info_cb + endif + + function cbs.callback(chan, msg) dict + call add(self.messages, a:msg) + endfunction + + function cbs.exit_cb(job, exitval) dict + if has_key(self, 'error_info_cb') + call self.error_info_cb(a:job, a:exitval, self.messages) + endif + + if get(g:, 'go_echo_command_info', 1) + if a:exitval == 0 + call go#util#EchoSuccess("SUCCESS") + else + call go#util#EchoError("FAILED") + endif + endif + + if has_key(self, 'custom_cb') + call self.custom_cb(a:job, a:exitval, self.messages) + endif + + let l:listtype = go#list#Type(self.for) + if a:exitval == 0 + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + return + endif + + call self.show_errors(l:listtype) + endfunction + + function cbs.show_errors(listtype) dict + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + try + execute cd self.jobdir + let errors = go#tool#ParseErrors(self.messages) + let errors = go#tool#FilterValids(errors) + finally + execute cd . fnameescape(self.dir) + endtry + + if !len(errors) + " failed to parse errors, output the original content + call go#util#EchoError(self.messages + [self.dir]) + return + endif + + if self.winnr == winnr() + call go#list#Populate(a:listtype, errors, join(self.args)) + call go#list#Window(a:listtype, len(errors)) + if !empty(errors) && !self.bang + call go#list#JumpToFirst(a:listtype) + endif + endif + endfunction + + " override callback handler if user provided it + if has_key(a:args, 'callback') + let cbs.callback = a:args.callback + endif + + " override exit callback handler if user provided it + if has_key(a:args, 'exit_cb') + let cbs.exit_cb = a:args.exit_cb + endif + + return cbs +endfunction +" vim: sw=2 ts=2 et diff --git a/autoload/go/jobcontrol.vim b/autoload/go/jobcontrol.vim index 777b054..57eab32 100644 --- a/autoload/go/jobcontrol.vim +++ b/autoload/go/jobcontrol.vim @@ -2,62 +2,68 @@ " internal function s:spawn let s:jobs = {} +" s:handlers is a global event handlers for all jobs started with Spawn() or +" with the internal function s:spawn +let s:handlers = {} + " Spawn is a wrapper around s:spawn. It can be executed by other files and " scripts if needed. Desc defines the description for printing the status " during the job execution (useful for statusline integration). -function! go#jobcontrol#Spawn(bang, desc, args) +function! go#jobcontrol#Spawn(bang, desc, for, args) abort " autowrite is not enabled for jobs call go#cmd#autowrite() - let job = s:spawn(a:bang, a:desc, a:args) + let job = s:spawn(a:bang, a:desc, a:for, a:args) return job.id endfunction -" Statusline returns the current status of the job -function! go#jobcontrol#Statusline() abort - if empty(s:jobs) - return '' - endif - - let import_path = go#package#ImportPath(expand('%:p:h')) - - for job in values(s:jobs) - if job.importpath != import_path - continue - endif - - if job.state == "SUCCESS" - return '' - endif - - return printf("%s ... [%s]", job.desc, job.state) - endfor +" AddHandler adds a on_exit callback handler and returns the id. +function! go#jobcontrol#AddHandler(handler) abort + let i = len(s:handlers) + while has_key(s:handlers, string(i)) + let i += 1 + break + endwhile + let s:handlers[string(i)] = a:handler + return string(i) +endfunction - return '' +" RemoveHandler removes a callback handler by id. +function! go#jobcontrol#RemoveHandler(id) abort + unlet s:handlers[a:id] endfunction -" spawn spawns a go subcommand with the name and arguments with jobstart. Once -" a job is started a reference will be stored inside s:jobs. spawn changes the -" GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the -" current files folder. -function! s:spawn(bang, desc, args) - let job = { - \ 'desc': a:desc, - \ 'bang': a:bang, +" spawn spawns a go subcommand with the name and arguments with jobstart. Once a +" job is started a reference will be stored inside s:jobs. The job is started +" inside the current files folder. +function! s:spawn(bang, desc, for, args) abort + let status_type = a:args[0] + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': status_type, + \ 'state': "started", + \}) + + let job = { + \ 'desc': a:desc, + \ 'bang': a:bang, \ 'winnr': winnr(), - \ 'importpath': go#package#ImportPath(expand('%:p:h')), + \ 'importpath': go#package#ImportPath(), \ 'state': "RUNNING", \ 'stderr' : [], \ 'stdout' : [], \ 'on_stdout': function('s:on_stdout'), \ 'on_stderr': function('s:on_stderr'), \ 'on_exit' : function('s:on_exit'), + \ 'status_type' : status_type, + \ 'status_dir' : status_dir, + \ 'started_at' : started_at, + \ 'for' : a:for, \ } - " modify GOPATH if needed - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() - " execute go build in the files directory let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' @@ -83,9 +89,6 @@ function! s:spawn(bang, desc, args) execute cd . fnameescape(dir) - " restore back GOPATH - let $GOPATH = old_gopath - return job endfunction @@ -93,29 +96,57 @@ endfunction " references and also displaying errors in the quickfix window collected by " on_stderr handler. If there are no errors and a quickfix window is open, " it'll be closed. -function! s:on_exit(job_id, exit_status) +function! s:on_exit(job_id, exit_status, event) dict abort + let status = { + \ 'desc': 'last status', + \ 'type': self.status_type, + \ 'state': "success", + \ } + + if a:exit_status + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(self.started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(self.status_dir, status) + let std_combined = self.stderr + self.stdout + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + execute cd self.dir + + call s:callback_handlers_on_exit(s:jobs[a:job_id], a:exit_status, std_combined) + + let l:listtype = go#list#Type(self.for) if a:exit_status == 0 - call go#list#Clean(0) - call go#list#Window(0) + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) let self.state = "SUCCESS" - call go#util#EchoSuccess("SUCCESS") + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoSuccess("[" . self.status_type . "] SUCCESS") + endif + + execute cd . fnameescape(dir) return endif let self.state = "FAILED" - call go#util#EchoError("FAILED") - let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' - let dir = getcwd() - try - execute cd self.dir - let errors = go#tool#ParseErrors(std_combined) - let errors = go#tool#FilterValids(errors) - finally - execute cd . fnameescape(dir) - endtry + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoError("[" . self.status_type . "] FAILED") + endif + + let errors = go#tool#ParseErrors(std_combined) + let errors = go#tool#FilterValids(errors) + + execute cd . fnameescape(dir) if !len(errors) " failed to parse errors, output the original content @@ -125,8 +156,7 @@ function! s:on_exit(job_id, exit_status) " if we are still in the same windows show the list if self.winnr == winnr() - let l:listtype = "locationlist" - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, self.desc) call go#list#Window(l:listtype, len(errors)) if !empty(errors) && !self.bang call go#list#JumpToFirst(l:listtype) @@ -134,46 +164,27 @@ function! s:on_exit(job_id, exit_status) endif endfunction -" on_stdout is the stdout handler for jobstart(). It collects the output of -" stderr and stores them to the jobs internal stdout list. -function! s:on_stdout(job_id, data) - call extend(self.stdout, a:data) -endfunction - -" on_stderr is the stderr handler for jobstart(). It collects the output of -" stderr and stores them to the jobs internal stderr list. -function! s:on_stderr(job_id, data) - call extend(self.stderr, a:data) -endfunction - -" abort_all aborts all current jobs created with s:spawn() -function! s:abort_all() - if empty(s:jobs) +" callback_handlers_on_exit runs all handlers for job on exit event. +function! s:callback_handlers_on_exit(job, exit_status, data) abort + if empty(s:handlers) return endif - for id in keys(s:jobs) - if id > 0 - silent! call jobstop(id) - endif + for s:handler in values(s:handlers) + call s:handler(a:job, a:exit_status, a:data) endfor - - let s:jobs = {} endfunction -" abort aborts the job with the given name, where name is the first argument -" passed to s:spawn() -function! s:abort(path) - if empty(s:jobs) - return - endif +" on_stdout is the stdout handler for jobstart(). It collects the output of +" stderr and stores them to the jobs internal stdout list. +function! s:on_stdout(job_id, data, event) dict abort + call extend(self.stdout, a:data) +endfunction - for job in values(s:jobs) - if job.importpath == path && job.id > 0 - silent! call jobstop(job.id) - unlet s:jobs['job.id'] - endif - endfor +" on_stderr is the stderr handler for jobstart(). It collects the output of +" stderr and stores them to the jobs internal stderr list. +function! s:on_stderr(job_id, data, event) dict abort + call extend(self.stderr, a:data) endfunction -" vim:ts=2:sw=2:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/keyify.vim b/autoload/go/keyify.vim new file mode 100644 index 0000000..23ca0f3 --- /dev/null +++ b/autoload/go/keyify.vim @@ -0,0 +1,56 @@ +function! go#keyify#Keyify() + let bin_path = go#path#CheckBinPath("keyify") + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + + if empty(bin_path) || !exists('*json_decode') + return + endif + + " Get result of command as json, that contains `start`, `end` and `replacement` + let command = printf("%s -json %s:#%s", go#util#Shellescape(bin_path), + \ go#util#Shellescape(fname), go#util#OffsetCursor()) + let output = go#util#System(command) + silent! let result = json_decode(output) + + " We want to output the error message in case the result isn't a JSON + if type(result) != type({}) + call go#util#EchoError(s:chomp(output)) + return + endif + + " Because keyify returns the byte before the region we want, we goto the + " byte after that + execute "goto" result.start + 1 + let start = getpos('.') + execute "goto" result.end + let end = getpos('.') + + let vis_start = getpos("'<") + let vis_end = getpos("'>") + + " Replace contents between start and end with `replacement` + call setpos("'<", start) + call setpos("'>", end) + + let select = 'gv' + + " Make sure the visual mode is 'v', to avoid some bugs + normal! gv + if mode() !=# 'v' + let select .= 'v' + endif + + silent! execute "normal!" select."\"=result.replacement\p" + + " Replacement text isn't aligned, so it needs fix + normal! '= + + call setpos("'<", vis_start) + call setpos("'>", vis_end) +endfunction + +function! s:chomp(string) + return substitute(a:string, '\n\+$', '', '') +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/lint.vim b/autoload/go/lint.vim index 91247ad..5bf4edb 100644 --- a/autoload/go/lint.vim +++ b/autoload/go/lint.vim @@ -1,199 +1,329 @@ if !exists("g:go_metalinter_command") - let g:go_metalinter_command = "" + let g:go_metalinter_command = "" endif if !exists("g:go_metalinter_autosave_enabled") - let g:go_metalinter_autosave_enabled = ['vet', 'golint'] + let g:go_metalinter_autosave_enabled = ['vet', 'golint'] endif if !exists("g:go_metalinter_enabled") - let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] + let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] endif -if !exists("g:go_metalinter_deadline") - let g:go_metalinter_deadline = "5s" +if !exists("g:go_metalinter_excludes") + let g:go_metalinter_excludes = [] endif if !exists("g:go_golint_bin") - let g:go_golint_bin = "golint" + let g:go_golint_bin = "golint" endif if !exists("g:go_errcheck_bin") - let g:go_errcheck_bin = "errcheck" + let g:go_errcheck_bin = "errcheck" endif function! go#lint#Gometa(autosave, ...) abort - if a:0 == 0 - let goargs = expand('%:p:h') - else - let goargs = go#util#Shelljoin(a:000) + if a:0 == 0 + let goargs = shellescape(expand('%:p:h')) + else + let goargs = go#util#Shelljoin(a:000) + endif + + let bin_path = go#path#CheckBinPath("gometalinter") + if empty(bin_path) + return + endif + + let cmd = [bin_path] + let cmd += ["--disable-all"] + + if a:autosave || empty(g:go_metalinter_command) + " linters + let linters = a:autosave ? g:go_metalinter_autosave_enabled : g:go_metalinter_enabled + for linter in linters + let cmd += ["--enable=".linter] + endfor + + for exclude in g:go_metalinter_excludes + let cmd += ["--exclude=".exclude] + endfor + + " gometalinter has a --tests flag to tell its linters whether to run + " against tests. While not all of its linters respect this flag, for those + " that do, it means if we don't pass --tests, the linter won't run against + " test files. One example of a linter that will not run against tests if + " we do not specify this flag is errcheck. + let cmd += ["--tests"] + + " path + let cmd += [expand('%:p:h')] + else + " the user wants something else, let us use it. + let cmd += split(g:go_metalinter_command, " ") + endif + + " gometalinter has a default deadline of 5 seconds. + " + " For async mode (s:lint_job), we want to override the default deadline only + " if we have a deadline configured. + " + " For sync mode (go#util#System), always explicitly pass the 5 seconds + " deadline if there is no other deadline configured. If a deadline is + " configured, then use it. + + " Call gometalinter asynchronously. + if go#util#has_job() && has('lambda') + let deadline = get(g:, 'go_metalinter_deadline', 0) + if deadline != 0 + let cmd += ["--deadline=" . deadline] endif - let meta_command = "gometalinter --disable-all" - if a:autosave || empty(g:go_metalinter_command) - let bin_path = go#path#CheckBinPath("gometalinter") - if empty(bin_path) - return - endif - - if a:autosave - " include only messages for the active buffer - let meta_command .= " --include='^" . expand('%:p') . ".*$'" - endif - - " linters - let linters = a:autosave ? g:go_metalinter_autosave_enabled : g:go_metalinter_enabled - for linter in linters - let meta_command .= " --enable=".linter - endfor - - " deadline - let meta_command .= " --deadline=" . g:go_metalinter_deadline - - " path - let meta_command .= " " . goargs - else - " the user wants something else, let us use it. - let meta_command = g:go_metalinter_command - endif + call s:lint_job({'cmd': cmd}) + return + endif + + " We're calling gometalinter synchronously. + + let cmd += ["--deadline=" . get(g:, 'go_metalinter_deadline', "5s")] + + if a:autosave + " include only messages for the active buffer + let cmd += ["--include='^" . expand('%:p') . ".*$'"] + endif + + + let meta_command = join(cmd, " ") + + let out = go#util#System(meta_command) - " comment out the following two lines for debugging - " echo meta_command - " return - - let out = go#tool#ExecuteInDir(meta_command) - - let l:listtype = "quickfix" - if v:shell_error == 0 - redraw | echo - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - echon "vim-go: " | echohl Function | echon "[metalinter] PASS" | echohl None - else - " GoMetaLinter can output one of the two, so we look for both: - " ::[]: () - " ::: () - " This can be defined by the following errorformat: - let errformat = "%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m" - - " Parse and populate our location list - call go#list#ParseFormat(l:listtype, errformat, split(out, "\n")) - - let errors = go#list#Get(l:listtype) - call go#list#Window(l:listtype, len(errors)) - - if !a:autosave - call go#list#JumpToFirst(l:listtype) - endif + let l:listtype = go#list#Type("GoMetaLinter") + if go#util#ShellError() == 0 + redraw | echo + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + echon "vim-go: " | echohl Function | echon "[metalinter] PASS" | echohl None + else + " GoMetaLinter can output one of the two, so we look for both: + " ::[]: () + " ::: () + " This can be defined by the following errorformat: + let errformat = "%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m" + + " Parse and populate our location list + call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'GoMetaLinter') + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + + if !a:autosave + call go#list#JumpToFirst(l:listtype) endif + endif endfunction " Golint calls 'golint' on the current directory. Any warnings are populated in " the location list function! go#lint#Golint(...) abort - let bin_path = go#path#CheckBinPath(g:go_golint_bin) - if empty(bin_path) - return - endif - - if a:0 == 0 - let goargs = shellescape(expand('%')) - else - let goargs = go#util#Shelljoin(a:000) - endif - - let out = system(bin_path . " " . goargs) - if empty(out) - echon "vim-go: " | echohl Function | echon "[lint] PASS" | echohl None - return - endif - - let l:listtype = "quickfix" - call go#list#Parse(l:listtype, out) - let errors = go#list#Get(l:listtype) - call go#list#Window(l:listtype, len(errors)) - call go#list#JumpToFirst(l:listtype) + let bin_path = go#path#CheckBinPath(g:go_golint_bin) + if empty(bin_path) + return + endif + let bin_path = go#util#Shellescape(bin_path) + + if a:0 == 0 + let out = go#util#System(bin_path . " " . go#util#Shellescape(go#package#ImportPath())) + else + let out = go#util#System(bin_path . " " . go#util#Shelljoin(a:000)) + endif + + if empty(out) + echon "vim-go: " | echohl Function | echon "[lint] PASS" | echohl None + return + endif + + let l:listtype = go#list#Type("GoLint") + call go#list#Parse(l:listtype, out) + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + call go#list#JumpToFirst(l:listtype) endfunction " Vet calls 'go vet' on the current directory. Any warnings are populated in " the location list -function! go#lint#Vet(bang, ...) - call go#cmd#autowrite() - echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None - if a:0 == 0 - let out = go#tool#ExecuteInDir('go vet') - else - let out = go#tool#ExecuteInDir('go tool vet ' . go#util#Shelljoin(a:000)) - endif - - let l:listtype = "quickfix" - if v:shell_error - let errors = go#tool#ParseErrors(split(out, '\n')) - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) && !a:bang - call go#list#JumpToFirst(l:listtype) - endif - echon "vim-go: " | echohl ErrorMsg | echon "[vet] FAIL" | echohl None - else - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - redraw | echon "vim-go: " | echohl Function | echon "[vet] PASS" | echohl None +function! go#lint#Vet(bang, ...) abort + call go#cmd#autowrite() + echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None + if a:0 == 0 + let out = go#util#System('go vet ' . go#util#Shellescape(go#package#ImportPath())) + else + let out = go#util#System('go tool vet ' . go#util#Shelljoin(a:000)) + endif + + let l:listtype = go#list#Type("GoVet") + if go#util#ShellError() != 0 + let errors = go#tool#ParseErrors(split(out, '\n')) + call go#list#Populate(l:listtype, errors, 'Vet') + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) endif + echon "vim-go: " | echohl ErrorMsg | echon "[vet] FAIL" | echohl None + else + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + redraw | echon "vim-go: " | echohl Function | echon "[vet] PASS" | echohl None + endif endfunction " ErrCheck calls 'errcheck' for the given packages. Any warnings are populated in " the location list function! go#lint#Errcheck(...) abort - if a:0 == 0 - let goargs = go#package#ImportPath(expand('%:p:h')) - if goargs == -1 - echohl Error | echomsg "vim-go: package is not inside GOPATH src" | echohl None - return - endif - else - let goargs = go#util#Shelljoin(a:000) + if a:0 == 0 + let import_path = go#package#ImportPath() + if import_path == -1 + echohl Error | echomsg "vim-go: package is not inside GOPATH src" | echohl None + return + endif + else + let import_path = go#util#Shelljoin(a:000) + endif + + let bin_path = go#path#CheckBinPath(g:go_errcheck_bin) + if empty(bin_path) + return + endif + + echon "vim-go: " | echohl Identifier | echon "errcheck analysing ..." | echohl None + redraw + + let command = go#util#Shellescape(bin_path) . ' -abspath ' . import_path + let out = go#tool#ExecuteInDir(command) + + let l:listtype = go#list#Type("GoErrCheck") + if go#util#ShellError() != 0 + let errformat = "%f:%l:%c:\ %m, %f:%l:%c\ %#%m" + + " Parse and populate our location list + call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'Errcheck') + + let errors = go#list#Get(l:listtype) + if empty(errors) + echohl Error | echomsg "GoErrCheck returned error" | echohl None + echo out + return endif - let bin_path = go#path#CheckBinPath(g:go_errcheck_bin) - if empty(bin_path) - return + if !empty(errors) + echohl Error | echomsg "GoErrCheck found errors" | echohl None + call go#list#Populate(l:listtype, errors, 'Errcheck') + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) + call go#list#JumpToFirst(l:listtype) + endif endif + else + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + echon "vim-go: " | echohl Function | echon "[errcheck] PASS" | echohl None + endif + +endfunction + +function! go#lint#ToggleMetaLinterAutoSave() abort + if get(g:, "go_metalinter_autosave", 0) + let g:go_metalinter_autosave = 0 + call go#util#EchoProgress("auto metalinter disabled") + return + end + + let g:go_metalinter_autosave = 1 + call go#util#EchoProgress("auto metalinter enabled") +endfunction + +function s:lint_job(args) + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "gometalinter", + \ 'state': "analysing", + \}) + + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let l:listtype = go#list#Type("GoMetaLinter") + let l:errformat = '%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m' + + function! s:callback(chan, msg) closure + let old_errorformat = &errorformat + let &errorformat = l:errformat + try + if l:listtype == "locationlist" + lad a:msg + elseif l:listtype == "quickfix" + caddexpr a:msg + endif + finally + let &errorformat = old_errorformat + endtry + + " TODO(jinleileiking): give a configure to jump or not + let l:winnr = winnr() + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) - echon "vim-go: " | echohl Identifier | echon "errcheck analysing ..." | echohl None - redraw - - let command = bin_path . ' -abspath ' . goargs - let out = go#tool#ExecuteInDir(command) - - let l:listtype = "quickfix" - if v:shell_error - let errformat = "%f:%l:%c:\ %m, %f:%l:%c\ %#%m" - - " Parse and populate our location list - call go#list#ParseFormat(l:listtype, errformat, split(out, "\n")) - - let errors = go#list#Get(l:listtype) - - if empty(errors) - echohl Error | echomsg "GoErrCheck returned error" | echohl None - echo out - return - endif - - if !empty(errors) - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) - call go#list#JumpToFirst(l:listtype) - endif - endif - else - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - echon "vim-go: " | echohl Function | echon "[errcheck] PASS" | echohl None + exe l:winnr . "wincmd w" + endfunction + + function! s:exit_cb(job, exitval) closure + let status = { + \ 'desc': 'last status', + \ 'type': "gometaliner", + \ 'state': "finished", + \ } + + if a:exitval + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(status_dir, status) + + let errors = go#list#Get(l:listtype) + if empty(errors) + call go#list#Window(l:listtype, len(errors)) + elseif has("patch-7.4.2200") + if l:listtype == 'quickfix' + call setqflist([], 'a', {'title': 'GoMetaLinter'}) + else + call setloclist(0, [], 'a', {'title': 'GoMetaLinter'}) + endif + endif + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoSuccess("linting finished") endif + endfunction + + let start_options = { + \ 'callback': funcref("s:callback"), + \ 'exit_cb': funcref("s:exit_cb"), + \ } + + call job_start(a:args.cmd, start_options) + + call go#list#Clean(l:listtype) + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("linting started ...") + endif endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/list.vim b/autoload/go/list.vim index d91cfb1..472e0d3 100644 --- a/autoload/go/list.vim +++ b/autoload/go/list.vim @@ -1,126 +1,169 @@ if !exists("g:go_list_type") - let g:go_list_type = "" + let g:go_list_type = "" endif -" Window opens the list with the given height up to 10 lines maximum. -" Otherwise g:go_loclist_height is used. If no or zero height is given it -" closes the window -function! go#list#Window(listtype, ...) - let l:listtype = go#list#Type(a:listtype) - " we don't use lwindow to close the location list as we need also the - " ability to resize the window. So, we are going to use lopen and lclose - " for a better user experience. If the number of errors in a current - " location list increases/decreases, cwindow will not resize when a new - " updated height is passed. lopen in the other hand resizes the screen. - if !a:0 || a:1 == 0 - if l:listtype == "locationlist" - lclose - else - cclose - endif - return - endif +if !exists("g:go_list_type_commands") + let g:go_list_type_commands = {} +endif - let height = get(g:, "go_list_height", 0) - if height == 0 - " prevent creating a large location height for a large set of numbers - if a:1 > 10 - let height = 10 - else - let height = a:1 - endif +" Window opens the list with the given height up to 10 lines maximum. +" Otherwise g:go_loclist_height is used. +" +" If no or zero height is given it closes the window by default. +" To prevent this, set g:go_list_autoclose = 0 +function! go#list#Window(listtype, ...) abort + " we don't use lwindow to close the location list as we need also the + " ability to resize the window. So, we are going to use lopen and lclose + " for a better user experience. If the number of errors in a current + " location list increases/decreases, cwindow will not resize when a new + " updated height is passed. lopen in the other hand resizes the screen. + if !a:0 || a:1 == 0 + let autoclose_window = get(g:, 'go_list_autoclose', 1) + if autoclose_window + if a:listtype == "locationlist" + lclose + else + cclose + endif endif + return + endif - if l:listtype == "locationlist" - exe 'lopen ' . height + let height = get(g:, "go_list_height", 0) + if height == 0 + " prevent creating a large location height for a large set of numbers + if a:1 > 10 + let height = 10 else - exe 'copen ' . height + let height = a:1 endif + endif + + if a:listtype == "locationlist" + exe 'lopen ' . height + else + exe 'copen ' . height + endif endfunction -" Get returns the current list of items from the location list -function! go#list#Get(listtype) - let l:listtype = go#list#Type(a:listtype) - if l:listtype == "locationlist" - return getloclist(0) - else - return getqflist() - endif +" Get returns the current items from the list +function! go#list#Get(listtype) abort + if a:listtype == "locationlist" + return getloclist(0) + else + return getqflist() + endif endfunction -" Populate populate the location list with the given items -function! go#list#Populate(listtype, items) - let l:listtype = go#list#Type(a:listtype) - if l:listtype == "locationlist" - call setloclist(0, a:items, 'r') - else - call setqflist(a:items, 'r') - endif -endfunction +" Populate populate the list with the given items +function! go#list#Populate(listtype, items, title) abort + if a:listtype == "locationlist" + call setloclist(0, a:items, 'r') -function! go#list#PopulateWin(winnr, items) - call setloclist(a:winnr, a:items, 'r') + " The last argument ({what}) is introduced with 7.4.2200: + " https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640 + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif + else + call setqflist(a:items, 'r') + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif + endif endfunction -" Parse parses the given items based on the specified errorformat nad -" populates the location list. -function! go#list#ParseFormat(listtype, errformat, items) - let l:listtype = go#list#Type(a:listtype) - " backup users errorformat, will be restored once we are finished - let old_errorformat = &errorformat - - " parse and populate the location list - let &errorformat = a:errformat - if l:listtype == "locationlist" - lgetexpr a:items +" Parse parses the given items based on the specified errorformat and +" populates the list. +function! go#list#ParseFormat(listtype, errformat, items, title) abort + " backup users errorformat, will be restored once we are finished + let old_errorformat = &errorformat + + " parse and populate the location list + let &errorformat = a:errformat + try + if a:listtype == "locationlist" + lgetexpr a:items + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif else - cgetexpr a:items + cgetexpr a:items + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif endif - + finally "restore back let &errorformat = old_errorformat + endtry endfunction " Parse parses the given items based on the global errorformat and -" populates the location list. -function! go#list#Parse(listtype, items) - let l:listtype = go#list#Type(a:listtype) - if l:listtype == "locationlist" - lgetexpr a:items - else - cgetexpr a:items - endif +" populates the list. +function! go#list#Parse(listtype, items) abort + if a:listtype == "locationlist" + lgetexpr a:items + else + cgetexpr a:items + endif endfunction " JumpToFirst jumps to the first item in the location list -function! go#list#JumpToFirst(listtype) - let l:listtype = go#list#Type(a:listtype) - if l:listtype == "locationlist" - ll 1 - else - cc 1 - endif +function! go#list#JumpToFirst(listtype) abort + if a:listtype == "locationlist" + ll 1 + else + cc 1 + endif endfunction " Clean cleans the location list -function! go#list#Clean(listtype) - let l:listtype = go#list#Type(a:listtype) - if l:listtype == "locationlist" - lex [] - else - cex [] - endif +function! go#list#Clean(listtype) abort + if a:listtype == "locationlist" + lex [] + else + cex [] + endif endfunction -function! go#list#Type(listtype) - if g:go_list_type == "locationlist" - return "locationlist" - elseif g:go_list_type == "quickfix" - return "quickfix" - else - return a:listtype - endif +function! s:listtype(listtype) abort + if g:go_list_type == "locationlist" + return "locationlist" + elseif g:go_list_type == "quickfix" + return "quickfix" + endif + + return a:listtype +endfunction + +" s:default_list_type_commands is the defaults that will be used for each of +" the supported commands (see documentation for g:go_list_type_commands). When +" defining a default, quickfix should be used if the command operates on +" multiple files, while locationlist should be used if the command operates on a +" single file or buffer. Keys that begin with an underscore are not supported +" in g:go_list_type_commands. +let s:default_list_type_commands = { + \ "GoBuild": "quickfix", + \ "GoErrCheck": "quickfix", + \ "GoFmt": "locationlist", + \ "GoGenerate": "quickfix", + \ "GoInstall": "quickfix", + \ "GoLint": "quickfix", + \ "GoMetaLinter": "quickfix", + \ "GoModifyTags": "locationlist", + \ "GoRename": "quickfix", + \ "GoRun": "quickfix", + \ "GoTest": "quickfix", + \ "GoVet": "quickfix", + \ "_guru": "locationlist", + \ "_term": "locationlist", + \ "_job": "locationlist", + \ } + +function! go#list#Type(for) abort + let l:listtype = s:listtype(get(s:default_list_type_commands, a:for)) + if l:listtype == "0" + call go#util#EchoError(printf( + \ "unknown list type command value found ('%s'). Please open a bug report in the vim-go repo.", + \ a:for)) + let l:listtype = "quickfix" + endif + + return get(g:go_list_type_commands, a:for, l:listtype) endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/oracle.vim b/autoload/go/oracle.vim deleted file mode 100644 index 490b6b4..0000000 --- a/autoload/go/oracle.vim +++ /dev/null @@ -1,233 +0,0 @@ -" oracle.vim -- Vim integration for the Go oracle. -" -" Part of this plugin was taken directly from the oracle repo, however it's -" massively changed for a better integration into vim-go. Thanks Alan Donovan -" for the first iteration based on quickfix! - Fatih Arslan -" - -if !exists("g:go_oracle_bin") - let g:go_oracle_bin = "oracle" -endif - -" Parses (via regex) Oracle's 'plain' format output and puts them into a -" location list -func! s:loclist(output) - let llist = [] - " Parse GNU-style 'file:line.col-line.col: message' format. - let mx = '^\(\a:[\\/][^:]\+\|[^:]\+\):\(\d\+\):\(\d\+\):\(.*\)$' - for line in split(a:output, "\n") - let ml = matchlist(line, mx) - - " Ignore non-match lines or warnings - if ml == [] || ml[4] =~ '^ warning:' - continue - endif - - let item = { - \ 'filename': ml[1], - \ 'text': ml[4], - \ 'lnum': ml[2], - \ 'col': ml[3], - \} - let bnr = bufnr(fnameescape(ml[1])) - if bnr != -1 - let item['bufnr'] = bnr - endif - call add(llist, item) - endfor - call go#list#Populate("locationlist", llist) - call go#list#Window("locationlist", len(llist)) -endfun - -" This uses Vim's errorformat to parse the output from Oracle's 'plain output -" and put it into location list. I believe using errorformat is much more -" easier to use. If we need more power we can always switch back to parse it -" via regex. -func! s:loclistSecond(output) - " backup users errorformat, will be restored once we are finished - let old_errorformat = &errorformat - - " match two possible styles of errorformats: - " - " 'file:line.col-line2.col2: message' - " 'file:line:col: message' - " - " We discard line2 and col2 for the first errorformat, because it's not - " useful and location only has the ability to show one line and column - " number - let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m" - call go#list#ParseFormat("locationlist", errformat, split(a:output, "\n")) - - let errors = go#list#Get("locationlist") - call go#list#Window("locationlist", len(errors)) -endfun - -func! s:RunOracle(mode, selected, needs_package) range abort - let fname = expand('%:p') - let dname = expand('%:p:h') - let pkg = go#package#ImportPath(dname) - - if exists('g:go_oracle_scope') - " let the user defines the scope, must be a space separated string, - " example: 'fmt math net/http' - let scopes = split(get(g:, 'go_oracle_scope')) - elseif a:needs_package || exists('g:go_oracle_include_tests') && pkg != -1 - " give import path so it includes all _test.go files too - let scopes = [pkg] - else - " best usable way, only pass the package itself, without the test - " files - let scopes = go#tool#Files() - endif - - "return with a warning if the bin doesn't exist - let bin_path = go#path#CheckBinPath(g:go_oracle_bin) - if empty(bin_path) - return - endif - - if exists('g:go_oracle_tags') - let tags = get(g:, 'go_oracle_tags') - else - let tags = "" - endif - - if a:selected != -1 - let pos1 = go#util#Offset(line("'<"), col("'<")) - let pos2 = go#util#Offset(line("'>"), col("'>")) - let cmd = printf('%s -format plain -pos=%s:#%d,#%d -tags=%s %s', - \ bin_path, - \ shellescape(fname), pos1, pos2, tags, a:mode) - else - let pos = go#util#OffsetCursor() - let cmd = printf('%s -format plain -pos=%s:#%d -tags=%s %s', - \ bin_path, - \ shellescape(fname), pos, tags, a:mode) - endif - - " strip trailing slashes for each path in scoped. bug: - " https://github.com/golang/go/issues/14584 - let scopes = go#util#StripTrailingSlash(scopes) - - " now append each scope to the end as Oracle's scope parameter. It can be - " a packages or go files, dependent on the User's own choice. For more - " info check Oracle's User Manual section about scopes: - " https://docs.google.com/document/d/1SLk36YRjjMgKqe490mSRzOPYEDe0Y_WQNRv-EiFYUyw/view#heading=h.nwso96pj07q8 - let cmd .= ' ' . go#util#Shelljoin(scopes) - - echon "vim-go: " | echohl Identifier | echon "analysing ..." | echohl None - - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() - - let out = system(cmd) - - let $GOPATH = old_gopath - - if v:shell_error - " unfortunaly oracle outputs a very long stack trace that is not - " parsable to show the real error. But the main issue is usually the - " package which doesn't build. - redraw | echon "vim-go: " | echohl Statement | echon out | echohl None - return "" - endif - - return out -endfunc - -function! go#oracle#Scope(...) - if a:0 - if a:0 == 1 && a:1 == '""' - unlet g:go_oracle_scope - echon "vim-go: " | echohl Function | echon "oracle scope is cleared"| echohl None - else - let g:go_oracle_scope = join(a:000, ' ') - echon "vim-go: " | echohl Function | echon "oracle scope changed to: '". g:go_oracle_scope ."'" | echohl None - endif - - return - endif - - if !exists('g:go_oracle_scope') - echon "vim-go: " | echohl Function | echon "oracle scope is not set"| echohl None - else - echon "vim-go: " | echohl Function | echon "current oracle scope: '". g:go_oracle_scope ."'" | echohl None - endif -endfunction - -function! go#oracle#Tags(...) - if a:0 - if a:0 == 1 && a:1 == '""' - unlet g:go_oracle_tags - echon "vim-go: " | echohl Function | echon "oracle tags is cleared"| echohl None - else - let g:go_oracle_tags = a:1 - echon "vim-go: " | echohl Function | echon "oracle tags changed to: '". g:go_oracle_tags ."'" | echohl None - endif - - return - endif - - if !exists('g:go_oracle_tags') - echon "vim-go: " | echohl Function | echon "oracle tags is not set"| echohl None - else - echon "vim-go: " | echohl Function | echon "current oracle tags: '". g:go_oracle_tags ."'" | echohl None - endif -endfunction - -" Show 'implements' relation for selected package -function! go#oracle#Implements(selected) - let out = s:RunOracle('implements', a:selected, 0) - call s:loclistSecond(out) -endfunction - -" Describe selected syntax: definition, methods, etc -function! go#oracle#Describe(selected) - let out = s:RunOracle('describe', a:selected, 0) - call s:loclistSecond(out) -endfunction - -" Show possible targets of selected function call -function! go#oracle#Callees(selected) - let out = s:RunOracle('callees', a:selected, 1) - call s:loclistSecond(out) -endfunction - -" Show possible callers of selected function -function! go#oracle#Callers(selected) - let out = s:RunOracle('callers', a:selected, 1) - call s:loclistSecond(out) -endfunction - -" Show path from callgraph root to selected function -function! go#oracle#Callstack(selected) - let out = s:RunOracle('callstack', a:selected, 1) - call s:loclistSecond(out) -endfunction - -" Show free variables of selection -function! go#oracle#Freevars(selected) - " Freevars requires a selection - if a:selected == -1 - echon "vim-go: " | echohl Statement | echon "GoFreevars requires a selection (range) of code "| echohl None - return - endif - - let out = s:RunOracle('freevars', a:selected, 0) - call s:loclistSecond(out) -endfunction - -" Show send/receive corresponding to selected channel op -function! go#oracle#ChannelPeers(selected) - let out = s:RunOracle('peers', a:selected, 1) - call s:loclistSecond(out) -endfunction - -" Show all refs to entity denoted by selected identifier -function! go#oracle#Referrers(selected) - let out = s:RunOracle('referrers', a:selected, 0) - call s:loclistSecond(out) -endfunction - -" vim:ts=4:sw=4:et -" diff --git a/autoload/go/package.vim b/autoload/go/package.vim index 32b38ae..940423f 100644 --- a/autoload/go/package.vim +++ b/autoload/go/package.vim @@ -9,120 +9,124 @@ let s:goos = $GOOS let s:goarch = $GOARCH if len(s:goos) == 0 - if exists('g:golang_goos') - let s:goos = g:golang_goos - elseif has('win32') || has('win64') - let s:goos = 'windows' - elseif has('macunix') - let s:goos = 'darwin' - else - let s:goos = '*' - endif + if exists('g:golang_goos') + let s:goos = g:golang_goos + elseif has('win32') || has('win64') + let s:goos = 'windows' + elseif has('macunix') + let s:goos = 'darwin' + else + let s:goos = '*' + endif endif if len(s:goarch) == 0 - if exists('g:golang_goarch') - let s:goarch = g:golang_goarch - else - let s:goarch = '*' - endif + if exists('g:golang_goarch') + let s:goarch = g:golang_goarch + else + let s:goarch = '*' + endif endif -function! go#package#Paths() - let dirs = [] - - if !exists("s:goroot") - if executable('go') - let s:goroot = substitute(system('go env GOROOT'), '\n', '', 'g') - if v:shell_error - echomsg '''go env GOROOT'' failed' - endif - else - let s:goroot = $GOROOT - endif - endif +function! go#package#Paths() abort + let dirs = [] - if len(s:goroot) != 0 && isdirectory(s:goroot) - let dirs += [s:goroot] + if !exists("s:goroot") + if executable('go') + let s:goroot = go#util#env("goroot") + if go#util#ShellError() != 0 + echomsg '''go env GOROOT'' failed' + endif + else + let s:goroot = $GOROOT endif + endif - let workspaces = split($GOPATH, go#util#PathListSep()) - if workspaces != [] - let dirs += workspaces - endif + if len(s:goroot) != 0 && isdirectory(s:goroot) + let dirs += [s:goroot] + endif + + let workspaces = split(go#path#Default(), go#util#PathListSep()) + if workspaces != [] + let dirs += workspaces + endif - return dirs + return dirs endfunction -function! go#package#ImportPath(arg) - let path = fnamemodify(resolve(a:arg), ':p') - let dirs = go#package#Paths() +" ImportPath returns the import path in the current directory it was executed +function! go#package#ImportPath() abort + let out = go#tool#ExecuteInDir("go list") + if go#util#ShellError() != 0 + return -1 + endif - for dir in dirs - if len(dir) && match(path, dir) == 0 - let workspace = dir - endif - endfor + let import_path = split(out, '\n')[0] - if !exists('workspace') - return -1 - endif + " go list returns '_CURRENTDIRECTORY' if the directory is not inside GOPATH. + " Check it and retun an error if that is the case + if import_path[0] ==# '_' + return -1 + endif - let srcdir = substitute(workspace . '/src/', '//', '/', '') - return substitute(path, srcdir, '', '') + return import_path endfunction -function! go#package#FromPath(arg) - let path = fnamemodify(resolve(a:arg), ':p') - let dirs = go#package#Paths() - for dir in dirs - if len(dir) && match(path, dir) == 0 - let workspace = dir - endif - endfor +function! go#package#FromPath(arg) abort + let path = fnamemodify(resolve(a:arg), ':p') + let dirs = go#package#Paths() - if !exists('workspace') - return -1 - endif - - if isdirectory(path) - return substitute(path, workspace . 'src/', '', '') - else - return substitute(substitute(path, workspace . 'src/', '', ''), - \ '/' . fnamemodify(path, ':t'), '', '') + for dir in dirs + if len(dir) && match(path, dir) == 0 + let workspace = dir + break endif + endfor + + if !exists('workspace') + return -1 + endif + + let path = substitute(path, '/*$', '', '') + let workspace = substitute(workspace . '/src/', '/+', '', '') + if isdirectory(path) + return substitute(path, workspace, '', '') + else + return substitute(substitute(path, workspace, '', ''), + \ '/' . fnamemodify(path, ':t'), '', '') + endif endfunction -function! go#package#CompleteMembers(package, member) - silent! let content = system('godoc ' . a:package) - if v:shell_error || !len(content) - return [] - endif - let lines = filter(split(content, "\n"),"v:val !~ '^\\s\\+$'") - try - let mx1 = '^\s\+\(\S+\)\s\+=\s\+.*' - let mx2 = '^\%(const\|var\|type\|func\) \([A-Z][^ (]\+\).*' - let candidates = map(filter(copy(lines), 'v:val =~ mx1'), - \ 'substitute(v:val, mx1, "\\1", "")') - \ + map(filter(copy(lines), 'v:val =~ mx2'), - \ 'substitute(v:val, mx2, "\\1", "")') - return filter(candidates, '!stridx(v:val, a:member)') - catch - return [] - endtry +function! go#package#CompleteMembers(package, member) abort + silent! let content = go#util#System('godoc ' . a:package) + if go#util#ShellError() || !len(content) + return [] + endif + let lines = filter(split(content, "\n"),"v:val !~ '^\\s\\+$'") + try + let mx1 = '^\s\+\(\S+\)\s\+=\s\+.*' + let mx2 = '^\%(const\|var\|type\|func\) \([A-Z][^ (]\+\).*' + let candidates = map(filter(copy(lines), 'v:val =~ mx1'), + \ 'substitute(v:val, mx1, "\\1", "")') + \ + map(filter(copy(lines), 'v:val =~ mx2'), + \ 'substitute(v:val, mx2, "\\1", "")') + return filter(candidates, '!stridx(v:val, a:member)') + catch + return [] + endtry endfunction -function! go#package#Complete(ArgLead, CmdLine, CursorPos) - let words = split(a:CmdLine, '\s\+', 1) +function! go#package#Complete(ArgLead, CmdLine, CursorPos) abort + let words = split(a:CmdLine, '\s\+', 1) - " do not complete package members for these commands - let neglect_commands = ["GoImportAs", "GoOracleScope"] + " do not complete package members for these commands + let neglect_commands = ["GoImportAs", "GoGuruScope"] - if len(words) > 2 && index(neglect_commands, words[0]) == -1 - " Complete package members - return go#package#CompleteMembers(words[1], words[2]) - endif + if len(words) > 2 && index(neglect_commands, words[0]) == -1 + " Complete package members + return go#package#CompleteMembers(words[1], words[2]) + endif let dirs = go#package#Paths() @@ -157,4 +161,4 @@ function! go#package#Complete(ArgLead, CmdLine, CursorPos) return sort(keys(ret)) endfunction -" vim:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/path.vim b/autoload/go/path.vim index 295e103..8d91f26 100644 --- a/autoload/go/path.vim +++ b/autoload/go/path.vim @@ -4,171 +4,193 @@ " :GoPath is used let s:initial_go_path = "" -" GoPath sets or returns the current GOPATH. If no arguments are passed it +" GoPath sets or echos the current GOPATH. If no arguments are passed it " echoes the current GOPATH, if an argument is passed it replaces the current " GOPATH with it. If two double quotes are passed (the empty string in go), " it'll clear the GOPATH and will restore to the initial GOPATH. -function! go#path#GoPath(...) - " we have an argument, replace GOPATH - if len(a:000) - " clears the current manually set GOPATH and restores it to the - " initial GOPATH, which was set when Vim was started. - if len(a:000) == 1 && a:1 == '""' - if !empty(s:initial_go_path) - let $GOPATH = s:initial_go_path - let s:initial_go_path = "" - endif - - echon "vim-go: " | echohl Function | echon "GOPATH restored to ". $GOPATH | echohl None - return - endif - - echon "vim-go: " | echohl Function | echon "GOPATH changed to ". a:1 | echohl None - let s:initial_go_path = $GOPATH - let $GOPATH = a:1 - return +function! go#path#GoPath(...) abort + " no argument, show GOPATH + if len(a:000) == 0 + echo go#path#Default() + return + endif + + " we have an argument, replace GOPATH + " clears the current manually set GOPATH and restores it to the + " initial GOPATH, which was set when Vim was started. + if len(a:000) == 1 && a:1 == '""' + if !empty(s:initial_go_path) + let $GOPATH = s:initial_go_path + let s:initial_go_path = "" endif - echo go#path#Detect() -endfunction + echon "vim-go: " | echohl Function | echon "GOPATH restored to ". $GOPATH | echohl None + return + endif -" Default returns the default GOPATH. If there is a single GOPATH it returns -" it. For multiple GOPATHS separated with a the OS specific separator, only -" the first one is returned -function! go#path#Default() - let go_paths = split($GOPATH, go#util#PathListSep()) + echon "vim-go: " | echohl Function | echon "GOPATH changed to ". a:1 | echohl None + let s:initial_go_path = $GOPATH + let $GOPATH = a:1 +endfunction - if len(go_paths) == 1 - return $GOPATH - endif +" Default returns the default GOPATH. If GOPATH is not set, it uses the +" default GOPATH set starting with Go 1.8. This GOPATH can be retrieved via +" 'go env GOPATH' +function! go#path#Default() abort + if $GOPATH == "" + " use default GOPATH via go env + return go#util#env("gopath") + endif - return go_paths[0] + return $GOPATH endfunction " HasPath checks whether the given path exists in GOPATH environment variable " or not -function! go#path#HasPath(path) - let go_paths = split($GOPATH, go#util#PathListSep()) - let last_char = strlen(a:path) - 1 - - " check cases of '/foo/bar/' and '/foo/bar' - if a:path[last_char] == go#util#PathSep() - let withSep = a:path - let noSep = strpart(a:path, 0, last_char) - else - let withSep = a:path . go#util#PathSep() - let noSep = a:path - endif - - let hasA = index(go_paths, withSep) != -1 - let hasB = index(go_paths, noSep) != -1 - return hasA || hasB +function! go#path#HasPath(path) abort + let go_paths = split(go#path#Default(), go#util#PathListSep()) + let last_char = strlen(a:path) - 1 + + " check cases of '/foo/bar/' and '/foo/bar' + if a:path[last_char] == go#util#PathSep() + let withSep = a:path + let noSep = strpart(a:path, 0, last_char) + else + let withSep = a:path . go#util#PathSep() + let noSep = a:path + endif + + let hasA = index(go_paths, withSep) != -1 + let hasB = index(go_paths, noSep) != -1 + return hasA || hasB endfunction " Detect returns the current GOPATH. If a package manager is used, such as " Godeps, GB, it will modify the GOPATH so those directories take precedence " over the current GOPATH. It also detects diretories whose are outside " GOPATH. -function! go#path#Detect() - let gopath = $GOPATH +function! go#path#Detect() abort + let gopath = go#path#Default() - " don't lookup for godeps if autodetect is disabled. - if !get(g:, "go_autodetect_gopath", 1) - return gopath - endif + let current_dir = fnameescape(expand('%:p:h')) - let current_dir = fnameescape(expand('%:p:h')) + " TODO(arslan): this should be changed so folders or files should be + " fetched from a customizable list. The user should define any new package + " management tool by it's own. - " TODO(arslan): this should be changed so folders or files should be - " fetched from a customizable list. The user should define any new package - " management tool by it's own. + " src folders outside $GOPATH + let src_roots = finddir("src", current_dir .";", -1) - " src folder outside $GOPATH - let src_root = finddir("src", current_dir .";") - if !empty(src_root) - let src_path = fnamemodify(src_root, ':p:h:h') . go#util#PathSep() + " for cases like GOPATH/src/foo/src/bar, pick up GOPATH/src instead of + " GOPATH/src/foo/src + let src_root = "" + if len(src_roots) > 0 + let src_root = src_roots[-1] + endif - " gb vendor plugin - " (https://github.com/constabulary/gb/tree/master/cmd/gb-vendor) - let gb_vendor_root = src_path . "vendor" . go#util#PathSep() - if isdirectory(gb_vendor_root) && !go#path#HasPath(gb_vendor_root) - let gopath = gb_vendor_root . go#util#PathListSep() . gopath - endif + if !empty(src_root) + let src_path = fnamemodify(src_root, ':p:h:h') . go#util#PathSep() - if !go#path#HasPath(src_path) - let gopath = src_path . go#util#PathListSep() . gopath - endif + " gb vendor plugin + " (https://github.com/constabulary/gb/tree/master/cmd/gb-vendor) + let gb_vendor_root = src_path . "vendor" . go#util#PathSep() + if isdirectory(gb_vendor_root) && !go#path#HasPath(gb_vendor_root) + let gopath = gb_vendor_root . go#util#PathListSep() . gopath endif - " Godeps - let godeps_root = finddir("Godeps", current_dir .";") - if !empty(godeps_root) - let godeps_path = join([fnamemodify(godeps_root, ':p:h:h'), "Godeps", "_workspace" ], go#util#PathSep()) + if !go#path#HasPath(src_path) + let gopath = src_path . go#util#PathListSep() . gopath + endif + endif + + " Godeps + let godeps_root = finddir("Godeps", current_dir .";") + if !empty(godeps_root) + let godeps_path = join([fnamemodify(godeps_root, ':p:h:h'), "Godeps", "_workspace" ], go#util#PathSep()) - if !go#path#HasPath(godeps_path) - let gopath = godeps_path . go#util#PathListSep() . gopath - endif + if !go#path#HasPath(godeps_path) + let gopath = godeps_path . go#util#PathListSep() . gopath endif + endif - return gopath + " Fix up the case where initial $GOPATH is empty, + " and we end up with a trailing : + let gopath = substitute(gopath, ":$", "", "") + return gopath endfunction - " BinPath returns the binary path of installed go tools. -function! go#path#BinPath() - let bin_path = "" - - " check if our global custom path is set, if not check if $GOBIN is set so - " we can use it, otherwise use $GOPATH + '/bin' - if exists("g:go_bin_path") - let bin_path = g:go_bin_path - elseif $GOBIN != "" - let bin_path = $GOBIN - elseif $GOPATH != "" - let bin_path = expand(go#path#Default() . "/bin/") - else - " could not find anything +function! go#path#BinPath() abort + let bin_path = "" + + " check if our global custom path is set, if not check if $GOBIN is set so + " we can use it, otherwise use default GOPATH + if exists("g:go_bin_path") + let bin_path = g:go_bin_path + elseif $GOBIN != "" + let bin_path = $GOBIN + else + let go_paths = split(go#path#Default(), go#util#PathListSep()) + if len(go_paths) == 0 + return "" "nothing found endif + let bin_path = expand(go_paths[0] . "/bin/") + endif - return bin_path + return bin_path endfunction " CheckBinPath checks whether the given binary exists or not and returns the " path of the binary. It returns an empty string doesn't exists. -function! go#path#CheckBinPath(binpath) - " remove whitespaces if user applied something like 'goimports ' - let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') +function! go#path#CheckBinPath(binpath) abort + " remove whitespaces if user applied something like 'goimports ' + let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') + " save off original path + let old_path = $PATH + + " check if we have an appropriate bin_path + let go_bin_path = go#path#BinPath() + if !empty(go_bin_path) + " append our GOBIN and GOPATH paths and be sure they can be found there... + " let us search in our GOBIN and GOPATH paths + let $PATH = go_bin_path . go#util#PathListSep() . $PATH + endif - " if it's in PATH just return it - if executable(binpath) - return binpath + " if it's in PATH just return it + if executable(binpath) + if exists('*exepath') + let binpath = exepath(binpath) endif + let $PATH = old_path - " just get the basename - let basename = fnamemodify(binpath, ":t") - - " check if we have an appropriate bin_path - let go_bin_path = go#path#BinPath() - if empty(go_bin_path) - echo "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it." - return "" + if go#util#IsUsingCygwinShell() == 1 + return go#path#CygwinPath(binpath) endif - " append our GOBIN and GOPATH paths and be sure they can be found there... - " let us search in our GOBIN and GOPATH paths - let old_path = $PATH - let $PATH = $PATH . go#util#PathListSep() .go_bin_path - - if !executable(basename) - echo "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it." - " restore back! - let $PATH = old_path - return "" - endif + return binpath + endif + " just get the basename + let basename = fnamemodify(binpath, ":t") + if !executable(basename) + call go#util#EchoError(printf("could not find '%s'. Run :GoInstallBinaries to fix it", basename)) + + " restore back! let $PATH = old_path + return "" + endif + + let $PATH = old_path + + if go#util#IsUsingCygwinShell() == 1 + return go#path#CygwinPath(a:binpath) + endif + + return go_bin_path . go#util#PathSep() . basename +endfunction - return go_bin_path . go#util#PathSep() . basename +function! go#path#CygwinPath(path) + return substitute(a:path, '\\', '/', "g") endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/play.vim b/autoload/go/play.vim index 4b26fc1..2cf5009 100644 --- a/autoload/go/play.vim +++ b/autoload/go/play.vim @@ -1,94 +1,73 @@ if !exists("g:go_play_open_browser") - let g:go_play_open_browser = 1 + let g:go_play_open_browser = 1 endif -function! go#play#Share(count, line1, line2) - if !executable('curl') - echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None - return - endif +function! go#play#Share(count, line1, line2) abort + if !executable('curl') + echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None + return + endif - let content = join(getline(a:line1, a:line2), "\n") - let share_file = tempname() - call writefile(split(content, "\n"), share_file, "b") + let content = join(getline(a:line1, a:line2), "\n") + let share_file = tempname() + call writefile(split(content, "\n"), share_file, "b") - let command = "curl -s -X POST http://play.golang.org/share --data-binary '@".share_file."'" - let snippet_id = system(command) + let command = "curl -s -X POST https://play.golang.org/share --data-binary '@".share_file."'" + let snippet_id = go#util#System(command) - " we can remove the temp file because it's now posted. - call delete(share_file) + " we can remove the temp file because it's now posted. + call delete(share_file) - if v:shell_error - echo 'A error has occured. Run this command to see what the problem is:' - echo command - return - endif + if go#util#ShellError() != 0 + echo 'A error has occurred. Run this command to see what the problem is:' + echo command + return + endif - let url = "http://play.golang.org/p/".snippet_id + let url = "http://play.golang.org/p/".snippet_id - " copy to clipboard - if has('unix') && !has('xterm_clipboard') && !has('clipboard') - let @" = url - else - let @+ = url - endif + " copy to clipboard + if has('unix') && !has('xterm_clipboard') && !has('clipboard') + let @" = url + else + let @+ = url + endif - if g:go_play_open_browser != 0 - call go#tool#OpenBrowser(url) - endif + if g:go_play_open_browser != 0 + call go#tool#OpenBrowser(url) + endif - echo "vim-go: snippet uploaded: ".url + echo "vim-go: snippet uploaded: ".url endfunction -function! s:get_visual_content() - let save_regcont = @" - let save_regtype = getregtype('"') - silent! normal! gvy - let content = @" - call setreg('"', save_regcont, save_regtype) - return content +function! s:get_visual_content() abort + let save_regcont = @" + let save_regtype = getregtype('"') + silent! normal! gvy + let content = @" + call setreg('"', save_regcont, save_regtype) + return content endfunction " modified version of " http://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript " another function that returns the content of visual selection, it's not used " but might be useful in the future -function! s:get_visual_selection() - let [lnum1, col1] = getpos("'<")[1:2] - let [lnum2, col2] = getpos("'>")[1:2] - - " check if the the visual mode is used before - if lnum1 == 0 || lnum2 == 0 || col1 == 0 || col2 == 0 - return - endif - - let lines = getline(lnum1, lnum2) - let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)] - let lines[0] = lines[0][col1 - 1:] - return join(lines, "\n") +function! s:get_visual_selection() abort + let [lnum1, col1] = getpos("'<")[1:2] + let [lnum2, col2] = getpos("'>")[1:2] + + " check if the the visual mode is used before + if lnum1 == 0 || lnum2 == 0 || col1 == 0 || col2 == 0 + return + endif + + let lines = getline(lnum1, lnum2) + let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)] + let lines[0] = lines[0][col1 - 1:] + return join(lines, "\n") endfunction -" following two functions are from: https://github.com/mattn/gist-vim -" thanks @mattn -function! s:get_browser_command() - let go_play_browser_command = get(g:, 'go_play_browser_command', '') - if go_play_browser_command == '' - if has('win32') || has('win64') - let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%' - elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin' - let go_play_browser_command = 'open %URL%' - elseif executable('xdg-open') - let go_play_browser_command = 'xdg-open %URL%' - elseif executable('firefox') - let go_play_browser_command = 'firefox %URL% &' - else - let go_play_browser_command = '' - endif - endif - return go_play_browser_command -endfunction - - -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/rename.vim b/autoload/go/rename.vim index 98c5fa3..3af9dcf 100644 --- a/autoload/go/rename.vim +++ b/autoload/go/rename.vim @@ -1,69 +1,160 @@ if !exists("g:go_gorename_bin") - let g:go_gorename_bin = "gorename" + let g:go_gorename_bin = "gorename" endif -if !exists("g:go_gorename_prefill") - let g:go_gorename_prefill = 1 -endif +" Set the default value. A value of "1" is a shortcut for this, for +" compatibility reasons. +function! s:default() abort + if !exists("g:go_gorename_prefill") || g:go_gorename_prefill == 1 + let g:go_gorename_prefill = 'expand("") =~# "^[A-Z]"' . + \ '? go#util#pascalcase(expand(""))' . + \ ': go#util#camelcase(expand(""))' + endif +endfunction +call s:default() -function! go#rename#Rename(bang, ...) - let to = "" - if a:0 == 0 - let from = expand("") - let ask = printf("vim-go: rename '%s' to: ", from) - if g:go_gorename_prefill - let to = input(ask, from) - else - let to = input(ask) - endif - redraw! - if empty(to) - return - endif +function! go#rename#Rename(bang, ...) abort + call s:default() + + let to_identifier = "" + if a:0 == 0 + let ask = printf("vim-go: rename '%s' to: ", expand("")) + if g:go_gorename_prefill != '' + let to_identifier = input(ask, eval(g:go_gorename_prefill)) else - let to = a:1 + let to_identifier = input(ask) + endif + redraw! + if empty(to_identifier) + return endif + else + let to_identifier = a:1 + endif + + " return with a warning if the bin doesn't exist + let bin_path = go#path#CheckBinPath(g:go_gorename_bin) + if empty(bin_path) + return + endif + + let fname = expand('%:p') + let pos = go#util#OffsetCursor() + let offset = printf('%s:#%d', fname, pos) + + " no need to escape for job call + let bin_path = go#util#has_job() ? bin_path : shellescape(bin_path) + let offset = go#util#has_job() ? offset : shellescape(offset) + let to_identifier = go#util#has_job() ? to_identifier : shellescape(to_identifier) + + let cmd = [bin_path, "-offset", offset, "-to", to_identifier] + + " check for any tags + if exists('g:go_build_tags') + let tags = get(g:, 'go_build_tags') + call extend(cmd, ["-tags", tags]) + endif + + if go#util#has_job() + call go#util#EchoProgress(printf("renaming to '%s' ...", to_identifier)) + call s:rename_job({ + \ 'cmd': cmd, + \ 'bang': a:bang, + \}) + return + endif + + let command = join(cmd, " ") + let out = go#tool#ExecuteInDir(command) + + let splitted = split(out, '\n') + call s:parse_errors(go#util#ShellError(), a:bang, splitted) +endfunction + +function s:rename_job(args) + let messages = [] + function! s:callback(chan, msg) closure + call add(messages, a:msg) + endfunction - "return with a warning if the bin doesn't exist - let bin_path = go#path#CheckBinPath(g:go_gorename_bin) - if empty(bin_path) - return + let status_dir = expand('%:p:h') + + function! s:exit_cb(job, exitval) closure + let status = { + \ 'desc': 'last status', + \ 'type': "gorename", + \ 'state': "finished", + \ } + + if a:exitval + let status.state = "failed" endif - let fname = expand('%:p') - let pos = go#util#OffsetCursor() - let cmd = printf('%s -offset %s -to %s', shellescape(bin_path), shellescape(printf('%s:#%d', fname, pos)), shellescape(to)) - - let out = go#tool#ExecuteInDir(cmd) - - " strip out newline on the end that gorename puts. If we don't remove, it - " will trigger the 'Hit ENTER to continue' prompt - let clean = split(out, '\n') - - let l:listtype = "quickfix" - if v:shell_error - let errors = go#tool#ParseErrors(split(out, '\n')) - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !empty(errors) && !a:bang - call go#list#JumpToFirst(l:listtype) - elseif empty(errors) - " failed to parse errors, output the original content - call go#util#EchoError(out) - endif - return - else - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - redraw | echon "vim-go: " | echohl Function | echon clean[0] | echohl None + call go#statusline#Update(status_dir, status) + + call s:parse_errors(a:exitval, a:args.bang, messages) + endfunction + + let start_options = { + \ 'callback': funcref("s:callback"), + \ 'exit_cb': funcref("s:exit_cb"), + \ } + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "gorename", + \ 'state': "started", + \}) + + call job_start(a:args.cmd, start_options) +endfunction + +function s:parse_errors(exit_val, bang, out) + " reload all files to reflect the new changes. We explicitly call + " checktime to trigger a reload of all files. See + " http://www.mail-archive.com/vim@vim.org/msg05900.html for more info + " about the autoread bug + let current_autoread = &autoread + set autoread + silent! checktime + let &autoread = current_autoread + + let l:listtype = go#list#Type("GoRename") + if a:exit_val != 0 + call go#util#EchoError("FAILED") + let errors = go#tool#ParseErrors(a:out) + call go#list#Populate(l:listtype, errors, 'Rename') + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + elseif empty(errors) + " failed to parse errors, output the original content + call go#util#EchoError(a:out) endif - " refresh the buffer so we can see the new content - " TODO(arslan): also find all other buffers and refresh them too. For this - " we need a way to get the list of changes from gorename upon an success - " change. - silent execute ":e" + return + endif + + " strip out newline on the end that gorename puts. If we don't remove, it + " will trigger the 'Hit ENTER to continue' prompt + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + call go#util#EchoSuccess(a:out[0]) + + " refresh the buffer so we can see the new content + " TODO(arslan): also find all other buffers and refresh them too. For this + " we need a way to get the list of changes from gorename upon an success + " change. + silent execute ":e" +endfunction + +" Commandline completion: original, unexported camelCase, and exported +" CamelCase. +function! go#rename#Complete(lead, cmdline, cursor) + let l:word = expand('') + return filter(uniq(sort( + \ [l:word, go#util#camelcase(l:word), go#util#pascalcase(l:word)])), + \ 'strpart(v:val, 0, len(a:lead)) == a:lead') endfunction -" vim:ts=4:sw=4:et -" +" vim: sw=2 ts=2 et diff --git a/autoload/go/statusline.vim b/autoload/go/statusline.vim new file mode 100644 index 0000000..6a4f0bf --- /dev/null +++ b/autoload/go/statusline.vim @@ -0,0 +1,112 @@ +" Statusline +"""""""""""""""""""""""""""""""" + +" s:statuses is a global reference to all statuses. It stores the statuses per +" import paths (map[string]status), where each status is unique per its +" type. Current status dict is in form: +" { +" 'desc' : 'Job description', +" 'state' : 'Job state, such as success, failure, etc..', +" 'type' : 'Job type, such as build, test, etc..' +" 'created_at' : 'Time it was created as seconds since 1st Jan 1970' +" } +let s:statuses = {} + +" timer_id for cleaner +let s:timer_id = 0 + +" last_status stores the last generated text per status +let s:last_status = "" + +" Show returns the current status of the job for 20 seconds (configurable). It +" displays it in form of 'desc: [type|state]' if there is any state available, +" if not it returns an empty string. This function should be plugged directly +" into the statusline. +function! go#statusline#Show() abort + " lazy initialiation of the cleaner + if !s:timer_id + " clean every 60 seconds all statuses + let interval = get(g:, 'go_statusline_duration', 60000) + let s:timer_id = timer_start(interval, function('go#statusline#Clear'), {'repeat': -1}) + endif + + " nothing to show + if empty(s:statuses) + return '' + endif + + let status_dir = expand('%:p:h') + + if !has_key(s:statuses, status_dir) + return '' + endif + + let status = s:statuses[status_dir] + if !has_key(status, 'desc') || !has_key(status, 'state') || !has_key(status, 'type') + return '' + endif + + let status_text = printf("[%s|%s]", status.type, status.state) + if empty(status_text) + return '' + endif + + " only update highlight if status has changed. + if status_text != s:last_status + if status.state =~ "success" || status.state =~ "finished" || status.state =~ "pass" + hi goStatusLineColor cterm=bold ctermbg=76 ctermfg=22 + elseif status.state =~ "started" || status.state =~ "analysing" || status.state =~ "compiling" + hi goStatusLineColor cterm=bold ctermbg=208 ctermfg=88 + elseif status.state =~ "failed" + hi goStatusLineColor cterm=bold ctermbg=196 ctermfg=52 + endif + endif + + let s:last_status = status_text + return status_text +endfunction + +" Update updates (adds) the statusline for the given status_dir with the +" given status dict. It overrides any previously set status. +function! go#statusline#Update(status_dir, status) abort + let a:status.created_at = reltime() + let s:statuses[a:status_dir] = a:status + + " force to update the statusline, otherwise the user needs to move the + " cursor + exe 'let &ro = &ro' + + " before we stop the timer, check if we have any previous jobs to be cleaned + " up. Otherwise every job will reset the timer when this function is called + " and thus old jobs will never be cleaned + call go#statusline#Clear(0) + + " also reset the timer, so the user has time to see it in the statusline. + " Setting the timer_id to 0 will trigger a new cleaner routine. + call timer_stop(s:timer_id) + let s:timer_id = 0 +endfunction + +" Clear clears all currently stored statusline data. The timer_id argument is +" just a placeholder so we can pass it to a timer_start() function if needed. +function! go#statusline#Clear(timer_id) abort + for [status_dir, status] in items(s:statuses) + let elapsed_time = reltimestr(reltime(status.created_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + + if str2nr(elapsed_time) > 10 + call remove(s:statuses, status_dir) + endif + endfor + + if len(s:statuses) == 0 + let s:statuses = {} + endif + + " force to update the statusline, otherwise the user needs to move the + " cursor + exe 'let &ro = &ro' +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/tags.vim b/autoload/go/tags.vim new file mode 100644 index 0000000..af030d2 --- /dev/null +++ b/autoload/go/tags.vim @@ -0,0 +1,214 @@ +" mapped to :GoAddTags +function! go#tags#Add(start, end, count, ...) abort + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + let offset = 0 + if a:count == -1 + let offset = go#util#OffsetCursor() + endif + + let test_mode = 0 + call call("go#tags#run", [a:start, a:end, offset, "add", fname, test_mode] + a:000) +endfunction + +" mapped to :GoRemoveTags +function! go#tags#Remove(start, end, count, ...) abort + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + let offset = 0 + if a:count == -1 + let offset = go#util#OffsetCursor() + endif + + let test_mode = 0 + call call("go#tags#run", [a:start, a:end, offset, "remove", fname, test_mode] + a:000) +endfunction + +" run runs gomodifytag. This is an internal test so we can test it +function! go#tags#run(start, end, offset, mode, fname, test_mode, ...) abort + " do not split this into multiple lines, somehow tests fail in that case + let args = {'mode': a:mode,'start': a:start,'end': a:end,'offset': a:offset,'fname': a:fname,'cmd_args': a:000} + + if &modified + let args["modified"] = 1 + endif + + let result = s:create_cmd(args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return -1 + endif + + let command = join(result.cmd, " ") + + if &modified + let filename = expand("%:p:gs!\\!/!") + let content = join(go#util#GetLines(), "\n") + let in = filename . "\n" . strlen(content) . "\n" . content + let out = go#util#System(command, in) + else + let out = go#util#System(command) + endif + + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + if a:test_mode + exe 'edit ' . a:fname + endif + + call s:write_out(out) + + if a:test_mode + exe 'write! ' . a:fname + endif +endfunc + + +" write_out writes back the given output to the current buffer +func s:write_out(out) abort + " not a json output + if a:out[0] !=# '{' + return + endif + + " nothing to do + if empty(a:out) || type(a:out) != type("") + return + endif + + let result = json_decode(a:out) + if type(result) != type({}) + call go#util#EchoError(printf("malformed output from gomodifytags: %s", a:out)) + return + endif + + let lines = result['lines'] + let start_line = result['start'] + let end_line = result['end'] + + let index = 0 + for line in range(start_line, end_line) + call setline(line, lines[index]) + let index += 1 + endfor + + if has_key(result, 'errors') + let l:winnr = winnr() + let l:listtype = go#list#Type("GoModifyTags") + call go#list#ParseFormat(l:listtype, "%f:%l:%c:%m", result['errors'], "gomodifytags") + call go#list#Window(l:listtype, len(result['errors'])) + + "prevent jumping to quickfix list + exe l:winnr . "wincmd w" + endif +endfunc + + +" create_cmd returns a dict that contains the command to execute gomodifytags +func s:create_cmd(args) abort + if !exists("*json_decode") + return {'err': "requires 'json_decode'. Update your Vim/Neovim version."} + endif + + let bin_path = go#path#CheckBinPath('gomodifytags') + if empty(bin_path) + return {'err': "gomodifytags does not exist"} + endif + let bin_path = go#util#Shellescape(bin_path) + + let l:start = a:args.start + let l:end = a:args.end + let l:offset = a:args.offset + let l:mode = a:args.mode + let l:cmd_args = a:args.cmd_args + let l:modifytags_transform = get(g:, 'go_addtags_transform', "snakecase") + + " start constructing the command + let cmd = [bin_path] + call extend(cmd, ["-format", "json"]) + call extend(cmd, ["-file", go#util#Shellescape(a:args.fname)]) + call extend(cmd, ["-transform", l:modifytags_transform]) + + if has_key(a:args, "modified") + call add(cmd, "-modified") + endif + + if l:offset != 0 + call extend(cmd, ["-offset", l:offset]) + else + let range = printf("%d,%d", l:start, l:end) + call extend(cmd, ["-line", range]) + endif + + if l:mode == "add" + let l:tags = [] + let l:options = [] + + if !empty(l:cmd_args) + for item in l:cmd_args + let splitted = split(item, ",") + + " tag only + if len(splitted) == 1 + call add(l:tags, splitted[0]) + endif + + " options only + if len(splitted) == 2 + call add(l:tags, splitted[0]) + call add(l:options, printf("%s=%s", splitted[0], splitted[1])) + endif + endfor + endif + + " construct options + if !empty(l:options) + call extend(cmd, ["-add-options", join(l:options, ",")]) + else + " default value + if empty(l:tags) + let l:tags = ["json"] + endif + + " construct tags + call extend(cmd, ["-add-tags", join(l:tags, ",")]) + endif + elseif l:mode == "remove" + if empty(l:cmd_args) + call add(cmd, "-clear-tags") + else + let l:tags = [] + let l:options = [] + for item in l:cmd_args + let splitted = split(item, ",") + + " tag only + if len(splitted) == 1 + call add(l:tags, splitted[0]) + endif + + " options only + if len(splitted) == 2 + call add(l:options, printf("%s=%s", splitted[0], splitted[1])) + endif + endfor + + " construct tags + if !empty(l:tags) + call extend(cmd, ["-remove-tags", join(l:tags, ",")]) + endif + + " construct options + if !empty(l:options) + call extend(cmd, ["-remove-options", join(l:options, ",")]) + endif + endif + else + return {'err': printf("unknown mode: %s", l:mode)} + endif + + return {'cmd': cmd} +endfunc + +" vim: sw=2 ts=2 et diff --git a/autoload/go/tags_test.vim b/autoload/go/tags_test.vim new file mode 100644 index 0000000..7d4d32b --- /dev/null +++ b/autoload/go/tags_test.vim @@ -0,0 +1,22 @@ +func! Test_add_tags() abort + try + let l:tmp = gotest#load_fixture('tags/add_all_input.go') + silent call go#tags#run(0, 0, 40, "add", bufname(''), 1) + call gotest#assert_fixture('tags/add_all_golden.go') + finally + call delete(l:tmp, 'rf') + endtry +endfunc + + +func! Test_remove_tags() abort + try + let l:tmp = gotest#load_fixture('tags/remove_all_input.go') + silent call go#tags#run(0, 0, 40, "remove", bufname(''), 1) + call gotest#assert_fixture('tags/remove_all_golden.go') + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +" vim:ts=2:sts=2:sw=2:et diff --git a/autoload/go/template.vim b/autoload/go/template.vim new file mode 100644 index 0000000..11a91ae --- /dev/null +++ b/autoload/go/template.vim @@ -0,0 +1,53 @@ +let s:current_file = expand("") + +function! go#template#create() abort + let l:go_template_use_pkg = get(g:, 'go_template_use_pkg', 0) + let l:root_dir = fnamemodify(s:current_file, ':h:h:h') + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + let l:package_name = -1 + + if isdirectory(expand('%:p:h')) + execute cd . fnameescape(expand('%:p:h')) + let l:package_name = go#tool#PackageName() + endif + + " if we can't figure out any package name(no Go files or non Go package + " files) from the directory create the template or use the cwd + " as the name + if l:package_name == -1 && l:go_template_use_pkg != 1 + let l:filename = fnamemodify(expand("%"), ':t') + if l:filename =~ "_test.go$" + let l:template_file = get(g:, 'go_template_test_file', "hello_world_test.go") + else + let l:template_file = get(g:, 'go_template_file', "hello_world.go") + endif + let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file) + silent exe '0r ' . fnameescape(l:template_path) + elseif l:package_name == -1 && l:go_template_use_pkg == 1 + " cwd is now the dir of the package + let l:path = fnamemodify(getcwd(), ':t') + let l:content = printf("package %s", l:path) + call append(0, l:content) + else + let l:content = printf("package %s", l:package_name) + call append(0, l:content) + endif + $delete _ + + execute cd . fnameescape(dir) +endfunction + +function! go#template#ToggleAutoCreate() abort + if get(g:, "go_template_autocreate", 1) + let g:go_template_autocreate = 0 + call go#util#EchoProgress("auto template create disabled") + return + end + + let g:go_template_autocreate = 1 + call go#util#EchoProgress("auto template create enabled") +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/term.vim b/autoload/go/term.vim index 693041e..23ee18c 100644 --- a/autoload/go/term.vim +++ b/autoload/go/term.vim @@ -1,5 +1,5 @@ if has('nvim') && !exists("g:go_term_mode") - let g:go_term_mode = 'vsplit' + let g:go_term_mode = 'vsplit' endif " s:jobs is a global reference to all jobs started with new() @@ -7,122 +7,134 @@ let s:jobs = {} " new creates a new terminal with the given command. Mode is set based on the " global variable g:go_term_mode, which is by default set to :vsplit -function! go#term#new(bang, cmd) - return go#term#newmode(a:bang, a:cmd, g:go_term_mode) +function! go#term#new(bang, cmd) abort + return go#term#newmode(a:bang, a:cmd, g:go_term_mode) endfunction " new creates a new terminal with the given command and window mode. -function! go#term#newmode(bang, cmd, mode) - let mode = a:mode - if empty(mode) - let mode = g:go_term_mode - endif +function! go#term#newmode(bang, cmd, mode) abort + let mode = a:mode + if empty(mode) + let mode = g:go_term_mode + endif - " modify GOPATH if needed - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() + " execute go build in the files directory + let l:winnr = winnr() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() - " execute go build in the files directory - let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' - let dir = getcwd() + execute cd . fnameescape(expand("%:p:h")) - execute cd . fnameescape(expand("%:p:h")) + execute mode.' __go_term__' - execute mode.' __go_term__' + setlocal filetype=goterm + setlocal bufhidden=delete + setlocal winfixheight + setlocal noswapfile + setlocal nobuflisted - setlocal filetype=goterm - setlocal bufhidden=delete - setlocal winfixheight - setlocal noswapfile - setlocal nobuflisted + let job = { + \ 'stderr' : [], + \ 'stdout' : [], + \ 'bang' : a:bang, + \ 'on_stdout': function('s:on_stdout'), + \ 'on_stderr': function('s:on_stderr'), + \ 'on_exit' : function('s:on_exit'), + \ } - let job = { - \ 'stderr' : [], - \ 'stdout' : [], - \ 'bang' : a:bang, - \ 'on_stdout': function('s:on_stdout'), - \ 'on_stderr': function('s:on_stderr'), - \ 'on_exit' : function('s:on_exit'), - \ } + let id = termopen(a:cmd, job) - let id = termopen(a:cmd, job) + execute cd . fnameescape(dir) - execute cd . fnameescape(dir) + let job.id = id + let job.cmd = a:cmd + startinsert - " restore back GOPATH - let $GOPATH = old_gopath + " resize new term if needed. + let height = get(g:, 'go_term_height', winheight(0)) + let width = get(g:, 'go_term_width', winwidth(0)) - let job.id = id - startinsert + " we are careful how to resize. for example it's vsplit we don't change + " the height. The below command resizes the buffer - " resize new term if needed. - let height = get(g:, 'go_term_height', winheight(0)) - let width = get(g:, 'go_term_width', winwidth(0)) + if mode =~ "vertical" || mode =~ "vsplit" || mode =~ "vnew" + exe 'vertical resize ' . width + elseif mode =~ "split" || mode =~ "new" + exe 'resize ' . height + endif - " we are careful how to resize. for example it's vertical we don't change - " the height. The below command resizes the buffer - if a:mode == "split" - exe 'resize ' . height - elseif a:mode == "vertical" - exe 'vertical resize ' . width - endif + " we also need to resize the pty, so there you go... + call jobresize(id, width, height) - " we also need to resize the pty, so there you go... - call jobresize(id, width, height) + let s:jobs[id] = job + stopinsert - let s:jobs[id] = job - return id + if l:winnr !=# winnr() + exe l:winnr . "wincmd w" + endif + + return id endfunction -function! s:on_stdout(job_id, data) - if !has_key(s:jobs, a:job_id) - return - endif - let job = s:jobs[a:job_id] +function! s:on_stdout(job_id, data, event) dict abort + if !has_key(s:jobs, a:job_id) + return + endif + let job = s:jobs[a:job_id] - call extend(job.stdout, a:data) + call extend(job.stdout, a:data) endfunction -function! s:on_stderr(job_id, data) - if !has_key(s:jobs, a:job_id) - return - endif - let job = s:jobs[a:job_id] +function! s:on_stderr(job_id, data, event) dict abort + if !has_key(s:jobs, a:job_id) + return + endif + let job = s:jobs[a:job_id] - call extend(job.stderr, a:data) + call extend(job.stderr, a:data) endfunction -function! s:on_exit(job_id, data) - if !has_key(s:jobs, a:job_id) - return - endif - let job = s:jobs[a:job_id] - - let l:listtype = "locationlist" - " usually there is always output so never branch into this clause - if empty(job.stdout) - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - else - let errors = go#tool#ParseErrors(job.stdout) - let errors = go#tool#FilterValids(errors) - if !empty(errors) - " close terminal we don't need it - close - - call go#list#Populate(l:listtype, errors) - call go#list#Window(l:listtype, len(errors)) - if !self.bang - call go#list#JumpToFirst(l:listtype) - endif - else - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - endif +function! s:on_exit(job_id, exit_status, event) dict abort + if !has_key(s:jobs, a:job_id) + return + endif + let job = s:jobs[a:job_id] + + let l:listtype = go#list#Type("_term") + " usually there is always output so never branch into this clause + if empty(job.stdout) + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + unlet s:jobs[a:job_id] + return + endif + + let errors = go#tool#ParseErrors(job.stdout) + let errors = go#tool#FilterValids(errors) + + if !empty(errors) + " close terminal we don't need it anymore + close + + call go#list#Populate(l:listtype, errors, job.cmd) + call go#list#Window(l:listtype, len(errors)) + if !self.bang + call go#list#JumpToFirst(l:listtype) endif + unlet s:jobs[a:job_id] + return + endif + + " tests are passing clean the list and close the list. But we only can + " close them from a normal view, so jump back, close the list and then + " again jump back to the terminal + wincmd p + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + wincmd p unlet s:jobs[a:job_id] endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/test-fixtures/def/jump.go b/autoload/go/test-fixtures/def/jump.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/autoload/go/test-fixtures/def/jump.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/autoload/go/test-fixtures/fmt/hello.go b/autoload/go/test-fixtures/fmt/hello.go new file mode 100644 index 0000000..3be42f6 --- /dev/null +++ b/autoload/go/test-fixtures/fmt/hello.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + + func main() { +fmt.Println("vim-go") +} diff --git a/autoload/go/test-fixtures/fmt/hello_golden.go b/autoload/go/test-fixtures/fmt/hello_golden.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/autoload/go/test-fixtures/fmt/hello_golden.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/autoload/go/test-fixtures/fmt/imports/goimports.go b/autoload/go/test-fixtures/fmt/imports/goimports.go new file mode 100644 index 0000000..eec47f8 --- /dev/null +++ b/autoload/go/test-fixtures/fmt/imports/goimports.go @@ -0,0 +1,13 @@ +package main + +import ( + "fmt" +) + +func Foo(log *logging.TestLogger) { +log.Debug("vim-go") +} + +func main() { + fmt.Println("vim-go") +} diff --git a/autoload/go/test-fixtures/fmt/imports/goimports_golden.go b/autoload/go/test-fixtures/fmt/imports/goimports_golden.go new file mode 100644 index 0000000..3719f6b --- /dev/null +++ b/autoload/go/test-fixtures/fmt/imports/goimports_golden.go @@ -0,0 +1,15 @@ +package main + +import ( + "fmt" + + logging "gh.com/gi/foo-logging" +) + +func Foo(log *logging.TestLogger) { + log.Debug("vim-go") +} + +func main() { + fmt.Println("vim-go") +} diff --git a/autoload/go/test-fixtures/fmt/imports/vendor/gh.com/gi/foo-logging/logger.go b/autoload/go/test-fixtures/fmt/imports/vendor/gh.com/gi/foo-logging/logger.go new file mode 100644 index 0000000..1396018 --- /dev/null +++ b/autoload/go/test-fixtures/fmt/imports/vendor/gh.com/gi/foo-logging/logger.go @@ -0,0 +1,12 @@ +package logging + +import "fmt" + +type TestLogger struct { + Value string +} + +func (l *TestLogger) Debug(msg string) { + fmt.Println(msg) + fmt.Println(l.Value) +} diff --git a/autoload/go/test-fixtures/fmt/src/imports b/autoload/go/test-fixtures/fmt/src/imports new file mode 120000 index 0000000..60ee253 --- /dev/null +++ b/autoload/go/test-fixtures/fmt/src/imports @@ -0,0 +1 @@ +../imports/ \ No newline at end of file diff --git a/autoload/go/test-fixtures/tags/add_all_golden.go b/autoload/go/test-fixtures/tags/add_all_golden.go new file mode 100644 index 0000000..eaa3e7b --- /dev/null +++ b/autoload/go/test-fixtures/tags/add_all_golden.go @@ -0,0 +1,16 @@ +package main + +type Server struct { + Name string `json:"name"` + ID int `json:"id"` + MyHomeAddress string `json:"my_home_address"` + SubDomains []string `json:"sub_domains"` + Empty string `json:"empty"` + Example int64 `json:"example"` + Example2 string `json:"example_2"` + Bar struct { + Four string `json:"four"` + Five string `json:"five"` + } `json:"bar"` + Lala interface{} `json:"lala"` +} diff --git a/autoload/go/test-fixtures/tags/add_all_input.go b/autoload/go/test-fixtures/tags/add_all_input.go new file mode 100644 index 0000000..bfc4d3e --- /dev/null +++ b/autoload/go/test-fixtures/tags/add_all_input.go @@ -0,0 +1,16 @@ +package main + +type Server struct { + Name string + ID int + MyHomeAddress string + SubDomains []string + Empty string + Example int64 + Example2 string + Bar struct { + Four string + Five string + } + Lala interface{} +} diff --git a/autoload/go/test-fixtures/tags/remove_all_golden.go b/autoload/go/test-fixtures/tags/remove_all_golden.go new file mode 100644 index 0000000..de57085 --- /dev/null +++ b/autoload/go/test-fixtures/tags/remove_all_golden.go @@ -0,0 +1,16 @@ +package main + +type Server struct { + Name string + ID int + MyHomeAddress string + SubDomains []string + Empty string + Example int64 + Example2 string + Bar struct { + Four string + Five string + } + Lala interface{} +} diff --git a/autoload/go/test-fixtures/tags/remove_all_input.go b/autoload/go/test-fixtures/tags/remove_all_input.go new file mode 100644 index 0000000..eaa3e7b --- /dev/null +++ b/autoload/go/test-fixtures/tags/remove_all_input.go @@ -0,0 +1,16 @@ +package main + +type Server struct { + Name string `json:"name"` + ID int `json:"id"` + MyHomeAddress string `json:"my_home_address"` + SubDomains []string `json:"sub_domains"` + Empty string `json:"empty"` + Example int64 `json:"example"` + Example2 string `json:"example_2"` + Bar struct { + Four string `json:"four"` + Five string `json:"five"` + } `json:"bar"` + Lala interface{} `json:"lala"` +} diff --git a/autoload/go/test-fixtures/test/.gitignore b/autoload/go/test-fixtures/test/.gitignore new file mode 100644 index 0000000..fc5bd90 --- /dev/null +++ b/autoload/go/test-fixtures/test/.gitignore @@ -0,0 +1 @@ +/pkg diff --git a/autoload/go/test-fixtures/test/src/compilerror/compilerror.go b/autoload/go/test-fixtures/test/src/compilerror/compilerror.go new file mode 100644 index 0000000..3f3dc7c --- /dev/null +++ b/autoload/go/test-fixtures/test/src/compilerror/compilerror.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go" +} diff --git a/autoload/go/test-fixtures/test/src/play/mock/controller.go b/autoload/go/test-fixtures/test/src/play/mock/controller.go new file mode 100644 index 0000000..893d6e9 --- /dev/null +++ b/autoload/go/test-fixtures/test/src/play/mock/controller.go @@ -0,0 +1,7 @@ +package mock + +import "testing" + +func Fail(t *testing.T) { + t.Fatal("another package badness") +} diff --git a/autoload/go/test-fixtures/test/src/play/play_test.go b/autoload/go/test-fixtures/test/src/play/play_test.go new file mode 100644 index 0000000..ed71ef3 --- /dev/null +++ b/autoload/go/test-fixtures/test/src/play/play_test.go @@ -0,0 +1,58 @@ +package play + +import ( + "sync" + "testing" + + "play/mock" +) + +func TestTopSubHelper(t *testing.T) { + t.Run("sub", func(t *testing.T) { + t.Log("log message") + t.Error("sub badness") + }) + t.Error("badness") + helper(t) +} + +func TestMultiline(t *testing.T) { + t.Error("this is an error\nand a second line, too") +} + +func TestSub(t *testing.T) { + t.Run("indented", func(t *testing.T) { + t.Error("this is a sub-test error\nand a second line, too") + }) +} + +func TestOK(t *testing.T) { + t.Run("log", func(t *testing.T) { + t.Log("goodness") + }) +} + +// TestMocked tests behavior similar to what users may experience when using +// github.com/golang/mock/gomock. +func TestMocked(t *testing.T) { + mock.Fail(t) +} + +func TestPanic(t *testing.T) { + panic("worst ever") +} + +func TestConcurrentPanic(t *testing.T) { + var wg sync.WaitGroup + wg.Add(1) + go func() { + panic("concurrent fail") + wg.Done() + }() + wg.Wait() +} + +func helper(t *testing.T) { + t.Helper() + t.Fatal("helper badness") +} diff --git a/autoload/go/test.vim b/autoload/go/test.vim new file mode 100644 index 0000000..51e9a5d --- /dev/null +++ b/autoload/go/test.vim @@ -0,0 +1,389 @@ +" Test runs `go test` in the current directory. If compile is true, it'll +" compile the tests instead of running them (useful to catch errors in the +" test files). Any other argument is appended to the final `go test` command. +function! go#test#Test(bang, compile, ...) abort + let args = ["test"] + + " don't run the test, only compile it. Useful to capture and fix errors. + if a:compile + let testfile = tempname() . ".vim-go.test" + call extend(args, ["-c", "-o", testfile]) + endif + + if exists('g:go_build_tags') + let tags = get(g:, 'go_build_tags') + call extend(args, ["-tags", tags]) + endif + + if a:0 + let goargs = a:000 + + " do not expand for coverage mode as we're passing the arg ourself + if a:1 != '-coverprofile' + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") + endif + + if !(has('nvim') || go#util#has_job()) + let goargs = go#util#Shelllist(goargs, 1) + endif + + call extend(args, goargs, 1) + else + " only add this if no custom flags are passed + let timeout = get(g:, 'go_test_timeout', '10s') + call add(args, printf("-timeout=%s", timeout)) + endif + + if get(g:, 'go_echo_command_info', 1) + if a:compile + call go#util#EchoProgress("compiling tests ...") + else + call go#util#EchoProgress("testing...") + endif + endif + + if go#util#has_job() + " use vim's job functionality to call it asynchronously + let job_args = { + \ 'cmd': ['go'] + args, + \ 'bang': a:bang, + \ 'winnr': winnr(), + \ 'dir': getcwd(), + \ 'compile_test': a:compile, + \ 'jobdir': fnameescape(expand("%:p:h")), + \ } + + call s:test_job(job_args) + return + elseif has('nvim') + " use nvims's job functionality + if get(g:, 'go_term_enabled', 0) + let id = go#term#new(a:bang, ["go"] + args) + else + let id = go#jobcontrol#Spawn(a:bang, "test", "GoTest", args) + endif + + return id + endif + + call go#cmd#autowrite() + redraw + + let command = "go " . join(args, ' ') + let out = go#tool#ExecuteInDir(command) + " TODO(bc): When the output is JSON, the JSON should be run through a + " filter to produce lines that are more easily described by errorformat. + + let l:listtype = go#list#Type("GoTest") + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + execute cd fnameescape(expand("%:p:h")) + + if go#util#ShellError() != 0 + call go#list#ParseFormat(l:listtype, s:errorformat(), split(out, '\n'), command) + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + elseif empty(errors) + " failed to parse errors, output the original content + call go#util#EchoError(out) + endif + call go#util#EchoError("[test] FAIL") + else + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + + if a:compile + call go#util#EchoSuccess("[test] SUCCESS") + else + call go#util#EchoSuccess("[test] PASS") + endif + endif + execute cd . fnameescape(dir) +endfunction + +" Testfunc runs a single test that surrounds the current cursor position. +" Arguments are passed to the `go test` command. +function! go#test#Func(bang, ...) abort + " search flags legend (used only) + " 'b' search backward instead of forward + " 'c' accept a match at the cursor position + " 'n' do Not move the cursor + " 'W' don't wrap around the end of the file + " + " for the full list + " :help search + let test = search('func \(Test\|Example\)', "bcnW") + + if test == 0 + echo "vim-go: [test] no test found immediate to cursor" + return + end + + let line = getline(test) + let name = split(split(line, " ")[1], "(")[0] + let args = [a:bang, 0, "-run", name . "$"] + + if a:0 + call extend(args, a:000) + endif + + call call('go#test#Test', args) +endfunction + +function! s:test_job(args) abort + let status_dir = expand('%:p:h') + let started_at = reltime() + + let status = { + \ 'desc': 'current status', + \ 'type': "test", + \ 'state': "started", + \ } + + if a:args.compile_test + let status.state = "compiling" + endif + + call go#statusline#Update(status_dir, status) + + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let messages = [] + function! s:callback(chan, msg) closure + call add(messages, a:msg) + endfunction + + function! s:exit_cb(job, exitval) closure + let status = { + \ 'desc': 'last status', + \ 'type': "test", + \ 'state': "pass", + \ } + + if a:args.compile_test + let status.state = "success" + endif + + if a:exitval + let status.state = "failed" + endif + + if get(g:, 'go_echo_command_info', 1) + if a:exitval == 0 + if a:args.compile_test + call go#util#EchoSuccess("[test] SUCCESS") + else + call go#util#EchoSuccess("[test] PASS") + endif + else + call go#util#EchoError("[test] FAIL") + endif + endif + + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(status_dir, status) + + let l:listtype = go#list#Type("GoTest") + if a:exitval == 0 + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + return + endif + + " TODO(bc): When messages is JSON, the JSON should be run through a + " filter to produce lines that are more easily described by errorformat. + call s:show_errors(a:args, a:exitval, messages) + endfunction + + let start_options = { + \ 'callback': funcref("s:callback"), + \ 'exit_cb': funcref("s:exit_cb"), + \ } + + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + call job_start(a:args.cmd, start_options) + + " post start + execute cd . fnameescape(dir) +endfunction + +" show_errors parses the given list of lines of a 'go test' output and returns +" a quickfix compatible list of errors. It's intended to be used only for go +" test output. +function! s:show_errors(args, exit_val, messages) abort + let l:listtype = go#list#Type("GoTest") + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + try + execute cd a:args.jobdir + call go#list#ParseFormat(l:listtype, s:errorformat(), a:messages, join(a:args.cmd)) + let errors = go#list#Get(l:listtype) + finally + execute cd . fnameescape(a:args.dir) + endtry + + if !len(errors) + " failed to parse errors, output the original content + call go#util#EchoError(a:messages) + call go#util#EchoError(a:args.dir) + return + endif + + if a:args.winnr == winnr() + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:args.bang + call go#list#JumpToFirst(l:listtype) + endif + endif +endfunction + + +let s:efm= "" + +function! s:errorformat() abort + " NOTE(arslan): once we get JSON output everything will be easier :). + " TODO(bc): When the output is JSON, the JSON should be run through a + " filter to produce lines that are more easily described by errorformat. + " https://github.com/golang/go/issues/2981. + let goroot = go#util#goroot() + + if s:efm != "" + return s:efm + endif + + " each level of test indents the test output 4 spaces. + " TODO(bc): figure out how to use 0 or more groups of four spaces for the + " indentation. '%\\( %\\)%#' should work, but doesn't. + let indent = " %#" + + " match compiler errors + let format = "%f:%l:%c: %m" + + " ignore `go test -v` output for starting tests + let format .= ",%-G=== RUN %.%#" + " ignore `go test -v` output for passing tests + let format .= ",%-G" . indent . "--- PASS: %.%#" + + " Match failure lines. + " + " Test failures start with '--- FAIL: ', followed by the test name followed + " by a space the duration of the test in parentheses + " + " e.g.: + " '--- FAIL: TestSomething (0.00s)' + if get(g:, 'go_test_show_name', 0) + let format .= ",%+G" . indent . "--- FAIL: %.%#" + else + let format .= ",%-G" . indent . "--- FAIL: %.%#" + endif + + " Matches test output lines. + " + " All test output lines start with the test indentation and a tab, followed + " by the filename, a colon, the line number, another colon, a space, and the + " message. e.g.: + " '\ttime_test.go:30: Likely problem: the time zone files have not been installed.' + let format .= ",%A" . indent . "%\\t%\\+%f:%l: %m" + + " Match the 2nd and later lines of multi-line output. These lines are + " indented the number of spaces for the level of nesting of the test, + " followed by two tabs, followed by the message. + " + " Treat these lines as if they are stand-alone lines of output by using %G. + " It would also be valid to treat these lines as if they were the + " continuation of a multi-line error by using %C instead of %G, but that + " would also require that all test errors using a %A or %E modifier to + " indicate that they're multiple lines of output, but in that case the lines + " get concatenated in the quickfix list, which is not what users typically + " want when writing a newline into their test output. + let format .= ",%G" . indent . "%\\t%\\{2}%m" + + " set the format for panics. + + " In addition to 'panic', check for 'fatal error' to support older versions + " of Go that used 'fatal error'. + " + " Panics come in two flavors. When the goroutine running the tests panics, + " `go test` recovers and tries to exit more cleanly. In that case, the panic + " message is suffixed with ' [recovered]'. If the panic occurs in a + " different goroutine, it will not be suffixed with ' [recovered]'. + let format .= ",%+Afatal error: %.%# [recovered]" + let format .= ",%+Apanic: %.%# [recovered]" + let format .= ",%+Afatal error: %.%#" + let format .= ",%+Apanic: %.%#" + + " Match address lines in stacktraces produced by panic. + " + " Address lines in the stack trace have leading tabs, followed by the path + " to the file. The file path is followed by a colon and then the line number + " within the file where the panic occurred. After that there's a space and + " hexadecimal number. + " + " e.g.: + " '\t/usr/local/go/src/time.go:1313 +0x5d' + + " panicaddress, and readyaddress are identical except for + " panicaddress sets the filename and line number. + let panicaddress = "%\\t%f:%l +0x%[0-9A-Fa-f]%\\+" + let readyaddress = "%\\t%\\f%\\+:%\\d%\\+ +0x%[0-9A-Fa-f]%\\+" + " stdlib address is identical to readyaddress, except it matches files + " inside GOROOT. + let stdlibaddress = "%\\t" . goroot . "%\\f%\\+:%\\d%\\+ +0x%[0-9A-Fa-f]%\\+" + + " Match and ignore the running goroutine line. + let format .= ",%-Cgoroutine %\\d%\\+ [running]:" + " Match address lines that refer to stdlib, but consider them informational + " only. This is to catch the lines after the first address line in the + " running goroutine of a panic stack trace. Ideally, this wouldn't be + " necessary, but when a panic happens in the goroutine running a test, it's + " recovered and another panic is created, so the stack trace actually has + " the line that caused the original panic a couple of addresses down the + " stack. + let format .= ",%-C" . stdlibaddress + " Match address lines in the first matching goroutine. This means the panic + " message will only be shown as the error message in the first address of + " the running goroutine's stack. + let format .= ",%Z" . panicaddress + + " Match and ignore panic address without being part of a multi-line message. + " This is to catch those lines that come after the top most non-standard + " library line in stack traces. + let format .= ",%-G" . readyaddress + + " Match and ignore exit status lines (produced when go test panics) whether + " part of a multi-line message or not, because these lines sometimes come + " before and sometimes after panic stacktraces. + let format .= ",%-Cexit status %[0-9]%\\+" + "let format .= ",exit status %[0-9]%\\+" + + " Match and ignore exit failure lines whether part of a multi-line message + " or not, because these lines sometimes come before and sometimes after + " panic stacktraces. + let format .= ",%-CFAIL%\\t%.%#" + "let format .= ",FAIL%\\t%.%#" + + " Match and ignore everything else in multi-line messages. + let format .= ",%-C%.%#" + " Match and ignore everything else not in a multi-line message: + let format .= ",%-G%.%#" + + let s:efm = format + + return s:efm +endfunction + +" vim: sw=2 ts=2 et diff --git a/autoload/go/test_test.vim b/autoload/go/test_test.vim new file mode 100644 index 0000000..e9ab162 --- /dev/null +++ b/autoload/go/test_test.vim @@ -0,0 +1,123 @@ +func! Test_GoTest() abort + let expected = [ + \ {'lnum': 12, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'log message'}, + \ {'lnum': 13, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'sub badness'}, + \ {'lnum': 15, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'badness'}, + \ {'lnum': 16, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'helper badness'}, + \ {'lnum': 20, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'this is an error'}, + \ {'lnum': 0, 'bufnr': 0, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'and a second line, too'}, + \ {'lnum': 25, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'this is a sub-test error'}, + \ {'lnum': 0, 'bufnr': 0, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'and a second line, too'}, + \ {'lnum': 6, 'bufnr': 3, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'another package badness'}, + \ {'lnum': 42, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'panic: worst ever [recovered]'} + \ ] + call s:test('play/play_test.go', expected) + +endfunc + +func! Test_GoTestConcurrentPanic() + let expected = [ + \ {'lnum': 49, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'panic: concurrent fail'} + \ ] + call s:test('play/play_test.go', expected, "-run", "TestConcurrentPanic") +endfunc + +func! Test_GoTestVerbose() abort + let expected = [ + \ {'lnum': 12, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'log message'}, + \ {'lnum': 13, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'sub badness'}, + \ {'lnum': 15, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'badness'}, + \ {'lnum': 16, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'helper badness'}, + \ {'lnum': 20, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'this is an error'}, + \ {'lnum': 0, 'bufnr': 0, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'and a second line, too'}, + \ {'lnum': 25, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'this is a sub-test error'}, + \ {'lnum': 0, 'bufnr': 0, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'and a second line, too'}, + \ {'lnum': 31, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'goodness'}, + \ {'lnum': 6, 'bufnr': 3, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'another package badness'}, + \ {'lnum': 42, 'bufnr': 2, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'panic: worst ever [recovered]'} + \ ] + call s:test('play/play_test.go', expected, "-v") +endfunc + +func! Test_GoTestCompilerError() abort + let expected = [ + \ {'lnum': 6, 'bufnr': 6, 'col': 22, 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'pattern': '', 'text': 'syntax error: unexpected newline, expecting comma or )'} + \ ] + + call s:test('compilerror/compilerror_test.go', expected) +endfunc + +func! s:test(file, expected, ...) abort + if has('nvim') + " nvim mostly shows test errors correctly, but the the expected errors are + " slightly different; buffer numbers are not the same and stderr doesn't + " seem to be redirected to the job, so the lines from the panic aren't in + " the output to be parsed, and hence are not in the quickfix lists. Once + " those two issues are resolved, this early return should be removed so + " the tests will run for Neovim, too. + return + endif + let $GOPATH = fnameescape(expand("%:p:h")) . '/test-fixtures/test' + silent exe 'e ' . $GOPATH . '/src/' . a:file + + " clear the quickfix lists + call setqflist([], 'r') + + let args = [1,0] + if a:0 + let args += a:000 + endif + + " run the tests + call call(function('go#test#Test'), args) + + let actual = getqflist() + let start = reltime() + while len(actual) == 0 && reltimefloat(reltime(start)) < 10 + sleep 100m + let actual = getqflist() + endwhile + + " for some reason, when run headless, the quickfix lists includes a line + " that should have been filtered out; remove it manually. The line is not + " present when run manually. + let i = 0 + while i < len(actual) + if actual[i].text =~# '^=== RUN .*' + call remove(actual, i) + endif + let i += 1 + endwhile + + call assert_equal(len(a:expected), len(actual), "number of errors") + if len(a:expected) != len(actual) + return + endif + + let i = 0 + while i < len(a:expected) + let expected_item = a:expected[i] + let actual_item = actual[i] + let i += 1 + + call assert_equal(expected_item.bufnr, actual_item.bufnr, "bufnr") + call assert_equal(expected_item.lnum, actual_item.lnum, "lnum") + call assert_equal(expected_item.col, actual_item.col, "col") + call assert_equal(expected_item.vcol, actual_item.vcol, "vcol") + call assert_equal(expected_item.nr, actual_item.nr, "nr") + call assert_equal(expected_item.pattern, actual_item.pattern, "pattern") + + let expected_text = s:normalize_durations(expected_item.text) + let actual_text = s:normalize_durations(actual_item.text) + + call assert_equal(expected_text, actual_text, "text") + call assert_equal(expected_item.type, actual_item.type, "type") + call assert_equal(expected_item.valid, actual_item.valid, "valid") + endwhile +endfunc + +func! s:normalize_durations(str) abort + return substitute(a:str, '[0-9]\+\(\.[0-9]\+\)\?s', '0.000s', 'g') +endfunc + +" vim: sw=2 ts=2 et diff --git a/autoload/go/textobj.vim b/autoload/go/textobj.vim index a8e91a2..62a7042 100644 --- a/autoload/go/textobj.vim +++ b/autoload/go/textobj.vim @@ -6,6 +6,10 @@ if !exists("g:go_textobj_include_function_doc") let g:go_textobj_include_function_doc = 1 endif +if !exists("g:go_textobj_include_variable") + let g:go_textobj_include_variable = 1 +endif + " ( ) motions " { } motions " s for sentence @@ -13,14 +17,14 @@ endif " < > " t for tag -function! go#textobj#Function(mode) +function! go#textobj#Function(mode) abort let offset = go#util#OffsetCursor() - let fname = expand("%:p") + let fname = shellescape(expand("%:p")) if &modified " Write current unsaved buffer to a temp file and use the modified content let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) let fname = l:tmpname endif @@ -36,8 +40,8 @@ function! go#textobj#Function(mode) let command .= " -parse-comments" endif - let out = system(command) - if v:shell_error != 0 + let out = go#util#System(command) + if go#util#ShellError() != 0 call go#util#EchoError(out) return endif @@ -60,6 +64,16 @@ function! go#textobj#Function(mode) " want's to include doc comments for function declarations if has_key(info, 'doc') && g:go_textobj_include_function_doc call cursor(info.doc.line, info.doc.col) + elseif info['sig']['name'] == '' && g:go_textobj_include_variable + " one liner anonymous functions + if info.lbrace.line == info.rbrace.line + " jump to first nonblack char, to get the correct column + call cursor(info.lbrace.line, 0 ) + normal! ^ + call cursor(info.func.line, col(".")) + else + call cursor(info.func.line, info.rbrace.col) + endif else call cursor(info.func.line, info.func.col) endif @@ -67,7 +81,7 @@ function! go#textobj#Function(mode) normal! v call cursor(info.rbrace.line, info.rbrace.col) return - endif + endif " rest is inner mode, a:mode == 'i' @@ -84,7 +98,7 @@ function! go#textobj#Function(mode) call cursor(info.rbrace.line-1, 1) endfunction -function! go#textobj#FunctionJump(mode, direction) +function! go#textobj#FunctionJump(mode, direction) abort " get count of the motion. This should be done before all the normal " expressions below as those reset this value(because they have zero " count!). We abstract -1 because the index starts from 0 in motion. @@ -103,11 +117,11 @@ function! go#textobj#FunctionJump(mode, direction) let offset = go#util#OffsetCursor() - let fname = expand("%:p") + let fname = shellescape(expand("%:p")) if &modified " Write current unsaved buffer to a temp file and use the modified content let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) let fname = l:tmpname endif @@ -129,8 +143,8 @@ function! go#textobj#FunctionJump(mode, direction) let command .= " -parse-comments" endif - let out = system(command) - if v:shell_error != 0 + let out = go#util#System(command) + if go#util#ShellError() != 0 call go#util#EchoError(out) return endif @@ -177,4 +191,4 @@ function! go#textobj#FunctionJump(mode, direction) keepjumps call cursor(info.func.line, 1) endfunction -" vim:ts=2:sw=2:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/tool.vim b/autoload/go/tool.vim index d378b5a..d163600 100644 --- a/autoload/go/tool.vim +++ b/autoload/go/tool.vim @@ -1,155 +1,218 @@ -function! go#tool#Files() - if go#util#IsWin() - let command = 'go list -f "{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}"' - else - let command = "go list -f '{{range $f := .GoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}'" - endif - let out = go#tool#ExecuteInDir(command) - return split(out, '\n') +" From "go list -h". +function! go#tool#ValidFiles(...) + let l:list = ["GoFiles", "CgoFiles", "IgnoredGoFiles", "CFiles", "CXXFiles", + \ "MFiles", "HFiles", "FFiles", "SFiles", "SwigFiles", "SwigCXXFiles", + \ "SysoFiles", "TestGoFiles", "XTestGoFiles"] + + " Used as completion + if len(a:000) > 0 + let l:list = filter(l:list, 'strpart(v:val, 0, len(a:1)) == a:1') + endif + + return l:list endfunction -function! go#tool#Deps() - if go#util#IsWin() - let command = 'go list -f "{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}"' - else - let command = "go list -f $'{{range $f := .Deps}}{{$f}}\n{{end}}'" +function! go#tool#Files(...) abort + if len(a:000) > 0 + let source_files = a:000 + else + let source_files = ['GoFiles'] + endif + + let combined = '' + for sf in source_files + " Strip dot in case people used ":GoFiles .GoFiles". + let sf = substitute(sf, '^\.', '', '') + + " Make sure the passed options are valid. + if index(go#tool#ValidFiles(), sf) == -1 + echoerr "unknown source file variable: " . sf endif - let out = go#tool#ExecuteInDir(command) - return split(out, '\n') -endfunction -function! go#tool#Imports() - let imports = {} if go#util#IsWin() - let command = 'go list -f "{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}"' + let combined .= '{{range $f := .' . sf . '}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}' else - let command = "go list -f $'{{range $f := .Imports}}{{$f}}\n{{end}}'" - endif - let out = go#tool#ExecuteInDir(command) - if v:shell_error - echo out - return imports + let combined .= "{{range $f := ." . sf . "}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}" endif + endfor + + let out = go#tool#ExecuteInDir('go list -f ' . shellescape(combined)) + return split(out, '\n') +endfunction - for package_path in split(out, '\n') - let cmd = "go list -f {{.Name}} " . package_path - let package_name = substitute(go#tool#ExecuteInDir(cmd), '\n$', '', '') - let imports[package_name] = package_path - endfor +function! go#tool#Deps() abort + if go#util#IsWin() + let format = '{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}' + else + let format = "{{range $f := .Deps}}{{$f}}\n{{end}}" + endif + let command = 'go list -f '.shellescape(format) + let out = go#tool#ExecuteInDir(command) + return split(out, '\n') +endfunction +function! go#tool#Imports() abort + let imports = {} + if go#util#IsWin() + let format = '{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}' + else + let format = "{{range $f := .Imports}}{{$f}}{{printf \"\\n\"}}{{end}}" + endif + let command = 'go list -f '.shellescape(format) + let out = go#tool#ExecuteInDir(command) + if go#util#ShellError() != 0 + echo out return imports + endif + + for package_path in split(out, '\n') + let cmd = "go list -f '{{.Name}}' " . shellescape(package_path) + let package_name = substitute(go#tool#ExecuteInDir(cmd), '\n$', '', '') + let imports[package_name] = package_path + endfor + + return imports endfunction -function! go#tool#ParseErrors(lines) - let errors = [] - - for line in a:lines - let fatalerrors = matchlist(line, '^\(fatal error:.*\)$') - let tokens = matchlist(line, '^\s*\(.\{-}\):\(\d\+\):\s*\(.*\)') - - if !empty(fatalerrors) - call add(errors, {"text": fatalerrors[1]}) - elseif !empty(tokens) - " strip endlines of form ^M - let out=substitute(tokens[3], '\r$', '', '') - - call add(errors, { - \ "filename" : fnamemodify(tokens[1], ':p'), - \ "lnum" : tokens[2], - \ "text" : out, - \ }) - elseif !empty(errors) - " Preserve indented lines. - " This comes up especially with multi-line test output. - if match(line, '^\s') >= 0 - call add(errors, {"text": line}) - endif - endif - endfor +function! go#tool#Info(auto) abort + let l:mode = get(g:, 'go_info_mode', 'gocode') + if l:mode == 'gocode' + call go#complete#Info(a:auto) + elseif l:mode == 'guru' + call go#guru#DescribeInfo() + else + call go#util#EchoError('go_info_mode value: '. l:mode .' is not valid. Valid values are: [gocode, guru]') + endif +endfunction + +function! go#tool#PackageName() abort + let command = "go list -f \"{{.Name}}\"" + let out = go#tool#ExecuteInDir(command) + if go#util#ShellError() != 0 + return -1 + endif + + return split(out, '\n')[0] +endfunction - return errors +function! go#tool#ParseErrors(lines) abort + let errors = [] + + for line in a:lines + let fatalerrors = matchlist(line, '^\(fatal error:.*\)$') + let tokens = matchlist(line, '^\s*\(.\{-}\):\(\d\+\):\s*\(.*\)') + + if !empty(fatalerrors) + call add(errors, {"text": fatalerrors[1]}) + elseif !empty(tokens) + " strip endlines of form ^M + let out = substitute(tokens[3], '\r$', '', '') + + call add(errors, { + \ "filename" : fnamemodify(tokens[1], ':p'), + \ "lnum" : tokens[2], + \ "text" : out, + \ }) + elseif !empty(errors) + " Preserve indented lines. + " This comes up especially with multi-line test output. + if match(line, '^\s') >= 0 + call add(errors, {"text": line}) + endif + endif + endfor + + return errors endfunction "FilterValids filters the given items with only items that have a valid "filename. Any non valid filename is filtered out. -function! go#tool#FilterValids(items) - " Remove any nonvalid filename from the location list to avoid opening an - " empty buffer. See https://github.com/fatih/vim-go/issues/287 for - " details. - let filtered = [] - let is_readable = {} - - for item in a:items - if has_key(item, 'bufnr') - let filename = bufname(item.bufnr) - elseif has_key(item, 'filename') - let filename = item.filename - else - " nothing to do, add item back to the list - call add(filtered, item) - continue - endif +function! go#tool#FilterValids(items) abort + " Remove any nonvalid filename from the location list to avoid opening an + " empty buffer. See https://github.com/fatih/vim-go/issues/287 for + " details. + let filtered = [] + let is_readable = {} + + for item in a:items + if has_key(item, 'bufnr') + let filename = bufname(item.bufnr) + elseif has_key(item, 'filename') + let filename = item.filename + else + " nothing to do, add item back to the list + call add(filtered, item) + continue + endif - if !has_key(is_readable, filename) - let is_readable[filename] = filereadable(filename) - endif - if is_readable[filename] - call add(filtered, item) - endif - endfor + if !has_key(is_readable, filename) + let is_readable[filename] = filereadable(filename) + endif + if is_readable[filename] + call add(filtered, item) + endif + endfor - for k in keys(filter(is_readable, '!v:val')) - echo "vim-go: " | echohl Identifier | echon "[run] Dropped " | echohl Constant | echon '"' . k . '"' - echohl Identifier | echon " from location list (nonvalid filename)" | echohl None - endfor + for k in keys(filter(is_readable, '!v:val')) + echo "vim-go: " | echohl Identifier | echon "[run] Dropped " | echohl Constant | echon '"' . k . '"' + echohl Identifier | echon " from location list (nonvalid filename)" | echohl None + endfor - return filtered + return filtered endfunction function! go#tool#ExecuteInDir(cmd) abort - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() - - let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' - let dir = getcwd() - try - execute cd . fnameescape(expand("%:p:h")) - let out = system(a:cmd) - finally - execute cd . fnameescape(dir) - endtry - - let $GOPATH = old_gopath - return out + " Verify that the directory actually exists. If the directory does not + " exist, then assume that the a:cmd should not be executed. Callers expect + " to check v:shell_error (via go#util#ShellError()), so execute a command + " that will return an error as if a:cmd was run and exited with an error. + " This helps avoid errors when working with plugins that use virtual files + " that don't actually exist on the file system (e.g. vim-fugitive's + " GitDiff). + if !isdirectory(expand("%:p:h")) + let [out, err] = go#util#Exec(["false"]) + return '' + endif + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + let out = go#util#System(a:cmd) + finally + execute cd . fnameescape(dir) + endtry + return out endfunction " Exists checks whether the given importpath exists or not. It returns 0 if " the importpath exists under GOPATH. -function! go#tool#Exists(importpath) +function! go#tool#Exists(importpath) abort let command = "go list ". a:importpath let out = go#tool#ExecuteInDir(command) - if v:shell_error + if go#util#ShellError() != 0 return -1 endif return 0 endfunction - -" following two functions are from: https://github.com/mattn/gist-vim +" following two functions are from: https://github.com/mattn/gist-vim " thanks @mattn -function! s:get_browser_command() +function! s:get_browser_command() abort let go_play_browser_command = get(g:, 'go_play_browser_command', '') if go_play_browser_command == '' if go#util#IsWin() let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%' - elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin' + elseif go#util#IsMac() let go_play_browser_command = 'open %URL%' elseif executable('xdg-open') let go_play_browser_command = 'xdg-open %URL%' elseif executable('firefox') let go_play_browser_command = 'firefox %URL% &' + elseif executable('chromium') + let go_play_browser_command = 'chromium %URL% &' else let go_play_browser_command = '' endif @@ -157,7 +220,7 @@ function! s:get_browser_command() return go_play_browser_command endfunction -function! go#tool#OpenBrowser(url) +function! go#tool#OpenBrowser(url) abort let cmd = s:get_browser_command() if len(cmd) == 0 redraw @@ -168,15 +231,15 @@ function! go#tool#OpenBrowser(url) return endif if cmd =~ '^!' - let cmd = substitute(cmd, '%URL%', '\=shellescape(a:url)', 'g') + let cmd = substitute(cmd, '%URL%', '\=escape(shellescape(a:url),"#")', 'g') silent! exec cmd elseif cmd =~ '^:[A-Z]' - let cmd = substitute(cmd, '%URL%', '\=a:url', 'g') + let cmd = substitute(cmd, '%URL%', '\=escape(a:url,"#")', 'g') exec cmd else let cmd = substitute(cmd, '%URL%', '\=shellescape(a:url)', 'g') - call system(cmd) + call go#util#System(cmd) endif endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/tool_test.vim b/autoload/go/tool_test.vim new file mode 100644 index 0000000..1af3b7b --- /dev/null +++ b/autoload/go/tool_test.vim @@ -0,0 +1,23 @@ +func! Test_ExecuteInDir() abort + let l:tmp = gotest#write_file('a/a.go', ['package a']) + try + let l:out = go#tool#ExecuteInDir("pwd") + call assert_equal(l:tmp . "/src/a\n", l:out) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +func! Test_ExecuteInDir_nodir() abort + let l:tmp = go#util#tempdir("executeindir") + exe ':e ' . l:tmp . '/new-dir/a' + + try + let l:out = go#tool#ExecuteInDir("pwd") + call assert_equal('', l:out) + finally + call delete(l:tmp, 'rf') + endtry +endfunc + +" vim: sw=2 ts=2 et diff --git a/autoload/go/ui.vim b/autoload/go/ui.vim index c658141..3f61257 100644 --- a/autoload/go/ui.vim +++ b/autoload/go/ui.vim @@ -1,89 +1,114 @@ let s:buf_nr = -1 "OpenWindow opens a new scratch window and put's the content into the window -function! go#ui#OpenWindow(title, content) - " reuse existing buffer window if it exists otherwise create a new one - if !bufexists(s:buf_nr) - execute 'botright new' - file `="[" . a:title . "]"` - let s:buf_nr = bufnr('%') - elseif bufwinnr(s:buf_nr) == -1 - execute 'botright new' - execute s:buf_nr . 'buffer' - elseif bufwinnr(s:buf_nr) != bufwinnr('%') - execute bufwinnr(s:buf_nr) . 'wincmd w' - endif - +function! go#ui#OpenWindow(title, content, filetype) abort + " Ensure there's only one return window in this session/tabpage + call go#util#Windo("unlet! w:vim_go_return_window") + " Mark the window we're leaving as such + let w:vim_go_return_window = 1 + + " reuse existing buffer window if it exists otherwise create a new one + if !bufexists(s:buf_nr) + execute 'botright new' + file `="[" . a:title . "]"` + let s:buf_nr = bufnr('%') + elseif bufwinnr(s:buf_nr) == -1 + execute 'botright new' + execute s:buf_nr . 'buffer' + elseif bufwinnr(s:buf_nr) != bufwinnr('%') + execute bufwinnr(s:buf_nr) . 'wincmd w' + endif + + " Resize window to content length + exe 'resize' . len(a:content) + + execute "setlocal filetype=".a:filetype + + " some sane default values for a readonly buffer + setlocal bufhidden=delete + setlocal buftype=nofile + setlocal noswapfile + setlocal nobuflisted + setlocal winfixheight + setlocal cursorline " make it easy to distinguish + setlocal nonumber + setlocal norelativenumber + setlocal showbreak="" + + " we need this to purge the buffer content + setlocal modifiable + + "delete everything first from the buffer + %delete _ + + " add the content + call append(0, a:content) + + " delete last line that comes from the append call + $delete _ + + " set it back to non modifiable + setlocal nomodifiable + + " Remove the '... [New File]' message line from the command line + echon +endfunction - " Keep minimum height to 10, if there is more just increase it that it - " occupies all results - let buffer_height = 10 - if len(a:content) < buffer_height - exe 'resize ' . buffer_height - else - exe 'resize ' . len(a:content) +function! go#ui#GetReturnWindow() abort + for l:wn in range(1, winnr("$")) + if !empty(getwinvar(l:wn, "vim_go_return_window")) + return l:wn endif - - " some sane default values for a readonly buffer - setlocal filetype=vimgo - setlocal bufhidden=delete - setlocal buftype=nofile - setlocal noswapfile - setlocal nobuflisted - setlocal winfixheight - setlocal cursorline " make it easy to distinguish - - " we need this to purge the buffer content - setlocal modifiable - - "delete everything first from the buffer - %delete _ - - " add the content - call append(0, a:content) - - " delete last line that comes from the append call - $delete _ - - " set it back to non modifiable - setlocal nomodifiable + endfor endfunction - " CloseWindow closes the current window -function! go#ui#CloseWindow() - close - echo "" +function! go#ui#CloseWindow() abort + " Close any window associated with the ui buffer, if it's there + if bufexists(s:buf_nr) + let ui_window_number = bufwinnr(s:buf_nr) + if ui_window_number != -1 + execute ui_window_number . 'close' + endif + endif + + "return to original window, if it's there + let l:rw = go#ui#GetReturnWindow() + if !empty(l:rw) + execute l:rw . 'wincmd w' + unlet! w:vim_go_return_window + endif endfunction " OpenDefinition parses the current line and jumps to it by openening a new " tab -function! go#ui#OpenDefinition(filter) - let curline = getline('.') - - " don't touch our first line or any blank line - if curline =~ a:filter || curline =~ "^$" - " supress information about calling this function - echo "" - return - endif +function! go#ui#OpenDefinition(filter) abort + let curline = getline('.') + + " don't touch our first line or any blank line + if curline =~ a:filter || curline =~ "^$" + " suppress information about calling this function + echo "" + return + endif - " format: 'interface file:lnum:coln' - let mx = '^\(^\S*\)\s*\(.\{-}\):\(\d\+\):\(\d\+\)' + " format: 'interface file:lnum:coln' + let mx = '^\(^\S*\)\s*\(.\{-}\):\(\d\+\):\(\d\+\)' - " parse it now into the list - let tokens = matchlist(curline, mx) + " parse it now into the list + let tokens = matchlist(curline, mx) - " convert to: 'file:lnum:coln' - let expr = tokens[2] . ":" . tokens[3] . ":" . tokens[4] + " convert to: 'file:lnum:coln' + let expr = tokens[2] . ":" . tokens[3] . ":" . tokens[4] - " jump to it in a new tab, we use explicit lgetexpr so we can later change - " the behaviour via settings (like opening in vsplit instead of tab) - lgetexpr expr - tab split - ll 1 + " jump to it in a new tab, we use explicit lgetexpr so we can later change + " the behaviour via settings (like opening in vsplit instead of tab) + lgetexpr expr + tab split + ll 1 - " center the word - norm! zz + " center the word + norm! zz endfunction +" vim: sw=2 ts=2 et diff --git a/autoload/go/util.vim b/autoload/go/util.vim index 24aa254..bf72dad 100644 --- a/autoload/go/util.vim +++ b/autoload/go/util.vim @@ -1,123 +1,398 @@ " PathSep returns the appropriate OS specific path separator. -function! go#util#PathSep() - if go#util#IsWin() - return '\' - endif - return '/' +function! go#util#PathSep() abort + if go#util#IsWin() + return '\' + endif + return '/' endfunction " PathListSep returns the appropriate OS specific path list separator. -function! go#util#PathListSep() - if go#util#IsWin() - return ";" - endif - return ":" +function! go#util#PathListSep() abort + if go#util#IsWin() + return ";" + endif + return ":" endfunction " LineEnding returns the correct line ending, based on the current fileformat -function! go#util#LineEnding() - if &fileformat == 'dos' - return "\r\n" - elseif &fileformat == 'mac' - return "\r" - endif +function! go#util#LineEnding() abort + if &fileformat == 'dos' + return "\r\n" + elseif &fileformat == 'mac' + return "\r" + endif + + return "\n" +endfunction - return "\n" +" Join joins any number of path elements into a single path, adding a +" Separator if necessary and returns the result +function! go#util#Join(...) abort + return join(a:000, go#util#PathSep()) endfunction " IsWin returns 1 if current OS is Windows or 0 otherwise -function! go#util#IsWin() - let win = ['win16', 'win32', 'win64', 'win95'] - for w in win - if (has(w)) - return 1 - endif - endfor +function! go#util#IsWin() abort + let win = ['win16', 'win32', 'win64', 'win95'] + for w in win + if (has(w)) + return 1 + endif + endfor + + return 0 +endfunction + +" IsMac returns 1 if current OS is macOS or 0 otherwise. +function! go#util#IsMac() abort + return has('mac') || + \ has('macunix') || + \ has('gui_macvim') || + \ go#util#System('uname') =~? '^darwin' +endfunction + + " Checks if using: + " 1) Windows system, + " 2) And has cygpath executable, + " 3) And uses *sh* as 'shell' +function! go#util#IsUsingCygwinShell() + return go#util#IsWin() && executable('cygpath') && &shell =~ '.*sh.*' +endfunction + +function! go#util#has_job() abort + " job was introduced in 7.4.xxx however there are multiple bug fixes and one + " of the latest is 8.0.0087 which is required for a stable async API. + return has('job') && has("patch-8.0.0087") +endfunction + +let s:env_cache = {} + +" env returns the go environment variable for the given key. Where key can be +" GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached +" version. +function! go#util#env(key) abort + let l:key = tolower(a:key) + if has_key(s:env_cache, l:key) + return s:env_cache[l:key] + endif + + if executable('go') + let l:var = call('go#util#'.l:key, []) + if go#util#ShellError() != 0 + call go#util#EchoError(printf("'go env %s' failed", toupper(l:key))) + return '' + endif + else + let l:var = eval("$".toupper(a:key)) + endif + + let s:env_cache[l:key] = l:var + return l:var +endfunction + +" goarch returns 'go env GOARCH'. This is an internal function and shouldn't +" be used. Instead use 'go#util#env("goarch")' +function! go#util#goarch() abort + return substitute(go#util#System('go env GOARCH'), '\n', '', 'g') +endfunction + +" goos returns 'go env GOOS'. This is an internal function and shouldn't +" be used. Instead use 'go#util#env("goos")' +function! go#util#goos() abort + return substitute(go#util#System('go env GOOS'), '\n', '', 'g') +endfunction + +" goroot returns 'go env GOROOT'. This is an internal function and shouldn't +" be used. Instead use 'go#util#env("goroot")' +function! go#util#goroot() abort + return substitute(go#util#System('go env GOROOT'), '\n', '', 'g') +endfunction + +" gopath returns 'go env GOPATH'. This is an internal function and shouldn't +" be used. Instead use 'go#util#env("gopath")' +function! go#util#gopath() abort + return substitute(go#util#System('go env GOPATH'), '\n', '', 'g') +endfunction + +function! go#util#osarch() abort + return go#util#env("goos") . '_' . go#util#env("goarch") +endfunction + +" Run a shell command. +" +" It will temporary set the shell to /bin/sh for Unix-like systems if possible, +" so that we always use a standard POSIX-compatible Bourne shell (and not e.g. +" csh, fish, etc.) See #988 and #1276. +function! s:system(cmd, ...) abort + " Preserve original shell and shellredir values + let l:shell = &shell + let l:shellredir = &shellredir + + if !go#util#IsWin() && executable('/bin/sh') + set shell=/bin/sh shellredir=>%s\ 2>&1 + endif + + try + return call('system', [a:cmd] + a:000) + finally + " Restore original values + let &shell = l:shell + let &shellredir = l:shellredir + endtry +endfunction + +" System runs a shell command "str". Every arguments after "str" is passed to +" stdin. +function! go#util#System(str, ...) abort + return call('s:system', [a:str] + a:000) +endfunction + +" Exec runs a shell command "cmd", which must be a list, one argument per item. +" Every list entry will be automatically shell-escaped +" Every other argument is passed to stdin. +function! go#util#Exec(cmd, ...) abort + if len(a:cmd) == 0 + call go#util#EchoError("go#util#Exec() called with empty a:cmd") + return + endif + + " CheckBinPath will show a warning for us. + let l:bin = go#path#CheckBinPath(a:cmd[0]) + if empty(l:bin) + return ["", 1] + endif - return 0 + let l:out = call('s:system', [go#util#Shelljoin([l:bin] + a:cmd[1:])] + a:000) + return [l:out, go#util#ShellError()] +endfunction + +function! go#util#ShellError() abort + return v:shell_error endfunction " StripPath strips the path's last character if it's a path separator. " example: '/foo/bar/' -> '/foo/bar' -function! go#util#StripPathSep(path) - let last_char = strlen(a:path) - 1 - if a:path[last_char] == go#util#PathSep() - return strpart(a:path, 0, last_char) - endif +function! go#util#StripPathSep(path) abort + let last_char = strlen(a:path) - 1 + if a:path[last_char] == go#util#PathSep() + return strpart(a:path, 0, last_char) + endif - return a:path + return a:path endfunction " StripTrailingSlash strips the trailing slash from the given path list. " example: ['/foo/bar/'] -> ['/foo/bar'] -function! go#util#StripTrailingSlash(paths) +function! go#util#StripTrailingSlash(paths) abort return map(copy(a:paths), 'go#util#StripPathSep(v:val)') endfunction " Shelljoin returns a shell-safe string representation of arglist. The " {special} argument of shellescape() may optionally be passed. -function! go#util#Shelljoin(arglist, ...) - try - let ssl_save = &shellslash - set noshellslash - if a:0 - return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ') - endif +function! go#util#Shelljoin(arglist, ...) abort + try + let ssl_save = &shellslash + set noshellslash + if a:0 + return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ') + endif - return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') - finally - let &shellslash = ssl_save - endtry + return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') + finally + let &shellslash = ssl_save + endtry endfunction +fu! go#util#Shellescape(arg) + try + let ssl_save = &shellslash + set noshellslash + return shellescape(a:arg) + finally + let &shellslash = ssl_save + endtry +endf + " Shelllist returns a shell-safe representation of the items in the given " arglist. The {special} argument of shellescape() may optionally be passed. -function! go#util#Shelllist(arglist, ...) - try - let ssl_save = &shellslash - set noshellslash - if a:0 - return map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')') - endif - return map(copy(a:arglist), 'shellescape(v:val)') - finally - let &shellslash = ssl_save - endtry +function! go#util#Shelllist(arglist, ...) abort + try + let ssl_save = &shellslash + set noshellslash + if a:0 + return map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')') + endif + return map(copy(a:arglist), 'shellescape(v:val)') + finally + let &shellslash = ssl_save + endtry endfunction " Returns the byte offset for line and column -function! go#util#Offset(line, col) - if &encoding != 'utf-8' - let sep = go#util#LineEnding() - let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep) - let buf .= a:col == 1 ? '' : getline('.')[:a:col-2] - return len(iconv(buf, &encoding, 'utf-8')) - endif - return line2byte(a:line) + (a:col-2) +function! go#util#Offset(line, col) abort + if &encoding != 'utf-8' + let sep = go#util#LineEnding() + let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep) + let buf .= a:col == 1 ? '' : getline('.')[:a:col-2] + return len(iconv(buf, &encoding, 'utf-8')) + endif + return line2byte(a:line) + (a:col-2) endfunction " " Returns the byte offset for the cursor -function! go#util#OffsetCursor() - return go#util#Offset(line('.'), col('.')) +function! go#util#OffsetCursor() abort + return go#util#Offset(line('.'), col('.')) endfunction -" TODO(arslan): I couldn't parameterize the highlight types. Check if we can -" simplify the following functions +" Windo is like the built-in :windo, only it returns to the window the command +" was issued from +function! go#util#Windo(command) abort + let s:currentWindow = winnr() + try + execute "windo " . a:command + finally + execute s:currentWindow. "wincmd w" + unlet s:currentWindow + endtry +endfunction -function! go#util#EchoSuccess(msg) - redraws! | echon "vim-go: " | echohl Function | echon a:msg | echohl None +" snippetcase converts the given word to given preferred snippet setting type +" case. +function! go#util#snippetcase(word) abort + let l:snippet_case = get(g:, 'go_addtags_transform', "snakecase") + if l:snippet_case == "snakecase" + return go#util#snakecase(a:word) + elseif l:snippet_case == "camelcase" + return go#util#camelcase(a:word) + else + return a:word " do nothing + endif endfunction -function! go#util#EchoError(msg) - redraws! | echon "vim-go: " | echohl ErrorMsg | echon a:msg | echohl None +" snakecase converts a string to snake case. i.e: FooBar -> foo_bar +" Copied from tpope/vim-abolish +function! go#util#snakecase(word) abort + let word = substitute(a:word, '::', '/', 'g') + let word = substitute(word, '\(\u\+\)\(\u\l\)', '\1_\2', 'g') + let word = substitute(word, '\(\l\|\d\)\(\u\)', '\1_\2', 'g') + let word = substitute(word, '[.-]', '_', 'g') + let word = tolower(word) + return word endfunction -function! go#util#EchoWarning(msg) - redraws! | echon "vim-go: " | echohl WarningMsg | echon a:msg | echohl None +" camelcase converts a string to camel case. e.g. FooBar or foo_bar will become +" fooBar. +" Copied from tpope/vim-abolish. +function! go#util#camelcase(word) abort + let word = substitute(a:word, '-', '_', 'g') + if word !~# '_' && word =~# '\l' + return substitute(word, '^.', '\l&', '') + else + return substitute(word, '\C\(_\)\=\(.\)', '\=submatch(1)==""?tolower(submatch(2)) : toupper(submatch(2))','g') + endif +endfunction + +" pascalcase converts a string to 'PascalCase'. e.g. fooBar or foo_bar will +" become FooBar. +function! go#util#pascalcase(word) abort + let word = go#util#camelcase(a:word) + return toupper(word[0]) . word[1:] endfunction +" Echo a message to the screen and highlight it with the group in a:hi. +" +" The message can be a list or string; every line with be :echomsg'd separately. +function! s:echo(msg, hi) + let l:msg = [] + if type(a:msg) != type([]) + let l:msg = split(a:msg, "\n") + else + let l:msg = a:msg + endif + + " Tabs display as ^I or <09>, so manually expand them. + let l:msg = map(l:msg, 'substitute(v:val, "\t", " ", "")') + + exe 'echohl ' . a:hi + for line in l:msg + echom "vim-go: " . line + endfor + echohl None +endfunction + +function! go#util#EchoSuccess(msg) + call s:echo(a:msg, 'Function') +endfunction +function! go#util#EchoError(msg) + call s:echo(a:msg, 'ErrorMsg') +endfunction +function! go#util#EchoWarning(msg) + call s:echo(a:msg, 'WarningMsg') +endfunction function! go#util#EchoProgress(msg) - redraws! | echon "vim-go: " | echohl Identifier | echon a:msg | echohl None + call s:echo(a:msg, 'Identifier') +endfunction +function! go#util#EchoInfo(msg) + call s:echo(a:msg, 'Debug') +endfunction + +" Get all lines in the buffer as a a list. +function! go#util#GetLines() + let buf = getline(1, '$') + if &encoding != 'utf-8' + let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') + endif + if &l:fileformat == 'dos' + " XXX: line2byte() depend on 'fileformat' option. + " so if fileformat is 'dos', 'buf' must include '\r'. + let buf = map(buf, 'v:val."\r"') + endif + return buf +endfunction + +" Convert the current buffer to the "archive" format of +" golang.org/x/tools/go/buildutil: +" https://godoc.org/golang.org/x/tools/go/buildutil#ParseOverlayArchive +" +" > The archive consists of a series of files. Each file consists of a name, a +" > decimal file size and the file contents, separated by newlinews. No newline +" > follows after the file contents. +function! go#util#archive() + let l:buffer = join(go#util#GetLines(), "\n") + return expand("%:p:gs!\\!/!") . "\n" . strlen(l:buffer) . "\n" . l:buffer +endfunction + + +" Make a named temporary directory which starts with "prefix". +" +" Unfortunately Vim's tempname() is not portable enough across various systems; +" see: https://github.com/mattn/vim-go/pull/3#discussion_r138084911 +function! go#util#tempdir(prefix) abort + " See :help tempfile + if go#util#IsWin() + let l:dirs = [$TMP, $TEMP, 'c:\tmp', 'c:\temp'] + else + let l:dirs = [$TMPDIR, '/tmp', './', $HOME] + endif + + let l:dir = '' + for l:d in dirs + if !empty(l:d) && filewritable(l:d) == 2 + let l:dir = l:d + break + endif + endfor + + if l:dir == '' + echoerr 'Unable to find directory to store temporary directory in' + return + endif + + " Not great randomness, but "good enough" for our purpose here. + let l:rnd = sha256(printf('%s%s', localtime(), fnamemodify(bufname(''), ":p"))) + let l:tmp = printf("%s/%s%s", l:dir, a:prefix, l:rnd) + call mkdir(l:tmp, 'p', 0700) + return l:tmp endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/autoload/go/vimproc.vim b/autoload/go/vimproc.vim deleted file mode 100644 index 42d1392..0000000 --- a/autoload/go/vimproc.vim +++ /dev/null @@ -1,21 +0,0 @@ -"Check if has vimproc -function! go#vimproc#has_vimproc() - if !exists('g:go#use_vimproc') - if go#util#IsWin() - try - call vimproc#version() - let exists_vimproc = 1 - catch - let exists_vimproc = 0 - endtry - else - let exists_vimproc = 0 - endif - - let g:go#use_vimproc = exists_vimproc - endif - - return g:go#use_vimproc -endfunction - -" vim:ts=4:sw=4:et diff --git a/autoload/gotest.vim b/autoload/gotest.vim new file mode 100644 index 0000000..199df1e --- /dev/null +++ b/autoload/gotest.vim @@ -0,0 +1,105 @@ +" Write a Go file to a temporary directory and append this directory to $GOPATH. +" +" The file will written to a:path, which is relative to the temporary directory, +" and this file will be loaded as the current buffer. +" +" The cursor will be placed on the character before any 0x1f byte. +" +" The full path to the created directory is returned, it is the caller's +" responsibility to clean that up! +fun! gotest#write_file(path, contents) abort + let l:dir = go#util#tempdir("vim-go-test/testrun/") + let $GOPATH .= ':' . l:dir + let l:full_path = l:dir . '/src/' . a:path + + call mkdir(fnamemodify(l:full_path, ':h'), 'p') + call writefile(a:contents, l:full_path) + exe 'cd ' . l:dir . '/src' + silent exe 'e! ' . a:path + + " Set cursor. + let l:lnum = 1 + for l:line in a:contents + let l:m = match(l:line, "\x1f") + if l:m > -1 + call setpos('.', [0, l:lnum, l:m, 0]) + call setline('.', substitute(getline('.'), "\x1f", '', '')) + break + endif + + let l:lnum += 1 + endfor + + return l:dir +endfun + +" Load a fixture file from test-fixtures. +" +" The file will be copied to a new GOPATH-compliant temporary directory and +" loaded as the current buffer. +fun! gotest#load_fixture(path) abort + let l:dir = go#util#tempdir("vim-go-test/testrun/") + let $GOPATH .= ':' . l:dir + let l:full_path = l:dir . '/src/' . a:path + + call mkdir(fnamemodify(l:full_path, ':h'), 'p') + exe 'cd ' . l:dir . '/src' + silent exe 'noautocmd e ' . a:path + silent exe printf('read %s/test-fixtures/%s', g:vim_go_root, a:path) + silent noautocmd w! + + return l:dir +endfun + +" Diff the contents of the current buffer to a:want, which should be a list. +" If a:skipHeader is true we won't bother with the package and import +" declarations; so e.g.: +" +" let l:diff = s:diff_buffer(1, ['_ = mail.Address{}']) +" +" will pass, whereas otherwise you'd have to: +" +" let l:diff = s:diff_buffer(0, ['package main', 'import "net/mail", '_ = mail.Address{}']) +fun! gotest#assert_buffer(skipHeader, want) abort + let l:buffer = go#util#GetLines() + + if a:skipHeader + for l:lnum in range(0, len(l:buffer) - 1) + " Bit rudimentary, but works reasonably well. + if match(l:buffer[l:lnum], '^\v(func|var|const|import \(|\))') > -1 + " vint bug: https://github.com/Kuniwak/vint/issues/179 + " vint: -ProhibitUsingUndeclaredVariable + let l:buffer = l:buffer[l:lnum:len(l:buffer)] + break + endif + endfor + endif + + " Using ' is often easier so we don't have to escape ". + let l:want = map(a:want, 'substitute(v:val, "\\\\t", "\t", "")') + + let l:tmp = go#util#tempdir('assert_buffer') + try + call writefile(l:buffer, l:tmp . '/have') + call writefile(l:want, l:tmp . '/want') + call go#fmt#run('gofmt', l:tmp . '/have', l:tmp . '/have') + call go#fmt#run('gofmt', l:tmp . '/want', l:tmp . '/want') + let [l:out, l:err] = go#util#Exec(["diff", "-u", l:tmp . '/have', l:tmp . '/want']) + finally + call delete(l:tmp . '/have') + call delete(l:tmp . '/want') + call delete(l:tmp, 'd') + endtry + + if l:err || l:out != '' + let v:errors = extend(v:errors, split(l:out, "\n")) + endif +endfun + +" Diff the contents of the current buffer to the fixture file in a:path. +fun! gotest#assert_fixture(path) abort + let l:want = readfile(printf('%s/test-fixtures/%s', g:vim_go_root, a:path)) + call gotest#assert_buffer(0, l:want) +endfun + +" vim: sw=2 ts=2 et diff --git a/autoload/unite/sources/decls.vim b/autoload/unite/sources/decls.vim new file mode 100644 index 0000000..b4d5da8 --- /dev/null +++ b/autoload/unite/sources/decls.vim @@ -0,0 +1,70 @@ +let s:save_cpo = &cpoptions +set cpoptions&vim + +let s:source = { + \ 'name': 'decls', + \ 'description': 'GoDecls implementation for unite', + \ 'syntax': 'uniteSource__Decls', + \ 'action_table': {}, + \ 'hooks': {}, + \ } + +function! unite#sources#decls#define() + return s:source +endfunction + +function! s:source.gather_candidates(args, context) abort + let l:bin_path = go#path#CheckBinPath('motion') + if empty(l:bin_path) + return [] + endif + + let l:path = expand(get(a:args, 0, '%:p:h')) + if isdirectory(l:path) + let l:mode = 'dir' + elseif filereadable(l:path) + let l:mode = 'file' + else + return [] + endif + + let l:include = get(g:, 'go_decls_includes', 'func,type') + let l:command = printf('%s -format vim -mode decls -include %s -%s %s', l:bin_path, l:include, l:mode, shellescape(l:path)) + let l:candidates = [] + try + let l:result = eval(unite#util#system(l:command)) + let l:candidates = get(l:result, 'decls', []) + catch + call unite#print_source_error(['command returned invalid response.', v:exception], s:source.name) + endtry + + return map(l:candidates, "{ + \ 'word': printf('%s :%d :%s', fnamemodify(v:val.filename, ':~:.'), v:val.line, v:val.full), + \ 'kind': 'jump_list', + \ 'action__path': v:val.filename, + \ 'action__line': v:val.line, + \ 'action__col': v:val.col, + \ }") +endfunction + +function! s:source.hooks.on_syntax(args, context) abort + syntax match uniteSource__Decls_Filepath /[^:]*\ze:/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_Line /\d\+\ze :/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_WholeFunction /\vfunc %(\([^)]+\) )?[^(]+/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_Function /\S\+\ze(/ contained containedin=uniteSource__Decls_WholeFunction + syntax match uniteSource__Decls_WholeType /type \S\+/ contained containedin=uniteSource__Decls + syntax match uniteSource__Decls_Type /\v( )@<=\S+/ contained containedin=uniteSource__Decls_WholeType + highlight default link uniteSource__Decls_Filepath Comment + highlight default link uniteSource__Decls_Line LineNr + highlight default link uniteSource__Decls_Function Function + highlight default link uniteSource__Decls_Type Type + + syntax match uniteSource__Decls_Separator /:/ contained containedin=uniteSource__Decls conceal + syntax match uniteSource__Decls_SeparatorFunction /func / contained containedin=uniteSource__Decls_WholeFunction conceal + syntax match uniteSource__Decls_SeparatorType /type / contained containedin=uniteSource__Decls_WholeType conceal +endfunction + +let &cpoptions = s:save_cpo +unlet s:save_cpo + +" vim: sw=2 ts=2 et diff --git a/compiler/go.vim b/compiler/go.vim index 7b5a025..523cb28 100644 --- a/compiler/go.vim +++ b/compiler/go.vim @@ -4,10 +4,10 @@ " " compiler/go.vim: Vim compiler file for Go. -if exists("current_compiler") +if exists("g:current_compiler") finish endif -let current_compiler = "go" +let g:current_compiler = "go" if exists(":CompilerSet") != 2 command -nargs=* CompilerSet setlocal @@ -16,9 +16,9 @@ endif let s:save_cpo = &cpo set cpo-=C if filereadable("makefile") || filereadable("Makefile") - CompilerSet makeprg=make + CompilerSet makeprg=make else - CompilerSet makeprg=go\ build + CompilerSet makeprg=go\ build endif " Define the patterns that will be recognized by QuickFix when parsing the @@ -38,4 +38,4 @@ CompilerSet errorformat+=%-G%.%# " All lines not matching a let &cpo = s:save_cpo unlet s:save_cpo -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/doc/vim-go.txt b/doc/vim-go.txt index 08ad5bc..9adb896 100644 --- a/doc/vim-go.txt +++ b/doc/vim-go.txt @@ -1,18 +1,18 @@ *vim-go.txt* Go development plugin *vim-go* -=============================================================================== -# # -# ## ## #### ## ## ###### ####### # -# ## ## ## ### ### ## ## ## ## # -# ## ## ## #### #### ## ## ## # -# ## ## ## ## ### ## ####### ## #### ## ## # -# ## ## ## ## ## ## ## ## ## # -# ## ## ## ## ## ## ## ## ## # -# ### #### ## ## ###### ####### # -# # -=============================================================================== -CONTENTS *go-contents* +============================================================================== +# # +# ## ## #### ## ## ###### ####### # +# ## ## ## ### ### ## ## ## ## # +# ## ## ## #### #### ## ## ## # +# ## ## ## ## ### ## ####### ## #### ## ## # +# ## ## ## ## ## ## ## ## ## # +# ## ## ## ## ## ## ## ## ## # +# ### #### ## ## ###### ####### # +# # +============================================================================== +CONTENTS *go-contents* 1. Intro........................................|go-intro| 2. Install......................................|go-install| @@ -21,120 +21,149 @@ CONTENTS *go-contents* 5. Text Objects.................................|go-text-objects| 6. Functions....................................|go-functions| 7. Settings.....................................|go-settings| - 8. Troubleshooting..............................|go-troubleshooting| - 9. Credits......................................|go-credits| - -=============================================================================== -INTRO *go-intro* - -Go (golang) support for Vim. vim-go installs automatically all necessary -binaries for providing seamless Vim integration. It comes with pre-defined -sensible settings (like auto gofmt on save), has autocomplete, snippet -support, improved syntax highlighting, go toolchain commands, etc... It's -highly customizable and each individual feature can be disabled/enabled -easily. - - * Improved Syntax highlighting with items such as Functions, Operators, Methods. - * Auto completion support via `gocode` - * Better `gofmt` on save, which keeps cursor position and doesn't break your undo - history - * Go to symbol/declaration with `:GoDef` - * Look up documentation with `:GoDoc` inside Vim or open it in browser - * Automatically import packages via `:GoImport` or plug it into autosave - * Compile your package with `:GoBuild`, install it with `:GoInstall` or test - them with `:GoTest` (also supports running single tests via `:GoTestFunc`) - * Quickly execute your current file/files with `:GoRun` - * Automatic `GOPATH` detection based on the directory structure (i.e. `gb` - projects, `godep` vendored projects) - * Change or display `GOPATH` with `:GoPath` - * Create a coverage profile and display annotated source code in browser to see - which functions are covered with `:GoCoverage` - * Call `gometalinter` with `:GoMetaLinter`, which invokes all possible linters - (golint, vet, errcheck, deadcode, etc..) and shows the warnings/errors - * Lint your code with `:GoLint` - * Run your code through `:GoVet` to catch static errors - * Advanced source analysis tools utilizing oracle, such as `:GoImplements`, - `:GoCallees`, and `:GoReferrers` - * Precise type-safe renaming of identifiers with `:GoRename` - * List all source files and dependencies - * Unchecked error checking with `:GoErrCheck` - * Integrated and improved snippets, supporting `ultisnips` or `neosnippet` - * Share your current code to [play.golang.org](http://play.golang.org) with `:GoPlay` - * On-the-fly type information about the word under the cursor. Plug it into - your custom vim function. - * Go asm formatting on save - * Tagbar support to show tags of the source code in a sidebar with `gotags` - * Custom vim text objects such as `a function` or `inner function` - * A async launcher for the go command is implemented for neovim, fully async + 8. Syntax highlighting..........................|go-syntax| + 9. FAQ/Troubleshooting..........................|go-troubleshooting| + 10. Development..................................|go-development| + 11. Donation.....................................|go-donation| + 12. Credits......................................|go-credits| + +============================================================================== +INTRO *go-intro* + +Go (golang) support for Vim. vim-go comes with sensible predefined settings +(e.g. automatic `gofmt` on save), has autocomplete, snippet support, improved +syntax highlighting, go toolchain commands, etc. It is highly customizable, +and individual features can be toggled easily. vim-go leverages a number of +tools developed by the Go community to provide a seamless Vim experience. + + * Compile your package with |:GoBuild|, install it with |:GoInstall| or + test it with |:GoTest|. Run a single tests with |:GoTestFunc|). + * Quickly execute your current file(s) with |:GoRun|. + * Improved syntax highlighting and folding. + * Completion support via `gocode`. + * `gofmt` or `goimports` on save keeps the cursor position and undo history. + * Go to symbol/declaration with |:GoDef|. + * Look up documentation with |:GoDoc| or |:GoDocBrowser|. + * Easily import packages via |:GoImport|, remove them via |:GoDrop|. + * Automatic `GOPATH` detection which works with `gb` and `godep`. Change or + display `GOPATH` with |:GoPath|. + * See which code is covered by tests with |:GoCoverage|. + * Add or remove tags on struct fields with |:GoAddTags| and |:GoRemoveTags|. + * Call `gometalinter` with |:GoMetaLinter| to invoke all possible linters + (`golint`, `vet`, `errcheck`, `deadcode`, etc.) and put the result in the + quickfix or location list. + * Lint your code with |:GoLint|, run your code through |:GoVet| to catch + static errors, or make sure errors are checked with |:GoErrCheck|. + * Advanced source analysis tools utilizing `guru`, such as |:GoImplements|, + |:GoCallees|, and |:GoReferrers|. + * Precise type-safe renaming of identifiers with |:GoRename|. + * Integrated and improved snippets, supporting `ultisnips`, `neosnippet`, + and `vim-minisnip`. + * Share your current code to play.golang.org with |:GoPlay|. + * On-the-fly information about the word under the cursor. Plug it into your + custom Vim function. + * Text objects such as "a function" (|go-af|) or "inner function" (|go-if|). + * Most commands are run asynchronous in Neovim and Vim 8. Fully async building and testing. - * Integrated with the neovim terminal, launch `:GoRun` and other go commands - in their own new terminal. - * Alternate between implementation and test code with `:GoAlternate` + * Integrated with the Neovim terminal, launch |:GoRun| and other Go commands + in a terminal buffer. + * Switch between `file.go` and `file_test.go` code with |:GoAlternate|. + * Supports integration with the Tagbar and ctrlp.vim plugins. + * ...and more... -=============================================================================== +============================================================================== INSTALL *go-install* -Vim-go follows the standard runtime path structure, so I highly recommend to use -a common and well known plugin manager to install vim-go. Do not use vim-go with -other Go plugins. For Pathogen just clone the repo, for other plugin managers -add the appropriate lines and execute the plugin's install command. +The latest stable release, https://github.com/fatih/vim-go/releases/latest, is +the recommended version to use. If you choose to use the master branch +instead, please do so with caution; it is a _development_ branch. + +vim-go follows the standard runtime path structure and should work with any of +the major plugin managers. + +For Pathogen or Vim |packages|, just clone the repo. For other plugin managers +you may also need to add the lines to your vimrc to execute the plugin +manager's install command. + +* Vim 8 |packages| +> + git clone https://github.com/fatih/vim-go.git \ + ~/.vim/pack/plugins/start/vim-go * https://github.com/tpope/vim-pathogen > git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go < - * https://github.com/junegunn/vim-plug > Plug 'fatih/vim-go' -< * https://github.com/Shougo/neobundle.vim > NeoBundle 'fatih/vim-go' < - * https://github.com/gmarik/vundle > Plugin 'fatih/vim-go' - < -* Manual > +* Manual (not recommended) > Copy all of the files into your `~/.vim` directory < +You will also need to install all the necessary binaries. vim-go makes it easy +to install all of them by providing a command, |:GoInstallBinaries|, to +`go get` all the required binaries. The binaries will be installed to $GOBIN +or $GOPATH/bin (default: $HOME/go/bin). It requires `git`. + +Depending on your installation method, you may have to generate the plugin's +|:helptags| manually (e.g. `:helptags ALL`). + +Autocompletion is enabled by default via 'omnifunc', which you can trigger +with |i_CTRL-X_CTRL-O| (``). + +Supported Go plugins~ *vim-go-plugins* + +The following plugins are supported for use with vim-go: + +* Real-time completion (Vim): + https://github.com/Shougo/neocomplete.vim + +* Real-time completion (Neovim and Vim 8): + https://github.com/Shougo/deoplete.nvim and + https://github.com/zchee/deoplete-go -Please be sure all necessary binaries are installed (such as `gocode`, `godef`, -`goimports`, etc..). You can easily install them with the included -|GoInstallBinaries| command. If you invoke it, all necessary binaries will be -automatically downloaded and installed to your `$GOBIN` environment (if not set -it will use `$GOPATH/bin`). It requires `git` for fetching the individual Go -packages. - -* Autocompletion is enabled by default via ``, to get real-time -completion (completion by type) install: -https://github.com/Shougo/neocomplete.vim for Vim or -https://github.com/Shougo/deoplete.nvim and -https://github.com/zchee/deoplete-go for Neovim -* To get displayed source code tag informations on a sidebar install -https://github.com/majutsushi/tagbar. -* For snippet feature install: -https://github.com/Shougo/neosnippet.vim or -https://github.com/SirVer/ultisnips. -* For a better documentation viewer checkout: https://github.com/garyburd/go-explorer - -=============================================================================== -COMMANDS *go-commands* - - *:GoPath* +* Display source code navigation in a sidebar: + https://github.com/majutsushi/tagbar + +* Snippets: + https://github.com/Shougo/neosnippet.vim or + https://github.com/SirVer/ultisnips or + https://github.com/joereynolds/vim-minisnip + +* For a better documentation viewer check out: + https://github.com/garyburd/go-explorer + +* Integration with `delve` (Neovim only): + https://github.com/jodosha/vim-godebug + +* Interactive |:GoDecls| and |:GoDeclsDir|: + https://github.com/ctrlpvim/ctrlp.vim or + https://github.com/junegunn/fzf.vim or + https://github.com/Shougo/unite.vim or + https://github.com/Shougo/denite.nvim + +============================================================================== +COMMANDS *go-commands* + + *:GoPath* :GoPath [path] GoPath sets and overrides GOPATH with the given {path}. If no {path} is given it shows the current GOPATH. If `""` is given as path, it clears - current `GOPATH` which was set with |GoPath| and restores `GOPATH` back to - the initial value which was sourced when Vim was started. + current `GOPATH` which was set with |:GoPath| and restores `GOPATH` back + to the initial value which was sourced when Vim was started. - *:GoImport* + *:GoImport* :GoImport[!] [path] Import ensures that the provided package {path} is imported in the current @@ -143,36 +172,38 @@ COMMANDS *go-commands* If [!] is given it will download the package with `go get` - *:GoImportAs* + *:GoImportAs* :GoImportAs [localname] [path] Same as Import, but uses a custom local name for the package. - *:GoDrop* + *:GoDrop* :GoDrop [path] Remove the import line for the provided package {path}, if present in the current Go buffer. If {path} is not being imported, an error will be displayed and the buffer will be untouched. - *:GoLint* + *:GoLint* :GoLint [packages] - Run golint for the current Go file, or for given packages. + Run golint for the directory under your current file, or for the given + packages. - *:GoDoc* + *:GoDoc* :GoDoc [word] Open the relevant GoDoc in split window for either the word[s] passed to the command or by default, the word under the cursor. - *:GoDocBrowser* + *:GoDocBrowser* :GoDocBrowser [word] Open the relevant GoDoc in browser for either the word[s] passed to the - command or by default, the word under the cursor. + command or by default, the word under the cursor. By default it opens the + documentation in 'https://godoc.org'. To change it see |'g:go_doc_url'|. - *:GoFmt* + *:GoFmt* :GoFmt Filter the current Go buffer through gofmt. It tries to preserve cursor @@ -183,7 +214,7 @@ COMMANDS *go-commands* Filter the current Go buffer through goimports (needs to be installed). `goimports` automatically discards/add import path based on the code. Like - |GoFmt|, It tries to preserve cursor position and avoids replacing the + |:GoFmt|, It tries to preserve cursor position and avoids replacing the buffer with stderr output. *:GoPlay* @@ -194,14 +225,14 @@ COMMANDS *go-commands* is copied to system clipboard if Vim is compiled with 'clipboard' or 'xterm-clipboard' otherwise it's get yanked into the `""` register. - *:GoVet* + *:GoVet* :GoVet[!] [options] Run `go vet` for the directory under your current file. Vet examines Go source code and reports suspicious constructs, such as Printf calls whose - arguments do not align with the format string. Vet uses heuristics that do not - guarantee all reports are genuine problems, but it can find errors not caught - by the compilers. + arguments do not align with the format string. Vet uses heuristics that do + not guarantee all reports are genuine problems, but it can find errors not + caught by the compilers. You may optionally pass any valid go tool vet flags/options. In this case, `go tool vet` is run in place of `go vet`. For a full list please see @@ -209,19 +240,78 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. - *:GoDef* -:GoDef [identifier] + *:GoDef* +:GoDef +gd +CTRL-] +g + + + Goto declaration/definition for the declaration under the cursor. By + default the CTRL-] shortcut, the mapping `gd` and , + g are enabled to invoke :GoDef for the identifier under the + cursor. See |'g:go_def_mapping_enabled'| to disable them. No explicit + arguments are supported. + + vim-go also keeps a per-window location stack, roughly analogous to how + Vim's internal |tags| functionality works. This is pushed to every time a + jump is made using the GoDef functionality. In essence, this is a LIFO + list of file locations you have visited with :GoDef that is retained to + help you navigate software. + + *:GoDefStack* +:GoDefStack [number] + + This command Jumps to a given location in the jumpstack, retaining all + other entries. Jumps to non-existent entries will print an informative + message, but are otherwise a noop. + + If no argument is given, it will print out an interactive list of all + items in the stack. Its output looks like this: + + 1 /path/first/file.go|1187 col 16|AddThing func(t *Thing) + > 2 /path/thing/thing.go|624 col 19|String() string + 3 /path/thing/thing.go|744 col 6|func Sprintln(a ...interface{}) string + + This list shows the identifiers that you jumped to and the file and cursor + position before that jump. The older jumps are at the top, the newer at + the bottom. - Goto declaration/definition for the given [identifier]. If no argument is - given, it will jump to the declaration under the cursor. By default the - mapping `gd` is enabled to invoke GoDef for the identifier under the cursor. - See |g:go_def_mapping_enabled| to disable it. + The '>' points to the active entry. This entry and any newer entries + below it will be replaced if |:GoDef| is done from this location. The + CTRL-t and |:GoDefPop| command will jump to the position above the active + entry. - *:GoRun* + Jumps to non-existent entries will print an informative message, but are + otherwise a noop. + + *:GoDefStackClear* +:GoDefStackClear + + Clears the current stack list and resets it. + + *:GoDefPop* +:GoDefPop [count] +CTRL-t + + Navigate to the [count] earlier entry in the jump stack, retaining the + newer entries. If no argument is given, it will jump to the next most + recent entry (`:GoDefPop 1`). If [count] is greater than the number of + prior entries, an error will be printed and no jump will be performed. + + If you have used :GoDefPop to jump to an earlier location, and you issue + another :GoDef command, the current entry will be replaced, and all newer + entries will be removed, effectively resuming the stack at that location. + + By default [count]CTRL-t is enabled to invoke :GoDefPop. Similarly, + hitting CTRL-t without a prior count is equivalent to `:GoDefPop 1`. See + |'g:go_def_mapping_enabled'| to disable this. + + *:GoRun* :GoRun[!] [expand] Build and run your current main package. By default all main files for the - current file is used. If an argument is passed, 'expand' is used as file + current file is used. If an argument is passed, [expand] is used as file selector. For example use `:GoRun %` to select the current file only. You may optionally pass any valid go run flags/options. For a full list @@ -230,73 +320,75 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. If using neovim then `:GoRun` will run in a new terminal according to - |g:go_term_mode|. + |'g:go_term_mode'|. - *:GoBuild* + *:GoBuild* :GoBuild[!] [expand] Build your package with `go build`. Errors are populated in the quickfix window. It automatically builds only the files that depends on the current file. `:GoBuild` doesn't produce a result file. - Use 'make' to create a result file. + Use |:make| to create a result file. You may optionally pass any valid go build flags/options. For a full list - please see `go help build`. Options are expanded with 'expand'. + please see `go help build`. Options are expanded with [expand]. If [!] is not given the first error is jumped to. If using neovim then this command is fully async, it does not block the UI. - *:GoGenerate* + *:GoGenerate* :GoGenerate[!] [expand] Creates or updates your auto-generated source files by running `go generate`. - You may optionally pass any valid go generate flags/options. For a full list - please see `go help generate`. Options are expanded with 'expand'. + You may optionally pass any valid go generate flags/options. For a full + list please see `go help generate`. Options are expanded with [expand]. If [!] is not given the first error is jumped to. - *:GoInfo* + *:GoInfo* :GoInfo Show type information about the identifier under the cursor. For example putting it above a function call is going to show the full function - signature. It uses gocode to get the type informations. + signature. By default it uses `gocode` to get the type informations. To + change the underlying tool from `gocode` to another tool, see + |'g:go_info_mode'|. - *:GoInstall* + *:GoInstall* :GoInstall[!] [options] Install your package with `go install`. - You may optionally pass any valid go install flags/options. For a full list - please see `go help install`. + You may optionally pass any valid go install flags/options. For a full + list please see `go help install`. If [!] is not given the first error is jumped to. - *:GoTest* + *:GoTest* :GoTest[!] [expand] Run the tests on your _test.go files via in your current directory. Errors - are populated in the quickfix window. If an argument is passed, 'expand' + are populated in the quickfix window. If an argument is passed, [expand] is used as file selector (useful for cases like `:GoTest ./...`). You may optionally pass any valid go test flags/options. For a full list please see `go help test`. GoTest timesout automatically after 10 seconds. To customize the timeout - use |g:go_test_timeout|. This feature is disabled if any arguments are + use |'g:go_test_timeout'|. This feature is disabled if any arguments are passed to the `:GoTest` command. If [!] is not given the first error is jumped to. If using neovim `:GoTest` will run in a new terminal or run asynchronously - in the background according to |g:go_term_enabled|. You can set the mode of - the new terminal with |g:go_term_mode|. + in the background according to |'g:go_term_enabled'|. You can set the mode + of the new terminal with |'g:go_term_mode'|. - *:GoTestFunc* + *:GoTestFunc* :GoTestFunc[!] [expand] Runs :GoTest, but only on the single test function immediate to your @@ -308,28 +400,50 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. - If using neovim `:GoTestFunc` will run in a new terminal or run asynchronously - in the background according to |g:go_term_enabled|. You can set the mode of - the new terminal with |g:go_term_mode|. + If using neovim `:GoTestFunc` will run in a new terminal or run + asynchronously in the background according to |'g:go_term_enabled'|. You + can set the mode of the new terminal with |'g:go_term_mode'|. *:GoTestCompile* :GoTestCompile[!] [expand] Compile your _test.go files via in your current directory. Errors are - populated in the quickfix window. If an argument is passed, 'expand' is + populated in the quickfix window. If an argument is passed, [expand] is used as file selector (useful for cases like `:GoTest ./...`). Useful to not run the tests and capture/fix errors before running the tests or to create test binary. If [!] is not given the first error is jumped to. - If using neovim `:GoTestCompile` will run in a new terminal or run asynchronously - in the background according to |g:go_term_enabled|. You can set the mode of - the new terminal with |g:go_term_mode|. + If using neovim `:GoTestCompile` will run in a new terminal or run + asynchronously in the background according to |'g:go_term_enabled'|. You + can set the mode of the new terminal with |'g:go_term_mode'|. - *:GoCoverage* + *:GoCoverage* :GoCoverage[!] [options] + Create a coverage profile and annotates the current file's source code. If + called again it rerurns the tests. + + If [!] is not given the first error is jumped to. + + *:GoCoverageToggle* +:GoCoverageToggle[!] [options] + + Create a coverage profile and annotates the current file's source code. If + called again clears the annotation (works as a toggle). + + If [!] is not given the first error is jumped to. + + *:GoCoverageClear* +:GoCoverageClear [options] + + Clears the coverage annotation. + + + *:GoCoverageBrowser* +:GoCoverageBrowser[!] [options] + Create a coverage profile and open a browser to display the annotated source code of the current package. @@ -338,45 +452,56 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. - *:GoErrCheck* + *:GoErrCheck* :GoErrCheck [options] Check for unchecked errors in you current package. Errors are populated in the quickfix window. - You may optionally pass any valid errcheck flags/options. For a full list - please see `errcheck -h`. + You may optionally pass any valid errcheck flags/options. See + `errcheck -h` for a full list. - *:GoFiles* -:GoFiles + *:GoFiles* +:GoFiles [source_files] - Show source files that depends for the current package + Show source files for the current package. The [source_files] specifies + which file types to list. See the "// Source files" section of + `go list -h` for possible values; multiple values are accepted. + Command-line completion also works for this command. + The default is to use `GoFiles` if no arguments are given. - *:GoDeps* + *:GoDeps* :GoDeps - Show dependencies for the current package + Show dependencies for the current package. *:GoInstallBinaries* -:GoInstallBinaries +:GoInstallBinaries [binaries] - Download and Install all necessary Go tool binaries such as `godef`, - `goimports`, `gocode`, etc.. under `g:go_bin_path` + Download and install all necessary Go tool binaries such as `godef`, + `goimports`, `gocode`, etc. under |'g:go_bin_path'|. If [binaries] is + supplied, then only the specified binaries will be installed. The default + is to install everything. - *:GoUpdateBinaries* -:GoUpdateBinaries + Set |'g:go_get_update'| to disable updating dependencies. - Download and Update previously installed Go tool binaries such as `godef`, - `goimports`, `gocode`, etc.. under `g:go_bin_path`. This can be used to - update the necessary Go binaries. + *:GoUpdateBinaries* +:GoUpdateBinaries [binaries] - *:GoImplements* + Download and update previously installed Go tool binaries such as `godef`, + `goimports`, `gocode`, etc. under |'g:go_bin_path'|. If [binaries] is + supplied, then only the specified binaries will be updated. The default is + to update everything. + + Set |'g:go_get_update'| to disable updating dependencies. + + *:GoImplements* :GoImplements - Show 'implements' relation for a selected package. A list of interfaces + Show "implements" relation for a selected package. A list of interfaces for the type that implements an interface under the cursor (or selected package) is shown in a location list. - *:GoRename* + *:GoRename* :GoRename[!] [to] Rename the identifier under the cursor to the desired new name. If no @@ -385,152 +510,339 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. - *:GoOracleScope* -:GoOracleScope [path1] [path2] ... + *:GoGuruScope* +:GoGuruScope [pattern] [pattern2] ... [patternN] - Changes the custom |g:go_oracle_scope| setting and overrides it with the - given import paths. The custom scope is cleared (unset) if `""` is given - as the only path. If no arguments is given it prints the current custom - scope. + Changes the custom |'g:go_guru_scope'| setting and overrides it with the + given package patterns. The custom scope is cleared (unset) if `""` is + given as the only path. If no arguments is given it prints the current + custom scope. Example patterns are: +> + golang.org/x/tools/cmd/guru # a single package + golang.org/x/tools/... # all packages beneath dir + ... # the entire workspace. +< + Example usage, the following sets the scope to a `github.com/fatih/color` + and to all packages under `golang.org/x/tools/`: +> + :GoGuruScope github.com/fatih/color golang.org/x/tools/... +< + The following sets it to the entire workspace: +> + :GoGuruScope ... +< + Under the hood, the patterns are all joined to a comma-separated list and + passed to `guru`'s `-scope` flag. - *:GoCallees* + Also see |go-guru-scope|. + + *:GoCallees* :GoCallees - Show 'callees' relation for a selected package. A list of possible call + Show "callees" relation for a selected package. A list of possible call targets for the type under the cursor (or selected package) is shown in a location list. - *:GoCallers* + *:GoCallers* :GoCallers - Show 'callers' relation for a selected function. A list of possible + Show "callers" relation for a selected function. A list of possible callers for the selected function under the cursor is shown in a location list. - *:GoDescribe* + *:GoDescribe* :GoDescribe Shows various properties of the selected syntax: its syntactic kind, its type (for an expression), its value (for a constant expression), its size, alignment, method set and interfaces (for a type), its declaration (for an identifier), etc. Almost any piece of syntax may be described, and the - oracle will try to print all the useful information it can. + guru will try to print all the useful information it can. - *:GoCallstack* + *:GoCallstack* :GoCallstack - Shows 'callstack' relation for the selected function. An arbitrary path + Shows "callstack" relation for the selected function. An arbitrary path from the root of the callgraph to the selected function is shown in a location list. This may be useful to understand how the function is reached in a given program. - *:GoFreevars* + *:GoFreevars* :GoFreevars - Enumerates the free variables of the selection. ā€œFree variablesā€ is a + Enumerates the free variables of the selection. "Free variables" is a technical term meaning the set of variables that are referenced but not defined within the selection, or loosely speaking, its inputs. - This information is useful if youā€™re considering whether to refactor the + This information is useful when considering whether to refactor the selection into a function of its own, as the free variables would be the - necessary parameters of that function. Itā€™s also useful when you want to + necessary parameters of that function. It's also useful when you want to understand what the inputs are to a complex block of code even if you donā€™t plan to change it. - *:GoChannelPeers* + *:GoChannelPeers* :GoChannelPeers Shows the set of possible sends/receives on the channel operand of the - selected send or receive operation; the selection must be a <- token. + selected send or receive operation; the selection must be a `<-` token. For example, visually select a channel operand in the form of: - - "done <- true" - - and call |GoChannelPeers| on it. It will show where it was allocated, and +> + done <- true +< + And call |:GoChannelPeers| on it. It will show where it was allocated, and the sending and receiving endings. - *:GoReferrers* + *:GoReferrers* :GoReferrers The referrers query shows the set of identifiers that refer to the same object as does the selected identifier, within any package in the analysis scope. - *:GoMetaLinter* + *:GoSameIds* +:GoSameIds + + Highlights all identifiers that are equivalent to the identifier under the + cursor. + + *:GoSameIdsClear* +:GoSameIdsClear + + Clears all SameIds highlights from a |:GoSameIds| call. + + *:GoSameIdsToggle* +:GoSameIdsToggle + + Toggle between |:GoSameIds| and |:GoSameIdsClear|. + + *:GoSameIdsAutoToggle* +:GoSameIdsAutoToggle + + Enables or disables automatic highlighting of |:GoSameIds| while moving + the cursor. This basically toggles the option |'g:go_auto_sameids'| + on/off. + If enabled it starts highlighting whenever your cursor is staying at the + same position for a configurable period of time (see 'updatetime'). If + disabled it clears and stops automatic highlighting. + + *:GoMetaLinter* :GoMetaLinter [path] Calls the underlying `gometalinter` tool and displays all warnings and - errors in the quickfix window. By default the following linters are - enabled: "'vet', 'golint', 'errcheck'". This can be changed with the - |g:go_metalinter_enabled| variable. To override the command completely use - the variable |g:go_metalinter_command|. To override the maximum linters - execution time use |g:go_metalinter_deadline| variable. - - *:GoOracleTags* -:GoOracleTags [tags] - - Changes the custom |g:go_oracle_tags| setting and overrides it with the - given build tags. This command cooperate with GoReferrers command when - there exist mulitiple build tags in your project, then you can set one - of the build tags for GoReferrers to find more accurate. - The custom build tags is cleared (unset) if `""` is given. If no arguments - is given it prints the current custom build tags. + errors in the |quickfix| window. By default the following linters are + enabled: `vet`, `golint`, and `errcheck`. This can be changed with the + |'g:go_metalinter_enabled'| variable. To override the command completely + use the variable |'g:go_metalinter_command'|. To override the maximum + linters execution time use |'g:go_metalinter_deadline'| variable. + + *:GoBuildTags* +:GoBuildTags [tags] + + Changes the build tags for various commands. If you have any file that + uses a custom build tag, such as `//+build integration` , this command can + be used to pass it to all tools that accepts tags, such as guru, gorename, + etc.. + + The build tags is cleared (unset) if `""` is given. If no arguments is + given it prints the current custom build tags. *:AsmFmt* :AsmFmt - Filter the current Go asm buffer through asmfmt. It tries to preserve cursor - position and avoids replacing the buffer with stderr output. - + Filter the current Go asm buffer through asmfmt. It tries to preserve + cursor position and avoids replacing the buffer with stderr output. - *:GoAlternate* + *:GoAlternate* :GoAlternate[!] - Alternates between the implementation and test code. For example if in main.go, - switch to main_test.go. Uses the |g:go_alternate_mode| setting as the command - to open the file. + Alternates between the implementation and test code. For example if in + main.go, switch to main_test.go. Uses the |'g:go_alternate_mode'| setting + as the command to open the file. - If [!] is given then it switches to the new file even if it does not exist. + If [!] is given then it switches to the new file even if it does not + exist. - If you would like to override the traditional commands for alternating, add - the following to your .vimrc: + If you would like to override the traditional commands for alternating, + add the following to your .vimrc: > augroup go autocmd! - autocmd Filetype go command! -bang A call go#alternate#Switch(0, 'edit') - autocmd Filetype go command! -bang AV call go#alternate#Switch(0, 'vsplit') - autocmd Filetype go command! -bang AS call go#alternate#Switch(0, 'split') + autocmd Filetype go + \ command! -bang A call go#alternate#Switch(0, 'edit') + \| command! -bang AV call go#alternate#Switch(0, 'vsplit') + \| command! -bang AS call go#alternate#Switch(0, 'split') augroup END < - *:GoDecls* + *:GoWhicherrs* +:GoWhicherrs + + Show the list of possible constants, global variables, and concrete types + for the error type under the cursor in a location list. + + *:GoDecls* :GoDecls [file] - - Only enabled if `ctrlp.vim` is installed. If run shows all function and - type declarations for the current file. If [file] is non empty it parses - the given file. - By default `type` and `func` declarations are being showed. This can be - changed via |g:go_decls_includes|, which accepts a comma delimited list of - definitions. By default set to: `"func,type"`. Possible options are: - `{func,type}` - - *:GoDeclsDir* + + Show all function and type declarations for the current file. If + [file] is non empty it parses the given file. + Requires `ctrlp.vim` or `fzf`; it will autodetect the plugin if installed, + but you can use |'g:go_decls_mode'| to force using one or the other. + By default `type` and `func` declarations are shown. This can be changed + via |'g:go_decls_includes'|. Also see |unite-decls|, |denite-decls|. + + *:GoDeclsDir* :GoDeclsDir [dir] - - Only enabled if `ctrlp.vim` is installed. If run shows all function and - type declarations for the current directory. If [dir] is given it parses - the given directory. - By default `type` and `func` declarations are being showed. This can be - changed via |g:go_decls_includes|, which accepts a comma delimited list of - definitions. By default set to: `"func,type"`. Possible options are: - `{func,type}` - -=============================================================================== + + Show all function and type declarations for the current directory. If + [dir] is given it parses the given directory. + + *unite-decls* + *denite-decls* +:Unite decls[:path] +:Denite decls[:path] + + Only enabled if `unite.vim` or `denite.nvim` is installed. Show + declarations for all functions and types on the current file or directory + or for [path] if given. + + Note: `denite.nvim` requires NeoVim or Vim 8 with |:python3| enabled. +> + " show declarations on the parent directory of the current file + :Unite decls + :Denite decls + + " show declarations in the file. + :Unite decls:foo/bar.go + :Denite decls:foo/bar.go + + " show declarations in the directory "foo". + :Unite decls:foo + :Denite decls:foo +< + *:GoImpl* +:GoImpl [receiver] [interface] + + Generates method stubs for implementing an interface. If no arguments is + passed it takes the identifier under the cursor to be the receiver and + asks for the interface type to be generated. If used with arguments, the + receiver and the interface needs to be specified. Example usages: +> + :GoImpl f *Foo io.Writer + :GoImpl t Type io.ReadWriteCloser +< + *:GoAddTags* +:[range]GoAddTags [key],[option] [key1],[option] ... + + Adds field tags for the fields of a struct. If called inside a struct it + automatically add field tags with the `json` key and the value + automatically generated based on the field name. An error message is given + if it's called outside a struct definition or if the file is not correctly + formatted. + + If [range] is given, only the selected fields will be changed. + + The default `json` can be changed by providing one or more [key] + arguments. An example of adding `xml` and `db` would be: +> + :GoAddTags xml db +< + If [option] is passed it'll either add a new tag with an option or will + modify existing tags. An example of adding `omitempty` to all `json` + fields would be: +> + :GoAddTags json,omitempty +< + You can define a constant value instead of the default field based value. + For example the following command will add ``valid:"1"`` to all fields. +> + :GoAddTags valid=1 +< + *:GoRemoveTags* +:[range]GoRemoveTags [key],[option] [key1],[option1] ... + + Rmove field tags for the fields of a struct. If called inside a struct it + automatically remove all field tags. An error message is given if it's + called outside a struct definition or if the file is not correctly + formatted + + If [range] is given, only the selected fields will be changed. + + If [key] is given, it will only remove those keys. Example: +> + :GoRemoveTags json +< + If [option] is passed with a [key], it will only remove the options. + Example, this will only remove `omitempty` options from fields containing + `json`: +> + :GoRemoveTags json,omitempty +< + *:GoAutoTypeInfoToggle* +:GoAutoTypeInfoToggle + + Toggles |'g:go_auto_type_info'|. + + *:GoFmtAutoSaveToggle* +:GoFmtAutoSaveToggle + + Toggles |'g:go_fmt_autosave'|. + + *:GoAsmFmtAutoSaveToggle* +:GoAsmFmtAutoSaveToggle + + Toggles |'g:go_asmfmt_autosave'|. + + *:GoMetaLinterAutoSaveToggle* +:GoMetaLinterAutoSaveToggle + + Toggles |'g:go_metalinter_autosave'|. + + *:GoTemplateAutoCreateToggle* +:GoTemplateAutoCreateToggle + + Toggles |'g:go_template_autocreate'|. + + *:GoKeyify* +:GoKeyify + + Uses `keyify` to turn unkeyed struct literals into keyed ones. + + For example: +> + Person{"John", "Smith"} +< + Becomes: +> + Person{ + Name: "John", + Surname: "Smith", + } +< + *:GoFillStruct* +:GoFillStruct + + Use `fillstruct` to fill a struct literal with default values. Existing + values (if any) are preserved. The cursor must be on the struct you wish + to fill. + + For example: +> + addr := net.Address{Name: "Ford Prefect"} +< + Becomes: +> + addr := net.Address{ + Name: "Ford Prefect", + Email: "", + } +< + +============================================================================== MAPPINGS *go-mappings* vim-go has several keys which can be used to create custom mappings -For example, to create a mapping that `go run` the current file create a -mapping for the `(go-run)`: > +For example, to create a mapping that calls `go run` for the current package, +create a mapping for the `(go-run)`: > au FileType go nmap r (go-run) @@ -538,11 +850,11 @@ As always one is free to create more advanced mappings or functions based with |go-commands|. For more information please check out the mappings command documentation in the |go-commands| section. Available keys are: - *(go-run)* + *(go-run)* -Calls `go run` for the current file +Calls `go run` for the current main package - *(go-run-tab)* + *(go-run-tab)* Calls `go run` for the current file in a new terminal tab This option is neovim only. @@ -552,169 +864,201 @@ This option is neovim only. Calls `go run` for the current file in a new terminal horizontal split This option is neovim only. - *(go-run-vertical)* + *(go-run-vertical)* Calls `go run` for the current file in a new terminal vertical split This option is neovim only. - - *(go-build)* + *(go-build)* Calls `go build` for the current package - *(go-generate)* + *(go-generate)* Calls `go generate` for the current package - - *(go-info)* + *(go-info)* Shows type information for the word under the cursor - - *(go-install)* + *(go-install)* Calls `go install` for the current package - - *(go-test)* + *(go-test)* Calls `go test` for the current package - *(go-test-func)* + *(go-test-func)* Calls `go test -run '...'` for the test function immediate to cursor - *(go-test-compile)* + *(go-test-compile)* Calls `go test -c` for the current package - *(go-coverage)* + *(go-coverage)* + +Calls `go test -coverprofile-temp.out` for the current package and shows the +coverage annotation. + + *(go-coverage-clear)* + +Clears the coverage annotation + + *(go-coverage-toggle)* -Calls `go test -coverprofile-temp.out` for the current package +Calls `go test -coverprofile-temp.out` for the current package and shows the +coverage annotation. If run again it acts as a toggle and clears the +annotation. - *(go-vet)* + *(go-imports)* + +Calls `goimports` for the current package + + *(go-lint)* + +Calls `golint` for the current package + + *(go-vet)* Calls `go vet` for the current package - *(go-files)* + *(go-files)* Show source files that depends for the current package - *(go-deps)* + *(go-deps)* Show dependencies for the current package - *(go-doc)* + *(go-doc)* Show the relevant GoDoc for the word under the cursor in a split window leftabove (default mode). - *(go-doc-split)* + *(go-doc-split)* Show the relevant GoDoc for the word under the cursor in a split window. - *(go-doc-vertical)* + *(go-doc-vertical)* Show the relevant GoDoc for the word under the cursor in a vertical split window. - - *(go-doc-tab)* + *(go-doc-tab)* Show the relevant GoDoc for the word under the cursor in a tab window. - *(go-doc-browser)* + *(go-doc-browser)* Show the relevant GoDoc for the word under in browser - *(go-def)* + *(go-def)* Goto declaration/definition. Results are shown in the current buffer. - - *(go-def-split)* + *(go-def-split)* Goto declaration/definition. Results are shown in a split window. +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled. - - *(go-def-vertical)* + *(go-def-vertical)* Goto declaration/definition. Results are shown in a vertical split window. +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled. - - *(go-def-tab)* + *(go-def-tab)* Goto declaration/definition. Results are shown in a tab window. +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled. + + *(go-def-stack)* + +Shows the godef tag stack + + *(go-def-stack-clear)* + +Resets and clears the tag stack + + *(go-def-pop)* + +Jump to previous entry in the tag stack - *(go-implements)* + *(go-implements)* Show the interfaces that the type under the cursor implements. - *(go-rename)* + *(go-rename)* Rename the identifier under the cursor to the desired new name - *(go-callees)* + *(go-callees)* Show the call targets for the type under the cursor - *(go-callers)* + *(go-callers)* Show possible callers of selected function - *(go-describe)* + *(go-describe)* Describe selected syntax: definition, methods, etc - - *(go-callstack)* + *(go-callstack)* Show path from callgraph root to selected function - *(go-freevars)* + *(go-freevars)* Show free variables of selection - *(go-channelpeers)* + *(go-channelpeers)* Show send/receive corresponding to selected channel op - *(go-referrers)* + *(go-referrers)* Show all refs to entity denoted by selected identifier - *(go-metalinter)* + *(go-metalinter)* Calls `go-metalinter` for the current directory - *(go-alternate-edit)* + *(go-alternate-edit)* Alternates between the implementation and test code in the current window - *(go-alternate-split)* + *(go-alternate-split)* Alternates between the implementation and test code in a new horizontal split - *(go-alternate-vertical)* + *(go-alternate-vertical)* Alternates between the implementation and test code in a new vertical split -=============================================================================== + *(go-import)* + +Calls `:GoImport` for the current package + + +============================================================================== TEXT OBJECTS *go-text-objects* vim-go comes with several custom |text-objects| that can be used to operate upon regions of text. vim-go currently defines the following text objects: *go-v_af* *go-af* -af "a function", select contents from a function definition to the - closing bracket. If |g:go_textobj_include_function_doc| is +af "a function", select contents from a function definition to the + closing bracket. If |'g:go_textobj_include_function_doc'| is enabled it also includes the comment doc for a function declaration. This text-object also supports literal functions. + If |'g:go_textobj_include_variable'| is enabled it also + includes the variable of an function assignment *go-v_if* *go-if* if "inside a function", select contents of a function, @@ -725,9 +1069,9 @@ if "inside a function", select contents of a function, vim-go also defines the following text motion objects: *go-v_]]* *go-]]* -]] [count] forward to next function declaration. If - |g:go_textobj_include_function_doc| is enabled and if your - on a comment, it skips the function which the comment +]] [count] forward to next function declaration. If + |'g:go_textobj_include_function_doc'| is enabled and if your + on a comment, it skips the function which the comment belongs and forwards to the next function declaration. *go-v_[[* *go-[[* @@ -735,59 +1079,99 @@ vim-go also defines the following text motion objects: -=============================================================================== +============================================================================== FUNCTIONS *go-functions* - *go#jobcontrol#Statusline()* + *go#statusline#Show()* Shows the status of a job running asynchronously. Can be used to plug into the statusline. It works to show the status per package instead of per -file. Assume you have three files open, all belonging to the same package, -if the package build (`:GoBuild`) is successful, all statusline's will be empty -(means SUCCESS), if you it fails all file's statusline will show FAILED. +file. Assume you have three files open, all belonging to the same package, if +the package build (`:GoBuild`) is successful, all statusline's will show +`success`, if you it fails all file's statusline will show `failed`. - *go#complete#GetInfo()* +To avoid always showing old status information, the status information is +cleaned for each package after `60` seconds. This can be changed with the +|'g:go_statusline_duration'| setting. + + *go#complete#GetInfo()* Returns the description of the identifer under the cursor. Can be used to plug -into the statusline. This function is also used for |g:go_auto_type_info|. +into the statusline. This function is also used for |'g:go_auto_type_info'|. -=============================================================================== +============================================================================== SETTINGS *go-settings* - *'g:go_test_timeout'* + *'g:go_test_show_name'* + +Show the name of each failed test before the errors and logs output by the +test. By default it is disabled. +> + let g:go_test_show_name = 0 +< + + *'g:go_test_timeout'* Use this option to change the test timeout of |:GoTest|. By default it is set to 10 seconds . > let g:go_test_timeout= '10s' < + *'g:go_play_browser_command'* - *'g:go_play_browser_command'* +Browser to use for |:GoPlay| or |:GoDocBrowser|. The url must be added with +`%URL%`, and it's advisable to include `&` to make sure the shell returns. For +example: +> + let g:go_play_browser_command = 'firefox-developer %URL% &' +< -Use this option to change the browser that is used to open the snippet url -posted to play.golang.org with |:GoPlay| or for the relevant documentation -used with |:GoDocBrowser|. By default it tries to find it automatically for -the current OS. > +By default it tries to find it automatically for the current OS. > let g:go_play_browser_command = '' < - *'g:go_play_open_browser'* + *'g:go_play_open_browser'* Use this option to open browser after posting the snippet to play.golang.org with |:GoPlay|. By default it's enabled. > let g:go_play_open_browser = 1 < - *'g:go_auto_type_info'* - -Use this option to show the type info (|:GoInfo|) for the word under the cursor -automatically. Whenever the cursor changes the type info will be updated. -By default it's disabled > + *'g:go_auto_type_info'* +Use this option to show the type info (|:GoInfo|) for the word under the +cursor automatically. Whenever the cursor changes the type info will be +updated. By default it's disabled. The delay can be configured with the +'g:go_updatetime' setting. +> let g:go_auto_type_info = 0 < - *'g:go_jump_to_error'* + *'g:go_info_mode'* + +Use this option to define the command to be used for |:GoInfo|. By default +`gocode` is being used as it's the fastest option. But one might also use +`guru` as it's covers more cases and is more accurate. Current valid options +are: `[gocode, guru]` > + + let g:go_info_mode = 'gocode' +< + *'g:go_auto_sameids'* + +Use this option to highlight all uses of the identifier under the cursor +(:GoSameIds) automatically. By default it's disabled. The delay can be +configured with the 'g:go_updatetime' setting. +> + let g:go_auto_sameids = 0 +< + *'g:go_updatetime'* + +Use this option to configure the a custom 'updatetime' for Go source files. If +set to 0, no custom time will be configured. By default it's set to 800ms. +> + let g:go_updatetime = 800 +< + *'g:go_jump_to_error'* Use this option to enable/disable passing the bang attribute to the mappings |(go-build)|, |(go-run)|, etc.. When enabled it will jump to the first error @@ -798,36 +1182,47 @@ changing the behaviour of our custom static mappings. By default it's enabled. > let g:go_jump_to_error = 1 < - *'g:go_fmt_autosave'* + *'g:go_fmt_autosave'* Use this option to auto |:GoFmt| on save. By default it's enabled > let g:go_fmt_autosave = 1 < - *'g:go_fmt_command'* + *'g:go_fmt_command'* Use this option to define which tool is used to gofmt. By default `gofmt` is used > let g:go_fmt_command = "gofmt" < - *'g:go_fmt_options'* - -Use this option to add additional options to the |g:go_fmt_command|. Default -is empty. > + *'g:go_fmt_options'* +Use this option to add additional options to the |'g:go_fmt_command'|. It's +value type can be either a string or a dictionary. This is due backwards +compatibility. The string version will be removed in the future so please use +the dictionary version. Default is empty. +> let g:go_fmt_options = '' -< - *'g:go_fmt_fail_silently'* + or -Use this option to disable showing a location list when |g:go_fmt_command| + let g:go_fmt_options = {} +< +The dictionary version allows you to define options for multiple binaries: +> + let g:go_fmt_options = { + \ 'gofmt': '-s', + \ 'goimports': '-local mycompany.com', + \ } +< + *'g:go_fmt_fail_silently'* + +Use this option to disable showing a location list when |'g:go_fmt_command'| fails. By default the location list is shown. > let g:go_fmt_fail_silently = 0 < - - *'g:go_fmt_experimental'* + *'g:go_fmt_experimental'* Use this option to enable fmt's experimental mode. This experimental mode is superior to the current mode as it fully saves the undo history, so undo/redo @@ -836,192 +1231,174 @@ it's causing problems on some Vim versions. By default it's disabled. > let g:go_fmt_experimental = 0 < - *'g:go_doc_keywordprg_enabled'* + *'g:go_doc_keywordprg_enabled'* -Use this option to run `godoc` on words under the cursor with the default -K , keywordprg shortcut. Usually this shortcut is set to use the program `man`. -In Go, using `godoc` is more idiomatic. Default is enabled. > +Use this option to run `godoc` on words under the cursor with |K|; this will +normally run the `man` program, but for Go using `godoc` is more idiomatic. It +will not override the |'keywordprg'| setting, but will run |:GoDoc|. Default +is enabled. > let g:go_doc_keywordprg_enabled = 1 < - *'g:go_def_mapping_enabled'* + *'g:go_doc_height'* -Use this option to enable/disable the default mapping of (`gd`) for GoDef. -Disabling it allows you to map something else to `gd`. Default is enabled. > +Maximum height for the GoDoc window created with |:GoDoc|. Default is 20. > - let g:go_def_mapping_enabled = 1 + let g:go_doc_max_height = 20 < - *'g:go_dispatch_enabled'* -Use this option to enable/disable the use of Dispatch to execute the -`:GoRun`, `:GoBuild` and `:GoGenerate` commands. More information about Dispatch -is available at https://github.com/tpope/vim-dispatch. Default is disabled. > + *'g:go_doc_url'* - let g:go_dispatch_enabled = 0 -< - *'g:go_doc_command'* - -Use this option to define which tool is used to godoc. By default `godoc` is -used > - - let g:go_doc_command = "godoc" -< - *'g:go_doc_options'* - -Use this option to add additional options to the |g:go_doc_command|. Default -is empty. > - - let g:go_doc_options = '' - -< *'g:go_bin_path'* - -Use this option to change default path for vim-go tools when using -|GoInstallBinaries| and |GoUpdateBinaries|. If not set `$GOBIN` or -`$GOPATH/bin` is used. > - - let g:go_bin_path = "" -< - *'g:go_snippet_engine'* - -Use this option to define the default snippet engine. By default "ultisnips" -is used. Use "neosnippet" for neosnippet.vim: > - - let g:go_snippet_engine = "ultisnips" -< - - *'g:go_oracle_scope'* - -Use this option to define the scope of the analysis to be passed for oracle -related commands, such as |GoImplements|, |GoCallers|, etc. By default it's -not set, so only the current package's go files are passed as scope. You can -change it on-the-fly with |GoOracleScope|. For more info, please have a look -at oracle's user manual: -https://golang.org/s/oracle-user-manual#heading=h.nwso96pj07q8 > - - let g:go_oracle_scope = '' +godoc server URL used when |:GoDocBrowser| is used. Change if you want to use +a private internal service. Default is 'https://godoc.org'. +> + let g:go_doc_url = 'https://godoc.org' < - *'g:go_highlight_array_whitespace_error'* + *'g:go_def_mode'* -Highlights white space after "[]". > +Use this option to define the command to be used for |:GoDef|. By default +`guru` is being used as it covers all edge cases. But one might also use +`godef` as it's faster. Current valid options are: `[guru, godef]` > - let g:go_highlight_array_whitespace_error = 1 + let g:go_def_mode = 'guru' < + *'g:go_def_mapping_enabled'* - *'g:go_highlight_chan_whitespace_error'* - -Highlights white space around the communications operator (`<-`) that doesn't -follow the standard style. > +Use this option to enable/disable the default mapping of CTRL-], +, g and (`gd`) for GoDef and CTRL-t for :GoDefPop. +Disabling it allows you to map something else to these keys or mappings. +Default is enabled. > - let g:go_highlight_chan_whitespace_error = 1 + let g:go_def_mapping_enabled = 1 < + *'g:go_def_reuse_buffer'* - *'g:go_highlight_extra_types'* +Use this option to jump to an existing buffer for the split, vsplit and tab +mappings of |:GoDef|. By default it's disabled. > -Highlights commonly used library types (io.Reader, etc.). > - - let g:go_highlight_extra_types = 1 + let g:go_def_reuse_buffer = 0 < + *'g:go_doc_command'* - *'g:go_highlight_space_tab_error'* +Command to use for |:GoDoc|; only used when invoked with a package name. The +`gogetdoc` command is always used when |:GoDoc| is used on the identifier +under the cursor (i.e. without argument or from |K|). > -Highlights instances of tabs following spaces. > + let g:go_doc_command = ["godoc"] - let g:go_highlight_space_tab_error = 1 -< - *'g:go_highlight_trailing_whitespace_error'* - -Highlights trailing white space. > +< *'g:go_bin_path'* - let g:go_highlight_trailing_whitespace_error = 1 +Use this option to change default path for vim-go tools when using +|:GoInstallBinaries| and |:GoUpdateBinaries|. If not set `$GOBIN` or +`$GOPATH/bin` is used. > + let g:go_bin_path = "" < - *'g:go_highlight_operators'* + *'g:go_snippet_engine'* -Highlights operators such as `:=` , `==`, `-=`, etc. By default it's -disabled. > +Define the snippet engine to use. The default is to auto-detect one. Valid +values are: - let g:go_highlight_operators = 0 + automatic Automatically detect a snippet engine. + ultisnips https://github.com/SirVer/ultisnips + neosnippet https://github.com/Shougo/neosnippet.vim + minisnip https://github.com/joereynolds/vim-minisnip + Note: the original at KeyboardFire/vim-minisnip won't work. +> + let g:go_snippet_engine = "automatic" < - *'g:go_highlight_functions'* + *'g:go_get_update'* -Highlights function names. By default it's disabled. > - - let g:go_highlight_functions = 0 +Use this option to disable updating dependencies with |:GoInstallBinaries|. By +default this is enabled. +> + let g:go_get_update = 1 < - *'g:go_highlight_methods'* + *'g:go_guru_scope'* -Highlights method names. By default it's disabled. > +Use this option to define the scope of the analysis to be passed for guru +related commands, such as |:GoImplements|, |:GoCallers|, etc. You can change +it on-the-fly with |:GoGuruScope|. The input should be a a list of package +pattern. An example input might be: +`["github.com/fatih/color","github.com/fatih/structs"]` - let g:go_highlight_methods = 0 -< - *'g:go_highlight_structs'* - -Highlights struct names. By default it's disabled. > +Also see |go-guru-scope|. - let g:go_highlight_structs = 0 +By default it's not set, so the relevant commands defaults are being used. +> + let g:go_guru_scope = [] < - *'g:go_highlight_interfaces'* + *'g:go_build_tags'* -Highlights interface names. By default it's disabled. > - - let g:go_highlight_interfaces = 0 +These options that will be automatically passed to the `-tags` option of +various tools, such as `guru`, `gorename`, etc... This is a permanent +setting. A more useful way is to use |:GoBuildTags| to dynamically change or +remove build tags. By default it's not set. +> + let g:go_build_tags = '' < - *'g:go_highlight_build_constraints'* + *'g:go_autodetect_gopath'* -Highlights build constraints. By default it's disabled. > - - let g:go_highlight_build_constraints = 0 +Automatically modify GOPATH for certain directory structures, such as for +the `godep` tool which stores dependencies in the `Godeps` folder. What this +means is that all tools are now working with the newly modified GOPATH. So +|:GoDef| for example jumps to the source inside the `Godeps` (vendored) +source. Currently `godep` and `gb` are supported. By default it's disabled. +> + let g:go_autodetect_gopath = 0 < - *'g:go_highlight_string_spellcheck* + *'g:go_textobj_enabled'* -Use this option to highlight spelling errors in strings when |spell| is -also enabled. By default it's enabled. > +Adds custom text objects. By default it's enabled. > - let g:go_highlight_string_spellcheck = 1 + let g:go_textobj_enabled = 1 < + *'g:go_textobj_include_function_doc'* - *'g:go_autodetect_gopath'* - -Automatically modifies GOPATH for certain directory structures, such as for -the tool `godep` which has his own dependencies via the `Godeps` folder. What -this means is that all tools are now working with the newly modified GOPATH. -So |GoDef| for example jumps to the source inside the `Godeps` (vendored) -source. Currently `godep` and `gb` is supported, in the near future more tool -supports will be added. By default it's enabled. > +Consider the comment above a function to be part of the function when using +the `af` text object and `[[` motion. By default it's enabled. > - let g:go_autodetect_gopath = 1 + let g:go_textobj_include_function_doc = 1 < - *'g:go_textobj_enabled'* + *'g:go_textobj_include_variable'* -Adds custom text objects. By default it's enabled. > +Consider the variable of an function assignment to be part of the anonymous +function when using the `af` text object. By default it's enabled. > - let g:go_textobj_enabled = 1 + let g:go_textobj_include_variable = 1 < - *'g:go_metalinter_autosave'* + *'g:go_metalinter_autosave'* Use this option to auto |:GoMetaLinter| on save. Only linter messages for the active buffer will be shown. By default it's disabled > let g:go_metalinter_autosave = 0 < - *'g:go_metalinter_autosave_enabled'* + *'g:go_metalinter_autosave_enabled'* -Specifies the enabled linters for auto |GoMetaLinter| on save. By +Specifies the enabled linters for auto |:GoMetaLinter| on save. By default it's using `vet` and `golint`. > let g:go_metalinter_autosave_enabled = ['vet', 'golint'] < - *'g:go_metalinter_enabled'* + *'g:go_metalinter_enabled'* -Specifies the currently enabled linters for the |GoMetaLinter| command. By +Specifies the currently enabled linters for the |:GoMetaLinter| command. By default it's using `vet`, `golint` and `errcheck`. > let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] < - *'g:go_metalinter_command'* + *'g:go_metalinter_excludes'* -Overrides the command to be executed when |GoMetaLinter| is called. This is +Specifies the linters to be excluded from the |:GoMetaLinter| command. By +default it's empty +> + let g:go_metalinter_excludes = [] +< + *'g:go_metalinter_command'* + +Overrides the command to be executed when |:GoMetaLinter| is called. This is an advanced settings and is for users who want to have a complete control over how `gometalinter` should be executed. By default it's empty. > @@ -1034,7 +1411,7 @@ seconds. > let g:go_metalinter_deadline = "5s" < - *'g:go_list_height'* + *'g:go_list_height'* Specifies the window height for the quickfix and location list windows. The default value (empty) automatically sets the height to the number of items @@ -1043,21 +1420,52 @@ explicitly overrides this behavior. For standard Vim behavior, set it to 10. > let g:go_list_height = 0 < - *'g:go_list_type'* - -Specifies the type of list to use. The default value (empty) will use the -appropriate kind of list for the command that was called. Supported values are -"", "quickfix", and "locationlist". > + *'g:go_list_type'* +Specifies the type of list to use for command outputs (such as errors from +builds, results from static analysis commands, etc...). The list type for +specific commands can be overridden with |'g:go_list_type_commands'|. The +default value (empty) will use the appropriate kind of list for the command +that was called. Supported values are "", "quickfix", and "locationlist". +> let g:go_list_type = "" < - *'g:go_asmfmt_autosave'* -Use this option to auto |:AsmFmt| on save. By default it's enabled. > + *'g:go_list_type_commands'* + +Specifies the type of list to use for command outputs (such as errors from +builds, results from static analysis commands, etc...). When an expected key +is not present in the dictionary, |'g:go_list_type'| will be used instead. +Supported keys are "GoBuild", "GoErrCheck", "GoFmt", "GoInstall", "GoLint", +"GoMetaLinter", "GoModifyTags" (used for both :GoAddTags and :GoRemoveTags), +"GoRename", "GoRun", and "GoTest". Supported values for each command are +"quickfix" and "locationlist". +> + let g:go_list_type_commands = {} +< +As an example, the following settings will change all list types to +`locationlist` except for `:GoBuild` where `quickfix` is used: +> + let g:go_list_type = "locationlist" + let g:go_list_type_commands = {"GoBuild": "quickfix"} +< + + *'g:go_list_autoclose'* + +Specifies whether the quickfix/location list should be closed automatically +in the absence of errors. The default value is 1. +If you prefer to keep a long running error window open, you can disable +this by setting the value to 0. +> + let g:go_list_autoclose = 1 +< + *'g:go_asmfmt_autosave'* + +Use this option to auto |:AsmFmt| on save. By default it's disabled. > - let g:go_asmfmt_autosave = 1 + let g:go_asmfmt_autosave = 0 < - *g:go_term_mode* + *'g:go_term_mode'* This option is Neovim only. Use it to change the default command used to open a new terminal for go commands such as |:GoRun|. @@ -1065,8 +1473,8 @@ The default is vsplit. > let g:go_term_mode = "vsplit" < - *g:go_term_height* - *g:go_term_width* + *'g:go_term_height'* + *'g:go_term_width'* These options are Neovim only. Use them to control the height and width of a terminal split. By default these are not set, meaning that the height and @@ -1078,82 +1486,527 @@ For example here is how to set each to 30. let g:go_term_height = 30 let g:go_term_width = 30 < - *g:go_term_enabled* + *'g:go_term_enabled'* This option is Neovim only. Use it to change the behavior of the test commands. If set to 1 it opens the test commands inside a new terminal -according to |g:go_term_mode|, otherwise it will run them in the background -just like `:GoBuild` and then display the status with |go#jobcontrol#Statusline()|. -By default it is disabled. +according to |'g:go_term_mode'|, otherwise it will run them in the background +just like `:GoBuild`. By default it is disabled. > let g:go_term_enabled = 0 < - *g:go_alternate_mode* + *'g:go_alternate_mode'* Specifies the command that |:GoAlternate| uses to open the alternate file. By default it is set to edit. > let g:go_alternate_mode = "edit" < - *g:go_gorename_prefill* + *'g:go_gorename_prefill'* -Specifies whether |:GoRename| prefills the new identifier name with the -word under the cursor. By default is is enabled. +Expression to prefill the new identifier when using |:GoRename| without any +arguments. Use an empty string if you don't want to prefill anything. By +default it converts the identifier to camel case but preserves the +capitalisation of the first letter to ensure that the exported state stays the +same. > - let g:go_gorename_prefill = 1 + let g:go_gorename_prefill = 'expand("") =~# "^[A-Z]"' . + \ '? go#util#pascalcase(expand(""))' . + \ ': go#util#camelcase(expand(""))' < + *'g:go_gocode_autobuild'* +Specifies whether `gocode` should automatically build out-of-date packages +when their source fields are modified, in order to obtain the freshest +autocomplete results for them. By default it is enabled. +> + let g:go_gocode_autobuild = 1 +< + *'g:go_gocode_propose_builtins'* + +Specifies whether `gocode` should add built-in types, functions and constants +to an autocompletion proposals. By default it is enabled. +> + let g:go_gocode_propose_builtins = 1 +< + *'g:go_gocode_unimported_packages'* -=============================================================================== -TROUBLESHOOTING *go-troubleshooting* +Specifies whether `gocode` should include suggestions from unimported +packages. By default it is disabled. +> + let g:go_gocode_unimported_packages = 0 +< -I'm using Fish shell but have some problems using vim-go~ + *'g:go_gocode_socket_type'* -First environment variables in Fish are applied differently, it should be like: +Specifies whether `gocode` should use a different socket type. By default +`unix` is enabled. Possible values: `unix`, `tcp` > - set -x GOPATH /your/own/gopath + let g:go_gocode_socket_type = 'unix' < -Second, Vim needs a POSIX compatible shell (more info here: -https://github.com/dag/vim-fish#teach-a-vim-to-fish). If you use Fish to open -Vim, it will make certain shell based commands fail (means vim-go will fail -too). To overcome this problem change the default shell by adding the -following into your .vimrc (on the top of the file): + *'g:go_template_autocreate'* + +When a new Go file is created, vim-go automatically fills the buffer content +with a Go code template. By default, the templates under the `templates` +folder are used. This can be changed with the |'g:go_template_file'| and +|'g:go_template_test_file'| settings. + +If the new file is created in an already prepopulated package (with other Go +files), in this case a Go code template with only the Go package declaration +(which is automatically determined according to the current package) is added. + +To always use the package name instead of the template, enable the +|'g:go_template_use_pkg'| setting. + +By default it is enabled. > - if $SHELL =~ 'fish' - set shell='/bin/sh' - endif + let g:go_template_autocreate = 1 < -or + *'g:go_template_file'* + +Specifies the file under the `templates` folder that is used if a new Go file +is created. Checkout |'g:go_template_autocreate'| for more info. By default +the `hello_world.go` file is used. > - set shell='/bin/sh' + let g:go_template_file = "hello_world.go" +< + *'g:go_template_test_file'* + +Specifies the file under the `templates` folder that is used if a new Go test +file is created. Checkout |'g:go_template_autocreate'| for more info. By +default the `hello_world_test.go` file is used. > + let g:go_template_test_file = "hello_world_test.go" +< + *'g:go_template_use_pkg'* -I'm seeing weird errors during installation of binaries with -GoInstallBinaries: +Specifies that, rather than using a template, the package name is used if a +new Go file is created. Checkout |'g:go_template_autocreate'| for more info. +By default the template file specified by |'g:go_template_file'| is used. -If you see errors like this: > - Error installing code.google.com/p/go.tools/cmd/goimports: - Error installing code.google.com/p/rog-go/exp/cmd/godef: + let g:go_template_use_pkg = 0 +< + *'g:go_decls_includes'* + +Only useful if `ctrlp.vim`, `unite.vim`, `denite.nvim` or `fzf` are installed. +This sets which declarations to show for |:GoDecls| (`ctrp.vim`), +|unite-decls| (`unite.vim`) and |denite-decls| (`denite.nvim`). It is a Comma +delimited list. Possible options are: {func,type}. The default is: > + + let g:go_decls_includes = 'func,type' +< + *'g:go_decls_mode'* + +Define the tool to be used for |:GoDecls|. Valid options are `ctrlp.vim`, +`fzf`, or an empty string; in which case it will try to autodetect either +`ctrlp.vim` or `fzf`. +> + let g:go_decls_mode = '' +< + *'g:go_echo_command_info'* + +Echoes information about various Go commands, such as `:GoBuild`, `:GoTest`, +`:GoCoverage`, etc... Useful to disable if you use the statusline integration, +i.e: |go#statusline#Show()|. By default it's enabled +> + let g:go_echo_command_info = 1 +< + *'g:go_echo_go_info'* + +Use this option to show the identifier information when completion is done. By +default it's enabled > + + let g:go_echo_go_info = 1 +< +Please note that 'noshowmode' must be set for this feature to work correctly. + + *'g:go_statusline_duration'* + +Specifies the duration of statusline information being showed per package. By +default it's 60 seconds. Must be in milliseconds. +> + let g:go_statusline_duration = 60000 +< + *'g:go_addtags_transform'* + +Sets the `transform` option for `gomodifytags` when using |:GoAddTags| or if +it's being used for snippet expansion of single fields. Possible options are: +`snakecase`, `camelcase`. For the following case, if `snakecase` is used the +field will be transformed to: +> + type T struct { + FooBarQuz string `json:"foo_bar_quz" + } +< + +If "camelcase" is used: +> + type T struct { + FooBarQuz string `json:"fooBarQuz" + } +< +By default "snakecase" is used. Current values are: ["snakecase", +"camelcase"]. +> + let g:go_addtags_transform = 'snakecase' +< + +============================================================================== +SYNTAX HIGHLIGHTING *ft-go-syntax* *go-syntax* + +vim-go comes with an enhanced version of Vim's Go syntax highlighting. It +comes with a number of features, most of which are disabled by default. + +The recommended settings are the default values. If you're experiencing +slowdowns in Go files and you enabled some of these options then try disabling +them; some can be resource intensive. + + *'g:go_fold_enable'* + +Control syntax-based folding which takes effect when 'foldmethod' is set to +`syntax`. +You can enable specific fold regions by setting an array. Possible values are: + + block `{` .. `}` blocks. + import `import` block. + varconst `var` and `const` blocks. + package_comment The package comment. + comment Any comment that is not the package comment. + +By default all except "comment" are enabled: +> + let g:go_fold_enable = ['block', 'import', 'varconst', 'package_comment'] +< +Enable folding of only imports: +> + let g:go_fold_enable = ['import'] +< +Disable everything (same as not setting 'foldmethod' to `syntax`): +> + let g:go_fold_enable = [] +< + *'g:go_highlight_array_whitespace_error'* + +Highlight white space after `[]`. > + + let g:go_highlight_array_whitespace_error = 0 +< + *'g:go_highlight_chan_whitespace_error'* + +Highlight white space around the receive operator (`<-`) that doesn't follow +the standard style. > + + let g:go_highlight_chan_whitespace_error = 0 +< + *'g:go_highlight_extra_types'* + +Highlight commonly used library types (`io.Reader`, etc.). > + + let g:go_highlight_extra_types = 0 +< + *'g:go_highlight_space_tab_error'* + +Highlight instances of tabs following spaces. > + + let g:go_highlight_space_tab_error = 0 +< + *'g:go_highlight_trailing_whitespace_error'* + +Highlight trailing white space. > + + let g:go_highlight_trailing_whitespace_error = 0 +< + *'g:go_highlight_operators'* + +Highlight operators such as `:=` , `==`, `-=`, etc. +> + let g:go_highlight_operators = 0 +< + *'g:go_highlight_functions'* + +Highlight function names. +> + let g:go_highlight_functions = 0 +< + *'g:go_highlight_function_arguments'* + +Highlight the variable names in arguments and return values in function +declarations. Setting this implies the functionality from +|'g:go_highlight_functions'|. +> + let g:go_highlight_function_arguments = 0 +< + *'g:go_highlight_methods'* + +Highlight method names. +> + let g:go_highlight_methods = 0 +< + *'g:go_highlight_types'* + +Highlight struct and interface names. +> + let g:go_highlight_types = 0 +< + *'g:go_highlight_fields'* + +Highlight struct field names. +> + let g:go_highlight_fields = 0 +< + *'g:go_highlight_build_constraints'* + +Highlights build constraints. +> + let g:go_highlight_build_constraints = 0 +< + *'g:go_highlight_generate_tags'* + +Highlight go:generate directives. +> + let g:go_highlight_generate_tags = 0 +< + *'g:go_highlight_string_spellcheck'* + +Highlight spelling errors in strings when |spell| is enabled. +> + let g:go_highlight_string_spellcheck = 1 +< + *'g:go_highlight_format_strings'* + +Highlight printf-style formatting verbs inside string literals. +> + let g:go_highlight_format_strings = 1 +< + *'g:go_highlight_variable_declarations'* + +Highlight variable names in variable declarations (`x` in ` x :=`). +> + let g:go_highlight_variable_declarations = 0 +< + *'g:go_highlight_variable_assignments'* + +Highlight variable names in variable assignments (`x` in `x =`). +> + let g:go_highlight_variable_assignments = 0 < -that means your local Go setup is broken or the remote website is down. For -example sometimes code.google.com times out. To test, just execute a simple go -get: +============================================================================== + *gohtmltmpl* *ft-gohtmltmpl-syntax* + *gotexttmpl* *ft-gotexttmpl-syntax* +Go template syntax~ + +The `gotexttmpl` 'filetype' provides syntax highlighting and indentation for +Go's `text/template` package. + +The `gohtmltmpl` filetype is for use with the `html/template` package and is +identical to `gotexttmpl` except that it will also load the standard `html` +filetype. + +The `gohtmltmpl` filetype is automatically set for `*.tmpl` files; the +`gotexttmpl` is never automatically set and needs to be set manually. + + +============================================================================== +FAQ TROUBLESHOOTING *go-troubleshooting* + +I get "not an editor command" error when I invoke :GoXXX~ + +This happens if vim-go is not installed properly. Be sure you have added this +line into your vimrc: > - go get code.google.com/p/go.tools/cmd/goimports + filetype plugin indent on +< + +I get a "command not found" error when I invoke :GoXXX~ + +If you try to call |:GoDef|, |:GoInfo| and get a command not found, check that +you have the binaries installed by using |:GoInstallBinaries|. + +Before opening vim, check your current $PATH: +> + echo $PATH +< +After opening vim, run `:echo $PATH`, the output must be your current `$PATH` +plus `$GOPATH/bin` (the location where |:GoInstallBinaries| installed the +binaries). + + *go-guru-scope* +What is the guru scope and how do I set it?~ + +Many vim-go commands use the `guru` commandline tool to get information. Some +`guru` commands require an expensive analysis of the source code. To still get +a reasonable amount of performance `guru` limits this analysis to a selected +list of packages. This is known as the "guru scope". + +The default is to use the package the curent buffer belongs to, but this may +not always be correct. For example for the file `guthub.com/user/pkg/a/a.go` +the scope will be set to `github.com/user/pkg/a`, but you probably want +`github.com/user/pkg` + +Guessing what package(s) you do want is not easy so you may need to set this +manually, usually from an |autocommand|: +> + autocmd BufRead /home/martin/go/src/github.com/user/pkg/*.go + \ :GoGuruScope github.com/user/pkg +< + +If you have a lot of packages with the same prefix (`github.com/user`) you can +use a single autocommand: +> + autocmd BufRead /home/martin/go/src/*.go + \ let s:tmp = matchlist(expand('%:p'), + \ '/home/martin/go/src/\(github.com/user/[^/]\+\)') + \| if len(s:tmp) > 1 | exe 'silent :GoGuruScope ' . s:tmp[1] | endif + \| unlet s:tmp +< +Also see |:GoGuruScope| and |'g:go_guru_scope'|. + + +Vim becomes slow while editing Go files~ + +This is usually caused by `g:go_highlight_*` options. Try disabling them if +you've enabled some of them. + +Other common culprits are |'g:go_auto_sameids'| and |go#statusline#Show()|. + + +I get errors when using GoInstallBinaries~ + +If you see errors like this: +> + Error installing golang.org/x/tools/cmd/goimports +< +that means your local Go setup is broken or the remote website is down. For +example sometimes code.google.com times out. To test, just execute a simple +`go get`: +> + go get golang.org/x/tools/cmd/goimports < You'll see a more detailed error. If this works, vim-go will work too. -=============================================================================== + +I want to use a different binary name than "go", can I do this?~ + +There is no way to directly configure the binary name; but you can use a +wrapper script; for example if you would like to run `goapp` instead of `go`: + +1. In `~/gobin/go` (remember to make it executable): +> + #!/bin/sh + # Remove gobin from PATH and run goapp. + PATH=${PATH#$HOME/gobin} goapp "$@" +< +2. Start Vim with `~/gobin` as the first `PATH` entry so it will use the + wrapper script: +> + PATH="$HOME/gobin/:$PATH" vim +< + Alternatively you you could set `$PATH` in your vimrc with an |:autocmd|. + + +How do I use vim-go with syntastic?~ + +Sometimes when using both `vim-go` and `syntastic` Vim will start lagging +while saving and opening files. The following fixes this: +> + let g:syntastic_go_checkers = ['golint', 'govet'] + let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] } +< +If you want to add errcheck you can use gometalinter as a wrapper +> + let g:syntastic_go_checkers = ['golint', 'govet', 'gometalinter'] + let g:syntastic_go_gometalinter_args = ['--disable-all', '--enable=errcheck'] + let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] } +< +Another issue with `vim-go` and `syntastic` is that the location list window +that contains the output of commands such as `:GoBuild` and `:GoTest` might +not appear. To resolve this: +> + let g:go_list_type = "quickfix" +< + +How do I run focused ginkgo tests?~ + +You must set this environment variable in your `.vimrc`: +> + let $GINKGO_EDITOR_INTEGRATION = "true" +< + +Using with NeoVim~ + +Note: Neovim currently is not a first class citizen for vim-go. You are free +to open bug, however I'm not using Neovim so it's hard for me to test it. +vim-go might not work well as good as in Vim. I'm happy to accept pull +requests or very detailed bug reports. If you're interested to improve the +state of Neovim in vim-go you're always welcome! + +Run `:GoRun` in a new tab, horizontal split or vertical split terminal +> + au FileType go nmap rt (go-run-tab) + au FileType go nmap rs (go-run-split) + au FileType go nmap rv (go-run-vertical) +< +By default new terminals are opened in a vertical split. To change it +> + let g:go_term_mode = "split" +> + +============================================================================== +DEVELOPMENT *go-development* + +vim-go supports test files written in VimScript; the way they're run is +roughly similar to Go tests: + +- A `*.vim` file has a corresponding `*_test.vim`. +- All functions starting with `Test_` are run as test. +- A test is considered to be "failed" if |v:errors| has any entries. You can + use one of the |test-functions| to set this, or append to it directly. + +A simple example: +> + function Test_run_fmt() + call assert_equal(expected, actual) + ... + endfunction +< +To run tests vim-go comes with three small helper scripts: + + `scripts/install-vim` Install a pristine Vim to `/tmp/vim-go-test/`. + `scripts/run-vim` Run a Vim version from `/tmp/vim-go-test/`. + `scripts/test` Run all tests with a Vim from `/tmp/vim-go-test/`. + +All scripts accept a Vim version as the first argument, which can be +`vim-7.4`, `vim-8.0`, or `nvim`. You will need to install a Vim version with +`install-vim` before you can use `run-vim` or `test`. + +You can install and test all Vim versions by running `make`. + + +============================================================================== +DONATION *go-donation* + +People have asked for this for a long time, now you can be a fully supporter +by being a patreon at: https://www.patreon.com/fatih + +By being a patron, you are enabling vim-go to grow and mature, helping me to +invest in bug fixes, new documentation, and improving both current and future +features. It's completely optional and is just a direct way to support +vim-go's ongoing development. Thanks! + +Check it out: https://www.patreon.com/fatih + + +============================================================================== CREDITS *go-credits* -* Go Authors for official vim plugins -* Gocode, Godef, Golint, Oracle, Goimports, Errcheck projects and authors of +* Go Authors for official Vim plugins. +* Gocode, Godef, Golint, Guru, Goimports, Errcheck projects and authors of those projects. * Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode, - vim-godef) -* vim-go contributors: https://github.com/fatih/vim-go/graphs/contributors + vim-godef). +* vim-go contributors: https://github.com/fatih/vim-go/graphs/contributors. -vim:ft=help:et:ts=2:sw=2:sts=2:norl + vim: ft=help tw=78 et ts=2 sw=2 sts=2 norl diff --git a/ftdetect/gofiletype.vim b/ftdetect/gofiletype.vim index b5578a6..bc47776 100644 --- a/ftdetect/gofiletype.vim +++ b/ftdetect/gofiletype.vim @@ -6,26 +6,29 @@ let s:current_fileencodings = '' " define fileencodings to open as utf-8 encoding even if it's ascii. function! s:gofiletype_pre(type) - let s:current_fileformats = &g:fileformats - let s:current_fileencodings = &g:fileencodings - set fileencodings=utf-8 fileformats=unix - let &l:filetype = a:type + let s:current_fileformats = &g:fileformats + let s:current_fileencodings = &g:fileencodings + set fileencodings=utf-8 fileformats=unix + let &l:filetype = a:type endfunction " restore fileencodings as others function! s:gofiletype_post() - let &g:fileformats = s:current_fileformats - let &g:fileencodings = s:current_fileencodings + let &g:fileformats = s:current_fileformats + let &g:fileencodings = s:current_fileencodings endfunction -au BufNewFile *.go setfiletype go | setlocal fileencoding=utf-8 fileformat=unix -au BufRead *.go call s:gofiletype_pre("go") -au BufReadPost *.go call s:gofiletype_post() +augroup vim-go-filetype + autocmd! + au BufNewFile *.go setfiletype go | setlocal fileencoding=utf-8 fileformat=unix + au BufRead *.go call s:gofiletype_pre("go") + au BufReadPost *.go call s:gofiletype_post() -au BufNewFile *.s setfiletype asm | setlocal fileencoding=utf-8 fileformat=unix -au BufRead *.s call s:gofiletype_pre("asm") -au BufReadPost *.s call s:gofiletype_post() + au BufNewFile *.s setfiletype asm | setlocal fileencoding=utf-8 fileformat=unix + au BufRead *.s call s:gofiletype_pre("asm") + au BufReadPost *.s call s:gofiletype_post() -au BufRead,BufNewFile *.tmpl set filetype=gohtmltmpl + au BufRead,BufNewFile *.tmpl set filetype=gohtmltmpl +augroup end -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/ftplugin/asm.vim b/ftplugin/asm.vim index 0ac3594..99996aa 100644 --- a/ftplugin/asm.vim +++ b/ftplugin/asm.vim @@ -1,7 +1,7 @@ " asm.vim: Vim filetype plugin for Go assembler. if exists("b:did_ftplugin") - finish + finish endif let b:did_ftplugin = 1 @@ -15,3 +15,5 @@ setlocal commentstring=//\ %s setlocal noexpandtab command! -nargs=0 AsmFmt call go#asmfmt#Format() + +" vim: sw=2 ts=2 et diff --git a/ftplugin/go.vim b/ftplugin/go.vim index 3b317d2..a0ecd32 100644 --- a/ftplugin/go.vim +++ b/ftplugin/go.vim @@ -5,7 +5,7 @@ " go.vim: Vim filetype plugin for Go. if exists("b:did_ftplugin") - finish + finish endif let b:did_ftplugin = 1 @@ -24,34 +24,110 @@ compiler go setlocal omnifunc=go#complete#Complete if get(g:, "go_doc_keywordprg_enabled", 1) - " keywordprg doesn't allow to use vim commands, override it - nnoremap K :GoDoc + " keywordprg doesn't allow to use vim commands, override it + nnoremap K :GoDoc endif if get(g:, "go_def_mapping_enabled", 1) - nnoremap gd :GoDef + " these are default Vim mappings, we're overriding them to make them + " useful again for Go source code + nnoremap gd :GoDef + nnoremap :GoDef + nnoremap :GoDef + nnoremap g :GoDef + nnoremap :call go#def#Jump("split") + nnoremap ] :call go#def#Jump("split") + nnoremap :call go#def#StackPop(v:count1) endif if get(g:, "go_textobj_enabled", 1) - onoremap af :call go#textobj#Function('a') - onoremap if :call go#textobj#Function('i') + onoremap af :call go#textobj#Function('a') + onoremap if :call go#textobj#Function('i') - xnoremap af :call go#textobj#Function('a') - xnoremap if :call go#textobj#Function('i') + xnoremap af :call go#textobj#Function('a') + xnoremap if :call go#textobj#Function('i') - " Remap ]] and [[ to jump betweeen functions as they are useless in Go - nnoremap ]] :call go#textobj#FunctionJump('n', 'next') - nnoremap [[ :call go#textobj#FunctionJump('n', 'prev') + " Remap ]] and [[ to jump betweeen functions as they are useless in Go + nnoremap ]] :call go#textobj#FunctionJump('n', 'next') + nnoremap [[ :call go#textobj#FunctionJump('n', 'prev') - onoremap ]] :call go#textobj#FunctionJump('o', 'next') - onoremap [[ :call go#textobj#FunctionJump('o', 'prev') + onoremap ]] :call go#textobj#FunctionJump('o', 'next') + onoremap [[ :call go#textobj#FunctionJump('o', 'prev') - xnoremap ]] :call go#textobj#FunctionJump('v', 'next') - xnoremap [[ :call go#textobj#FunctionJump('v', 'prev') + xnoremap ]] :call go#textobj#FunctionJump('v', 'next') + xnoremap [[ :call go#textobj#FunctionJump('v', 'prev') endif -if get(g:, "go_auto_type_info", 0) - setlocal updatetime=800 +if get(g:, "go_auto_type_info", 0) || get(g:, "go_auto_sameids", 0) + let &l:updatetime= get(g:, "go_updatetime", 800) endif -" vim:ts=4:sw=4:et +" NOTE(arslan): experimental, disabled by default, doesn't work well. No +" documentation as well. If anyone feels adventurous, enable the following and +" try to search for Go identifiers ;) +" +" if get(g:, "go_sameid_search_enabled", 0) +" autocmd FileType go nnoremap * :call Sameids_search(0) +" autocmd FileType go nnoremap # :call Sameids_search(1) +" autocmd FileType go nnoremap n :call Sameids_repeat(0) +" autocmd FileType go nnoremap N :call Sameids_repeat(1) +" autocmd FileType go cabbrev nohlsearch =Sameids_nohlsearch() +" endif + +" " mode 0: next 1: prev +" function! Sameids_repeat(mode) +" let matches = getmatches() +" if empty(matches) +" return +" endif +" let cur_offset = go#util#OffsetCursor() + +" " reverse list to make it easy to find the prev occurrence +" if a:mode +" call reverse(matches) +" endif + +" for m in matches +" if !has_key(m, "group") +" return +" endif + +" if m.group != "goSameId" +" return +" endif + +" let offset = go#util#Offset(m.pos1[0], m.pos1[1]) + +" if a:mode && cur_offset > offset +" call cursor(m.pos1[0], m.pos1[1]) +" return +" elseif !a:mode && cur_offset < offset +" call cursor(m.pos1[0], m.pos1[1]) +" return +" endif +" endfor + +" " reached start/end, jump to the end/start +" let initial_match = matches[0] +" if !has_key(initial_match, "group") +" return +" endif + +" if initial_match.group != "goSameId" +" return +" endif + +" call cursor(initial_match.pos1[0], initial_match.pos1[1]) +" endfunction + +" function! Sameids_search(mode) +" call go#guru#SameIds() +" call Sameids_repeat(a:mode) +" endfunction + +" function! Sameids_nohlsearch() +" call go#guru#ClearSameIds() +" return "nohlsearch" +" endfunction + +" vim: sw=2 ts=2 et diff --git a/ftplugin/go/commands.vim b/ftplugin/go/commands.vim index 4c4f070..9b983ef 100644 --- a/ftplugin/go/commands.vim +++ b/ftplugin/go/commands.vim @@ -1,38 +1,59 @@ -" gorename -command! -nargs=? GoRename call go#rename#Rename(0,) - -" oracle -command! -nargs=* -complete=customlist,go#package#Complete GoOracleScope call go#oracle#Scope() -command! -range=% GoImplements call go#oracle#Implements() -command! -range=% GoCallees call go#oracle#Callees() -command! -range=% GoDescribe call go#oracle#Describe() -command! -range=% GoCallers call go#oracle#Callers() -command! -range=% GoCallstack call go#oracle#Callstack() -command! -range=% GoFreevars call go#oracle#Freevars() -command! -range=% GoChannelPeers call go#oracle#ChannelPeers() -command! -range=% GoReferrers call go#oracle#Referrers() -command! -nargs=? GoOracleTags call go#oracle#Tags() - -" tool -command! -nargs=0 GoFiles echo go#tool#Files() +" -- gorename +command! -nargs=? -complete=customlist,go#rename#Complete GoRename call go#rename#Rename(0, ) + +" -- guru +command! -nargs=* -complete=customlist,go#package#Complete GoGuruScope call go#guru#Scope() +command! -range=% GoImplements call go#guru#Implements() +command! -range=% GoWhicherrs call go#guru#Whicherrs() +command! -range=% GoCallees call go#guru#Callees() +command! -range=% GoDescribe call go#guru#Describe() +command! -range=% GoCallers call go#guru#Callers() +command! -range=% GoCallstack call go#guru#Callstack() +command! -range=% GoFreevars call go#guru#Freevars() +command! -range=% GoChannelPeers call go#guru#ChannelPeers() +command! -range=% GoReferrers call go#guru#Referrers() + +command! -range=0 GoSameIds call go#guru#SameIds() +command! -range=0 GoSameIdsClear call go#guru#ClearSameIds() +command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds() +command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds() + +" -- tags +command! -nargs=* -range GoAddTags call go#tags#Add(, , , ) +command! -nargs=* -range GoRemoveTags call go#tags#Remove(, , , ) + +" -- tool +command! -nargs=* -complete=customlist,go#tool#ValidFiles GoFiles echo go#tool#Files() command! -nargs=0 GoDeps echo go#tool#Deps() -command! -nargs=* GoInfo call go#complete#Info(0) +command! -nargs=* GoInfo call go#tool#Info(0) +command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo() -" cmd +" -- cmd command! -nargs=* -bang GoBuild call go#cmd#Build(0,) +command! -nargs=? -bang GoBuildTags call go#cmd#BuildTags(0, ) command! -nargs=* -bang GoGenerate call go#cmd#Generate(0,) command! -nargs=* -bang -complete=file GoRun call go#cmd#Run(0,) command! -nargs=* -bang GoInstall call go#cmd#Install(0, ) -command! -nargs=* -bang GoTest call go#cmd#Test(0, 0, ) -command! -nargs=* -bang GoTestFunc call go#cmd#TestFunc(0, ) -command! -nargs=* -bang GoTestCompile call go#cmd#Test(0, 1, ) -command! -nargs=* -bang GoCoverage call go#cmd#Coverage(0, ) + +" -- test +command! -nargs=* -bang GoTest call go#test#Test(0, 0, ) +command! -nargs=* -bang GoTestFunc call go#test#Func(0, ) +command! -nargs=* -bang GoTestCompile call go#test#Test(0, 1, ) + +" -- cover +command! -nargs=* -bang GoCoverage call go#coverage#Buffer(0, ) +command! -nargs=* -bang GoCoverageClear call go#coverage#Clear() +command! -nargs=* -bang GoCoverageToggle call go#coverage#BufferToggle(0, ) +command! -nargs=* -bang GoCoverageBrowser call go#coverage#Browser(0, ) " -- play command! -nargs=0 -range=% GoPlay call go#play#Share(, , ) " -- def -command! -nargs=* -range GoDef :call go#def#Jump() +command! -nargs=* -range GoDef :call go#def#Jump('') +command! -nargs=? GoDefPop :call go#def#StackPop() +command! -nargs=? GoDefStack :call go#def#Stack() +command! -nargs=? GoDefStackClear :call go#def#StackClear() " -- doc command! -nargs=* -range -complete=customlist,go#package#Complete GoDoc call go#doc#Open('new', 'split', ) @@ -40,8 +61,12 @@ command! -nargs=* -range -complete=customlist,go#package#Complete GoDocBrowser c " -- fmt command! -nargs=0 GoFmt call go#fmt#Format(-1) +command! -nargs=0 GoFmtAutoSaveToggle call go#fmt#ToggleFmtAutoSave() command! -nargs=0 GoImports call go#fmt#Format(1) +" -- asmfmt +command! -nargs=0 GoAsmFmtAutoSaveToggle call go#asmfmt#ToggleAsmFmtAutoSave() + " -- import command! -nargs=? -complete=customlist,go#package#Complete GoDrop call go#import#SwitchImport(0, '', , '') command! -nargs=1 -bang -complete=customlist,go#package#Complete GoImport call go#import#SwitchImport(1, '', , '') @@ -49,6 +74,7 @@ command! -nargs=* -bang -complete=customlist,go#package#Complete GoImportAs call " -- linters command! -nargs=* GoMetaLinter call go#lint#Gometa(0, ) +command! -nargs=0 GoMetaLinterAutoSaveToggle call go#lint#ToggleMetaLinterAutoSave() command! -nargs=* GoLint call go#lint#Golint() command! -nargs=* -bang GoVet call go#lint#Vet(0, ) command! -nargs=* -complete=customlist,go#package#Complete GoErrCheck call go#lint#Errcheck() @@ -56,10 +82,20 @@ command! -nargs=* -complete=customlist,go#package#Complete GoErrCheck call go#li " -- alternate command! -bang GoAlternate call go#alternate#Switch(0, '') -" -- ctrlp -if globpath(&rtp, 'plugin/ctrlp.vim') != "" - command! -nargs=? -complete=file GoDecls call ctrlp#init(ctrlp#decls#cmd(0, )) - command! -nargs=? -complete=dir GoDeclsDir call ctrlp#init(ctrlp#decls#cmd(1, )) -endif +" -- decls +command! -nargs=? -complete=file GoDecls call go#decls#Decls(0, ) +command! -nargs=? -complete=dir GoDeclsDir call go#decls#Decls(1, ) + +" -- impl +command! -nargs=* -complete=customlist,go#impl#Complete GoImpl call go#impl#Impl() + +" -- template +command! -nargs=0 GoTemplateAutoCreateToggle call go#template#ToggleAutoCreate() + +" -- keyify +command! -nargs=0 GoKeyify call go#keyify#Keyify() + +" -- fillstruct +command! -nargs=0 GoFillStruct call go#fillstruct#FillStruct() -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/ftplugin/go/mappings.vim b/ftplugin/go/mappings.vim index 2529a84..4cb8278 100644 --- a/ftplugin/go/mappings.vim +++ b/ftplugin/go/mappings.vim @@ -5,46 +5,58 @@ " which by default is enabled. For commands the user has the ability to pass " the '!', such as :GoBuild or :GoBuild! if !exists("g:go_jump_to_error") - let g:go_jump_to_error = 1 + let g:go_jump_to_error = 1 endif " Some handy plug mappings nnoremap (go-run) :call go#cmd#Run(!g:go_jump_to_error) if has("nvim") - nnoremap (go-run-vertical) :call go#cmd#RunTerm(!g:go_jump_to_error, 'vsplit', []) - nnoremap (go-run-split) :call go#cmd#RunTerm(!g:go_jump_to_error, 'split', []) - nnoremap (go-run-tab) :call go#cmd#RunTerm(!g:go_jump_to_error, 'tabe', []) + nnoremap (go-run-vertical) :call go#cmd#RunTerm(!g:go_jump_to_error, 'vsplit', []) + nnoremap (go-run-split) :call go#cmd#RunTerm(!g:go_jump_to_error, 'split', []) + nnoremap (go-run-tab) :call go#cmd#RunTerm(!g:go_jump_to_error, 'tabe', []) endif nnoremap (go-build) :call go#cmd#Build(!g:go_jump_to_error) nnoremap (go-generate) :call go#cmd#Generate(!g:go_jump_to_error) nnoremap (go-install) :call go#cmd#Install(!g:go_jump_to_error) -nnoremap (go-test) :call go#cmd#Test(!g:go_jump_to_error, 0) -nnoremap (go-test-func) :call go#cmd#TestFunc(!g:go_jump_to_error) -nnoremap (go-test-compile) :call go#cmd#Test(!g:go_jump_to_error, 1) -nnoremap (go-coverage) :call go#cmd#Coverage(!g:go_jump_to_error) +nnoremap (go-test) :call go#test#Test(!g:go_jump_to_error, 0) +nnoremap (go-test-func) :call go#test#Func(!g:go_jump_to_error) +nnoremap (go-test-compile) :call go#test#Test(!g:go_jump_to_error, 1) + +nnoremap (go-coverage) :call go#coverage#Buffer(!g:go_jump_to_error) +nnoremap (go-coverage-clear) :call go#coverage#Clear() +nnoremap (go-coverage-toggle) :call go#coverage#BufferToggle(!g:go_jump_to_error) +nnoremap (go-coverage-browser) :call go#coverage#Browser(!g:go_jump_to_error) nnoremap (go-files) :call go#tool#Files() nnoremap (go-deps) :call go#tool#Deps() -nnoremap (go-info) :call go#complete#Info(0) +nnoremap (go-info) :call go#tool#Info(0) nnoremap (go-import) :call go#import#SwitchImport(1, '', expand(''), '') +nnoremap (go-imports) :call go#fmt#Format(1) -nnoremap (go-implements) :call go#oracle#Implements(-1) -nnoremap (go-callees) :call go#oracle#Callees(-1) -nnoremap (go-callers) :call go#oracle#Callers(-1) -nnoremap (go-describe) :call go#oracle#Describe(-1) -nnoremap (go-callstack) :call go#oracle#Callstack(-1) -nnoremap (go-freevars) :call go#oracle#Freevars(-1) -nnoremap (go-channelpeers) :call go#oracle#ChannelPeers(-1) -nnoremap (go-referrers) :call go#oracle#Referrers(-1) +nnoremap (go-implements) :call go#guru#Implements(-1) +nnoremap (go-callees) :call go#guru#Callees(-1) +nnoremap (go-callers) :call go#guru#Callers(-1) +nnoremap (go-describe) :call go#guru#Describe(-1) +nnoremap (go-callstack) :call go#guru#Callstack(-1) +xnoremap (go-freevars) :call go#guru#Freevars(0) +nnoremap (go-channelpeers) :call go#guru#ChannelPeers(-1) +nnoremap (go-referrers) :call go#guru#Referrers(-1) +nnoremap (go-sameids) :call go#guru#SameIds() +nnoremap (go-whicherrs) :call go#guru#Whicherrs(-1) +nnoremap (go-sameids-toggle) :call go#guru#ToggleSameIds() nnoremap (go-rename) :call go#rename#Rename(!g:go_jump_to_error) -nnoremap (go-def) :call go#def#Jump() -nnoremap (go-def-vertical) :call go#def#JumpMode("vsplit") -nnoremap (go-def-split) :call go#def#JumpMode("split") -nnoremap (go-def-tab) :call go#def#JumpMode("tab") +nnoremap (go-def) :call go#def#Jump('') +nnoremap (go-def-vertical) :call go#def#Jump("vsplit") +nnoremap (go-def-split) :call go#def#Jump("split") +nnoremap (go-def-tab) :call go#def#Jump("tab") + +nnoremap (go-def-pop) :call go#def#StackPop() +nnoremap (go-def-stack) :call go#def#Stack() +nnoremap (go-def-stack-clear) :call go#def#StackClear() nnoremap (go-doc) :call go#doc#Open("new", "split") nnoremap (go-doc-tab) :call go#doc#Open("tabnew", "tabe") @@ -53,8 +65,11 @@ nnoremap (go-doc-split) :call go#doc#Open("new", "split") (go-doc-browser) :call go#doc#OpenBrowser() nnoremap (go-metalinter) :call go#lint#Gometa(0) +nnoremap (go-lint) :call go#lint#Golint() nnoremap (go-vet) :call go#lint#Vet(!g:go_jump_to_error) nnoremap (go-alternate-edit) :call go#alternate#Switch(0, "edit") nnoremap (go-alternate-vertical) :call go#alternate#Switch(0, "vsplit") nnoremap (go-alternate-split) :call go#alternate#Switch(0, "split") + +" vim: sw=2 ts=2 et diff --git a/ftplugin/go/snippets.vim b/ftplugin/go/snippets.vim index 3bf13d2..33a3cd5 100644 --- a/ftplugin/go/snippets.vim +++ b/ftplugin/go/snippets.vim @@ -3,44 +3,65 @@ if exists("g:go_loaded_gosnippets") endif let g:go_loaded_gosnippets = 1 -" by default UltiSnips -if !exists("g:go_snippet_engine") - let g:go_snippet_engine = "ultisnips" -endif +function! s:GoUltiSnips() abort + if get(g:, 'did_plugin_ultisnips') isnot 1 + return + endif + + if !exists("g:UltiSnipsSnippetDirectories") + let g:UltiSnipsSnippetDirectories = ["gosnippets/UltiSnips"] + else + let g:UltiSnipsSnippetDirectories += ["gosnippets/UltiSnips"] + endif +endfunction + +function! s:GoNeosnippet() abort + if get(g:, 'loaded_neosnippet') isnot 1 + return + endif -function! s:GoUltiSnips() - if globpath(&rtp, 'plugin/UltiSnips.vim') == "" - return - endif + let g:neosnippet#enable_snipmate_compatibility = 1 - if !exists("g:UltiSnipsSnippetDirectories") - let g:UltiSnipsSnippetDirectories = ["gosnippets/UltiSnips"] - else - let g:UltiSnipsSnippetDirectories += ["gosnippets/UltiSnips"] - endif + let l:gosnippets_dir = globpath(&rtp, 'gosnippets/snippets') + if type(g:neosnippet#snippets_directory) == type([]) + let g:neosnippet#snippets_directory += [l:gosnippets_dir] + elseif type(g:neosnippet#snippets_directory) == type("") + if strlen(g:neosnippet#snippets_directory) > 0 + let g:neosnippet#snippets_directory = g:neosnippet#snippets_directory . "," . l:gosnippets_dir + else + let g:neosnippet#snippets_directory = l:gosnippets_dir + endif + endif endfunction -function! s:GoNeosnippet() - if globpath(&rtp, 'plugin/neosnippet.vim') == "" - return - endif - - let g:neosnippet#enable_snipmate_compatibility = 1 - - let gosnippets_dir = globpath(&rtp, 'gosnippets/snippets') - if type(g:neosnippet#snippets_directory) == type([]) - let g:neosnippet#snippets_directory += [gosnippets_dir] - elseif type(g:neosnippet#snippets_directory) == type("") - if strlen(g:neosnippet#snippets_directory) > 0 - let g:neosnippet#snippets_directory = g:neosnippet#snippets_directory . "," . gosnippets_dir - else - let g:neosnippet#snippets_directory = gosnippets_dir - endif - endif +function! s:GoMinisnip() abort + if get(g:, 'loaded_minisnip') isnot 1 + return + endif + + if exists('g:minisnip_dir') + let g:minisnip_dir .= ':' . globpath(&rtp, 'gosnippets/minisnip') + else + let g:minisnip_dir = globpath(&rtp, 'gosnippets/minisnip') + endif endfunction -if g:go_snippet_engine == "ultisnips" - call s:GoUltiSnips() -elseif g:go_snippet_engine == "neosnippet" - call s:GoNeosnippet() + +let s:engine = get(g:, 'go_snippet_engine', 'automatic') +if s:engine is? "automatic" + if get(g:, 'did_plugin_ultisnips') is 1 + call s:GoUltiSnips() + elseif get(g:, 'loaded_neosnippet') is 1 + call s:GoNeosnippet() + elseif get(g:, 'loaded_minisnip') is 1 + call s:GoMinisnip() + endif +elseif s:engine is? "ultisnips" + call s:GoUltiSnips() +elseif s:engine is? "neosnippet" + call s:GoNeosnippet() +elseif s:engine is? "minisnip" + call s:GoMinisnip() endif + +" vim: sw=2 ts=2 et diff --git a/ftplugin/go/tagbar.vim b/ftplugin/go/tagbar.vim index ca5b184..2d22fd7 100644 --- a/ftplugin/go/tagbar.vim +++ b/ftplugin/go/tagbar.vim @@ -4,52 +4,54 @@ " Also make sure the ctags command exists " if !executable('ctags') - finish + finish elseif globpath(&rtp, 'plugin/tagbar.vim') == "" - finish + finish endif if !exists("g:go_gotags_bin") - let g:go_gotags_bin = "gotags" + let g:go_gotags_bin = "gotags" endif function! s:SetTagbar() - let bin_path = go#path#CheckBinPath(g:go_gotags_bin) - if empty(bin_path) - return - endif + let bin_path = go#path#CheckBinPath(g:go_gotags_bin) + if empty(bin_path) + return + endif - if !exists("g:tagbar_type_go") - let g:tagbar_type_go = { - \ 'ctagstype' : 'go', - \ 'kinds' : [ - \ 'p:package', - \ 'i:imports', - \ 'c:constants', - \ 'v:variables', - \ 't:types', - \ 'n:interfaces', - \ 'w:fields', - \ 'e:embedded', - \ 'm:methods', - \ 'r:constructor', - \ 'f:functions' - \ ], - \ 'sro' : '.', - \ 'kind2scope' : { - \ 't' : 'ctype', - \ 'n' : 'ntype' - \ }, - \ 'scope2kind' : { - \ 'ctype' : 't', - \ 'ntype' : 'n' - \ }, - \ 'ctagsbin' : expand(bin_path), - \ 'ctagsargs' : '-sort -silent' - \ } - endif + if !exists("g:tagbar_type_go") + let g:tagbar_type_go = { + \ 'ctagstype' : 'go', + \ 'kinds' : [ + \ 'p:package', + \ 'i:imports', + \ 'c:constants', + \ 'v:variables', + \ 't:types', + \ 'n:interfaces', + \ 'w:fields', + \ 'e:embedded', + \ 'm:methods', + \ 'r:constructor', + \ 'f:functions' + \ ], + \ 'sro' : '.', + \ 'kind2scope' : { + \ 't' : 'ctype', + \ 'n' : 'ntype' + \ }, + \ 'scope2kind' : { + \ 'ctype' : 't', + \ 'ntype' : 'n' + \ }, + \ 'ctagsbin' : bin_path, + \ 'ctagsargs' : '-sort -silent' + \ } + endif endfunction call s:SetTagbar() + +" vim: sw=2 ts=2 et diff --git a/ftplugin/gohtmltmpl.vim b/ftplugin/gohtmltmpl.vim new file mode 100644 index 0000000..ea0aacf --- /dev/null +++ b/ftplugin/gohtmltmpl.vim @@ -0,0 +1,7 @@ +if exists("b:did_ftplugin") + finish +endif + +runtime! ftplugin/html.vim + +" vim: sw=2 ts=2 et diff --git a/gosnippets/UltiSnips/go.snippets b/gosnippets/UltiSnips/go.snippets index d08d72e..1a78a04 100644 --- a/gosnippets/UltiSnips/go.snippets +++ b/gosnippets/UltiSnips/go.snippets @@ -110,7 +110,7 @@ snippet gpl * You should have received a copy of the GNU General Public License * along with this program; if not, see . * -* Copyright (C) ${1:Author}, `strftime("%Y")` +* Copyright (C) ${1:Author}, `!v strftime("%Y")` */ ${0} endsnippet @@ -143,6 +143,13 @@ else { } endsnippet +# if inline error +snippet ife "If with inline erro" +if err := ${1:condition}; err != nil { + ${0:${VISUAL}} +} +endsnippet + # error snippet snippet errn "Error return " !b if err != nil { @@ -151,14 +158,15 @@ if err != nil { ${0} endsnippet -# error snippet -snippet errt "Error test fatal " !b +# error log snippet +snippet errl "Error with log.Fatal(err)" !b if err != nil { - t.Fatal(err) + log.Fatal(err) } ${0} endsnippet +# error multiple return snippet errn, "Error return with two return values" !b if err != nil { return ${1:nil}, err @@ -166,6 +174,23 @@ if err != nil { ${0} endsnippet +# error panic +snippet errp "Error panic" !b +if err != nil { + panic(${1}) +} +${0} +endsnippet + +# error test +snippet errt "Error test fatal " !b +if err != nil { + t.Fatal(err) +} +${0} +endsnippet + +# error handle snippet errh "Error handle and return" !b if err != nil { ${1} @@ -174,8 +199,14 @@ if err != nil { ${0} endsnippet +# json field tag snippet json "\`json:key\`" -\`json:"${1:keyName}"\` +\`json:"${1:`!v go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\` +endsnippet + +# yaml field tag +snippet yaml "\`yaml:key\`" +\`yaml:"${1:`!v go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\` endsnippet # fallthrough @@ -327,6 +358,18 @@ func Test${1:Function}(t *testing.T) { } endsnippet +snippet hf "http.HandlerFunc" !b +func ${1:handler}(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} +} +endsnippet + +snippet hhf "mux.HandleFunc" !b +${1:http}.HandleFunc("${2:/}", func(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} +}) +endsnippet + # quick test server snippet tsrv "httptest.NewServer" ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -351,6 +394,21 @@ if err != nil { } endsnippet +snippet example "func ExampleXYZ() { ... }" +func Example${1:Method}() { + ${0:${VISUAL}} + // Output: +} +endsnippet + +snippet benchmark "func BenchmarkXYZ(b *testing.B) { ... }" +func Benchmark${1:Method}(b *testing.B) { + for i := 0; i < b.N; i++ { + ${0:${VISUAL}} + } +} +endsnippet + # variable declaration snippet var "var x Type [= ...]" var ${1:x} ${2:Type}${3: = ${0:value}} @@ -372,7 +430,6 @@ if !reflect.DeepEqual(${1:expected}, ${2:actual}) { } endsnippet - global !p import re diff --git a/gosnippets/minisnip/_go_eq b/gosnippets/minisnip/_go_eq new file mode 100644 index 0000000..9e8fad0 --- /dev/null +++ b/gosnippets/minisnip/_go_eq @@ -0,0 +1,3 @@ +if !reflect.DeepEqual({{+got+}}, {{+want+}}) { + t.Errorf("\ngot: %#v\nwant: %#v\n", {{+~\~2+}}, {{+~\~2+}}) +} diff --git a/gosnippets/minisnip/_go_err b/gosnippets/minisnip/_go_err new file mode 100644 index 0000000..3a5a493 --- /dev/null +++ b/gosnippets/minisnip/_go_err @@ -0,0 +1,3 @@ +if err != nil { + return {{+err+}} +} diff --git a/gosnippets/minisnip/_go_errt b/gosnippets/minisnip/_go_errt new file mode 100644 index 0000000..c5cb6fc --- /dev/null +++ b/gosnippets/minisnip/_go_errt @@ -0,0 +1,4 @@ +if err != nil { + t.Fatal(err) +} +{{++}} diff --git a/gosnippets/minisnip/_go_errw b/gosnippets/minisnip/_go_errw new file mode 100644 index 0000000..d1958d5 --- /dev/null +++ b/gosnippets/minisnip/_go_errw @@ -0,0 +1,3 @@ +if err != nil { + return errors.Wrap(err, "{{++}}") +} diff --git a/gosnippets/minisnip/_go_f b/gosnippets/minisnip/_go_f new file mode 100644 index 0000000..6e35d24 --- /dev/null +++ b/gosnippets/minisnip/_go_f @@ -0,0 +1,3 @@ +// {{++}} +func {{+~\~1+}}() { +} diff --git a/gosnippets/minisnip/_go_ff b/gosnippets/minisnip/_go_ff new file mode 100644 index 0000000..ed942c2 --- /dev/null +++ b/gosnippets/minisnip/_go_ff @@ -0,0 +1 @@ +fmt.Printf("%#v\n", {{++}}) diff --git a/gosnippets/minisnip/_go_fori b/gosnippets/minisnip/_go_fori new file mode 100644 index 0000000..8a52ec9 --- /dev/null +++ b/gosnippets/minisnip/_go_fori @@ -0,0 +1,3 @@ +for i := 0; i < {{++}}; i++ { + {{++}} +} diff --git a/gosnippets/minisnip/_go_pkg b/gosnippets/minisnip/_go_pkg new file mode 100644 index 0000000..2491d9a --- /dev/null +++ b/gosnippets/minisnip/_go_pkg @@ -0,0 +1,2 @@ +// Package {{+~expand('%:p:h:t')+}} {{++}} +package {{+~\~2+}} diff --git a/gosnippets/minisnip/_go_sp b/gosnippets/minisnip/_go_sp new file mode 100644 index 0000000..b392681 --- /dev/null +++ b/gosnippets/minisnip/_go_sp @@ -0,0 +1,2 @@ +fmt.Sprintf("{{++}}", {{++}}) + diff --git a/gosnippets/snippets/go.snip b/gosnippets/snippets/go.snip index f60aeb5..9a480b0 100644 --- a/gosnippets/snippets/go.snip +++ b/gosnippets/snippets/go.snip @@ -118,6 +118,14 @@ snippet else else { ${0} } + +# if inline error +snippet ife +abbr if err := ...; err != nil { ... } + if err := ${1:condition}; err != nil { + ${0} + } + # error snippet snippet errn abbr if err != nil { ... } @@ -132,6 +140,13 @@ abbr if err != nil { ... } t.Fatal(err) } +# error snippet in log.Fatal +snippet errl +abbr if err != nil { ... } + if err != nil { + log.Fatal(err) + } + # error snippet with two return values snippet errn, abbr if err != nil { return [...], err } @@ -149,11 +164,24 @@ abbr if err != nil { return } } ${0} +# error snippet with panic +snippet errp +abbr if err != nil { ... } + if err != nil { + panic(${1}) + } + ${0} + # json snippet snippet json abbr \`json:key\` \`json:"${1:keyName}"\` +# yaml snippet +snippet yaml +abbr \`yaml:key\` + \`yaml:"${1:keyName}"\` + # fallthrough snippet ft abbr fallthrough @@ -305,6 +333,19 @@ abbr if err != nil { t.Fatalf(...) } if err != nil { t.Fatalf("${1}") } +# test example +snippet example + func Example${1:Method}() { + ${0} + // Output: + } +# test benchmark +snippet benchmark + func Benchmark${1:Method}(b *testing.B) { + for i := 0; i < b.N; i++ { + ${0} + } + } # variable declaration snippet var abbr var x Type [= ...] @@ -323,3 +364,15 @@ abbr equals: test two identifiers with DeepEqual fmt.Printf("%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\n\n", filepath.Base(file), line, $1, $2) t.FailNow() } + +snippet hf +abbr http.HandlerFunc + func ${1:handler}(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} + } + +snippet hhf +abbr mux.HandleFunc(...) + ${1:http}.HandleFunc("${2:/}", func(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} + }) diff --git a/indent/go.vim b/indent/go.vim index a3fa2b7..ba99d54 100644 --- a/indent/go.vim +++ b/indent/go.vim @@ -9,7 +9,7 @@ " - general line splits (line ends in an operator) if exists("b:did_indent") - finish + finish endif let b:did_indent = 1 @@ -21,58 +21,58 @@ setlocal indentexpr=GoIndent(v:lnum) setlocal indentkeys+=<:>,0=},0=) if exists("*GoIndent") - finish + finish endif " use shiftwidth function only if it's available if exists('*shiftwidth') - func s:sw() - return shiftwidth() - endfunc + func s:sw() + return shiftwidth() + endfunc else - func s:sw() - return &sw - endfunc + func s:sw() + return &sw + endfunc endif function! GoIndent(lnum) - let prevlnum = prevnonblank(a:lnum-1) - if prevlnum == 0 - " top of file - return 0 - endif + let prevlnum = prevnonblank(a:lnum-1) + if prevlnum == 0 + " top of file + return 0 + endif - " grab the previous and current line, stripping comments. - let prevl = substitute(getline(prevlnum), '//.*$', '', '') - let thisl = substitute(getline(a:lnum), '//.*$', '', '') - let previ = indent(prevlnum) + " grab the previous and current line, stripping comments. + let prevl = substitute(getline(prevlnum), '//.*$', '', '') + let thisl = substitute(getline(a:lnum), '//.*$', '', '') + let previ = indent(prevlnum) - let ind = previ + let ind = previ - if prevl =~ '[({]\s*$' - " previous line opened a block - let ind += s:sw() - endif - if prevl =~# '^\s*\(case .*\|default\):$' - " previous line is part of a switch statement - let ind += s:sw() - endif - " TODO: handle if the previous line is a label. + if prevl =~ '[({]\s*$' + " previous line opened a block + let ind += s:sw() + endif + if prevl =~# '^\s*\(case .*\|default\):$' + " previous line is part of a switch statement + let ind += s:sw() + endif + " TODO: handle if the previous line is a label. - if thisl =~ '^\s*[)}]' - " this line closed a block - let ind -= s:sw() - endif + if thisl =~ '^\s*[)}]' + " this line closed a block + let ind -= s:sw() + endif - " Colons are tricky. - " We want to outdent if it's part of a switch ("case foo:" or "default:"). - " We ignore trying to deal with jump labels because (a) they're rare, and - " (b) they're hard to disambiguate from a composite literal key. - if thisl =~# '^\s*\(case .*\|default\):$' - let ind -= s:sw() - endif + " Colons are tricky. + " We want to outdent if it's part of a switch ("case foo:" or "default:"). + " We ignore trying to deal with jump labels because (a) they're rare, and + " (b) they're hard to disambiguate from a composite literal key. + if thisl =~# '^\s*\(case .*\|default\):$' + let ind -= s:sw() + endif - return ind + return ind endfunction -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/indent/gohtmltmpl.vim b/indent/gohtmltmpl.vim index 94ea135..864913d 100644 --- a/indent/gohtmltmpl.vim +++ b/indent/gohtmltmpl.vim @@ -30,15 +30,17 @@ function! GetGoHTMLTmplIndent(lnum) " If need to indent based on last line let last_line = getline(a:lnum-1) - if last_line =~ '^\s*{{\s*\%(if\|else\|range\|with\|define\|block\).*}}' + if last_line =~ '^\s*{{-\=\s*\%(if\|else\|range\|with\|define\|block\).*}}' let ind += sw endif " End of FuncMap block let current_line = getline(a:lnum) - if current_line =~ '^\s*{{\s*\%(else\|end\).*}}' + if current_line =~ '^\s*{{-\=\s*\%(else\|end\).*}}' let ind -= sw endif return ind endfunction + +" vim: sw=2 ts=2 et diff --git a/plugin/go.vim b/plugin/go.vim index e03565c..bb88608 100644 --- a/plugin/go.vim +++ b/plugin/go.vim @@ -1,173 +1,278 @@ " install necessary Go tools if exists("g:go_loaded_install") - finish + finish endif let g:go_loaded_install = 1 +" Not using the has('patch-7.4.1689') syntax because that wasn't added until +" 7.4.237, and we want to be sure this works for everyone (this is also why +" we're not using utils#EchoError()). +" +" Version 7.4.1689 was chosen because that's what the most recent Ubuntu LTS +" release (16.04) uses. +if + \ get(g:, 'go_version_warning', 1) != 0 && + \ (v:version < 704 || (v:version == 704 && !has('patch1689'))) + \ && !has('nvim') + echohl Error + echom "vim-go requires Vim 7.4.1689 or Neovim, but you're using an older version." + echom "Please update your Vim for the best vim-go experience." + echom "If you really want to continue you can set this to make the error go away:" + echom " let g:go_version_warning = 0" + echom "Note that some features may error out or behave incorrectly." + echom "Please do not report bugs unless you're using Vim 7.4.1689 or newer." + echohl None + + " Make sure people see this. + sleep 2 +endif " these packages are used by vim-go and can be automatically installed if " needed by the user with GoInstallBinaries -let s:packages = [ - \ "github.com/nsf/gocode", - \ "github.com/alecthomas/gometalinter", - \ "golang.org/x/tools/cmd/goimports", - \ "github.com/rogpeppe/godef", - \ "golang.org/x/tools/cmd/oracle", - \ "golang.org/x/tools/cmd/gorename", - \ "github.com/golang/lint/golint", - \ "github.com/kisielk/errcheck", - \ "github.com/jstemmer/gotags", - \ "github.com/klauspost/asmfmt/cmd/asmfmt", - \ "github.com/fatih/motion", - \ ] +let s:packages = { + \ 'asmfmt': ['github.com/klauspost/asmfmt/cmd/asmfmt'], + \ 'errcheck': ['github.com/kisielk/errcheck'], + \ 'fillstruct': ['github.com/davidrjenni/reftools/cmd/fillstruct'], + \ 'gocode': ['github.com/nsf/gocode', {'windows': '-ldflags -H=windowsgui'}], + \ 'godef': ['github.com/rogpeppe/godef'], + \ 'gogetdoc': ['github.com/zmb3/gogetdoc'], + \ 'goimports': ['golang.org/x/tools/cmd/goimports'], + \ 'golint': ['github.com/golang/lint/golint'], + \ 'gometalinter': ['github.com/alecthomas/gometalinter'], + \ 'gomodifytags': ['github.com/fatih/gomodifytags'], + \ 'gorename': ['golang.org/x/tools/cmd/gorename'], + \ 'gotags': ['github.com/jstemmer/gotags'], + \ 'guru': ['golang.org/x/tools/cmd/guru'], + \ 'impl': ['github.com/josharian/impl'], + \ 'keyify': ['github.com/dominikh/go-tools/cmd/keyify'], + \ 'motion': ['github.com/fatih/motion'], +\ } " These commands are available on any filetypes -command! GoInstallBinaries call s:GoInstallBinaries(-1) -command! GoUpdateBinaries call s:GoInstallBinaries(1) +command! -nargs=* -complete=customlist,s:complete GoInstallBinaries call s:GoInstallBinaries(-1, ) +command! -nargs=* -complete=customlist,s:complete GoUpdateBinaries call s:GoInstallBinaries(1, ) command! -nargs=? -complete=dir GoPath call go#path#GoPath() - -" GoInstallBinaries downloads and install all necessary binaries stated in the -" packages variable. It uses by default $GOBIN or $GOPATH/bin as the binary -" target install directory. GoInstallBinaries doesn't install binaries if they -" exist, to update current binaries pass 1 to the argument. -function! s:GoInstallBinaries(updateBinaries) - if $GOPATH == "" - echohl Error - echomsg "vim.go: $GOPATH is not set" - echohl None - return - endif - - let err = s:CheckBinaries() - if err != 0 +fun! s:complete(lead, cmdline, cursor) + return filter(keys(s:packages), 'strpart(v:val, 0, len(a:lead)) == a:lead') +endfun + +" GoInstallBinaries downloads and installs binaries defined in s:packages to +" $GOBIN or $GOPATH/bin. GoInstallBinaries will update already installed +" binaries only if updateBinaries = 1. By default, all packages in s:packages +" will be installed, but the set can be limited by passing the desired +" packages in the unnamed arguments. +function! s:GoInstallBinaries(updateBinaries, ...) + let err = s:CheckBinaries() + if err != 0 + return + endif + + if go#path#Default() == "" + echohl Error + echomsg "vim.go: $GOPATH is not set and 'go env GOPATH' returns empty" + echohl None + return + endif + + let go_bin_path = go#path#BinPath() + + " change $GOBIN so go get can automatically install to it + let $GOBIN = go_bin_path + + " old_path is used to restore users own path + let old_path = $PATH + + " vim's executable path is looking in PATH so add our go_bin path to it + let $PATH = go_bin_path . go#util#PathListSep() . $PATH + + " when shellslash is set on MS-* systems, shellescape puts single quotes + " around the output string. cmd on Windows does not handle single quotes + " correctly. Unsetting shellslash forces shellescape to use double quotes + " instead. + let resetshellslash = 0 + if has('win32') && &shellslash + let resetshellslash = 1 + set noshellslash + endif + + let cmd = "go get -v " + if get(g:, "go_get_update", 1) != 0 + let cmd .= "-u " + endif + + let s:go_version = matchstr(go#util#System("go version"), '\d.\d.\d') + + " https://github.com/golang/go/issues/10791 + if s:go_version > "1.4.0" && s:go_version < "1.5.0" + let cmd .= "-f " + endif + + " Filter packages from arguments (if any). + let l:packages = {} + if a:0 > 0 + for l:bin in a:000 + let l:pkg = get(s:packages, l:bin, []) + if len(l:pkg) == 0 + call go#util#EchoError('unknown binary: ' . l:bin) return - endif - - let go_bin_path = go#path#BinPath() + endif + let l:packages[l:bin] = l:pkg + endfor + else + let l:packages = s:packages + endif - " change $GOBIN so go get can automatically install to it - let $GOBIN = go_bin_path + let l:platform = '' + if go#util#IsWin() + let l:platform = 'windows' + endif - " old_path is used to restore users own path - let old_path = $PATH + for [binary, pkg] in items(l:packages) + let l:importPath = pkg[0] + let l:goGetFlags = len(pkg) > 1 ? get(pkg[1], l:platform, '') : '' - " vim's executable path is looking in PATH so add our go_bin path to it - let $PATH = $PATH . go#util#PathListSep() .go_bin_path + let binname = "go_" . binary . "_bin" - " when shellslash is set on MS-* systems, shellescape puts single quotes - " around the output string. cmd on Windows does not handle single quotes - " correctly. Unsetting shellslash forces shellescape to use double quotes - " instead. - let resetshellslash = 0 - if has('win32') && &shellslash - let resetshellslash = 1 - set noshellslash + let bin = binary + if exists("g:{binname}") + let bin = g:{binname} endif - let cmd = "go get -u -v " - - let s:go_version = matchstr(system("go version"), '\d.\d.\d') - - " https://github.com/golang/go/issues/10791 - if s:go_version > "1.4.0" && s:go_version < "1.5.0" - let cmd .= "-f " + if !executable(bin) || a:updateBinaries == 1 + if a:updateBinaries == 1 + echo "vim-go: Updating " . binary . ". Reinstalling ". importPath . " to folder " . go_bin_path + else + echo "vim-go: ". binary ." not found. Installing ". importPath . " to folder " . go_bin_path + endif + + let out = go#util#System(printf('%s %s %s', cmd, l:goGetFlags, shellescape(importPath))) + if go#util#ShellError() != 0 + echom "Error installing " . importPath . ": " . out + endif endif + endfor - for pkg in s:packages - let basename = fnamemodify(pkg, ":t") - let binname = "go_" . basename . "_bin" - - let bin = basename - if exists("g:{binname}") - let bin = g:{binname} - endif - - if !executable(bin) || a:updateBinaries == 1 - if a:updateBinaries == 1 - echo "vim-go: Updating ". basename .". Reinstalling ". pkg . " to folder " . go_bin_path - else - echo "vim-go: ". basename ." not found. Installing ". pkg . " to folder " . go_bin_path - endif - - - let out = system(cmd . shellescape(pkg)) - if v:shell_error - echo "Error installing ". pkg . ": " . out - endif - endif - endfor - - " restore back! - let $PATH = old_path - if resetshellslash - set shellslash - endif + " restore back! + let $PATH = old_path + if resetshellslash + set shellslash + endif endfunction " CheckBinaries checks if the necessary binaries to install the Go tool " commands are available. function! s:CheckBinaries() - if !executable('go') - echohl Error | echomsg "vim-go: go executable not found." | echohl None - return -1 - endif - - if !executable('git') - echohl Error | echomsg "vim-go: git executable not found." | echohl None - return -1 - endif + if !executable('go') + echohl Error | echomsg "vim-go: go executable not found." | echohl None + return -1 + endif + + if !executable('git') + echohl Error | echomsg "vim-go: git executable not found." | echohl None + return -1 + endif endfunction " Autocommands " ============================================================================ " function! s:echo_go_info() - if !exists('v:completed_item') || empty(v:completed_item) - return - endif - let item = v:completed_item + if !get(g:, "go_echo_go_info", 1) + return + endif - if !has_key(item, "info") - return - endif + if !exists('v:completed_item') || empty(v:completed_item) + return + endif + let item = v:completed_item - if empty(item.info) - return - endif + if !has_key(item, "info") + return + endif - redraws! | echo "vim-go: " | echohl Function | echon item.info | echohl None -endfunction + if empty(item.info) + return + endif -augroup vim-go - autocmd! + redraws! | echo "vim-go: " | echohl Function | echon item.info | echohl None +endfunction - " GoInfo automatic update - if get(g:, "go_auto_type_info", 0) - autocmd CursorHold *.go nested call go#complete#Info(1) - endif +function! s:auto_type_info() + " GoInfo automatic update + if get(g:, "go_auto_type_info", 0) + call go#tool#Info(1) + endif +endfunction - " Echo the identifier information when completion is done. Useful to see - " the signature of a function, etc... - if exists('##CompleteDone') - autocmd CompleteDone *.go nested call s:echo_go_info() - endif +function! s:auto_sameids() + " GoSameId automatic update + if get(g:, "go_auto_sameids", 0) + call go#guru#SameIds() + endif +endfunction - " Go code formatting on save - if get(g:, "go_fmt_autosave", 1) - autocmd BufWritePre *.go call go#fmt#Format(-1) - endif +function! s:fmt_autosave() + " Go code formatting on save + if get(g:, "go_fmt_autosave", 1) + call go#fmt#Format(-1) + endif +endfunction - " Go asm formatting on save - if get(g:, "go_asmfmt_autosave", 1) - autocmd BufWritePre *.s call go#asmfmt#Format() - endif +function! s:asmfmt_autosave() + " Go asm formatting on save + if get(g:, "go_asmfmt_autosave", 0) + call go#asmfmt#Format() + endif +endfunction - " run gometalinter on save - if get(g:, "go_metalinter_autosave", 0) - autocmd BufWritePost *.go call go#lint#Gometa(1) - endif -augroup END +function! s:metalinter_autosave() + " run gometalinter on save + if get(g:, "go_metalinter_autosave", 0) + call go#lint#Gometa(1) + endif +endfunction +function! s:template_autocreate() + " create new template from scratch + if get(g:, "go_template_autocreate", 1) + call go#template#create() + endif +endfunction -" vim:ts=4:sw=4:et +augroup vim-go + autocmd! + + autocmd CursorHold *.go call s:auto_type_info() + autocmd CursorHold *.go call s:auto_sameids() + + " Echo the identifier information when completion is done. Useful to see + " the signature of a function, etc... + if exists('##CompleteDone') + autocmd CompleteDone *.go call s:echo_go_info() + endif + + autocmd BufWritePre *.go call s:fmt_autosave() + autocmd BufWritePre *.s call s:asmfmt_autosave() + autocmd BufWritePost *.go call s:metalinter_autosave() + autocmd BufNewFile *.go call s:template_autocreate() + " clear SameIds when the buffer is unloaded so that loading another buffer + " in the same window doesn't highlight the most recently matched + " identifier's positions. + autocmd BufWinEnter *.go call go#guru#ClearSameIds() + + autocmd BufEnter *.go + \ if get(g:, 'go_autodetect_gopath', 0) && !exists('b:old_gopath') + \| let b:old_gopath = exists('$GOPATH') ? $GOPATH : -1 + \| let $GOPATH = go#path#Detect() + \| endif + autocmd BufLeave *.go + \ if exists('b:old_gopath') + \| if b:old_gopath isnot -1 + \| let $GOPATH = b:old_gopath + \| endif + \| unlet b:old_gopath + \| endif +augroup end + +" vim: sw=2 ts=2 et diff --git a/rplugin/python3/denite/source/decls.py b/rplugin/python3/denite/source/decls.py new file mode 100644 index 0000000..68651a8 --- /dev/null +++ b/rplugin/python3/denite/source/decls.py @@ -0,0 +1,93 @@ +# ============================================================================ +# FILE: decls.py +# AUTHOR: delphinus +# License: MIT license +# ============================================================================ + +import os +import subprocess +import json +import denite.util +from .base import Base + +DECLS_SYNTAX_HIGHLIGHT = [ + {'name': 'FilePath', 're': r'[^:]*\ze:', 'link': 'Comment'}, + {'name': 'Line', 're': r'\d\+\ze :', 'link': 'LineNr'}, + {'name': 'WholeFunction', 're': r'\vfunc %(\([^)]+\) )?[^(]+'}, + {'name': 'Function', 'parent': 'WholeFunction', + 're': r'\S\+\ze(', 'link': 'Function'}, + {'name': 'WholeType', 're': r'type \S\+'}, + {'name': 'Type', 'parent': 'WholeType', + 're': r'\v( )@<=\S+', 'link': 'Type'}, + {'name': 'Separator', 're': r':', 'conceal': True}, + {'name': 'SeparatorFunction', 'parent': 'WholeFunction', + 're': r'func ', 'conceal': True}, + {'name': 'SeparatorType', 'parent': 'WholeType', + 're': r'type ', 'conceal': True}, + ] + +class Source(Base): + + def __init__(self, vim): + super().__init__(vim) + + self.name = 'decls' + self.kind = 'file' + + def gather_candidates(self, context): + bin_path = self.vim.call('go#path#CheckBinPath', 'motion') + if bin_path == '': + return [] + + expand = context['args'][0] if context['args'] else '%:p:h' + target = self.vim.funcs.expand(expand) + + if os.path.isdir(target): + mode = 'dir' + elif os.path.isfile(target): + mode = 'file' + else: + return [] + + if self.vim.funcs.exists('g:go_decls_includes'): + include = self.vim.eval('g:go_decls_includes') + else: + include = 'func,type' + + command = [bin_path, '-mode', 'decls', '-include', include, + '-' + mode, target] + + try: + cmd = subprocess.run(command, stdout=subprocess.PIPE, check=True) + except subprocess.CalledProcessError as err: + denite.util.error(self.vim, + 'command returned invalid response: ' + str(err)) + return [] + + txt = cmd.stdout.decode('utf-8') + output = json.loads(txt, encoding='utf-8') + + def make_candidates(row): + name = self.vim.funcs.fnamemodify(row['filename'], ':~:.') + return { + 'word': '{0} :{1} :{2}'.format(name, row['line'], row['full']), + 'action__path': row['filename'], + 'action__line': row['line'], + 'action__col': row['col'], + } + return list(map(make_candidates, output['decls'])) + + def highlight(self): + for syn in DECLS_SYNTAX_HIGHLIGHT: + containedin = self.syntax_name + containedin += '_' + syn['parent'] if 'parent' in syn else '' + conceal = ' conceal' if 'conceal' in syn else '' + + self.vim.command( + 'syntax match {0}_{1} /{2}/ contained containedin={3}{4}' + .format(self.syntax_name, syn['name'], syn['re'], + containedin, conceal)) + + if 'link' in syn: + self.vim.command('highlight default link {0}_{1} {2}'.format( + self.syntax_name, syn['name'], syn['link'])) diff --git a/scripts/docker-test b/scripts/docker-test new file mode 100755 index 0000000..2b56ad8 --- /dev/null +++ b/scripts/docker-test @@ -0,0 +1,13 @@ +#!/bin/sh +# +# Run all tests inside a Docker container +# + +set -euC +vimgodir=$(cd -P "$(dirname "$0")/.." > /dev/null && pwd) +cd "$vimgodir" + +docker build --tag vim-go-test . +docker run --rm vim-go-test + +# vim:ts=2:sts=2:sw=2:et diff --git a/scripts/install-vim b/scripts/install-vim new file mode 100755 index 0000000..7b4e7a4 --- /dev/null +++ b/scripts/install-vim @@ -0,0 +1,112 @@ +#!/bin/sh +# +# Install and setup a Vim or Neovim for running tests. +# This should work on both Travis and people's desktop computers, and be 100% +# independent from any system installed Vim. +# +# It will echo the full path to a Vim binary, e.g.: +# /some/path/src/vim + +set -euC + +vimgodir=$(cd -P "$(dirname "$0")/.." > /dev/null && pwd) +cd "$vimgodir" + +vim=${1:-} + +case "$vim" in + "vim-7.4") + # This is what the most recent Ubuntu LTS (16.04) ships with. + tag="v7.4.1689" + giturl="https://github.com/vim/vim" + ;; + + "vim-8.0") + # This follows the version in Arch Linux. Vim's master branch isn't always + # stable, and we don't want to have the build fail because Vim introduced a + # bug. + tag="v8.0.1176" + giturl="https://github.com/vim/vim" + ;; + + "nvim") + # Use latest stable version. + tag="v0.2.0" + giturl="https://github.com/neovim/neovim" + ;; + + *) + echo "unknown version: '${1:-}'" + echo "First argument must be 'vim-7.4', 'vim-8.0', or 'nvim'." + exit 1 + ;; +esac + +srcdir="/tmp/vim-go-test/$1-src" +installdir="/tmp/vim-go-test/$1-install" + +# Use cached installdir. +if [ -d "$installdir" ]; then + echo "$installdir exists; skipping build." + + # The ./scripts/test script relies on this. + echo "installed to: $installdir" + exit 0 +fi + +mkdir -p "$srcdir" +cd "$srcdir" + +# Neovim build requires more deps than Vim and is annoying, so we use the +# binary. +# 0.2.0 doesn't have a binary build for Linux, so we use 0.2.1-dev for now. +if [ "$1" = "nvim" ]; then + + # TODO: Use macOS binaries on macOS + curl -Ls https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz | + tar xzf - -C /tmp/vim-go-test/ + mv /tmp/vim-go-test/nvim-linux64 /tmp/vim-go-test/nvim-install + mkdir -p "$installdir/share/nvim/runtime/pack/vim-go/start" + ln -s "$vimgodir" "$installdir/share/nvim/runtime/pack/vim-go/start/vim-go" + + # Consistent paths makes calling things easier. + mv "$installdir/bin/nvim" "$installdir/bin/vim" + mkdir -p "$installdir/share/vim/vimgo/pack" + ln -s "$installdir/share/nvim/runtime/pack/vim-go" "$installdir/share/vim/vimgo/pack/vim-go" + +# Build Vim from source. +else + if [ -d "$srcdir/.git" ]; then + echo "Skipping clone as $srcdir/.git exists" + else + echo "Cloning $tag from $giturl" + git clone --branch "$tag" --depth 1 "$giturl" "$srcdir" + fi + + ./configure --prefix="$installdir" --with-features=huge --disable-gui + make install + mkdir -p "$installdir/share/vim/vimgo/pack/vim-go/start" + ln -s "$vimgodir" "$installdir/share/vim/vimgo/pack/vim-go/start/vim-go" +fi + +# Make sure all Go tools and other dependencies are installed. +echo "Installing Go binaries" +export GOPATH=$installdir +export PATH=${GOPATH}/bin:$PATH +"$vimgodir/scripts/run-vim" $vim +':silent :GoUpdateBinaries' +':qa' + +echo "Installing lint tools" +( + mkdir -p "$installdir/share/vim/vimgo/pack/vim-go/start/" + cd "$installdir/share/vim/vimgo/pack/vim-go/start/" + [ -d "vim-vimhelplint" ] || git clone --depth 1 --quiet https://github.com/machakann/vim-vimhelplint + [ -d "vim-vimlparser" ] || git clone --depth 1 --quiet https://github.com/ynkdir/vim-vimlparser + [ -d "vim-vimlint" ] || git clone --depth 1 --quiet https://github.com/syngan/vim-vimlint +) + +# Don't really need source after successful install. +rm -rf "$srcdir" + +echo "installed to: $installdir" + +# vim:ts=2:sts=2:sw=2:et diff --git a/scripts/lint b/scripts/lint new file mode 100755 index 0000000..553413a --- /dev/null +++ b/scripts/lint @@ -0,0 +1,88 @@ +#!/bin/sh +# +# Run all linting tools. +# + +set -euC +vimgodir=$(cd -P "$(dirname "$0")/.." > /dev/null && pwd) +cd "$vimgodir" + +### Setup Vim and other dependencies. +##################################### +if [ -z "${1:-}" ]; then + echo "unknown version: '${1:-}'" + echo "First argument must be 'vim-7.4', 'vim-8.0', or 'nvim'." + exit 1 +fi + +vim=$1 +vimdir="/tmp/vim-go-test/$vim-install" +export GOPATH=$vimdir +export PATH=${GOPATH}/bin:$PATH + +if [ ! -f "$vimdir/bin/vim" ]; then + echo "$vimdir/bin/vim doesn't exist; did you install it with the install-vim script?" + exit 1 +fi + +### Run vint +############ +failed=0 +printf "Running vint ... " +if [ -x "$(command -v vint)" ]; then + lint=$(vint "$vimgodir" 2>&1 ||:) + if [ -n "$lint" ]; then + echo "FAILED" + echo "$lint" + echo + failed=6 + else + echo "PASSED" + fi +else + echo "SKIPPED" + echo "'vint' binary not found; use 'pip install vim-vint' to install it." +fi + +### Run vim-vimlint +################### +printf "Running vim-vimlint ... " +lint=$(sh "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlint/bin/vimlint.sh" \ + -p "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlparser" \ + -l "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlint" \ + -u \ + -c func_abort=1 \ + -e EVL110=1 -e EVL103=1 -e EVL104=1 -e EVL102=1 \ + "$vimgodir" \ + 2>&1 ||:) +if [ -n "$lint" ]; then + echo "FAILED" + echo "$lint" + echo + failed=6 +else + echo "PASSED" +fi + +### Run vimhelplint. +#################### +printf "Running vimhelplint ... " + +# set modeline explicitly so that the modeline will be respected when run as root. +lint=$($vimdir/bin/vim -esNR \ + --cmd "set rtp+=$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimhelplint/" \ + --cmd 'set modeline' \ + +'filetype plugin on' \ + +"e $vimgodir/doc/vim-go.txt" \ + +'verbose VimhelpLintEcho' \ + +q \ + 2>&1 ||:) +if [ "$lint" ]; then + echo "FAILED" + echo "$lint" + failed=6 +else + echo "PASSED" +fi + +exit "$failed" diff --git a/scripts/run-vim b/scripts/run-vim new file mode 100755 index 0000000..f020ea9 --- /dev/null +++ b/scripts/run-vim @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Run a "bare" Vim with just vim-go and ignoring ~/.vim +# + +set -euC +vimgodir=$(cd -P "$(dirname "$0")/.." > /dev/null && pwd) +cd "$vimgodir" + +coverage=0 +while getopts "c" option; do + case "$option" in + c) coverage=1; ;; + esac +done +shift $((OPTIND - 1)) + +if [ -z "${1:-}" ]; then + echo "unknown version: '${1:-}'" + echo "First argument must be 'vim-7.4', 'vim-8.0', or 'nvim'." + exit 1 +fi + +dir="/tmp/vim-go-test/$1-install" +export GOPATH=$dir +export PATH=${GOPATH}/bin:$PATH +shift + +if [ ! -f "$dir/bin/vim" ]; then + echo "$dir/bin/vim doesn't exist; did you install it with the install-vim script?" + exit 1 +fi + +if [ $coverage -eq 1 ]; then + covimerage -q run --report-file /tmp/vim-go-test/cov-profile.txt --append \ + $dir/bin/vim --noplugin -u NONE -N \ + +"set shm+=WAFI rtp=$dir/share/vim/vimgo packpath=$dir/share/vim/vimgo,$vimgodir" \ + +'filetype plugin indent on' \ + +'packloadall!' \ + "$@" +else + $dir/bin/vim --noplugin -u NONE -N \ + +"set shm+=WAFI rtp=$dir/share/vim/vimgo packpath=$dir/share/vim/vimgo,$vimgodir" \ + +'filetype plugin indent on' \ + +'packloadall!' \ + "$@" +fi + + +# vim:ts=2:sts=2:sw=2:et diff --git a/scripts/runtest.vim b/scripts/runtest.vim new file mode 100644 index 0000000..23d9186 --- /dev/null +++ b/scripts/runtest.vim @@ -0,0 +1,103 @@ +" Make sure some options are set to sane defaults and output all messages in +" English. + +" vint: -ProhibitSetNoCompatible +set nocompatible nomore shellslash encoding=utf-8 shortmess+=WIF +lang mess C + +" Initialize variables. +let s:total_started = reltime() +let s:fail = 0 +let s:done = 0 +let s:logs = [] +let s:gopath = $GOPATH +if !exists('g:test_verbose') + let g:test_verbose = 0 +endif + +" Source the passed test file. +source % + +" cd into the folder of the test file. +let s:cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' +let s:testfile = expand('%:t') +execute s:cd . expand('%:p:h') + +" Export root path to vim-go dir. +let g:vim_go_root = fnamemodify(getcwd(), ':p') + +" Get a list of all Test_ functions for the given file. +redir @q + silent function /^Test_ +redir END +let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) + +" Iterate over all tests and execute them. +for s:test in sort(s:tests) + " Since we extract the tests from a regexp the "abort" keyword is also in the + " list, which is not a test name :-) + if s:test == 'abort' + continue + endif + + let s:started = reltime() + if g:test_verbose is 1 + call add(s:logs, printf("=== RUN %s", s:test[:-3])) + endif + try + exe 'call ' . s:test + catch + let v:errors += [v:exception] + endtry + + " Restore GOPATH after each test. + let $GOPATH = s:gopath + + let s:elapsed_time = substitute(reltimestr(reltime(s:started)), '^\s*\(.\{-}\)\s*$', '\1', '') + let s:done += 1 + + if len(v:errors) > 0 + let s:fail += 1 + call add(s:logs, printf("--- FAIL %s (%ss)", s:test[:-3], s:elapsed_time)) + call extend(s:logs, map(v:errors, '" ". v:val')) + + " Reset so we can capture failures of the next test. + let v:errors = [] + else + if g:test_verbose is 1 + call add(s:logs, printf("--- PASS %s (%ss)", s:test[:-3], s:elapsed_time)) + endif + endif +endfor + +" Create an empty fail to indicate that at least one test failed. +if s:fail > 0 + split /tmp/vim-go-test/FAILED + silent write +endif + +let s:total_elapsed_time = substitute(reltimestr(reltime(s:total_started)), '^\s*\(.\{-}\)\s*$', '\1', '') + +" Add all messages (usually errors). +redir => s:mess + silent messages +redir END +let s:logs = s:logs + filter(split(s:mess, "\n"), 'v:val !~ "^Messages maintainer"') + +" Also store all internal messages from s:logs as well. +silent! split /tmp/vim-go-test/test.tmp +call append(line('$'), s:logs) +call append(line('$'), printf("%s %s %s %ss / %s tests", + \ (s:fail > 0 ? 'FAIL' : 'ok '), + \ s:testfile, + \ repeat(' ', 25 - len(s:testfile)), + \ s:total_elapsed_time, s:done)) +if g:test_verbose is 0 + silent :g/^$/d +endif +silent! write + +" Our work here is done. +qall! + +" vim:ts=2:sts=2:sw=2:et diff --git a/scripts/test b/scripts/test new file mode 100755 index 0000000..04e5169 --- /dev/null +++ b/scripts/test @@ -0,0 +1,101 @@ +#!/bin/sh +# +# Run all tests. +# + +set -euC +vimgodir=$(cd -P "$(dirname "$0")/.." > /dev/null && pwd) +cd "$vimgodir" + +_usage() { + echo "Usage: ${0##*/} [-hvc] [-r file] vim_version" + echo + echo "Options:" + echo " -h Show this help" + echo " -v Enable verbose output" + echo " -r Run only the tests from this file" + echo " -c Generate and submit code coverage reports" + echo +} + +verbose=0 +run="" +coverage="" +while getopts "hvcr:" option; do + case "$option" in + h) _usage; exit 0 ;; + v) verbose=1; ;; + r) run=$OPTARG ;; + c) coverage="-c" ;; + *) + echo "error: unknown option '$option'" + _usage + exit 1 + ;; + esac +done +shift $((OPTIND - 1)) + +### Setup Vim and other dependencies. +##################################### +if [ -z "${1:-}" ]; then + echo "unknown version: '${1:-}'" + echo "First argument must be 'vim-7.4', 'vim-8.0', or 'nvim'." + exit 1 +fi + +vim=$1 +vimdir="/tmp/vim-go-test/$vim-install" +export GOPATH=$vimdir +export PATH=${GOPATH}/bin:$PATH + +if [ ! -f "$vimdir/bin/vim" ]; then + echo "$vimdir/bin/vim doesn't exist; did you install it with the install-vim script?" + exit 1 +fi + +### Run tests. +############## +# Clean stale log file. +[ -f '/tmp/vim-go-test/test.log' ] && rm '/tmp/vim-go-test/test.log' +[ -f '/tmp/vim-go-test/FAILED' ] && rm '/tmp/vim-go-test/FAILED' +[ -f '/tmp/vim-go-test/cov-profile.txt' ] && rm '/tmp/vim-go-test/cov-profile.txt' +[ -f '/tmp/vim-go-test/cov-report.txt' ] && rm '/tmp/vim-go-test/cov-report.txt' + +# Run the actual tests. +find "$vimgodir" -name '*_test.vim' | while read test_file; do + [ -n "$run" -a "$(basename "$test_file")" != "$run" ] && continue + + "$vimgodir/scripts/run-vim" $coverage $vim -e \ + +"silent e $test_file" \ + +"let g:test_verbose=$verbose" \ + -S ./scripts/runtest.vim < /dev/null || ( + # If Vim exits with non-0 it's almost certainly a bug in the test runner; + # should very rarely happen in normal usage. + echo 'test runner failure' + cat '/tmp/vim-go-test/test.tmp' + rm '/tmp/vim-go-test/test.tmp' + exit 5 + ) + + # Append logs + cat '/tmp/vim-go-test/test.tmp' | tee '/tmp/vim-go-test/test.log' + rm '/tmp/vim-go-test/test.tmp' +done + +echo +if [ -f "/tmp/vim-go-test/FAILED" ]; then + echo 2>&1 "Some ($vim) tests FAILED" + exit 1 +fi +echo 2>&1 "All ($vim) tests PASSED" + +# Submit coverage reports +if [ -n "$coverage" ]; then + coverage xml --omit '*_test.vim' + codecov -X search gcov pycov -f coverage.xml --required \ + --flags "$(echo "$vim" | sed -s 's/[-.]//g')" + rm coverage.xml +fi + +# vim:ts=2:sts=2:sw=2:et diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100755 index d8a5b89..0000000 --- a/scripts/test.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash -e -# -# Copyright 2012 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. -# -# Tests for import.vim. - -cd $(dirname $0) - -cat > base.go <&1 -n "$1: " - vim -e -s -u /dev/null -U /dev/null --noplugin -c "source import.vim" \ - -c "$1" -c 'wq! test.go' base.go - # ensure blank lines are treated correctly - if ! gofmt test.go | cmp test.go -; then - echo 2>&1 "gofmt conflict" - gofmt test.go | diff -u test.go - | sed "s/^/ /" 2>&1 - fail=1 - return - fi - if ! [[ $(cat test.go) =~ $2 ]]; then - echo 2>&1 "$2 did not match" - cat test.go | sed "s/^/ /" 2>&1 - fail=1 - return - fi - echo 2>&1 "ok" -} - -# Tests for Import - -test_one "Import baz" '"baz".*"bytes"' -test_one "Import io/ioutil" '"io".*"io/ioutil".*"net"' -test_one "Import myc" '"io".*"myc".*"net"' # prefix of a site prefix -test_one "Import nat" '"io".*"nat".*"net"' -test_one "Import net/http" '"net".*"net/http".*"mycorp/foo"' -test_one "Import zoo" '"net".*"zoo".*"mycorp/foo"' -test_one "Import mycorp/bar" '"net".*"mycorp/bar".*"mycorp/foo"' -test_one "Import mycorp/goo" '"net".*"mycorp/foo".*"mycorp/goo"' - -# Tests for Drop - -cat > base.go <&1 "FAIL" - exit 1 -fi -echo 2>&1 "PASS" diff --git a/syntax/go.vim b/syntax/go.vim index 484b400..8e7df12 100644 --- a/syntax/go.vim +++ b/syntax/go.vim @@ -3,54 +3,31 @@ " license that can be found in the LICENSE file. " " go.vim: Vim syntax file for Go. -" -" Options: -" There are some options for customizing the highlighting; the recommended -" settings are the default values, but you can write: -" let OPTION_NAME = 0 -" in your ~/.vimrc file to disable particular options. You can also write: -" let OPTION_NAME = 1 -" to enable particular options. -" At present, all options default to on, except highlight of: -" functions, methods, structs, operators, build constraints and interfaces. -" -" - go_highlight_array_whitespace_error -" Highlights white space after "[]". -" - go_highlight_chan_whitespace_error -" Highlights white space around the communications operator that don't follow -" the standard style. -" - go_highlight_extra_types -" Highlights commonly used library types (io.Reader, etc.). -" - go_highlight_space_tab_error -" Highlights instances of tabs following spaces. -" - go_highlight_trailing_whitespace_error -" Highlights trailing white space. -" - go_highlight_string_spellcheck -" Specifies that strings should be spell checked " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") finish endif +" Set settings to default values. if !exists("g:go_highlight_array_whitespace_error") - let g:go_highlight_array_whitespace_error = 1 + let g:go_highlight_array_whitespace_error = 0 endif if !exists("g:go_highlight_chan_whitespace_error") - let g:go_highlight_chan_whitespace_error = 1 + let g:go_highlight_chan_whitespace_error = 0 endif if !exists("g:go_highlight_extra_types") - let g:go_highlight_extra_types = 1 + let g:go_highlight_extra_types = 0 endif if !exists("g:go_highlight_space_tab_error") - let g:go_highlight_space_tab_error = 1 + let g:go_highlight_space_tab_error = 0 endif if !exists("g:go_highlight_trailing_whitespace_error") - let g:go_highlight_trailing_whitespace_error = 1 + let g:go_highlight_trailing_whitespace_error = 0 endif if !exists("g:go_highlight_operators") @@ -61,16 +38,20 @@ if !exists("g:go_highlight_functions") let g:go_highlight_functions = 0 endif +if !exists("g:go_highlight_function_arguments") + let g:go_highlight_function_arguments = 0 +endif + if !exists("g:go_highlight_methods") let g:go_highlight_methods = 0 endif -if !exists("g:go_highlight_structs") - let g:go_highlight_structs = 0 +if !exists("g:go_highlight_fields") + let g:go_highlight_fields = 0 endif -if !exists("g:go_highlight_interfaces") - let g:go_highlight_interfaces = 0 +if !exists("g:go_highlight_types") + let g:go_highlight_types = 0 endif if !exists("g:go_highlight_build_constraints") @@ -81,19 +62,61 @@ if !exists("g:go_highlight_string_spellcheck") let g:go_highlight_string_spellcheck = 1 endif +if !exists("g:go_highlight_format_strings") + let g:go_highlight_format_strings = 1 +endif + if !exists("g:go_highlight_generate_tags") let g:go_highlight_generate_tags = 0 endif +if !exists("g:go_highlight_variable_assignments") + let g:go_highlight_variable_assignments = 0 +endif + +if !exists("g:go_highlight_variable_declarations") + let g:go_highlight_variable_declarations = 0 +endif + +let s:fold_block = 1 +let s:fold_import = 1 +let s:fold_varconst = 1 +let s:fold_package_comment = 1 +let s:fold_comment = 0 + +if exists("g:go_fold_enable") + " Enabled by default. + if index(g:go_fold_enable, 'block') == -1 + let s:fold_block = 0 + endif + if index(g:go_fold_enable, 'import') == -1 + let s:fold_import = 0 + endif + if index(g:go_fold_enable, 'varconst') == -1 + let s:fold_varconst = 0 + endif + if index(g:go_fold_enable, 'package_comment') == -1 + let s:fold_package_comment = 0 + endif + + " Disabled by default. + if index(g:go_fold_enable, 'comment') > -1 + let s:fold_comment = 1 + endif +endif + syn case match -syn keyword goDirective package import -syn keyword goDeclaration var const type -syn keyword goDeclType struct interface +syn keyword goPackage package +syn keyword goImport import contained +syn keyword goVar var contained +syn keyword goConst const contained -hi def link goDirective Statement +hi def link goPackage Statement +hi def link goImport Statement +hi def link goVar Keyword +hi def link goConst Keyword hi def link goDeclaration Keyword -hi def link goDeclType Keyword " Keywords within functions syn keyword goStatement defer go goto return break continue fallthrough @@ -119,24 +142,28 @@ hi def link goUnsignedInts Type hi def link goFloats Type hi def link goComplexes Type -" Treat func specially: it's a declaration at the start of a line, but a type -" elsewhere. Order matters here. -syn match goDeclaration /\/ - " Predefined functions and values -syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ -syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ -syn keyword goBoolean iota true false nil +syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ +syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ +syn keyword goBoolean true false +syn keyword goPredefinedIdentifiers nil iota -hi def link goBuiltins Keyword -hi def link goBoolean Boolean +hi def link goBuiltins Keyword +hi def link goBoolean Boolean +hi def link goPredefinedIdentifiers goBoolean " Comments; their contents syn keyword goTodo contained TODO FIXME XXX BUG syn cluster goCommentGroup contains=goTodo -syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell + syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell +if s:fold_comment + syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell fold + syn match goComment "\v(^\s*//.*\n)+" contains=goGenerate,@goCommentGroup,@Spell fold +else + syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell +endif hi def link goComment Comment hi def link goTodo Todo @@ -173,11 +200,14 @@ else syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup syn region goRawString start=+`+ end=+`+ endif -syn match goFormatSpecifier /%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString + +if g:go_highlight_format_strings != 0 + syn match goFormatSpecifier /\([^%]\(%%\)*\)\@<=%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString + hi def link goFormatSpecifier goSpecialString +endif hi def link goString String hi def link goRawString String -hi def link goFormatSpecifier goSpecialString " Characters; their contents syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU @@ -186,8 +216,35 @@ syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains= hi def link goCharacter Character " Regions -syn region goBlock start="{" end="}" transparent fold syn region goParen start='(' end=')' transparent +if s:fold_block + syn region goBlock start="{" end="}" transparent fold +else + syn region goBlock start="{" end="}" transparent +endif + +" import +if s:fold_import + syn region goImport start='import (' end=')' transparent fold contains=goImport,goString,goComment +else + syn region goImport start='import (' end=')' transparent contains=goImport,goString,goComment +endif + +" var, const +if s:fold_varconst + syn region goVar start='var (' end='^\s*)$' transparent fold + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments + syn region goConst start='const (' end='^\s*)$' transparent fold + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments +else + syn region goVar start='var (' end='^\s*)$' transparent + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments + syn region goConst start='const (' end='^\s*)$' transparent + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments +endif + +" Single-line var, const, and import. +syn match goSingleDecl /\(import\|var\|const\) [^(]\@=/ contains=goImport,goVar,goConst " Integers syn match goDecimalInt "\<-\=\d\+\%([Ee][-+]\=\d\+\)\=\>" @@ -268,6 +325,7 @@ hi def link goSpaceError Error syn keyword goTodo contained NOTE hi def link goTodo Todo +syn match goVarArgs /\.\.\./ " Operators; if g:go_highlight_operators != 0 @@ -282,72 +340,131 @@ if g:go_highlight_operators != 0 " match remaining two-char operators: := && || <- ++ -- syn match goOperator /:=\|||\|<-\|++\|--/ " match ... - syn match goOperator /\.\.\./ + + hi def link goPointerOperator goOperator + hi def link goVarArgs goOperator endif hi def link goOperator Operator " Functions; -if g:go_highlight_functions != 0 - syn match goFunction /\(func\s\+\)\@<=\w\+\((\)\@=/ - syn match goFunction /\()\s\+\)\@<=\w\+\((\)\@=/ +if g:go_highlight_functions isnot 0 || g:go_highlight_function_arguments isnot 0 + syn match goFunctionCall /\w\+\ze(/ contains=goBuiltins,goDeclaration + syn match goDeclaration /\/ nextgroup=goReceiver,goFunction,goSimpleArguments skipwhite skipnl + syn match goReceiverVar /\w\+\ze\s\+\(\w\|\*\)/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained + syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl + syn match goFunction /\w\+/ nextgroup=goSimpleArguments contained skipwhite skipnl + syn match goReceiverType /\w\+/ contained +if g:go_highlight_function_arguments isnot 0 + syn match goSimpleArguments /(\(\w\|\_s\|[*\.\[\],\{\}<>-]\)*)/ contained contains=goArgumentName nextgroup=goSimpleArguments skipwhite skipnl + syn match goArgumentName /\w\+\(\s*,\s*\w\+\)*\ze\s\+\(\w\|\.\|\*\|\[\)/ contained nextgroup=goArgumentType skipwhite skipnl + syn match goArgumentType /\([^,)]\|\_s\)\+,\?/ contained nextgroup=goArgumentName skipwhite skipnl + \ contains=goVarArgs,goType,goSignedInts,goUnsignedInts,goFloats,goComplexes,goDeclType,goBlock + hi def link goReceiverVar goArgumentName + hi def link goArgumentName Identifier +endif + syn match goReceiver /(\s*\w\+\(\s\+\*\?\s*\w\+\)\?\s*)\ze\s*\w/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl +else + syn keyword goDeclaration func endif hi def link goFunction Function +hi def link goFunctionCall Type " Methods; if g:go_highlight_methods != 0 - syn match goMethod /\(\.\)\@<=\w\+\((\)\@=/ + syn match goMethodCall /\.\w\+\ze(/hs=s+1 endif -hi def link goMethod Type +hi def link goMethodCall Type -" Structs; -if g:go_highlight_structs != 0 - syn match goStruct /\(.\)\@<=\w\+\({\)\@=/ - syn match goStructDef /\(type\s\+\)\@<=\w\+\(\s\+struct\s\+{\)\@=/ +" Fields; +if g:go_highlight_fields != 0 + syn match goField /\.\w\+\([.\ \n\r\:\)\[,]\)\@=/hs=s+1 endif -hi def link goStruct Function -hi def link goStructDef Function +hi def link goField Identifier + +" Structs & Interfaces; +if g:go_highlight_types != 0 + syn match goTypeConstructor /\<\w\+{\@=/ + syn match goTypeDecl /\/ nextgroup=goTypeName skipwhite skipnl + syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl + syn match goDeclType /\<\(interface\|struct\)\>/ skipwhite skipnl + hi def link goReceiverType Type +else + syn keyword goDeclType struct interface + syn keyword goDeclaration type +endif +hi def link goTypeConstructor Type +hi def link goTypeName Type +hi def link goTypeDecl Keyword +hi def link goDeclType Keyword -" Interfaces; -if g:go_highlight_interfaces != 0 - syn match goInterface /\(.\)\@<=\w\+\({\)\@=/ - syn match goInterfaceDef /\(type\s\+\)\@<=\w\+\(\s\+interface\s\+{\)\@=/ +" Variable Assignments +if g:go_highlight_variable_assignments != 0 + syn match goVarAssign /\v[_.[:alnum:]]+(,\s*[_.[:alnum:]]+)*\ze(\s*([-^+|^\/%&]|\*|\<\<|\>\>|\&\^)?\=[^=])/ + hi def link goVarAssign Special +endif + +" Variable Declarations +if g:go_highlight_variable_declarations != 0 + syn match goVarDefs /\v\w+(,\s*\w+)*\ze(\s*:\=)/ + hi def link goVarDefs Special endif -hi def link goInterface Function -hi def link goInterfaceDef Function " Build Constraints if g:go_highlight_build_constraints != 0 - syn match goBuildKeyword display contained "+build" - " Highlight the known values of GOOS, GOARCH, and other +build options. - syn keyword goBuildDirectives contained - \ android darwin dragonfly freebsd linux nacl netbsd openbsd plan9 - \ solaris windows 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 - \ ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc - \ s390 s390x sparc sparc64 cgo ignore race - - " Other words in the build directive are build tags not listed above, so - " avoid highlighting them as comments by using a matchgroup just for the - " start of the comment. - " The rs=s+2 option lets the \s*+build portion be part of the inner region - " instead of the matchgroup so it will be highlighted as a goBuildKeyword. - syn region goBuildComment matchgroup=goBuildCommentStart - \ start="//\s*+build\s"rs=s+2 end="$" - \ contains=goBuildKeyword,goBuildDirectives - hi def link goBuildCommentStart Comment - hi def link goBuildDirectives Type - hi def link goBuildKeyword PreProc - - " One or more line comments that are followed immediately by a "package" - " declaration are treated like package documentation, so these must be - " matched as comments to avoid looking like working build constraints. - " The he, me, and re options let the "package" itself be highlighted by - " the usual rules. - syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/ - \ end=/\v\n\s*package/he=e-7,me=e-7,re=e-7 - \ contains=@goCommentGroup,@Spell - hi def link goPackageComment Comment + syn match goBuildKeyword display contained "+build" + " Highlight the known values of GOOS, GOARCH, and other +build options. + syn keyword goBuildDirectives contained + \ android darwin dragonfly freebsd linux nacl netbsd openbsd plan9 + \ solaris windows 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 + \ ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc + \ s390 s390x sparc sparc64 cgo ignore race + + " Other words in the build directive are build tags not listed above, so + " avoid highlighting them as comments by using a matchgroup just for the + " start of the comment. + " The rs=s+2 option lets the \s*+build portion be part of the inner region + " instead of the matchgroup so it will be highlighted as a goBuildKeyword. + syn region goBuildComment matchgroup=goBuildCommentStart + \ start="//\s*+build\s"rs=s+2 end="$" + \ contains=goBuildKeyword,goBuildDirectives + hi def link goBuildCommentStart Comment + hi def link goBuildDirectives Type + hi def link goBuildKeyword PreProc +endif + +if g:go_highlight_build_constraints != 0 || s:fold_package_comment + " One or more line comments that are followed immediately by a "package" + " declaration are treated like package documentation, so these must be + " matched as comments to avoid looking like working build constraints. + " The he, me, and re options let the "package" itself be highlighted by + " the usual rules. + exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/' + \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7' + \ . ' contains=@goCommentGroup,@Spell' + \ . (s:fold_package_comment ? ' fold' : '') + exe 'syn region goPackageComment start=/\v\/\*.*\n(.*\n)*\s*\*\/\npackage/' + \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7' + \ . ' contains=@goCommentGroup,@Spell' + \ . (s:fold_package_comment ? ' fold' : '') + hi def link goPackageComment Comment endif +" :GoCoverage commands +hi def link goCoverageNormalText Comment + +function! s:hi() + hi def link goSameId Search + + " :GoCoverage commands + hi def goCoverageCovered ctermfg=green guifg=#A6E22E + hi def goCoverageUncover ctermfg=red guifg=#F92672 +endfunction + +augroup vim-go-hi + autocmd! + autocmd ColorScheme * call s:hi() +augroup end +call s:hi() " Search backwards for a global declaration to start processing the syntax. "syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/ @@ -357,3 +474,5 @@ endif syn sync minlines=500 let b:current_syntax = "go" + +" vim: sw=2 ts=2 et diff --git a/syntax/godefstack.vim b/syntax/godefstack.vim new file mode 100644 index 0000000..e4eefff --- /dev/null +++ b/syntax/godefstack.vim @@ -0,0 +1,20 @@ +if exists("b:current_syntax") + finish +endif + +syn match godefStackComment '^".*' +syn match godefLinePrefix '^[>\s]\s' nextgroup=godefStackEntryNumber contains=godefStackCurrentPosition +syn match godefStackEntryNumber '\d\+' nextgroup=godefStackFilename skipwhite +syn match godefStackCurrentPosition '>' contained +syn match godefStackFilename '[^|]\+' contained nextgroup=godefStackEntryLocation +syn region godefStackEntryLocation oneline start='|' end='|' contained contains=godefStackEntryLocationNumber +syn match godefStackEntryLocationNumber '\d\+' contained display + +let b:current_syntax = "godefstack" + +hi def link godefStackComment Comment +hi def link godefStackCurrentPosition Special +hi def link godefStackFilename Directory +hi def link godefStackEntryLocationNumber LineNr + +" vim: sw=2 ts=2 et diff --git a/syntax/godoc.vim b/syntax/godoc.vim deleted file mode 100644 index 0fba208..0000000 --- a/syntax/godoc.vim +++ /dev/null @@ -1,47 +0,0 @@ -" Copyright 2011 The Go Authors. All rights reserved. -" Use of this source code is governed by a BSD-style -" license that can be found in the LICENSE file. - -if exists("b:current_syntax") - finish -endif - -syn case match - -syn match godocTitle "^\([A-Z][A-Z ]*\)$" -hi def link godocTitle Title - -" Single Line Definitions -syn match godocMethodRec /\i\+\ze)/ contained -syn match godocMethodName /) \zs\i\+\ze(/ contained -syn match godocMethod /^func \((\i\+ [^)]*)\) \i\+(/ contains=godocMethodRec,godocMethodName -syn match godocFunction /^func \zs\i\+\ze(/ - -syn match godocType /^type \zs\i\+\ze.*/ -syn match godocVar /^var \zs\i\+\ze.*/ -syn match godocConst /^const \zs\i\+\ze.*/ - -hi def link godocMethodRec Type -hi def link godocType Type -hi def link godocMethodName Function -hi def link godocFunction Function -hi def link godocVar Identifier -hi def link godocConst Identifier - -" Definition Blocks -syn region godocComment start="/\*" end="\*/" contained -syn region godocComment start="//" end="$" contained -syn match godocDefinition /^\s\+\i\+/ contained - -syn region godocVarBlock start=/^var (/ end=/^)/ contains=godocComment,godocDefinition -syn region godocConstBlock start=/^const (/ end=/^)/ contains=godocComment,godocDefinition -syn region godocTypeBlock start=/^type \i\+ \(interface\|struct\) {/ end=/^}/ matchgroup=godocType contains=godocComment,godocType - -hi def link godocComment Comment -hi def link godocDefinition Identifier - -syn sync minlines=500 - -let b:current_syntax = "godoc" - -" vim:ts=4 sts=2 sw=2: diff --git a/syntax/gohtmltmpl.vim b/syntax/gohtmltmpl.vim index 5aa6c98..fd2612a 100644 --- a/syntax/gohtmltmpl.vim +++ b/syntax/gohtmltmpl.vim @@ -1,9 +1,9 @@ if exists("b:current_syntax") - finish + finish endif -if !exists("main_syntax") - let main_syntax = 'html' +if !exists("g:main_syntax") + let g:main_syntax = 'html' endif runtime! syntax/gotexttmpl.vim @@ -12,4 +12,4 @@ unlet b:current_syntax let b:current_syntax = "gohtmltmpl" -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/syntax/gotexttmpl.vim b/syntax/gotexttmpl.vim index f8f4e68..ab8b1b6 100644 --- a/syntax/gotexttmpl.vim +++ b/syntax/gotexttmpl.vim @@ -6,7 +6,7 @@ " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") - finish + finish endif syn case match @@ -74,12 +74,12 @@ hi def link goTplVariable Special syn region gotplAction start="{{" end="}}" contains=@gotplLiteral,gotplControl,gotplFunctions,gotplVariable,goTplIdentifier display syn region gotplAction start="\[\[" end="\]\]" contains=@gotplLiteral,gotplControl,gotplFunctions,gotplVariable display -syn region goTplComment start="{{/\*" end="\*/}}" display -syn region goTplComment start="\[\[/\*" end="\*/\]\]" display +syn region goTplComment start="{{\(- \)\?/\*" end="\*/\( -\)\?}}" display +syn region goTplComment start="\[\[\(- \)\?/\*" end="\*/\( -\)\?\]\]" display hi def link gotplAction PreProc hi def link goTplComment Comment let b:current_syntax = "gotexttmpl" -" vim:ts=4:sw=4:et +" vim: sw=2 ts=2 et diff --git a/syntax/vimgo.vim b/syntax/vimgo.vim index d62791d..3a2204c 100644 --- a/syntax/vimgo.vim +++ b/syntax/vimgo.vim @@ -1,5 +1,5 @@ if exists("b:current_syntax") - finish + finish endif let b:current_syntax = "vimgo" @@ -9,3 +9,5 @@ syn region goTitle start="\%1l" end=":" hi def link goInterface Type hi def link goTitle Label + +" vim: sw=2 ts=2 et diff --git a/templates/hello_world.go b/templates/hello_world.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/templates/hello_world.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/templates/hello_world_test.go b/templates/hello_world_test.go new file mode 100644 index 0000000..3ef4f52 --- /dev/null +++ b/templates/hello_world_test.go @@ -0,0 +1,7 @@ +package main + +import "testing" + +func TestHelloWorld(t *testing.T) { + // t.Fatal("not implemented") +} diff --git a/test/gopath_test.vim b/test/gopath_test.vim new file mode 100644 index 0000000..fef9d50 --- /dev/null +++ b/test/gopath_test.vim @@ -0,0 +1,55 @@ +fun! Test_Detect_Gopath() abort + let l:gopath = $GOPATH + try + let g:go_autodetect_gopath = 1 + let l:tmp = go#util#tempdir("pathdetect") + let l:tmp2 = go#util#tempdir("pathdetect-nogodep") + + call mkdir(l:tmp . '/subdir', 'p') + call mkdir(l:tmp . '/Godeps/_workspace', 'p') + + exe ':e ' . l:tmp . '/a.go' + call assert_equal(l:tmp . '/Godeps/_workspace:' . l:gopath, $GOPATH) + + exe ':e ' . l:tmp . '/not-a-go-file' + call assert_equal(l:gopath, $GOPATH) + + exe ':e ' . l:tmp . '/subdir/a.go' + call assert_equal(l:tmp . '/Godeps/_workspace:' . l:gopath, $GOPATH) + + exec ':e ' . l:tmp2 . '/a.go' + call assert_equal(l:gopath, $GOPATH) + finally + let g:go_autodetect_gopath = 0 + call delete(l:tmp, 'rf') + call delete(l:tmp2, 'rf') + endtry +endfun + +fun! Test_Detect_Gopath_disabled() abort + let l:gopath = $GOPATH + try + let g:go_autodetect_gopath = 0 + let l:tmp = go#util#tempdir("pathdetect") + let l:tmp2 = go#util#tempdir("pathdetect-nogodep") + + call mkdir(l:tmp . '/subdir', 'p') + call mkdir(l:tmp . '/Godeps/_workspace', 'p') + + exe ':e ' . l:tmp . '/a.go' + call assert_equal(l:gopath, $GOPATH) + + exe ':e ' . l:tmp . '/not-a-go-file' + call assert_equal(l:gopath, $GOPATH) + + exe ':e ' . l:tmp . '/subdir/a.go' + call assert_equal(l:gopath, $GOPATH) + + exec ':e ' . l:tmp2 . '/a.go' + call assert_equal(l:gopath, $GOPATH) + finally + let g:go_autodetect_gopath = 0 + call delete(l:tmp, 'rf') + call delete(l:tmp2, 'rf') + endtry +endfun

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 z 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≺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 z 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