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

在軟件開發領域,集成開發環境(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 插件時會用到。

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 位於 PATH 中,如果不在,需要在 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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Nm-_JLCG7GO5z5CCsUBPNw