NeoVim 打造成跟 Goland 一样好用的 IDE

文摘   2024-06-26 20:08   中国香港  

在软件开发领域,集成开发环境(IDE)的选择对程序员的效率和生产力起着举足轻重的作用。对于寻求精简而强大的编码体验的 Golang 开发者来说,配置 Neovim 是一个不错的选择。

本文分享完整的 Golang NeoVim 的设置,帮助你将 NeoVim 打造成媲美 Goland 的开发环境。

初始设置

将以下内容添加到 .vimrc 或 init.vim 文件中。

set expandtab
set shiftwidth=4
set tabstop=4
set hidden
set signcolumn=yes:2
set relativenumber
set number
set termguicolors
set undofile
set spell
set title
set ignorecase
set smartcase
set wildmode=longest:full,full
set nowrap
set list
set mouse=a
set scrolloff=8
set sidescrolloff=8
set nojoinspaces
set splitright
set clipboard=unnamedplus
set confirm
set exrc
Environment Variable

环境变量

需要根据需要设置以下环境变量。这些变量在下一步设置主要 Go 插件时会用到。

  • GOPATH:这是到 go 目录的路径,直到版本号为止,例如,我的是 /opt/my/go/1.20.3
  • GOBIN:这是 go 安装中 bin 目录的路径,例如 /opt/my/go/1.20.3/bin

Go Plugin

vim-go

毫无疑问,这是 Golang 开发中最好、最重要的 vim 插件。它提供无缝导航、智能自动完成和工具包功能,提升你的开发体验。

call plug#begin('~/.vim/plugged')

" This is where we'll be adding the other plugins

  Plug 'fatih/vim-go'

call plug#end()

请记住在执行 :PlugInstall 之后运行 :GoInstallBinaries。

如果不想每次保存文件时都自动格式化,让 g:go_fmt_autosave = 0。

coc.nvim

Plug 'neoclide/coc.nvim', {'do''yarn install --frozen-lockfile'}

下面是更多提升效率的配置:

set hidden
set cmdheight=2
set updatetime=300
set shortmess+=c
set signcolumn=yes

" Use <c-space> to trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()

"
 Use `[c` and `]c` to navigate diagnostics
nmap <silent> [c <Plug>(coc-diagnostic-prev)
nmap <silent> ]c <Plug>(coc-diagnostic-next)

" Remap keys for gotos
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)

"
 Use U to show documentation in preview window
nnoremap <silent> U :call <SID>show_documentation()<CR>

" Remap for rename current word
nmap <leader>rn <Plug>(coc-rename)

"
 Remap for format selected region
vmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)
" Show all diagnostics
nnoremap <silent> <space>a  :<C-u>CocList diagnostics<cr>
"
 Manage extensions
nnoremap <silent> <space>e  :<C-u>CocList extensions<cr>
" Show commands
nnoremap <silent> <space>c  :<C-u>CocList commands<cr>
"
 Find symbol of current document
nnoremap <silent> <space>o  :<C-u>CocList outline<cr>
" Search workspace symbols
nnoremap <silent> <space>s  :<C-u>CocList -I symbols<cr>
"
 Do default action for next item.
nnoremap <silent> <space>j  :<C-u>CocNext<CR>
" Do default action for previous item.
nnoremap <silent> <space>k  :<C-u>CocPrev<CR>
"
 Resume latest coc list
nnoremap <silent> <space>p  :<C-u>CocListResume<CR>

此外,如果我们需要从 vim-go 中移除 gd 映射,因为我们将使用 coc 功能。让 g:go_def_mapping_enabled = 0

现在,我们需要为 coc.nvim golang 设置添加 custome 配置。你可以使用 :CocConfig 命令找出配置的位置。以下假设 gopls 位于 GOBIN 环境变量中指向它。

{
  "languageserver": {
    "golang": {
      "command""gopls",
      "rootPatterns": ["go.mod"".vim/"".git/"".hg/"],
      "filetypes": ["go"]
    }
  }
}

Search(files and code)

fzf.vim

在安装此插件之前,我们需要 fzf 和 ripgrep 程序。对于 Linux 和 Mac,可以使用自己喜欢的软件包管理器轻松安装。对于 Windows,可以将 .exe 文件保存在自己喜欢的位置,并确保将这些位置添加到 $PATH 环境变量中。

现在,让我们安装插件:

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'stsewd/fzf-checkout.vim'

让我们添加一些自定义配置。

let g:fzf_layout = { 'up''~90%''window': { 'width': 0.8, 'height': 0.8, 'yoffset':0.5, 'xoffset': 0.5 } }
let $FZF_DEFAULT_OPTS = '--layout=reverse --info=inline'

" Customise the Files command to use rg which respects .gitignore files
command! -bang -nargs=? -complete=dir Files
    \ call fzf#run(fzf#wrap('files', fzf#vim#with_preview({ 'dir': <q-args>, 'sink': 'e', 'source': 'rg --files --hidden' }), <bang>0))

"
 Add an AllFiles variation that ignores .gitignore files
command! -bang -nargs=? -complete=dir AllFiles
    \ call fzf#run(fzf#wrap('allfiles', fzf#vim#with_preview({ 'dir': <q-args>, 'sink': 'e', 'source': 'rg --files --hidden --no-ignore' }), <bang>0))

nmap <leader>f :Files<cr>
nmap <leader>F :AllFiles<cr>
nmap <leader>b :Buffers<cr>
nmap <leader>h :History<cr>
nmap <leader>r :Rg<cr>
nmap <leader>R :Rg<space>
nmap <leader>gb :GBranches<cr>

现在,我们可以开始使用 f 快速查找文件,使用 r 快速查找代码。

文件资源管理器

nerdtree

虽然在 vim 中快速浏览任何文件的正确方法是使用 fzf,但有时你也需要使用文件浏览器查看文件。侧边的文件浏览器是集成开发环境有别于其他文本编辑器的一大特色。

Plug 'preservim/nerdtree'

为此设置一些自定义配置:

nnoremap <leader>n :NERDTreeFocus<CR>
nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
nnoremap <C-f> :NERDTreeFind<CR>

括号和小括号

使用 Plug 'jiangmiao/auto-pairs' 插件自动配置括号。

版本控制(git)

vim-fugitive

这是大多数 vim 用户采用的流行方法。尽管这不是我最喜欢的 git 插件,但它绝对是一个很棒的工具。

Plug 'tpope/vim-fugitive'

neogit

这是一个能让你在 vim 中获得最接近 IDE 体验的 git 插件。

Plug 'nvim-lua/plenary.nvim'
Plug 'NeogitOrg/neogit'

Terminal

vim-floaterm

如果我们不想每次都进入不同的终端窗口,所以让我们在自己的 GOVIM ide 中建立一个终端窗口。

Plug 'voldikss/vim-floaterm'

可以添加一些自定义快捷键,以方便使用。

nnoremap   <silent>   <F7>    :FloatermNew<CR>
tnoremap   <silent>   <F7>    <C-\><C-n>:FloatermNew<CR>
nnoremap   <silent>   <F8>    :FloatermPrev<CR>
tnoremap   <silent>   <F8>    <C-\><C-n>:FloatermPrev<CR>
nnoremap   <silent>   <F9>    :FloatermNext<CR>
tnoremap   <silent>   <F9>    <C-\><C-n>:FloatermNext<CR>
nnoremap   <silent>   <F12>   :FloatermToggle<CR>
tnoremap   <silent>   <F12>   <C-\><C-n>:FloatermToggle<CR>

语法高亮

vim-go-syntax

虽然我们已经有了多个支持 golang 语法的插件,但要真正实现类似 Intellij/Goland 的高亮显示,我们还需要由我们最喜欢的树形工具提供支持。

Plug 'charlespascoe/vim-go-syntax'

Intellij 主题

如果你想要跟 Intellij 一样的开发主题,可以使用 GitHub - doums/darcula: A Vim color scheme reproduction of the official JetBrains IDE Darcula theme[1]

参考资料
[1]

darcula theme: https://github.com/doums/darcula


Go Official Blog
Golang官方博客的资讯翻译及独家解读
 最新文章