Back
Featured image of post 基于Neovim的下一代IDE

基于Neovim的下一代IDE

Info

  • 首次:2022-10-15 初版
  • 刷新:2023-09-10 使用源头仓库; 新增试用镜像

作为一个多年vimer,近一两年看代码多于写代码,切换到VSCode也还算顺利,配合之前构建的一个容器镜像远程进行VSCode开发。但是VSCode的会话每次重连及不能跨机器漫游开发,还是略有不爽。另外当打开窗口太多时的识别和管理问题太费心了。于是尝试切换到Neovim,目前看似一切都很完美,从需求上看基本可完美替代我的VSCode使用。

我需要一个怎样的IDE呢?

在考察Neovim能力前,我想基于个人习惯定义所需要的IDE能力。

基本功能

  • 主流文本编辑能力(高亮等)
  • 支持vim操作模式
  • 文件目录树及内置的文件管理(复制、创建、删除、显示隐藏文件等)
  • 多窗口管理与跳转能力

代码能力

  • 代码补全能力
  • 批量注释/反注释
  • 函数引用,跳转定义、实现等能力
  • 函数签名提示
  • 基础重构能力(Rename)
  • 基本调试能力(断点,查看,单步等)
  • 函数搜索能力(支持模糊)
  • 内置命令行窗口

工程管理能力

  • 多工程管理与跳转
  • 工程内文件搜索(模糊)

安装与基础配置

先说结论,经过配置后以上诉求完全能满足,并且有不少插件给了我惊喜

我的远程机器是Ubuntu22.04 TLS系统,本地是MacOS终端连接过去。以下是其下安装与配置,主体是基于GitHub别人分享的配置,有一些没有提及的注意事项及个性化设置。

这里我顺手打包了个镜像,如果你感兴趣想试用,可以直接运行如下命令:

1
docker run -it docker.io/kevinlin86/dev-container-lite:latest bash

之后使用nvim进入即可开始体验,首次会自动下载/初始化插件等。

Ubuntu下安装Neovim及依赖

建议安装0.8+以上版本的neovim。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 安装较新版本neovim
wget https://github.com/neovim/neovim/releases/download/v0.8.0/nvim-linux64.deb
sudo apt install ./nvim-linux64.deb

# 安装pip和neovim: 
# for neovim python module
sudo apt install python3-pip
pip install neovim --user

# 安装NVM
# nodejs required by github-copilot
# node version should be latest LTS (version < 18)
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash 
nvm install --lts
nvm use --lts
npm install -g neovim

# 修复html bug
npm i -g vscode-html-languageserver-bin

# fd
npm install -g fd-find

# 安装lazygit
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep '"tag_name":' |  sed -E 's/.*"v*([^"]+)".*/\1/')

curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"

sudo tar xf lazygit.tar.gz -C /usr/local/bin lazygit

# 安装sqlite支持
sudo apt install sqlite libsqlite3-dev

以上一些依赖是如果部分不安装,将会影响某些插件使用,但是插件有些还不会报错(比如lazygit),这查起来将很困难(别问,又是血和泪)。

配置插件

你可以直接运行如下命令安装(详情看这里 )

1
bash -c "$(wget -O- https://raw.githubusercontent.com/ayamir/nvimdots/HEAD/scripts/install.sh)"

然后nvim打开,首次会下载和初始化,有报错不要紧张,继续执行。在大部分插件下载后,关闭nvim再次打开,有错误根据提示重试一下。

可以使用checkhealth查看各个插件的状态。如果顺利的话,准备的80+插件已经就绪。

换上漂亮的字体

插件有一些好看的图标等,我们需要下载字体。安装后同时设置为你终端的字体。

解决Alt键无效(iTerm2)

如果你用iTerm2可能会遇到这个问题,要按如下设置一下。

基础快捷键

这套配置的基础快捷键可以在:lua/core/mapping.lua,基本和原来默认的vim行为一致。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
-- default map
local def_map = {
	-- Vim map
	["n|<Tab>"] = map_cr("normal zc"):with_noremap():with_silent(),
	["n|<S-Tab>"] = map_cr("normal zo"):with_noremap():with_silent(),
	["n|<C-x>k"] = map_cr("bdelete"):with_noremap():with_silent(),
	["n|<C-s>"] = map_cu("write"):with_noremap(),
	["n|Y"] = map_cmd("y$"),
	["n|D"] = map_cmd("d$"),
	["n|n"] = map_cmd("nzzzv"):with_noremap(),
	["n|N"] = map_cmd("Nzzzv"):with_noremap(),
	["n|J"] = map_cmd("mzJ`z"):with_noremap(),
	["n|<C-h>"] = map_cmd("<C-w>h"):with_noremap(),
	["n|<C-l>"] = map_cmd("<C-w>l"):with_noremap(),
	["n|<C-j>"] = map_cmd("<C-w>j"):with_noremap(),
	["n|<C-k>"] = map_cmd("<C-w>k"):with_noremap(),
	["n|<A-[>"] = map_cr("vertical resize -5"):with_silent(),
	["n|<A-]>"] = map_cr("vertical resize +5"):with_silent(),
	["n|<A-;>"] = map_cr("resize -2"):with_silent(),
	["n|<A-'>"] = map_cr("resize +2"):with_silent(),
	["n|<C-q>"] = map_cmd(":wq<CR>"),
	["n|<A-q>"] = map_cmd(":Bwipeout<CR>"),
	["n|<A-S-q>"] = map_cmd(":q!<CR>"),
	["n|<leader>o"] = map_cr("setlocal spell! spelllang=en_us"),
	-- Insert
	["i|<C-u>"] = map_cmd("<C-G>u<C-U>"):with_noremap(),
	["i|<C-b>"] = map_cmd("<Left>"):with_noremap(),
	["i|<C-a>"] = map_cmd("<ESC>^i"):with_noremap(),
	["i|<C-s>"] = map_cmd("<Esc>:w<CR>"),
	["i|<C-q>"] = map_cmd("<Esc>:wq<CR>"),
	-- command line
	["c|<C-b>"] = map_cmd("<Left>"):with_noremap(),
	["c|<C-f>"] = map_cmd("<Right>"):with_noremap(),
	["c|<C-a>"] = map_cmd("<Home>"):with_noremap(),
	["c|<C-e>"] = map_cmd("<End>"):with_noremap(),
	["c|<C-d>"] = map_cmd("<Del>"):with_noremap(),
	["c|<C-h>"] = map_cmd("<BS>"):with_noremap(),
	["c|<C-t>"] = map_cmd([[<C-R>=expand("%:p:h") . "/" <CR>]]):with_noremap(),
	["c|w!!"] = map_cmd("execute 'silent! write !sudo tee % >/dev/null' <bar> edit!"),
	-- Visual
	["v|J"] = map_cmd(":m '>+1<cr>gv=gv"),
	["v|K"] = map_cmd(":m '<-2<cr>gv=gv"),
	["v|<"] = map_cmd("<gv"),
	["v|>"] = map_cmd(">gv"),
}

bind.nvim_load_mapping(def_map)

值得说的是,这个配置顺便解决了原来修改一些readonly文件保存使用w!的尴尬,请使用w!!

插件配置

配置文件在这里:lua/keymap/init.lua。想要流畅使用,这些基本快捷键要了解。

重要插件展示

以下用一些图简要展示一下成果。

类VSCode的Ctrl+P

初次使用通过它学习一些快捷键是再好不过了。

代码补全

惊喜点:除了基本提示和补全外。gh快捷键试一下浮窗的提示特别棒。

命令行(可水平、可垂直、可浮窗)

快捷键一个是Ctrl + \。浮窗快捷键是F5

文件搜索

提供多种选择。基于sqlite可搜索最近打开频率高的文件等,可在项目中搜索(基于.git)。

git插件

基于lazygit插件,浮窗展示,很漂亮。

调试go程序

基于DAP的调试,可适应各种语言,以上的go还依赖于安装dlv

Copilot支持

没想到吧,neovim是支持copilot的,你只要在nvim中运行:

1
:copilot auth

根据弹出的内容操作,认证后便可使用copilot能力了。

总结

感觉是有机会回归沉浸式敲代码而不是来回点鼠标的日子了!!!
先用一阵后,顺利的话就会告别VSCode,毕竟天天更新我都烦了。

如果你有兴趣也可以试试。欢迎fork和star

这么漂亮舒适的界面,文章不写了,我要去写代码了:P