vim进行golang开发

下面vim插件安装都基于vim8之后的native package manager,低版本的vim,需要借助一些第三方的package manager,如vundle、vim-plugin等。

主要通过vim-go和coc.nvim插件实现。其中vim-go提供golang的基础支持,包括build,run,syntax highlighting, symbol/declaration,代码补全等。coc.nvim主要提供代码补全功能。

vim-go通过Language Server Protocol (LSP)与Language Server通信,以实现代码补全等功能。Language Server Protocol是微软提出的一个协议,用于IDE和Language Server之间进行通信的协议,可以使得Language Server供不同的IDE复用。而gopls是vim-go默认的Language Server。

gopls实现的代码补全,在insert模式下,通过ctl+x ctl+p呼出,通过ctl+n, ctl+p 切换。

coc.nvim完全支持LSP 3.16,支持多种语言,且支持额外的插件增强。coc克通过gopls协作提供代码补全等,也可以和其它Language Server协作。

关于LSP,可以参考下面链接:
Language Server Protocol

vim-go通过gopls提供代码补全。

gtags待探索

vim-go安装配置

vim-go为vim增加golang支持,包括build,run,syntax highlighting, symbol/declaration,代码补全等。

代码补全通过gopls实现,内置默认的代码补全功能。

安装升级vim 8

vim-go要求的vim最低版本为 8.1.2269,版本低的话可以手动升级,建议源码编译安装。

  • 安装:

    # 下载对应的tag
    https://github.com/vim/vim/tags
    
    # 编译安装
    make
    make install

安装vim-go

vim8之前通常需要借助第三方的plugin管理器如vundle管理plugin。从vim8可以通过package的方式原生支持plugin。安装卸载插件非常简单。

  • 安装:
    下载最新develop版本,或者下载稳定的Release版本,放置到vim的plugin目录下即可

    # develop版本
    git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go
    
    # release版本
    https://github.com/fatih/vim-go/releases
  • 卸载:

    rm -rf ~/.vim/pack/plugins/start/vim-go
  • 安装vim-go依赖的二进制程序

    vim
    :GoInstallBinaries
    
    # 会自动通过github下载需要的二进制程序
    # 放置到$GOBIN or $GOPATH/bin, 默认 $HOME/go/bin
    ......
    github.com/klauspost/asmfmt/cmd/asmfmt@latest to folder /home/gpadmin/go/bin/
    vim-go: installing finished!
  • 升级vim-go和依赖的二进制程序

    :GoUpdateBinaries
  • 配置vimrc

    vi ~/.vimrc
    filetype plugin indent on

使用vim-go

参考doc/vim-go.txt或者vim中的帮助:help vim-go(需要先:helptags ALL)

官方Tutorial内容有些过时了,有问题首选参考vim-go.txt。

  • Navigate:

    功能命令快捷键
    go to defination:GoDefgd / ctrl-]
    go back:GoDefPopctrl-t
    显示jumpstack:GoDefStack-
    清理jumpstack:GoDefStackClear-

详细见:

~/.vim/pack/plugins/start/vim-go/ftplugin/go.vim
如
 nnoremap <buffer> <silent> gd :GoDef<cr>

trouble-shooting

  • 粘贴代码缩进问题:
    现象:vimrc中配置'filetype plugin indent on'后,vim中粘贴代码出现错误的缩进。
    办法:使用:paste模式粘贴

     1. :set paste
     2. 进入insert模式粘贴代码
     3. :set nopaste

参考资料

trouble-shooting

coc.nvim安装配置

主要介绍coc.nvim安装配置。依赖nodejs,需要首先安装nodejs

nodejs安装

以下主要通过dnf从centos的default appstream中安装。也可以通过源码安装。

  • 查看nodejs的stream:

    sudo dnf module list nodejs
  • nodejs版本
    显示[d]的为默认版本,由于coc.nvim要求nodejs版本> 14.14,需要进行配置。

    Name     Stream  Profiles                               Summary
    nodejs   10 [d]  common [d], development, minimal, s2i  Javascript runtime
    nodejs   12      common [d], development, minimal, s2i  Javascript runtime
    nodejs   14      common [d], development, minimal, s2i  Javascript runtime
    nodejs   16      common [d], development, minimal, s2i  Javascript runtime
  • 切换nodejs版本

    dnf module enable nodejs:16
  • 检查nodejs版本

    Name     Stream  Profiles                               Summary
    nodejs   10 [d]  common [d], development, minimal, s2i  Javascript runtime
    nodejs   12      common [d], development, minimal, s2i  Javascript runtime
    nodejs   14      common [d], development, minimal, s2i  Javascript runtime
    nodejs   16 [e]  common [d], development, minimal, s2i  Javascript runtime
  • 安装nodejs

    dnf install nodejs
  • 检查nodejs版本

    [root@dw1-cn ~]# node --version
    v16.13.1
    [root@dw1-cn ~]# npm --version
    8.1.2
  • 参考资料
    How To Install Node.js on CentOS 8

coc.nvim安装

vim8之后,可以通过native的package manager安装plugin。

  • 安装coc.nvim

    mkdir -p ~/.vim/pack/coc/start
    cd ~/.vim/pack/coc/start
    git clone --branch release https://github.com/neoclide/coc.nvim.git --depth=1
    vim -c "helptags coc.nvim/doc/ | q"
  • 安装go插件
    // 插件并非必须,是一种增强
    // coc-html coc-css coc-json并非必须
    参照Using coc extensions

    vim -c 'CocInstall -sync coc-go coc-html coc-css coc-json|q'
  • 配置coc

    vi ~/.vim/coc-settings.json
    : CocConfig 

配置说明
// diagnostic.errorSign Vim sign column中显示的错误时的图标
// coc.preferences.formatOnSaveFiletypes配置save时自动format
// staticcheck": true 设置静态检查

{
  "suggest.noselect": false,
  "diagnostic.errorSign": "✘",
  "diagnostic.warningSign": "!",
  "diagnostic.infoSign": "?",
  "diagnostic.checkCurrentLine": true,
  "coc.preferences.formatOnSaveFiletypes": [
    "javascript",
    "html",
    "json",
    "css",
    "scss",
    "go"
  ],
  "coc.preferences.hoverTarget": "float",
  "languageserver": {
    "golang": {
      "command": "gopls",
      "rootPatterns": ["go.mod"],
      "filetypes": ["go"]
    }
  },
  "go.goplsOptions": {
    "staticcheck": true
  }
}

vimrc配置

""""""""""""""""""""""""""""""""""" coc.nvim begin
" Having longer updatetime (default is 4000 ms = 4s) leads to noticeable
" delays and poor user experience
set updatetime=300

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved
set signcolumn=yes

" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" GoTo code navigation
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" Highlight the symbol and its references when holding the cursor
autocmd CursorHold * silent call CocActionAsync('highlight')

" Symbol renaming
nmap <leader>rn <Plug>(coc-rename)

" Highlight the symbol and its references when holding the cursor
autocmd CursorHold * silent call CocActionAsync('highlight')
""""""""""""""""""""""""""""""""""" coc.nvim end

参照
vimrc配置

coc.nvim使用

  • 代码补全

    insert模式下
    代码补全自动弹出,选择<Ctrl-n>,<Ctrl-p>,确定Enter

    image.png

  • Vim sign column

    显示warning等,cursor移动到该行,显示具体信息

    image.png

  • 跳转

    移动cursor
    gd:跳转到定义
    gr:弹出references,上下箭头切换,esc退出
    gy:跳转type定义,如常量对应的type定义
    gi:跳转到实现,如接口的实现
  • 跳转到对应的文档

    移动cursor
    K
  • rename

    移动cursor
    \rn 输入新名字
  • 参考资料:
    Quick Start
    Install coc.nvim
    How to set up Vim for Go Development
    Using Vim for Go Development

nerdtree安装配置

nerdtree提供类似于IDE中的文件树状浏览功能

nerdtree安装

git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/vendor/start/nerdtree
vim -u NONE -c "helptags ~/.vim/pack/vendor/start/nerdtree/doc" -c q
:NERDTree
?

nerdtree


黑暗森林
12 声望2 粉丝

弱小和无知不是生存的障碍,傲慢才是!