.. _nvim_ide_fix:
=======================
重新配置NeoVim IDE
=======================
我之前 :ref:`nvim_ide` 参考 `从零开始配置 Neovim(Nvim) `_ ,原作者更新了博客,配置更为精简。正好我遇到了在 :ref:`nvim_ide_freebsd` ,所以再次参考这篇博客进行配置。
配置文件路径
==============
``nvim`` 配置目录 ``~/.config/nvim`` ,默认读取 ``~/.config/nvim/init.lua`` ,为方便维护,从 ``init.lua`` 划分出不同目标的配置:
.. literalinclude:: nvim_ide_fix/tree
:caption: ``nvim`` 配置目录 ``~/.config/nvim`` 结构
选项配置
=========
- ``~/.config/nvim/lua/options.lua`` 配置实现功能:
- 默认采用系统剪贴板,同时支持鼠标操控 Nvim
- Tab 和空格的换算
- UI 界面
- “智能”搜索
.. literalinclude:: nvim_ide/options.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
键盘映射配置
==============
- 以下配置 ``~/.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`` (这里的案例只完成 ``lazy.nvim`` 自身安装,没有指定其他第三方插件)):
.. 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
主题配置
============
.. 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)
================================
.. note::
2024年之后 `从零开始配置 Neovim(Nvim) `_ 采用了 `blink.cmp `_ 替代了之前使用的自动补全插件 `nvim-cmp `_ 。配置更为简单且自动补全快(Rust代码)。
.. warning::
`blink.cmp `_ 混合了部分Rust程序代码,所以安装是有平台要求的。如果不是常用平台Linux(x86和arm)/macOS/Windows,那么安装会比较麻烦,需要从源代码编译安装。
之前使用的 `nvim-cmp `_ 由于是纯Lua代码,就没有这个困难。
另外, ``blink.cmp`` 官方发布的release实际上对 ``nvim`` 版本要求很高,我在ARM平台的 :ref:`raspberry_pi` 系统上安装就遇到 ``nvim`` 版本过低无法config的问题。
总之,有利有弊
.. note::
- 在FreeBSD平台,我还是继续使用 `nvim-cmp `_ (纯Lua跨平台)
- 在Raspberry Pi平台,我重新构建了 :ref:`debian_tini_image` (包含了编译 :ref:`nvim` 步骤),以获得最新的nvim版本来适配 ``blink.cmp``
- 修订 ``~/.config/nvim/lua/plugins.lua`` 添加:
.. literalinclude:: nvim_ide_fix/plugins_blink.lua
:caption: ``~/.config/nvim/lua/plugins.lua`` 添加 ``blink.cmp`` 插件配置
- 重启 ``nvim`` 后就会自动安装插件并得到初步的自动补全功能
异常排查
----------
我在配置了 ``blink.cmp`` 之后,启动遇到一个报错
.. literalinclude:: nvim_ide_fix/plugins_blink.cmp_error
:caption: 启动nvim遇到的 ``blink.cmp`` 报错
这个问题似乎和 `Config failing - preset: expected function: 0x7ff7cc3683b8, got string (default) #881 `_ 类似,issue中说明要升级nvim。报告issue的nvim是 ``NVIM v0.11.0-dev-979+g84623dbe9`` ,比我的发行版使用的 ``NVIM v0.11.0-dev-790+g0fe4362e2`` 还要新一些,报告升级到 ``NVIM v0.11.0-dev-1479+g548f19ccc3`` 解决。
我重新构建了 :ref:`debian_tini_image` (包含了编译 :ref:`nvim` 步骤),获得了最新的 ``NVIM v0.12.0-dev-695+g63a7b92e58`` 解决了这个异常问题。
LSP
======
要将 ``Nvim`` 作为IDE,需要依赖LSP实现。但是手动安装和配置LSP很麻烦,因为不同的LSP有不同的安装步骤,对后期的管理来说很不方便。所以就有了 `mason.nvim `_ 和 `mason-ispconfig.nvim `_ 来简化配置:
- `mason.nvim `_ : LSP 管理器,可以实现 LSP 的下载、更新等
- `mason-ispconfig.nvim `_ : 主要功能是处理 mason.nvim 和 nvim-lspconfig 之间名字不一致的问题; mason-lspconfig.nvim 还会自动调用 vim.lsp.enable 启动安装好的 LSP
- 修改 ``plugins.lua`` 添加如下行:
.. literalinclude:: nvim_ide_fix/plugins_lsp.lua
:language: lua
:caption: ``~/.config/nvim/lua/plugins.lua`` 增加 ``nason.nvim`` 相关设置
说明:
- ``mason.nvim`` 采用默认配置即可,所以用的是 ``opts = {}``
- ``mason-lspconfig.nvim`` 配置项使用 ``ensure_installed`` 确保 ``pylsp`` 会被自动安装(pylsp 是 Python 语言的一个 LSP)
- 通过 ``nvim-lspconfig`` 对 ``pylsp`` 进行配置
- 这里没有采用 ``opts = { ... }`` 进行插件配置,而是使用 ``config = function() ... end`` 自定义一个配置函数,该函数会被自动执行
- 主要的功能是调用 ``lspconfig.pylsp.setup({})`` ,这里的 ``{}`` 表示采用该 ``LSP`` 的默认行为
完成上面的配置之后,LSP 已经可用了: 默认安装了 ``pylsp``
- 编辑 ``~/.config/nvim/lua/lsp.lua`` ,添加一些Mason的特定配置:
.. literalinclude:: nvim_ide_fix/lsp.lua
:caption: 配置 LSP ``~/.config/nvim/lua/lsp.lua``
typescript LSP
---------------
.. warning::
Mason的LSP支持列表实际上比 ``nvim-lspconfig`` 少,所以有些LSP无法通过Mason安装。此外 Mason 是强Linux绑定,对FreeBSD支持不佳,所以在 :ref:`freebsd_programming_tools` ,我后续将尝试直接使用 ``nvim-lspconfig`` 。或者改为使用 ``helix`` 编辑器。
要支持更多的LSP,则参考 `nvim-lspconfig/doc/configs.md `_
- 现在配置非常简单,只需要只需要修订 ``opts`` 配置段,在 ``ensure_installed`` 加入对应LSP名字就可以了
- 支持 :ref:`javascript` 和 :ref:`typescript` 可以使用 `typescript-tools.nvim `_ ,修订 ``lua/plugins.lua`` :
.. literalinclude:: nvim_ide_fix/plugins_typescript_lsp.lua
:caption: 安装 ``typescript-tools.nvim``
参考
======
- `从零开始配置 Neovim(Nvim) `_