Closed jm33-m0 closed 2 years ago
Do you see this always or only sometime? Others have reported this, but I've been unable to find a way to duplicate it.
I can reproduce this on a Ubuntu VM (go installed via snap) reliably, but on other machines it's fine.
If I comment out this command, the error will disappear. It's weird that I was unable to invoke GoKeyify
even when working in GOPATH
https://github.com/fatih/vim-go/blob/8dfedede1c6e27e4339411b1071fee6a40663f11/ftplugin/go/commands.vim#L106
If you can duplicate this reliably, then we may be able to get to the bottom of it.
Can you open a shell in the directory that contains the file that you have open when you see this and provide the output of go list
with GO111MODULE
set to off
?
Here's a screenshot, with provided init.vim
Can you try this with https://github.com/fatih/vim-go/pull/3352 and let me know what message it gives you?
I replaced package.vim
with the one you modified, there was no error message
vim-go: initialized gopls
vim-go: Finished loading packages.
Press ENTER or type command to continue
That's odd. The only difference is that I wrapped the offending line in a try/catch
and output the go list
result when an exception was thrown 🤔
Maybe it caught something but didn't print the message?
I don't see how that would be possible in this instance
Are you still experiencing this issue or should we close this issue?
On that Ubuntu VM, yes.
Ok, then if we're going to get to the bottom of this, then we'll need that output on the Ubuntu VM from the branch I referenced earlier. If it can't reproduce on that branch, then I suspect something else is amiss and will need the package.vim
file from that Ubuntu VM when your error message does reproduce.
Here it is, no modifications made, throws error reliably
Given the error you're seeing:
Error detected while processing function go#package#InGOPATH:
line 15:
E684: list index out of range: 0
Error detected while processing /home/u/.dein/repos/github.com/fatih/vim-go/ftplugin/go/commands.vim:
line 106:
E171: Missing :endif
line 15 in the file you provided is let l:importpath = split(l:out, '\n')[0]
.
But if that's the case, then the PR I linked earlier, https://github.com/fatih/vim-go/pull/3352, should output the go list
output and exit code in the output of :messages
after when you're normally seeing this error. If it's not, then can you put call go#util#EchoError(printf('go list in %s returned [%s, %d]', expand('%:p:h'), l:out, l:err))
on the line before let l:importpath = split(l:out, '\n')[0]
in go#package#InGOPATH
? In that case you should see in the output of :messages
both the go list
output and exit code and the error you've been seeing.
It gives me this: [, 0]
vim-go: initializing gopls
vim-go: go list in /home/u/emp3r0r/core/lib/agent returned [, 0]
Error detected while processing function go#package#InGOPATH:
line 16:
E684: list index out of range: 0
Error detected while processing /home/u/.dein/repos/github.com/fatih/vim-go/ftplugin/go/commands.vim:
line 106:
E171: Missing :endif
That's odd. Can you put
let [l:out, l:err] = go#util#ExecInDir(['env'])
call go#util#EchoInfo(printf("env => \n%s", l:out))
between these two lines in go#package#InGOPATH
:
let Restore_modules = go#util#SetEnv('GO111MODULE', 'off')
let [l:out, l:err] = go#util#ExecInDir(['go', 'list'])
and let me know the output?
It shows output from env
, the same as manually executing env
in that directory
I couldn't find a way to copy the output of :message
as it's too long (it's a shame that vim/nvim doesn't even provide a way to redirect command output to a file)
If you are interested in specific environment variables, I can paste them here
I'd like to know what GO111MODULE
is in that output.
It's off
:
vim-go: GO111MODULE=off
Here's output of go env
, seems GO111MODULE
has a default value, instead of off
❯ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/u/.cache/go-build"
GOENV="/home/u/.config/go/env"
GOEXE=""
...
Okay, I just noticed this line sets GO111MODULE
to off
, I don't understand why it does that, though
let Restore_modules = go#util#SetEnv('GO111MODULE', 'off')
The comment above the line explains why: https://github.com/fatih/vim-go/blob/master/autoload/go/package.vim#L146-L147
I'm not sure if it has anything to do with this, but I noticed some oddities about your environment variables where things like GOPATH
and GOCACHE
directly below are /home/u
(e.g. /home/u/go
and /home/go/.cache
, respectively), but your home directory looks like it's probably /home/u/emp3r0r
. I wonder if Go perhaps doesn't have access to those other directories or if the odd configuration causes some kind of problem?
but your home directory looks like it's probably
/home/u/emp3r0r
No, it's /home/u
, /home/u/emp3r0r
is a Go project that's stored under home directory
I wonder if Go perhaps doesn't have access to those other directories
go
is installed from snap as a "classic" package that has access to full file system, it shouldn't be a problem for go
to access any files
The only other thing that comes to mind is I wonder if vim-go is using a different go
binary than you expect. Can you search your system and see if there are multiple go
binaries? If there are, then I'd be interested to know the location of each, what your $PATH
is, and what Go version each is.
I found only one go
binary:
u in ubuntu in ~
❯ echo $PATH
/home/u/bin:/home/u/.local/bin:/home/u/bin:/home/u/.pyenv/shims:/home/u/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/u/go/bin
u in ubuntu in ~
❯ whereis go
go: /snap/bin/go /snap/bin/go.gofmt
u in ubuntu in ~
❯ which go
/snap/bin/go
u in ubuntu in ~
❯ /snap/bin/go version
go version go1.17.6 linux/amd64
I tried to execute go version
in package.vim
, with
let [l:out, l:err] = go#util#ExecInDir(['go', 'version'])
call go#util#EchoInfo(printf("go version => \n%s\n%s", l:out, l:err))
and I got:
vim-go: initializing gopls
vim-go: go version =>
vim-go:
vim-go: 0
vim-go: go list in /home/u/emp3r0r/core/lib/agent returned [, 0]
If I execute which go
in package.vim
, it returns /snap/bin/go
, while go blah
returns nothing, neither does /snap/bin/go blah
.
And l:err
is always 0
Instead of whereis
, can you try find
(e.g. find / -name 'go' -type f
)?
It's interesting that go version
didn't provide any output either. That points to something wrong with your system, but I'm not sure what it would be. Why would go version
work when you run it from the commandline, but not when executed from Vim? Does go env
work when you run it from within Vim similarly to how you tried go version
?
Instead of whereis, can you try find (e.g. find / -name 'go' -type f)?
Seriously I didn't install any other versions of Go
Why would go version work when you run it from the commandline, but not when executed from Vim
We can't say it didn't work, because when I go -vvv
from vim, it returns 2
, and go version
returns 0
I wonder if it's because nvim
is also a snap package... There seems to be some mess since they are both sym links to /usr/bin/snap
We can't say it didn't work, because when I go -vvv from vim, it returns 2, and go version returns 0
Did you do that by calling go#util#ExecInDir
?
I wonder if it's because nvim is also a snap package... There seems to be some mess since they are both sym links to /usr/bin/snap
Now that's interesting. It wouldn't be that they're both symlinks, but I wouldn't be surprised if snap packages (or symlinks more generally) cause some kind of issues.
Did you do that by calling go#util#ExecInDir?
Yes, I did that in package.vim
I will install another go version in GOPATH
to see if that makes any difference
Is your source code in a symlinked directory?
Can you try #3361 before you try using a different version of Go - I'm pretty sure this isn't related to the version of Go that you're using.
No, the source code is not symlinked, and no matter where I put it, the error persists.
I have tried #3361, it was the same error as before.
However, installing a different Go (that is not a snap) worked.
I installed Go 1.17.7 with go install golang.org/dl/go1.17.7@latest
, and ln go1.17.7 go
, with the hard linked go
, I got:
vim-go: exec =>
vim-go: go version go1.17.7 linux/amd64
vim-go:
vim-go: 0
vim-go: go list in /home/u/emp3r0r/core/lib/agent returned [_/home/u/emp3r0r/core/lib/agent
vim-go: , 0]
vim-go: initializing gopls
vim-go: initialized gopls
vim-go: Finished loading packages.
So it's probably something wrong with the snap package
Yeah, that's very interesting. I wonder if there's something I can do to make it work with vim-go. In any case, I'm glad we got to the bottom of it. Thank you for taking the time to stick with me through all the analysis.
It seems to be a snap problem, I will test on a fresh VM later, hopefully I can figure out something.
This is probably due to the go binary being a link to /usr/bin/snap which confuses... something.
With Ubuntu 22.04 and golang installed as snap I fixed this by adding the following to init.vim
let $PATH = '/snap/go/current/bin:' .. $PATH
What did you do? (required: The issue will be closed when not provided)
Open a Go file with code in it
What did you expect to happen?
There shouldn't be errors in
:messages
What happened instead?
On loading, I see
commands.vim
throws exceptions:Configuration (MUST fill this out):
vim-go version:
vimrc
you used to reproduce:vimrc
```vim "dein Scripts----------------------------- if &compatible set nocompatible " Be iMproved endif " Required: set runtimepath+=~/.dein/repos/github.com/Shougo/dein.vim " Required: call dein#begin('~/.dein') " Let dein manage dein " Required: call dein#add('~/.dein/repos/github.com/Shougo/dein.vim') " dein call dein#add('wsdjeg/dein-ui.vim') call dein#add('haya14busa/dein-command.vim') " Autocomplete call dein#add('Shougo/deoplete.nvim') if !has('nvim') call dein#add('roxma/nvim-yarp') call dein#add('roxma/vim-hug-neovim-rpc') endif let g:deoplete#enable_at_startup = 1 call dein#add('Shougo/neosnippet.vim') call dein#add('Shougo/neosnippet-snippets') call dein#add('ncm2/float-preview.nvim') " preview in floating window " " tabnine " if has('win32') || has('win64') " call dein#add('tbodt/deoplete-tabnine', { 'build': 'powershell.exe .\install.ps1' }) " else " call dein#add('tbodt/deoplete-tabnine', { 'build': './install.sh' }) " endif " Golang call dein#add('fatih/vim-go', {'on_ft': 'go'}) " Required: call dein#end() " Required: filetype plugin indent on syntax enable " " If you want to install not installed plugins on startup. if dein#check_install() call dein#install() endif "End dein Scripts------------------------- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " ==>> vim-go """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let g:go_metalinter_command = 'golangci-lint' let g:go_rename_command = 'gopls' let g:go_def_mode='gopls' let g:go_info_mode='gopls' let g:go_fmt_command = 'gopls' let g:go_doc_keywordprg_enabled = 0 let g:go_gocode_autobuild = 1 let g:go_gocode_unimported_packages = 1 let g:go_go_code_completion_enabled = 0 let g:go_highlight_operators = 1 let g:go_highlight_extra_types = 1 let g:go_highlight_build_constraints = 1 let g:go_highlight_types = 1 let g:go_highlight_fields = 1 let g:go_highlight_functions = 1 let g:go_highlight_function_parameters = 1 let g:go_highlight_function_calls = 1 let g:go_highlight_format_strings = 1 let g:go_highlight_methods = 1 set autowrite " popup window for GoDoc let g:go_doc_popup_window = 1 ```Vim version (first three lines from
:version
):Go version (
go version
):Go environment
go env
Output:gopls version
gopls version
Output: