记录配置 neovim 的过程。我已经是 vim 老鸟了,所以 vim 的相关内容就略去了。
ps: 由于 NvChad已经升级了,现在按照本篇的方法已经无法安装了(报 lazy clone 失败 ),参考我最新的文章《使用容器启动 Neovim 并自启动 Neovim 和 NvimTree》。不过这篇文章中对于字体的描述还是挺有用的,还可以看。
零、neovim 介绍
Neovim 是 Vim 的一个分支,它的目标是改进 Vim 的代码库,使得 API 更容易实现,并改善用户体验和插件实现。Neovim 与 Vim 的主要区别有以下几点:
- Neovim 支持使用 Lua 语言进行扩展和配置,这使得 Neovim 的性能更高,配置更简洁,插件更丰富。
- Neovim 支持内置终端,可以在编辑器中运行 shell 命令或其他程序,而不需要切换到外部终端。
- Neovim 支持异步任务,可以在后台执行一些耗时的操作,比如代码检查、格式化、补全等,而不会阻塞编辑器的响应。
- Neovim 支持多进程架构,可以与其他程序进行通信和协作,比如使用 LSP(语言服务器协议)和 DAP(调试适配协议)来增强编程功能。
- Neovim 支持新的用户界面协议,可以让第三方开发者创建不同风格的 GUI(图形用户界面)或 TUI(终端用户界面)。
一般来说,Neovim 的配置文件是保存在 ~/.config/nvim/init.vim
或者 ~/.config/nvim/init.lua
中。
一、安装 neovim
apt install neovim
查看版本
nvim --version
版本太老了,卸载掉。
sudo apt remove neovim
sudo apt remove neovim-runtime
wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz
tar zxvf nvim-linux64.tar.gz
./nvim-linux64/bin/nvim
以下是默认配置。
我把安装位置调整一下,再做个软链到系统路径:
mv nvim-linux64 /var/local
ln -s /var/local/nvim-linux64/bin/nvim /usr/local/bin/nvim
二、安装 NvChad
NvChad 是一个基于 Neovim 的配置,它使用lua语言编写,旨在提供一个具有非常漂亮的UI和极快的启动时间(大约0.02秒~0.07秒)的基础配置。如官网的上图所示。
我们可以根据自己的喜好修改默认的设置,也可以删除一些自己不喜欢的配置,可以在自定义配置(lua/custom目录)中调整整个默认配置,并且这个目录是 git 忽略的,所以我们可以保持与NvChad最新的配置(main分支)同步。
2.1 Nerd Font 字体(可先跳过)
注:这一部分可以先跳过,待后续完全安装好了再处理
安装好之后如果没装字体,都会有一个疑问,为什么文件名的前面都有一个“?方框”?就是没装字体啦。
Nerd Font 字体:https://github.com/ryanoasis/nerd-fonts/releases/latest
Nerd Fonts 是一个针对开发人员的字体修补项目,其中包含高数量的字形。该项目补丁包括 Hack、Source Code Pro 等 50 多种修补字体,以及包括 Fira Code、JetBrains Mono 和 Meslo 等三种 Nerd Fonts 的 Termius 自定义字体。
字体安装只与你本地设备有关,我们是在哪个平台的设备展示内容(使用终端),就在那个平台下安装字体。
2.1.1 linux下
wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.2/SourceCodePro.zip
unzip SourceCodePro.zip -d /usr/share/fonts/SourceCodePro
确认字体放好了:
2.1.2 Mac 下
搜索”font“:
把下好的字体文件拖进去:
再在 item2 里配置使用这个字体:
就大功告成了:
2.1.3 iOS 下
参考了 reddit 的这个回答:https://www.reddit.com/r/ish/comments/nuzvir/how_to_install_nerd_fonts/ ,
-
下载 Fontcase
-
下载字体
https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.2/SourceCodePro.zip
扔到一个路径下。
-
Fonts import & install
-
install 后下载字体
-
需要在系统里安装,在路径 General > VPN & Device Management 里安装:
-
在具体的 app 里就可以使用导入的字体了。例如我在 iSH 里可以设置这个字体了:
2.2 ripgrep
ripgrep 是一个基于行的搜索工具,它可以递归地在当前目录中搜索与正则表达式模式匹配的内容。后续使用 telescope 插件时需要它。
默认情况下,ripgrep会尊重 gitignore 规则并自动跳过隐藏文件/目录和二进制文件。它支持Windows、macOS和Linux,并提供二进制下载。该工具类似于其他流行的搜索工具,例如 The Silver Searcher、ack 和 grep。它可以替代许多其他搜索工具,因为它包含了它们的大部分功能并且通常更快。
它的使用方法可以参考 https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#basics
我在 Debian 下下载deb 包安装:
curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
sudo dpkg -i ripgrep_13.0.0_amd64.deb
2.3 sharkdp/fd
fd是一个用于在文件系统中查找条目的程序,是find的一个简单,快速和用户友好的替代品。使用 telescope 需要它。
我在 Debian 下下载deb 包安装:
curl -LO https://github.com/sharkdp/fd/releases/download/v8.7.0/fd_8.7.0_amd64.deb
sudo dpkg -i fd_8.7.0_amd64.deb
2.4 安装NvChad
我不想用默认的neovim配置,直接把配置文件做个备份,安装 NvChad
cd ~/.config
mv nvim nvim_bak
git clone https://github.com/NvChad/NvChad ~/.config/nvim --depth 1 && nvim
2.5 检查插件依赖
在终端输入 nvim
打开 neovim 。直接键盘输入 :checkhealth
,然后按下回车执行来检查依赖是否齐全:
Ps: 这个自动提示真的太好用辣
发现问题还是挺多的。
按照提示修复相关的问题。
三、Neovim 目录结构
四、NvChad 快捷键/键盘映射
https://nvchad.com/docs/config/mappings
-
默认映射在
core.mappings
中定义。vi /root/.config/nvim/lua/core/mappings.lua
-
在 nvim 中可以使用
NvCheatsheet
或Telescope keymaps
来列出所有映射。
不知道是什么原因,无论我怎么修改,快捷键就是没办法生效。
我查看了 tmux.conf vimrc bashrc zshrc 等相关的文件,目前还没法解决。
只能使用 Neovim 默认的组合快捷键 Ctrl+w 了,再加上其他按键。先这么用着虽然不太方便,以后再研究:
- +hijk 就是左上下右的窗口激活
- +w 返回上个窗口
- +n/s 就是桌面横向分割
- +v 就是桌面纵向分割
- +o 就是关闭所有其他窗口
- +r 左右窗口调换
除此之外,还有(我不确定这些是谁的快捷键,但是在 neovim 中可以使用)
- Ctrl+O/T,在当前窗口向后开在 buff 里的历史文件。
- Ctrl+I,在当前窗口向前在 buff 里的历史文件。
- Shift+”,
五、常用 command 命令
在 command 模式下的命令
- help 帮助
- NvimTreeToggle,打开/关闭文件树
- checkHealth
- Lazy 查看 Lazy 管理的插件和插件加载情况
- Telescope find_files 查询文件名 Telescope live_grep 查询内容
- nvdash Neovim 的首页,可以进行更换主题,打开文件等操作
六、管理插件
lazy 插件管理
NvChad 使用 lazy.nvim 进行插件管理. 当一个插件被加载的时候, 它所依赖的插件也会自动加载。
在 nvim 界面内的 command 模式下输入 Lazy
即可进入管理界面,展示插件的加载状态, 安装和更新插件, 分析插件加载耗时等.
Telescope 模糊搜索
telescope.nvim 由 Lua 实现, 支持扩展, 功能十分强大. 它几乎支持一切可以列在列表中的东西, 例如:
- 文件内容模糊搜索
- Tag 符号搜索
- LSP 定义/引用搜索
- 诊断信息预览
- Treesitter 符号搜索
- Git 提交记录搜索
- Git 文件变动预览
可以检查是否安装好:
后来我补完了 fd 的安装。
另外由于我的快捷键实在没调试成功,暂时先用命令进入:
:Telescope find_files
界面如下,搜索的速度跟飞一样
根据官方 github ,一共有几个命令:
" Find files using Telescope command-line sugar.
nnoremap <leader>ff <cmd>Telescope find_files<cr>
nnoremap <leader>fg <cmd>Telescope live_grep<cr>
nnoremap <leader>fb <cmd>Telescope buffers<cr>
nnoremap <leader>fh <cmd>Telescope help_tags<cr>
同时 Telescope 还管理了其他几个插件 :
- plenary.nvim:
- plenary.nvim 是一个通用的 Neovim Lua 工具库,提供了一系列功能和实用函数,帮助简化插件的开发过程。
- 它包含了许多常用的功能,如异步任务管理、时间处理、表格操作、文件系统操作等。插件开发者可以使用这些功能来构建更高级和复杂的插件。
- plenary.nvim 是许多 Neovim 插件的依赖库,包括 telescope.nvim。
- extensions:
- extensions 是 telescope.nvim 的插件扩展机制,用于为 telescope.nvim 添加额外的功能和集成。
- extensions 可以为 telescope.nvim 提供与其他插件和工具的集成,扩展其搜索范围和功能。例如,有一些专门的 extensions 用于与 Git、LSP、文件预览等集成。
- extensions 使用 plenary.nvim 提供的工具和功能,以实现与 telescope.nvim 的无缝集成。
NvimTreeToggle 文件树
用于在 Neovim 中切换显示和隐藏文件浏览器(File Explorer)窗口。与另外两个插件一起配合完成工作。
- nvim-tree.lua:
- nvim-tree.lua 是一个用 Lua 语言编写的文件浏览器插件,它能够在 Neovim 中显示和管理文件和目录结构。
- 该插件提供了丰富的功能,如文件和目录的打开、创建、删除、复制、重命名等操作,同时支持图标化的文件显示。
- nvim-web-devicons:
- nvim-web-devicons 是一个 Neovim 插件和工具库,用于为文件和目录添加图标显示。
- 该工具库提供了一系列图标,用于根据文件类型、扩展名等信息在文件浏览器中显示相应的图标。
nvim-treesitter 语法高亮、代码导航
nvim-treesitter 提供强大的语法解析和代码分析功能,使你能够更高效地编写和理解代码。它使用 Tree-sitter 引擎,这是一种高效且可扩展的语法解析器,能够对各种编程语言进行快速而准确的语法分析。
nvim-treesitter 的功能包括:
- 语法高亮:通过基于语法树的准确分析,提供更准确和更丰富的语法高亮显示。
- 自动缩进:根据语法树的结构,自动调整代码的缩进,使代码更加清晰和可读。
- 智能缩写:根据语法树的理解,智能地扩展和补全代码的缩写。
- 智能选择和操作:根据语法树的知识,提供更智能的选择和操作功能,如选择函数、类、条件语句等。
- 代码导航:根据语法树的结构,提供跳转到定义、查找引用、代码浏览等功能,以方便代码导航和理解。
- 代码重构:基于语法树的信息,提供代码重构功能,如重命名变量、提取函数等。
- 错误和警告提示:根据语法树的分析,提供更准确的错误和警告提示,帮助你发现和修复代码中的问题。
我在 check的时候报了两个warning:
nvim-cmp 框架
nvim-cmp 是一个用于 Neovim 的代码补全框架,旨在提供灵活、高度可配置和可扩展的代码补全功能。它的设计理念是为了满足不同用户的需求,并与其他插件和补全源进行集成。
下面是 nvim-cmp 框架的一些关键特点和功能:
- 多源支持:nvim-cmp 支持多种不同的补全源(completion source),如缓冲区补全、LSP 补全、路径补全等。这些源可以根据用户的配置和需求进行选择和定制。
- 强大的配置选项:nvim-cmp 提供了丰富的配置选项,可以通过 Lua 代码进行定制。用户可以根据自己的偏好和需求来配置补全的行为、外观和交互方式,从而实现个性化的补全体验。
- 异步处理:nvim-cmp 使用异步处理的方式来提高补全的响应速度和效率。它可以在后台进行补全源的数据获取和处理,避免阻塞用户的编辑操作。
- 插件集成:nvim-cmp 可以与其他插件进行集成,如语法检查插件、代码片段插件等。这使得补全可以更好地与其他功能和工具结合使用,提供更全面和强大的开发环境。
- 基于事件的触发器:nvim-cmp 提供了灵活的触发器机制,可以根据用户定义的规则和条件来触发补全功能。这使得补全可以在用户希望的时候自动触发,提供更无缝的开发体验。
- 智能排序和过滤:nvim-cmp 提供了智能的排序和过滤机制,可以根据上下文和用户输入来对补全候选项进行排序和过滤,确保最相关和最有用的选项优先显示。
在 NvChad 中它集成了下面这些插件:
-
luaSnip:
- 插件功能:luaSnip 是一个用于 Neovim 的代码片段插件,它允许你定义和使用代码片段,提高代码编写的效率。此外,使用luaSnip还可以帮助避免手写代码时出错的可能性。
friendly-snippets:
- 插件功能:friendly-snippets 是一个包含了大量常见编程语言的友好代码片段集合。它与 luaSnip 插件兼容,可以作为 luaSnip 的片段库使用,提供丰富的代码片段供选择。
-
cmp-buffer:
- 插件功能:cmp-buffer 是 nvim-cmp 的一个源插件,用于提供缓冲区(buffer)的补全候选项。它可以在当前打开的缓冲区中进行补全,提供相应的候选项供选择。
-
cmp-nvim-lsp:
- 插件功能:cmp-nvim-lsp 是 nvim-cmp 的一个源插件,用于与 Neovim 的内置 LSP 客户端进行集成。它可以获取 LSP 提供的补全信息,包括函数、变量、类型等,提供相关的补全候选项。
-
cmp-nvim-lua:
- 插件功能:cmp-nvim-lua 是 nvim-cmp 的一个源插件,用于提供 Lua 语言的补全支持。它可以识别 Lua 代码中的函数、变量等信息,并提供相关的补全选项。
-
cmp-path:
- 插件功能:cmp-path 是 nvim-cmp 的一个源插件,用于提供文件路径的补全功能。它可以根据当前路径自动补全文件和文件夹的路径,方便快速访问文件系统中的内容。
-
cmp_luasnip:
- 插件功能:cmp_luasnip 是 nvim-cmp 的一个插件,用于与 luaSnip 插件进行集成。它可以将 luaSnip 的代码片段作为补全选项,与其他补全源一起提供补全功能。
-
nvim-autopairs:
- 插件功能:nvim-autopairs 是一个自动补全括号、引号等字符的插件,它可以根据光标位置自动插入和匹配这些字符,提高编写代码的效率。它与 nvim-cmp 配合使用,可以在补全时自动处理括号的闭合。
其他插件
- gitsigns.nvim:
- gitsigns.nvim 是一个 Git 状态提示插件,用于在 Neovim 中显示 Git 仓库中修改的部分,并提供相关的操作和功能,如跳转到修改的位置、提交代码等。
- indent-blankline.nvim:
- indent-blankline.nvim 是一个缩进线插件,用于在 Neovim 中显示缩进的可视化效果,帮助用户更清晰地看到代码的缩进层级。
- nvim-colorizer.lua:
- nvim-colorizer.lua 是一个颜色预览插件,它可以在 Neovim 中将代码中的颜色值以真实的颜色显示,帮助用户更直观地理解和调整颜色。
- nvim-lspconfig:
- nvim-lspconfig 是一个用于配置 Neovim 内置 LSP 客户端的插件。它提供了一系列预定义的配置选项,使得用户可以轻松地配置和启用不同的语言服务器。
- ui:
- ui 涉及到 Neovim 的用户界面美化和定制化。这可能包括颜色方案、状态栏、标签栏等方面的插件和配置,用于改善用户界面的外观和体验。
- which-key.nvim:
- which-key.nvim 是一个按键提示和快捷键帮助插件,用于在 Neovim 中显示当前按键的操作提示,帮助用户更好地了解和使用快捷键。
- Comment.nvim:
- Comment.nvim 是一个注释插件,它提供了快速注释和取消注释的功能,简化了对代码进行注释的操作。
- mason.nvim:
- mason.nvim 是一个 HTML 和 CSS 的快速插入插件,它可以帮助用户更快速和方便地插入常用的 HTML 和 CSS 代码片段。
- nvterm:
- nvterm 是一个 Neovim 的终端仿真器,它将终端功能嵌入到 Neovim 中,使得用户可以在 Neovim 中直接执行命令和操作终端。
lsp
这部分内容以后再完善。
暂时不用的插件
以后可能也会用,先放在这了。
启动页: alpha-nvim.
重命名: renamer.nvim.
Terminal: toggleterm.nvim.
提供格式化、诊断: null-ls.nvim.
管理 tabs、buffers: bufferline.nvim.
七、报错解决
-
遇到一个报错
Error executing vim.schedule lua callback: /root/.config/nvim/lua/core/utils.lua:80: attempt to index a nil value
和 gpt 进行了探讨,
改了源码
vi .config/nvim/lua/core/utils.lu
第 80 行,插入了这句:mappings[section] = mappings[section] or {}
最终如下:
就好了。
自动补全
参考资料
- 如何安装和使用 Neovim
- 终于把 vim 弄成了 vscode 的模样
- nvim-basic-ide star 1.6k
- VapourNvim star 486
- NvChad star 17.5k
- 让你的 neovim 像 IDE 一样强大
- Mac电脑iterm中配置neovim入门与实践
- https://github.com/glepnir/nvim-lua-guide-zh
- Neovim 使用体验
- My Neovim setup for React, TypeScript, Tailwind CSS, etc
- folke/lazy.nvim
- NvChad: 最簡單且完整的 Vim 設置
- 让neovim更舒适的写代码
- 从零开始的现代化Vim配置指南
- Markdown Writing and Previewing in Neovim – A Complete Guide
- neovim/nvim-lspconfig
- 千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)
- Neovim 学习笔记 - 知乎
- Neovim的入门指南 - 知乎
- 我的现代化Neovim配置
- Neovim 配置实战:从 0 到 1 打造自己的 IDE