378 lines
10 KiB
Markdown
378 lines
10 KiB
Markdown
|
# deoplete-go
|
||
|
|
||
|
|| **Status** |
|
||
|
|:---:|:---:|
|
||
|
| **Travis CI** |[![Build Status](https://travis-ci.org/zchee/deoplete-go.svg?branch=master)](https://travis-ci.org/zchee/deoplete-go)|
|
||
|
| **Gitter** |[![Join the chat at https://gitter.im/zchee/deoplete-go](https://badges.gitter.im/zchee/deoplete-go.svg)](https://gitter.im/zchee/deoplete-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)|
|
||
|
|
||
|
Go source for [deoplete.nvim](https://github.com/Shougo/deoplete.nvim) use [gocode](https://github.com/stamblerre/gocode).
|
||
|
|
||
|
## Overview
|
||
|
Asynchronous Go completion for Neovim/Vim8.
|
||
|
Use,
|
||
|
|
||
|
### deoplete.nvim
|
||
|
[Shougo/deoplete.nvim](https://github.com/Shougo/deoplete.nvim)
|
||
|
|
||
|
Dark powered asynchronous completion framework for neovim/Vim8.
|
||
|
Fastetst, Fully asynchronous, Nonblocking user interface, Customizable source
|
||
|
for each languages, and more. The Nextgen word completion.
|
||
|
|
||
|
### gocode
|
||
|
[stamblerre/gocode](https://github.com/stamblerre/gocode)
|
||
|
|
||
|
An autocompletion daemon for the Go programming language.
|
||
|
Fastest, Context-sensitive, Server/Client architecture, Result caching.
|
||
|
The *de facto* standard completion engine.
|
||
|
|
||
|
Note: Another gocode is avaiable.
|
||
|
It seems faster?
|
||
|
|
||
|
https://github.com/visualfc/gocode
|
||
|
|
||
|
---
|
||
|
|
||
|
## Required
|
||
|
|
||
|
### deoplete.nvim
|
||
|
https://github.com/Shougo/deoplete.nvim
|
||
|
|
||
|
### gocode
|
||
|
https://github.com/stamblerre/gocode
|
||
|
|
||
|
---
|
||
|
|
||
|
## How to install
|
||
|
|
||
|
### 1. Install Neovim or Vim8
|
||
|
For neovim, see Neovim wiki.
|
||
|
|
||
|
- [Installing Neovim](https://github.com/neovim/neovim/wiki/Installing-Neovim)
|
||
|
- [Following HEAD](https://github.com/neovim/neovim/wiki/Following-HEAD)
|
||
|
- [Building](https://github.com/neovim/neovim/wiki/Building-Neovim)
|
||
|
|
||
|
### 2. Install deoplete
|
||
|
See https://github.com/Shougo/deoplete.nvim
|
||
|
|
||
|
### 3. Install latest of gocode
|
||
|
|
||
|
```bash
|
||
|
go get -u github.com/stamblerre/gocode
|
||
|
```
|
||
|
|
||
|
### 4. Install plugin and Build ujson module
|
||
|
`deoplete-go` using [esnme/ultrajson](https://github.com/esnme/ultrajson) json module.
|
||
|
It's Python bindings for C library. Need compiling.
|
||
|
So, If you use Plugin manager supported build process, set `make` commmand.
|
||
|
|
||
|
```vim
|
||
|
" dein.vim
|
||
|
call dein#add('Shougo/deoplete.nvim')
|
||
|
call dein#add('deoplete-plugins/deoplete-go', {'build': 'make'})
|
||
|
|
||
|
" NeoBundle
|
||
|
NeoBundle 'Shougo/deoplete.nvim'
|
||
|
NeoBundle 'deoplete-plugins/deoplete-go', {'build': {'unix': 'make'}}
|
||
|
|
||
|
" vim-plug
|
||
|
Plug 'Shougo/deoplete.nvim'
|
||
|
Plug 'deoplete-plugins/deoplete-go', { 'do': 'make'}
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
## Available Settings
|
||
|
|
||
|
| Setting value | Default | Required |
|
||
|
|:---------------------------------------: |:-------:|:-------------:|
|
||
|
| `g:deoplete#sources#go#gocode_binary` | `''` | **Recommend** |
|
||
|
| `g:deoplete#sources#go#package_dot` | `0` | No |
|
||
|
| `g:deoplete#sources#go#sort_class` | `[]` | **Recommend** |
|
||
|
| `g:deoplete#sources#go#cgo` | `0` | *Any* |
|
||
|
| `g:deoplete#sources#go#goos` | `''` | No |
|
||
|
| `g:deoplete#sources#go#source_importer` | `0` | No |
|
||
|
| `g:deoplete#sources#go#builtin_objects` | `0` | No |
|
||
|
| `g:deoplete#sources#go#unimported_packages` | `0` | No |
|
||
|
| `g:deoplete#sources#go#fallback_to_source ` | `0` | No |
|
||
|
|
||
|
### `g:deoplete#sources#go#gocode_binary`
|
||
|
#### `gocode` Binary
|
||
|
|
||
|
| **Default** | `''` |
|
||
|
|--------------|-------------------------|
|
||
|
| **Required** | **Recommend** |
|
||
|
| **Type** | string |
|
||
|
| **Example** | `$GOPATH.'/bin/gocode'` |
|
||
|
|
||
|
`deoplete-go` will directly call `gocode`. Not vim bypass due to the omnifunc.
|
||
|
By default (not set), Find the gocode binary in `$PATH` environment.
|
||
|
This setting is **Recommend**.
|
||
|
If you set it, `deoplete-go` spared look for the binary. It will improve performance.
|
||
|
|
||
|
Also, If you want to use a different from the first found `gocode` binary from `$PATH` then set:
|
||
|
```vim
|
||
|
let g:deoplete#sources#go#gocode_binary = '/path/to/gocode'
|
||
|
```
|
||
|
|
||
|
### `g:deoplete#sources#go#package_dot`
|
||
|
#### Automatically insert dot after package name
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-----|
|
||
|
| **Required** | No |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
Automatically insert dot (period) when you select `package` name in popup menu.
|
||
|
By default, no dot (period) is inserted after a package name.
|
||
|
|
||
|
If you would prefer adding a period then set:
|
||
|
```vim
|
||
|
let g:deoplete#sources#go#package_dot = 1
|
||
|
```
|
||
|
|
||
|
### `g:deoplete#sources#go#sort_class`
|
||
|
#### Class Sorting and Ignore
|
||
|
|
||
|
| **Default** | `[]` |
|
||
|
|--------------|--------------------|
|
||
|
| **Required** | **Recommend** |
|
||
|
| **Type** | list |
|
||
|
| **Example** | See bellow exmaple |
|
||
|
|
||
|
By default, the completion word list is in the sort order of gocode. Same as
|
||
|
omnifunc. If you want to change it to an arbitrary order, set it.
|
||
|
|
||
|
Available values are [`package`, `func`, `type`, `var`, `const`].
|
||
|
If you did not include any value, it will always be hidden in the completion
|
||
|
list.
|
||
|
|
||
|
To display all words while sorting, set:
|
||
|
```vim
|
||
|
let g:deoplete#sources#go#sort_class = ['package', 'func', 'type', 'var', 'const']
|
||
|
```
|
||
|
|
||
|
### `g:deoplete#sources#go#pointer`
|
||
|
#### Support pointer match
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-------|
|
||
|
| **Required** | *Any* |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
Support pointer (`*`) match.
|
||
|
Example are bellow code. `|` is cursor.
|
||
|
|
||
|
```go
|
||
|
type Foo struct {
|
||
|
FooName string
|
||
|
}
|
||
|
|
||
|
func NewFoo() *Foo {
|
||
|
return &Foo{}
|
||
|
}
|
||
|
|
||
|
func (f *|
|
||
|
```
|
||
|
|
||
|
### `g:deoplete#sources#go#cgo`
|
||
|
#### cgo complete use libclang-python3
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-------|
|
||
|
| **Required** | *Any* |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
If current buffer has `import "C"` also `#include <foo.h>` and when you type
|
||
|
`C.`, deoplete-go will display the C function in the `foo.h`.
|
||
|
|
||
|
Simple example is below. `|` is cursor.
|
||
|
|
||
|
```go
|
||
|
package main
|
||
|
|
||
|
/*
|
||
|
#include <stdlib.h>
|
||
|
*/
|
||
|
import "C"
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
fmt.Printf()
|
||
|
C.|
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Will return the `pid_t`, `malloc`, `free` and more.
|
||
|
|
||
|
The real example uses libgit2.
|
||
|
|
||
|
```go
|
||
|
package main
|
||
|
|
||
|
/*
|
||
|
#include <git2.h>
|
||
|
*/
|
||
|
import "C"
|
||
|
import (
|
||
|
"log"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
|
||
|
"github.com/libgit2/git2go"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
repoPath := filepath.Join(os.Getenv("GOPATH"), "src/github.com/libgit2/git2go")
|
||
|
gitRepo, err := git.OpenRepository(repoPath)
|
||
|
|
||
|
C.git_blame_|
|
||
|
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
commitOid, err := gitRepo.Head()
|
||
|
if err != nil {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Will return that completion list.
|
||
|
|
||
|
![cgo_libgit2](images/cgo_libgit2.png)
|
||
|
|
||
|
Now support current buffer only.
|
||
|
TODO: Support parses `.c`, `.h` file.
|
||
|
|
||
|
### `g:deoplete#sources#go#cgo#libclang_path`
|
||
|
#### libclang shared library path for cgo complete
|
||
|
|
||
|
| **Default** | ` ` |
|
||
|
|--------------|--------------------------------|
|
||
|
| **Required** | *Any* |
|
||
|
| **Type** | string |
|
||
|
| **Example** | `/opt/llvm/lib/libclang.dylib` |
|
||
|
|
||
|
libclang shared library path option.
|
||
|
In darwin, `libclang.dylib`, In Linux, `libclang.so`.
|
||
|
|
||
|
### `g:deoplete#sources#go#cgo#std`
|
||
|
#### C language standard version
|
||
|
|
||
|
| **Default** | `c11` |
|
||
|
|--------------|--------|
|
||
|
| **Required** | *Any* |
|
||
|
| **Type** | string |
|
||
|
| **Example** | `c99` |
|
||
|
|
||
|
C language standard version option.
|
||
|
If not set, deoplete-go uses `c11`(latest) version.
|
||
|
|
||
|
### `g:deoplete#sources#go#auto_goos`
|
||
|
#### Automatically set GOOS environment variable when calling `gocode`
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|---------|
|
||
|
| **Required** | No |
|
||
|
| **Type** | boolean |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
When enabled, deoplete-go will try to set `GOOS` by checking the file name for
|
||
|
`name_<OS>.go`. If not found, the file will be checked for a `// +build <OS>`
|
||
|
directive. If the file's OS doesn't match your OS (e.g. `file_darwin.go`
|
||
|
while on `linux`), `CGO_ENABLED=0` will also be set.
|
||
|
|
||
|
**Note:** There may be a 5-10 second delay if `gocode` needs to compile the
|
||
|
platform-specific sources for the first time.
|
||
|
|
||
|
### `g:deoplete#sources#go#source_importer`
|
||
|
#### Enable source importer
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-----|
|
||
|
| **Required** | No |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
When enabled, deoplete-go can complete external packages.
|
||
|
|
||
|
It is deprecated option. You should use the latest gocode.
|
||
|
https://github.com/mdempsky/gocode/pull/71
|
||
|
|
||
|
### `g:deoplete#sources#go#builtin_objects`
|
||
|
#### Propose builtin objects
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-----|
|
||
|
| **Required** | No |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
When enabled, deoplete-go can complete builtin objects.
|
||
|
|
||
|
### `g:deoplete#sources#go#unimported_packages`
|
||
|
#### Propose completions for unimported standard library packages
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-----|
|
||
|
| **Required** | No |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
When enabled, deoplete-go can complete standard library packages that are
|
||
|
not explicitely imported yet.
|
||
|
|
||
|
### `g:deoplete#sources#go#fallback_to_source`
|
||
|
#### Scan source files when a dependency is not found on the GOPATH
|
||
|
|
||
|
| **Default** | `0` |
|
||
|
|--------------|-----|
|
||
|
| **Required** | No |
|
||
|
| **Type** | int |
|
||
|
| **Example** | `1` |
|
||
|
|
||
|
When enabled, deoplete-go will try the source importer when it fails
|
||
|
to find a dependency on the GOPATH.
|
||
|
|
||
|
---
|
||
|
|
||
|
## Sample init.vim
|
||
|
|
||
|
```vim
|
||
|
" neocomplete like
|
||
|
set completeopt+=noinsert
|
||
|
" deoplete.nvim recommend
|
||
|
set completeopt+=noselect
|
||
|
|
||
|
" Path to python interpreter for neovim
|
||
|
let g:python3_host_prog = '/path/to/python3'
|
||
|
" Skip the check of neovim module
|
||
|
let g:python3_host_skip_check = 1
|
||
|
|
||
|
" Run deoplete.nvim automatically
|
||
|
let g:deoplete#enable_at_startup = 1
|
||
|
" deoplete-go settings
|
||
|
let g:deoplete#sources#go#gocode_binary = $GOPATH.'/bin/gocode'
|
||
|
let g:deoplete#sources#go#sort_class = ['package', 'func', 'type', 'var', 'const']
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
TODO:
|
||
|
-----
|
||
|
- [x] Parse included cgo (C, C++ language) headers on current buffer
|
||
|
- `ctags` will be blocking `deoplete.nvim`
|
||
|
- [x] Support static json caching
|
||
|
- See https://github.com/deoplete-plugins/deoplete-go/pull/19
|
||
|
- [x] Support Go stdlib package `import "***"` name completion
|
||
|
- This feature has been implemented in gocode. Thanks @nhooyr!
|
||
|
- [x] Execute `gocode` binary instead of call vim function
|
||
|
- [x] Get and parse completion list of json format. such as `ycm`
|
||
|
- [x] When there is no candidate infomation, deoplete will cause an error
|
||
|
- [x] Support fizzy matching
|