neovim 安装使用备忘

记录配置 neovim 的过程。我已经是 vim 老鸟了,所以 vim 的相关内容就略去了。

零、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

image-20230608午前92200356

版本太老了,卸载掉。

sudo apt remove neovim
sudo apt remove neovim-runtime

更新为最新版本。 目前最新版本是0.9。下载安装包

wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz
tar zxvf nvim-linux64.tar.gz
./nvim-linux64/bin/nvim

image-20230608午前95003642

以下是默认配置。

image-20230608午前95041438

我把安装位置调整一下,再做个软链到系统路径:

mv nvim-linux64 /var/local
ln -s /var/local/nvim-linux64/bin/nvim /usr/local/bin/nvim

image-20230608午前95838484

二、安装 NvChad

NvChad screenshot

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

确认字体放好了:

image-20230608午前111528812

2.1.2 Mac 下

搜索”font“:

image-20230608午後51537344

把下好的字体文件拖进去:

image-20230608午後51506925

再在 item2 里配置使用这个字体:

image-20230608午後51630594

就大功告成了:

image-20230608午後52024117

image-20230608午後52050234

2.1.3 iOS 下

参考了 reddit 的这个回答:https://www.reddit.com/r/ish/comments/nuzvir/how_to_install_nerd_fonts/

  1. 下载 Fontcase

    IMG_6539

  2. 下载字体

    https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.2/SourceCodePro.zip
    

    扔到一个路径下。

  3. Fonts import & install

    IMG_6528

  4. install 后下载字体

    IMG_6529

  5. 需要在系统里安装,在路径 General > VPN & Device Management 里安装:

    IMG_6530

  6. 在具体的 app 里就可以使用导入的字体了。例如我在 iSH 里可以设置这个字体了:

    IMG_6531

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 ,然后按下回车执行来检查依赖是否齐全:

image-20230608午前101933265

Ps: 这个自动提示真的太好用辣

image-20230608午前102024652

发现问题还是挺多的。

image-20230608午前102422773

按照提示修复相关的问题。

三、Neovim 目录结构

image-20230608午前114025825

四、NvChad 快捷键/键盘映射

https://nvchad.com/docs/config/mappings

  • 默认映射在core.mappings中定义。

    vi /root/.config/nvim/lua/core/mappings.lua
    
  • 在 nvim 中可以使用NvCheatsheetTelescope keymaps来列出所有映射。

image-20230609午後41810233

不知道是什么原因,无论我怎么修改,快捷键就是没办法生效。

我查看了 tmux.conf vimrc bashrc zshrc 等相关的文件,目前还没法解决。

只能使用 Neovim 默认的组合快捷键 Ctrl+w 了,再加上其他按键。先这么用着虽然不太方便,以后再研究:

  • +hijk 就是左上下右的窗口激活
  • +w 返回上个窗口
  • +n/s 就是桌面横向分割
  • +v 就是桌面纵向分割
  • +o 就是关闭所有其他窗口
  • +r 左右窗口调换

image-20230609午後71841205

除此之外,还有(我不确定这些是谁的快捷键,但是在 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 即可进入管理界面,展示插件的加载状态, 安装和更新插件, 分析插件加载耗时等.

image-20230608午後10658703

Telescope 模糊搜索

telescope.nvim 由 Lua 实现, 支持扩展, 功能十分强大. 它几乎支持一切可以列在列表中的东西, 例如:

  • 文件内容模糊搜索
  • Tag 符号搜索
  • LSP 定义/引用搜索
  • 诊断信息预览
  • Treesitter 符号搜索
  • Git 提交记录搜索
  • Git 文件变动预览

可以检查是否安装好:

image-20230609午後61319808

后来我补完了 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)窗口。与另外两个插件一起配合完成工作。

  1. nvim-tree.lua:
    • nvim-tree.lua 是一个用 Lua 语言编写的文件浏览器插件,它能够在 Neovim 中显示和管理文件和目录结构。
    • 该插件提供了丰富的功能,如文件和目录的打开、创建、删除、复制、重命名等操作,同时支持图标化的文件显示。
  2. nvim-web-devicons:
    • nvim-web-devicons 是一个 Neovim 插件和工具库,用于为文件和目录添加图标显示。
    • 该工具库提供了一系列图标,用于根据文件类型、扩展名等信息在文件浏览器中显示相应的图标。

nvim-treesitter 语法高亮、代码导航

nvim-treesitter 提供强大的语法解析和代码分析功能,使你能够更高效地编写和理解代码。它使用 Tree-sitter 引擎,这是一种高效且可扩展的语法解析器,能够对各种编程语言进行快速而准确的语法分析。

nvim-treesitter 的功能包括:

  1. 语法高亮:通过基于语法树的准确分析,提供更准确和更丰富的语法高亮显示。
  2. 自动缩进:根据语法树的结构,自动调整代码的缩进,使代码更加清晰和可读。
  3. 智能缩写:根据语法树的理解,智能地扩展和补全代码的缩写。
  4. 智能选择和操作:根据语法树的知识,提供更智能的选择和操作功能,如选择函数、类、条件语句等。
  5. 代码导航:根据语法树的结构,提供跳转到定义、查找引用、代码浏览等功能,以方便代码导航和理解。
  6. 代码重构:基于语法树的信息,提供代码重构功能,如重命名变量、提取函数等。
  7. 错误和警告提示:根据语法树的分析,提供更准确的错误和警告提示,帮助你发现和修复代码中的问题。

我在 check的时候报了两个warning:

image-20230608午後30757726

nvim-cmp 框架

nvim-cmp 是一个用于 Neovim 的代码补全框架,旨在提供灵活、高度可配置和可扩展的代码补全功能。它的设计理念是为了满足不同用户的需求,并与其他插件和补全源进行集成。

下面是 nvim-cmp 框架的一些关键特点和功能:

  1. 多源支持:nvim-cmp 支持多种不同的补全源(completion source),如缓冲区补全、LSP 补全、路径补全等。这些源可以根据用户的配置和需求进行选择和定制。
  2. 强大的配置选项:nvim-cmp 提供了丰富的配置选项,可以通过 Lua 代码进行定制。用户可以根据自己的偏好和需求来配置补全的行为、外观和交互方式,从而实现个性化的补全体验。
  3. 异步处理:nvim-cmp 使用异步处理的方式来提高补全的响应速度和效率。它可以在后台进行补全源的数据获取和处理,避免阻塞用户的编辑操作。
  4. 插件集成:nvim-cmp 可以与其他插件进行集成,如语法检查插件、代码片段插件等。这使得补全可以更好地与其他功能和工具结合使用,提供更全面和强大的开发环境。
  5. 基于事件的触发器:nvim-cmp 提供了灵活的触发器机制,可以根据用户定义的规则和条件来触发补全功能。这使得补全可以在用户希望的时候自动触发,提供更无缝的开发体验。
  6. 智能排序和过滤:nvim-cmp 提供了智能的排序和过滤机制,可以根据上下文和用户输入来对补全候选项进行排序和过滤,确保最相关和最有用的选项优先显示。

在 NvChad 中它集成了下面这些插件:

  1. luaSnip:

    • 插件功能:luaSnip 是一个用于 Neovim 的代码片段插件,它允许你定义和使用代码片段,提高代码编写的效率。此外,使用luaSnip还可以帮助避免手写代码时出错的可能性。

    friendly-snippets:

    • 插件功能:friendly-snippets 是一个包含了大量常见编程语言的友好代码片段集合。它与 luaSnip 插件兼容,可以作为 luaSnip 的片段库使用,提供丰富的代码片段供选择。
  2. cmp-buffer:

    • 插件功能:cmp-buffer 是 nvim-cmp 的一个源插件,用于提供缓冲区(buffer)的补全候选项。它可以在当前打开的缓冲区中进行补全,提供相应的候选项供选择。
  3. cmp-nvim-lsp:

    • 插件功能:cmp-nvim-lsp 是 nvim-cmp 的一个源插件,用于与 Neovim 的内置 LSP 客户端进行集成。它可以获取 LSP 提供的补全信息,包括函数、变量、类型等,提供相关的补全候选项。
  4. cmp-nvim-lua:

    • 插件功能:cmp-nvim-lua 是 nvim-cmp 的一个源插件,用于提供 Lua 语言的补全支持。它可以识别 Lua 代码中的函数、变量等信息,并提供相关的补全选项。
  5. cmp-path:

    • 插件功能:cmp-path 是 nvim-cmp 的一个源插件,用于提供文件路径的补全功能。它可以根据当前路径自动补全文件和文件夹的路径,方便快速访问文件系统中的内容。
  6. cmp_luasnip:

    • 插件功能:cmp_luasnip 是 nvim-cmp 的一个插件,用于与 luaSnip 插件进行集成。它可以将 luaSnip 的代码片段作为补全选项,与其他补全源一起提供补全功能。
  7. nvim-autopairs:

    • 插件功能:nvim-autopairs 是一个自动补全括号、引号等字符的插件,它可以根据光标位置自动插入和匹配这些字符,提高编写代码的效率。它与 nvim-cmp 配合使用,可以在补全时自动处理括号的闭合。

其他插件

  1. gitsigns.nvim:
    • gitsigns.nvim 是一个 Git 状态提示插件,用于在 Neovim 中显示 Git 仓库中修改的部分,并提供相关的操作和功能,如跳转到修改的位置、提交代码等。
  2. indent-blankline.nvim:
    • indent-blankline.nvim 是一个缩进线插件,用于在 Neovim 中显示缩进的可视化效果,帮助用户更清晰地看到代码的缩进层级。
  3. nvim-colorizer.lua:
    • nvim-colorizer.lua 是一个颜色预览插件,它可以在 Neovim 中将代码中的颜色值以真实的颜色显示,帮助用户更直观地理解和调整颜色。
  4. nvim-lspconfig:
    • nvim-lspconfig 是一个用于配置 Neovim 内置 LSP 客户端的插件。它提供了一系列预定义的配置选项,使得用户可以轻松地配置和启用不同的语言服务器。
  5. ui:
    • ui 涉及到 Neovim 的用户界面美化和定制化。这可能包括颜色方案、状态栏、标签栏等方面的插件和配置,用于改善用户界面的外观和体验。
  6. which-key.nvim:
    • which-key.nvim 是一个按键提示和快捷键帮助插件,用于在 Neovim 中显示当前按键的操作提示,帮助用户更好地了解和使用快捷键。
  7. Comment.nvim:
    • Comment.nvim 是一个注释插件,它提供了快速注释和取消注释的功能,简化了对代码进行注释的操作。
  8. mason.nvim:
    • mason.nvim 是一个 HTML 和 CSS 的快速插入插件,它可以帮助用户更快速和方便地插入常用的 HTML 和 CSS 代码片段。
  9. nvterm:
    • nvterm 是一个 Neovim 的终端仿真器,它将终端功能嵌入到 Neovim 中,使得用户可以在 Neovim 中直接执行命令和操作终端。

lsp

这部分内容以后再完善。

暂时不用的插件

以后可能也会用,先放在这了。

启动页: alpha-nvim.

重命名: renamer.nvim.

Terminal: toggleterm.nvim.

提供格式化、诊断: null-ls.nvim.

管理 tabs、buffers: bufferline.nvim.

七、报错解决

  1. 遇到一个报错 Error executing vim.schedule lua callback: /root/.config/nvim/lua/core/utils.lua:80: attempt to index a nil value

    image-20230608午後05828970

    和 gpt 进行了探讨,

    image-20230608午後44051179

    改了源码 vi .config/nvim/lua/core/utils.lu 第 80 行,插入了这句:

    mappings[section] = mappings[section] or {}
    

    最终如下:

    image-20230608午後10143234

    就好了。

    自动补全

    image-20230608午後41100143

参考资料


mac 下怎么批量去掉文本文件中的每行^M ipad 下的终端工具 iSH