.. _nvim_ide: ============ NeoVim IDE ============ .. note:: `从零开始配置 Neovim(Nvim) `_ 和 `Transform Your Neovim into a IDE: A Step-by-Step Guide `_ 是双语写作的博客,原文作者撰写清晰,推荐阅读。 我参考该文的最新版本再次 :ref:`nvim_ide_fix` `Transform Your Neovim into a IDE: A Step-by-Step Guide `_ 作者提供的指南(借鉴): - 从0开始构建基于 :ref:`lua` 的 ``nvim`` 配置,努力理解每个配置选项 - 学习一些 :ref:`lua` 编程语言,可以参考一下 `Learn Lua in Y minutes `_ (这个 `Learn X in Y minutes `_ 比较有意思,通过案例让你快速入门一门语言) 配置文件路径 ============== - 先构建配置文件初始化 .. literalinclude:: nvim_ide/config_init :caption: 初始化 ``nvim`` 的配置路径 :emphasize-lines: 3 上述创建了一个空的 ``~/.config/nvim/init.lua`` ,这样进入 ``nvim`` 之后执行 ``checkhealth`` 至少能够看到 ``Configuration`` 是OK状态;每次修改 ``init.lua`` 都需要重启 ``nvim`` 才能看到修改的变化 配置选项 =========== - 以下配置 ``~/.config/nvim/lua/options.lua`` 实现了功能: - 使用系统剪贴板 - 在 ``nvim`` 中使用鼠标 - Tab和空格键 - UI配置 - 灵活搜索 .. literalinclude:: nvim_ide/options.lua :language: lua :caption: ``~/.config/nvim/lua/options.lua`` - 在 ``init.lua`` 中添加以下配置激活使用 ``options.lua`` : .. literalinclude:: nvim_ide/init.lua :language: lua :caption: 在 ``~/.config/nvim/lua/init.lua`` 中激活 ``options.lua`` :emphasize-lines: 1 现在显示的效果: .. figure:: ../../../_static/linux/desktop/nvim/options.png 显示效果 键盘映射配置 ============== - 以下配置 ``~/.config/nvim/lua/keymaps.lua`` 实现如下键盘映射: - 使用 ```` 在窗口间移动光标 - 使用 ``Ctrl + 方向键`` 来调整窗口大小 - 在select选择模式,可以使用 ``Tab`` 或者 ``Shift-Tab`` 来更改连续缩排(indentation repeatedly) .. literalinclude:: nvim_ide/keymaps.lua :language: lua :caption: ``~/.config/nvim/lua/keymaps.lua`` - 同样在 ``init.lua`` 中添加以下配置激活使用 ``keymaps.lua`` : .. literalinclude:: nvim_ide/init.lua :language: lua :caption: 在 ``~/.config/nvim/lua/init.lua`` 中激活 ``keymaps.lua`` :emphasize-lines: 2 安装包管理器 ================ ``nvim`` 通过第三方插件提供了强大的能力。有多种插件管理器,其中 :ref:`lazy.nvim` 非常受欢迎,提供了很多神奇功能: - 修正以来顺序 - 锁文件 ``lazy-lock.json`` 跟踪安装的插件 - ... - 创建 ``~/.config/nvim/lua/plugins.lua`` : .. literalinclude:: nvim_ide/plugins.lua :language: lua :caption: ``~/.config/nvim/lua/plugins.lua`` 管理插件 - 同样在 ``init.lua`` 中添加以下配置激活使用 ``plugins.lua`` : .. literalinclude:: nvim_ide/init.lua :language: lua :caption: 在 ``~/.config/nvim/lua/init.lua`` 中激活 ``plugins.lua`` :emphasize-lines: 3 这里我遇到一个报错: .. literalinclude:: nvim_ide/nvim_ver_err :caption: ``nvim`` 版本低于 0.8.0 导致不能使用 lazy.nvim 报错 解决方法是 :ref:`compile_nvim_debian` ,安装自己编译的最新版本后,重新执行上述安装包管理器 如果一切正常,首次重新启动 ``nvim`` 会有短暂的黑屏(没有输出内容),之后正常见到Dashboard。此时,输入 ``:Lazy`` 检查是否工作正常。 配色(Colorscheme) ==================== .. note:: `Monokai Pro `_ 开发的 ``Monokai`` color scheme 是开发IDE中最流行的语法高亮配色,在 `THE HISTORY OF Monokai `_ 一文中有详细的介绍: - 2006年荷兰设计师兼开发者Wimer Hazenberg开发出最初的Monokai,主要是TextMate on macOS上暗黑背景的活泼色彩 - 随后被各个主要IDE所接纳,并且用于终端色彩 - 2017年发布了Monokai Pro,进一步采用了现代色彩系列,并且包含了用户接口设计和定制图标,提供了色彩过滤器,例如 ``Spectrum`` , ``Ristretto`` 和 ``Monokai Classic`` - 2024年发布了Monokai Pro Light,采用了新的 ``Sun`` filter,适配了明亮环境,也就是说经过多年发展,Monokai已经完成了主流的 dark 和 light 两种环境适配 在完成了上文 :ref:`lazy.nvim` 配置之后,就可以安装配色插件,这里参考原文使用了 `monokai.nvim `_ 插件,并且选择了我对比之后认为较为美观的 ``monokai`` 风格: - 修订 ``~/.config/nvim/lua/plugins.lua`` ,增加安装 ``monokai.nvim`` 的配置行: .. literalinclude:: nvim_ide/plugins_colorscheme.lua :language: lua :caption: ``~/.config/nvim/lua/plugins.lua`` 增加 ``monokai.nvim`` 插件管理配色 :emphasize-lines: 15 - 创建一个 ``~/.config/nvim/lua/colorscheme.lua`` 来定制 ``monokai.nvim`` 插件: .. literalinclude:: nvim_ide/colorscheme.lua :language: lua :caption: ``~/.config/nvim/lua/colorscheme.lua`` 定制 ``monokai.nvim`` 插件 :emphasize-lines: 2 - 最后在 ``~/.config/nvim/init.lua`` 激活配置 .. literalinclude:: nvim_ide/init.lua :language: lua :caption: 在 ``~/.config/nvim/lua/init.lua`` 中激活 ``colorscheme.lua`` :emphasize-lines: 4 自动代码补全(Auto-completion) ================================ ``nvim`` 可以配置成自动代码补全,通过一些极佳的插件可以轻易实现。 使用插件 `nvim-cmp `_ 可以管理多种自动代码补全功能,也提供了自定义补全菜单等功能。 - 创建 ``~/.config/nvim/lua/config/nvim-cmp.lua`` 为 ``nvim-cmp`` 准备配置: .. literalinclude:: nvim_ide/nvim-cmp.lua :language: lua :caption: 在 ``~/.config/nvim/lua/config/nvim-cmp.lua`` 增加 ``nvim-cmp`` - 修订 ``~/.config/nvim/lua/plugins.lua`` 添加: .. literalinclude:: nvim_ide/plugins_nvim-cmp.lua :language: lua :caption: ``~/.config/nvim/lua/plugins.lua`` 增加 ``nvim-cmp`` 设置 解析: - ``cmp.setup`` 功能接受一个Lua表,该表定义了一些定制选项。 - ``LuaSnip`` 是一个代码片段引擎(code snippet engine), ``nvim-cmp`` 可以从该引擎中获取一个代码片段,不过如果你不需要的话可以忽略 - 在 ``lazy.nvim`` 中的 ``config = function() ... end`` 设置了该插件将要加载的代码,这部分保存在 ``nvim-cmp.lua`` 中 - ``nvim-cmp`` 是主要的插件,其他以 ``cmp-`` 开头的插件是 ``nvim-cmp`` 所使用的自动补全源代码帮手。而 ``lspkind.nvim`` 将这些代码补全显示得更为美观 ``nvim-cmp`` 的键盘映射 ------------------------- ``mapping = ...`` 语法是 ``[''] = cmp.mapping.xxx,`` ,不同的 ``cmp.mapping.xxx`` 选项可以在手册中找到,如果需要修改键盘绑定,只需要修改 ``[...]`` ,这里采用: - ```` 或者 ``/`` 来在补全项之间移动 - ```` 在补全项的文档中滚动 - ```` 确认补全 ``nvim-cmp`` 补全菜单 ------------------------ 使用 ``formatting = ...`` : - ``fields`` 设置每个补全项目的显示 - ``format = function(...)`` 设置每个补全源代码的文本,你可以在 ``sources = ...`` 设置补全代码的源。 .. note:: 到这里基本配置已经完成 LSP ====== 要将 ``Nvim`` 作为IDE,需要依赖LSP实现。但是手动安装和配置LSP很麻烦,因为不同的LSP有不同的安装步骤,对后期的管理来说很不方便。所以就有了 `mason.nvim `_ 和 `mason-ispconfig.nvim `_ 来简化配置。 - 修改 ``plugins.lua`` 添加如下行: .. literalinclude:: nvim_ide/plugins_lsp.lua :language: lua :caption: ``~/.config/nvim/lua/plugins.lua`` 增加 ``nason.nvim`` 相关设置 - 然后再创建一个 ``~/.config/nvim/lua/lsp.lua`` 管理 ``mason`` ,这里首先配置 ``mason`` 和 ``mason-ispconfig`` : .. literalinclude:: nvim_ide/lsp.lua :language: lua :caption: ``~/.config/nvim/lua/lsp.lua`` 管理 ``mason`` 配置 .. note:: 所有需要添加的LSP都在 ``ensure_installed`` 中列出,完整列表见 `nvim-lspconfig/doc/server_configurations.md `_ 在上述 ``lsp.lua`` 中,不仅需要配置 ``mason-lspconfig`` ,之后还需要配置 ``nvim-lspconfig`` ,但是这个代码非常长, `Transform Your Neovim into a IDE: A Step-by-Step Guide `_ 原文作者给出了一个案例 `GitHub:MartinLwx dotfiles/nvim/lua/lsp.lua `_ 来展示 ``pylsp`` ,其他配置需要自己根据 `nvim-lspconfig/doc/server_configurations.md `_ 来完成。 .. note:: 每个LSP可能需要配置自己的选项,需要检查相应的GitHub仓库啊获得进一步信息,或者仅仅设置 ``on_attach = on_attach`` - 在 ``~/.config/nvim/lua/lsp.lua`` 文件中添加如下代码(这里我按照 原文作者给出了一个案例 `GitHub:MartinLwx dotfiles/nvim/lua/lsp.lua `_ ): .. literalinclude:: nvim_ide/lsp_complete.lua :language: lua :caption: ``~/.config/nvim/lua/lsp.lua`` 添加详细配置 :emphasize-lines: 27-30 请注意上述配置中 ``vim.diagnostic`` 配置快捷键,这是一个非常有用的功能,当lsp检查出代码错误时会在错误行的开头添加一个 ``E`` ,只要将光标移动到错误行,通过快捷键就就能够查看诊断信息: - ``vim.diagnostic.open_float`` 表示浮动框显示错误信息,这里配置 ``e`` 组合键显示错误诊断浮动框 - ``vim.diagnostic.goto_prev`` 和 ``vim.diagnostic.goto_next`` 分别显示上一个和下一个错误诊断详情 - ``vim.diagnostic.setloclist`` 则是在当前工作窗口切分出一个窗口单独显示错误诊断信息,适合一次性展示多个错误内容的诊断信息j 这里有一个疑惑需要后续解决,就是 ``e`` 和 ``q`` 这个组合键中的 ```` 在使用中会导致光标移动,需要有一个方法关闭掉交互模式下空格键移动光标的功能(待查) - 最后,在 ``init.lua`` 中加入激活 ``lsp`` : .. literalinclude:: nvim_ide/init.lua :language: lua :caption: 在 ``~/.config/nvim/lua/init.lua`` 中激活 ``lsp.lua`` :emphasize-lines: 5 一旦完成上述配置,重启 ``Nvim`` ,可以看到 ``Mason`` 会安装指定LSP。要跟踪安装,在命令状态输入 ``:Mason`` ,此时会看到一个动态安装进度,安装完成后会看到类似如下显示: .. figure:: ../../../_static/linux/desktop/nvim/mason_install_lsp.png ``Mason`` 安装完成LSP的情况 继续探索 ========= 参考 `Transform Your Neovim into a IDE: A Step-by-Step Guide `_ ,可以完成一个轻量级的IDE,但是这只是一个开始: - 获得了一个代码高亮显示、代码自动补全、语法检查等功能,完全采用开源方式构建;但是这仅仅提供了一个案例学习配置,实际生产适配不同语言,需要再深入学习实践 - `mason.nvim `_ 和 `mason-ispconfig.nvim `_ 配置需要针对不同开发语言进行配置和打磨,这有待我后续实践: 我计划把自己学习和使用的语言配置上 这是一个开始,我将继续实践... 参考 =========== - `Transform Your Neovim into a IDE: A Step-by-Step Guide `_ 我当时没有注意,原来作者是中文/英文双语撰写博客,中文版 `从零开始配置 Neovim(Nvim) `_ 阅读更为方便,并且在2024/25年更新了文档,非常清晰易读,推荐阅读原文 - `Learn How To Use NeoVim As an IDE `_ - `GitHub: ldelossa/nvim-ide `_