Info
- 首次:2022-10-15 初版
- 刷新:2023-09-10 使用源头仓库; 新增试用镜像
作为一个多年vimer,近一两年看代码多于写代码,切换到VSCode也还算顺利,配合之前构建的一个容器镜像远程进行VSCode开发。但是VSCode的会话每次重连及不能跨机器漫游开发,还是略有不爽。另外当打开窗口太多时的识别和管理问题太费心了。于是尝试切换到Neovim,目前看似一切都很完美,从需求上看基本可完美替代我的VSCode使用。
我需要一个怎样的IDE呢?
在考察Neovim能力前,我想基于个人习惯定义所需要的IDE能力。
基本功能
代码能力
工程管理能力
安装与基础配置
先说结论,经过配置后以上诉求完全能满足,并且有不少插件给了我惊喜。
我的远程机器是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中运行:
根据弹出的内容操作,认证后便可使用copilot能力了。
总结
感觉是有机会回归沉浸式敲代码而不是来回点鼠标的日子了!!!
先用一阵后,顺利的话就会告别VSCode,毕竟天天更新我都烦了。
如果你有兴趣也可以试试。欢迎fork和star。
这么漂亮舒适的界面,文章不写了,我要去写代码了:P