用最少的时间打造一个强大的 neovim
tags: 终端, 编辑器
@
vim 的作者去世一段时间了,所以我将这篇文章从新组织了一次。2024 年,vim 还是存在一些小问题,在 windows 和 macos 上的体验不太好,所以我现在换用 neovim 了,这套配置还是依然适用,vim 和 neovim。
适用人群
简单的代码或者文本编辑,无需将 neovim 配置成 IDE。
基本配置
外观方面的基本配置
---------------------------------------------------------------
-- ~/.config/nvim/init.lua —— 最小可行且舒服
---------------------------------------------------------------
-- 0. 判断系统 & 默认 shell
local is_win = vim.fn.has("win32") == 1 or vim.fn.has("win64") == 1
if is_win then
vim.opt.shell = "powershell"
vim.opt.shellcmdflag = "-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command"
end
-- 1. 外观
vim.opt.number = true -- 绝对行号
vim.opt.relativenumber = false -- 相对行号
vim.opt.cursorline = true -- 当前行号高亮
vim.opt.showmatch = true -- 括号匹配
vim.opt.matchtime = 5 -- 0.5 s
vim.opt.scrolloff = 3 -- 上下留边
vim.opt.sidescrolloff = 3 -- 左右留边
-- 2. 输入体验
vim.g.mapleader = " "
vim.opt.mouse = "a"
vim.opt.clipboard = "unnamedplus" -- 默认系统剪贴板
-- 3. 缩进
vim.opt.tabstop = 4
vim.opt.softtabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true -- 用 4 空格而不是tab
vim.opt.smartindent = true
vim.opt.autoindent = true
-- 4. 搜索 / 修改
vim.opt.hlsearch = true
vim.opt.incsearch = true
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.wo.wrap = true -- 长行自动换行
-- 5. 缓冲区、撤销
vim.opt.swapfile = false
vim.opt.backup = false
vim.opt.writebackup = false
vim.opt.history = 100 -- undo 100 次
vim.opt.updatetime = 100 -- 提升 LSP/gitsigns 响应
-- 6. 一行魔法,打开文件类型检测 + 语法高亮
vim.cmd([[
filetype plugin indent on
syntax enable
]])
插件
推荐几个轻量插件,实用性更强,需要安装 packer,兼顾了外观和功能。
注意:如果你使用的是 windows 下 git 自带的 vim,则会被认为处在 linux 环境下,安装插件目录需要选择 linux 的目录。
这一部分我自己也不咋用了,保留以前的 vim 版本吧
" vim-plug 安装
" sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
call plug#begin('~/.vim/plugged/')
Plug 'skywind3000/vim-auto-popmenu'
Plug 'skywind3000/vim-dict'
Plug 'preservim/nerdtree'
Plug 'jiangmiao/auto-pairs'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'morhetz/gruvbox'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'skywind3000/asynctasks.vim'
Plug 'skywind3000/asyncrun.vim'
call plug#end()
" 代码补全配置
" 设定需要生效的文件类型,如果是 "*" 的话,代表所有类型
let g:apc_enable_ft = {'*':1}
" 设定从字典文件以及当前打开的文件里收集补全单词,详情看 ':help cpt'
set cpt=.,k,w,b
" 不要自动选中第一个选项。
set completeopt=menu,menuone,noselect
" 禁止在下方显示一些啰嗦的提示
set shortmess+=c
" nerdtree 按 F1 打开关闭
map <F1> :NERDTreeToggle<CR>
" 状态栏设置
set laststatus=2 "永远显示状态栏
let g:airline_powerline_fonts = 1 " 支持 powerline 字体
let g:airline#extensions#tabline#enabled = 1 " 显示窗口 tab 和 buffer
let g:airline_theme='molokai' " murmur 配色不错
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = '▶'
let g:airline_left_alt_sep = '❯'
let g:airline_right_sep = '◀'
let g:airline_right_alt_sep = '❮'
let g:airline_symbols.linenr = '¶'
let g:airline_symbols.branch = '⎇'
" colorscheme pablo
" colorscheme torte
" colorscheme koehler
colorscheme gruvbox
set background=dark
" 设置颜色主题
" 映射两个代码运行的快捷键
let g:asyncrun_open = 10
noremap <silent><C-g> :AsyncTask file-run<cr>
noremap <silent><C-b> :AsyncTask file-build<cr>
去掉了快捷键基本上使用默认配置,F1 打开 nerdtree,Ctrl+g 运行当前文件,Ctrl+b 构建当前项目(但针对这一点我不做过多讲解,否则偏离了文章的主题)。使用 gruvbox 主题
更新一版,加入了 gui 和平台特性,因为我要在 win 下用 gvim
再一键安装 Coc 插件,这是我常用的,你可以装自己需要的插件
CocInstall coc-html coc-tsserver coc-sumneko-lua coc-sh coc-pyright coc-json coc-clangd
然后简单的配置一下 asyncrun, vim ~/.vim/tasks.ini,我常用的语言配置如下:
[file-run]
command="$(VIM_FILEPATH)"
command:python=python "$(VIM_FILENAME)"
command:javascript=node "$(VIM_FILENAME)"
command:sh=bash "$(VIM_FILENAME)"
command:lua=lua "$(VIM_FILENAME)"
command:rust=rust "$(VIM_FILENAME)"
output=terminal
cwd=$(VIM_FILEDIR)
save=2
这个插件功能十分强大,详情可见https://github.com/skywind3000/asynctasks.vim
这样的话,进行一些简易的代码编写和文本编辑都没问题了
后话
我并不建议将 neovim 作为大型项目的编辑器,因为它在项目管理,构建上的配置难度比单文件高得多,插件装得太多也会影响 neovim 本身的性能,所以还是专注于简单文本编辑比较好。如果需要管理大型工程,使用 vs、xcode 等 IDE 是更为明智的选择。