• 亮色
  • 深色
  • 自动
  • RSS 订阅

    neovim 配置学习(1

    2024-05-11

    要求

    我使用的系统环境是 Linux Debian 12,对于非 Debian 系的系统而言可能需要根据其特定的操作系统视情况修改命令。

    用的是 Lua 语言编写 neovim 的配置文件,如果要看懂的话,可能需要学习一下相关的知识。配置文件中的一些参数可以查阅文章末尾参考列表中给出的相关链接阅读。

    安装

    首先便是安装 neovim,对于大多数的主流 Linux 发行版来说,通常可以在其自带的软件源仓库里进行安装,如果嫌仓库里的老,也可以到 neovim/neovim 上下载。

    下载截止此文发布时最新版本的 neovim 0.9.5:

    # or curl -fsSLO https://github.com/neovim/neovim/releases/download/v0.9.5/nvim-linux64.tar.gz
    wget https://github.com/neovim/neovim/releases/download/v0.9.5/nvim-linux64.tar.gz
    

    给全局用户安装

    此操作需要 root 权限,可以使用 sudo 或是 su 命令切换到 root 用户后再进行操作。下面是使用 sudo 进行操作的演示:

    # 文件移动到 /opt 目录下
    sudo mv nvim-linux64.tar.gz /opt/
    # 切换到 /opt 目录下
    cd /opt
    # 解压
    sudo tar zxvf nvim-linux64.tar.gz
    # 删除 neovim 压缩包
    sudo rm -f nvim-linux64.tar.gz
    # 创建 neovim 二进制程序软链接
    sudo cp -s /opt/nvim-linux64/bin/nvim /bin/nvim
    

    然后使用 nvim 命令即可调用 neovim。

    给当前用户安装

    此操作无需 root 权限。下面是操作演示:

    # 创建 ${HOME}/.local/share 目录
    mkdir -p ${HOME}/.local/share
    # 文件移动到 ${HOME}/.local/share 目录下
    mv nvim-linux64.tar.gz ${HOME}/.local/share/
    # 进入到 ${HOME}/.local/share 目录下
    cd ${HOME}/.local/share/
    # 解压
    tar zxvf nvim-linux64.tar.gz
    # 删除 neovim 压缩包
    rm -f nvim-linux64.tar.gz
    # 创建存放二进制文件用的目录
    mkdir -p ${HOME}/.local/bin
    # 创建 neovim 二进制程序软链接
    cp -s ${HOME}/.local/share/nvim-linux64/bin/nvim ${HOME}/.local/bin/nvim
    # 将存放二进制文件用的目录添加到环境变量中, 对于 bash SHELL 是像下面这样
    echo PATH="${HOME}/.local/bin:$PATH" >> ${HOME}/.bashrc
    

    而后执行如下命令应用更新后的 ${HOME}/.bashrc

    source ${HOME}/.bashrc
    

    然后当前用户使用 nvim 命令即可调用 neovim。

    如果要设置成默认的终端编辑器,可以添加 export EDITOR='nvim'${HOME}/.bashrc 中(对于 bash shell 用户)。

    配置

    基础配置

    neovim 默认会去读取当前用户下的 ~/.config/nvim/ 里的 init.viminit.lua 文件。这里使用 lua 来编写。

    在 shell 里 ~ 值与 ${HOME} 值是相同的。

    于是来创建第一个配置文件:

    # 创建存放配置文件的目录
    mkdir -p ~/.config/nvim/lua
    

    由于 neovim 与 vim 完全兼容,所以能够使用一些 vim 的配置也不奇怪。

    然后创建 ~/.config/nvim/init.lua 文件,填入如下内容:

    -- 继承上一行缩进
    vim.o.autoindent = true
    
    -- 制表符转空格
    vim.o.expandtab  = true
    
    -- 使用 4 个空格缩进, 相当于按 Tab 键会有 4 个空格
    vim.o.tabstop    = 4
    
    -- 按下 tab 键时缩进 4 个空格
    vim.o.shiftwidth = 4
    
    -- 移动行的时候, 缩进转为最接近的 shiftwidth 倍数
    vim.o.shiftround = true
    
    -- 突出显示当前光标所在行
    vim.o.cursorline = true
    
    -- 显示行号
    vim.o.number     = true
    
    -- 显示相对行号, 不启用显示行号的话, 文件第一行会被判定为第 0 行
    vim.o.rnu        = true
    
    -- 始终显示状态栏
    vim.o.laststatus = 2
    
    -- 在所有模式下启用鼠标
    vim.o.mouse      = "a"
    
    -- 启用英语拼写检查
    vim.o.spell      = true
    vim.o.spelllang  = "en_us"
    
    -- 使用系统剪贴板,好像只能鼠标右键复制时才会把内容复制到系统剪贴板
    vim.o.clipboard = "unnamed"
    
    -- 启用特定于文件类型的缩进规则
    -- 启用语法高亮
    vim.cmd([[
      filetype indent on
      syntax enable
    ]])
    
    

    第三方插件

    安装插件管理器 lazy.nvim

    看了下比较新的 neovim 配置教程的插件管理器都是用的这个,所以这里也用这个。

    警告

    这个插件依赖 neovim >= 0.8.0 和 git >= 2.19.0,neovim 可以装二进制倒是没什么,但是在一些老的系统上 git 可能比较老,导致可能用不了这个插件,所以在一些老的服务器上可能需要注意一下。

    使用这个插件管理器建议安装并配置终端使用一个 Nerd Font(个人推荐 Mononoki Nerd Font)。

    为了分解各个模块的功能,这里将第三方插件和入口文件区分开来,放到其它的模块里。在 neovim 里,要导入其他的 lua 模块,需要在 ~/.config/nvim/ 下创建 lua 文件夹,存放模块。而后在要用到对应模块的地方,使用 文件名.lua 中的文件名进行导入。例如对于如下目录结构:

    ── init.lua
    └── lua
        └── lazy-plugins.lua
    

    init.lua 要导入 lua/lazy-plugins.lua 模块,只需指定 lazy-plugins,无需指定 lua/ 目录以及文件名后缀 .lua

    所以为了分解模块,我们首先需要创建 ~/.config/nvim/lua 目录:

    mkdir -p ~/.config/nvim/lua
    

    而后我们将 lazy.nvim 的安装放在 lazy-plugins 模块中,就是创建 ~/.config/nvim/lua/lazy-plugins.lua 文件,然后向其中添加如下内容来安装 lazy.nvim:

    local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
    if not (vim.uv or vim.loop).fs_stat(lazypath) then
      vim.fn.system({
        "git",
        "clone",
        "--filter=blob:none",
        "https://github.com/folke/lazy.nvim.git",
        "--branch=stable", -- latest stable release
        lazypath,
      })
    end
    vim.opt.rtp:prepend(lazypath)
    

    然后再在 ~/.config/nvim/init.lua 导入它,在 ~/.config/nvim/init.lua 文件末尾添加:

    
    -- lazy.nvim
    require('lazy-plugins')
    

    这里编辑完 ~/.config/nvim/init.lua 后,重新执行一下 nvim 命令,neovim 会去拉去安装 lazy.nvim,这个过程中界面上什么都不会显示。

    lazy.nvim 插件管理窗口

    在安装了 lazy.nvim 后,可以在 nvim 里使用 :Lazy 打开插件管理器。大概会弹出如下这样的窗口:

    q 键可以退出这个窗口。

    安装主题插件

    可以把主题当成插件看待。

    可以在 neovim-colorscheme · GitHub Topics · GitHub 上找 neovim 的主题。

    这里使用 folke/tokyonight.nvim 主题作为演示,这个主题的安装的方式仓库里也有说,所以这里照着敲就行了。

    再次编辑 ~/.config/nvim/lua/lazy-plugins.lua 文件,在文件末尾添加如下内容以安装这个主题:

    
    -- install plugins
    require("lazy").setup({
        {
            "folke/tokyonight.nvim",
            -- 因为主题应该在一打开就显示,所以需要禁用延迟加载
            lazy = false,
            -- 为了确保能够最先渲染主题,将其优先级设置为 1000
            priority = 1000,
        },
    });
    

    其实 require("lazy").setup() 就相当于 lazy.nvim 的插件注册表,当其中添加插件时,下一次打开 neovim,lazy.nvim 就会去下载其中的插件。

    对于删除插件的方式,可以看 删除主题插件 一节。

    可以在安装插件时就设置好主题,也可以在安装插件后,在其它地方设置主题,下面分别演示这两者。

    配置主题方式一:安装插件时顺带配置主题

    还是在 ~/.config/nvim/lua/lazy-plugins.lua 文件里,相当于加一些附加操作:

    
    -- install plugins
    require("lazy").setup({
        {
            "folke/tokyonight.nvim",
            -- 因为主题应该在一打开就显示,所以需要禁用延迟加载
            lazy = false,
            -- 为了确保能够最先渲染主题,将其优先级设置为 1000
            priority = 1000,
            config = function()
              -- 在这里加载主题
              vim.cmd([[colorscheme tokyonight]])
            end,
        },
    });
    
    配置主题方式二:安装插件后在其他地方配置主题

    假如要在 ~/.config/nvim/init.lua 里自己指定主题,可以在 ~/.config/nvim/init.lua 的文件末尾添加如下内容:

    -- or vim.cmd([[colorscheme tokyonight-day]])
    vim.cmd.colorscheme("tokyonight-day")
    

    必须要在导入 lazy-plugins 之后才能指定 lazy.nvim 中安装的主题。

    这种优先级比较高。

    删除主题插件

    如果不是在安装主题插件时指定的 neovim,例如通过 安装插件后在其他地方配置主题 方式配置主题,那最好先到对应到的位置删掉主题配置,不然主题被删掉后打开 neovim 会找不到对应的主题(当然到时再删其实也没什么)。

    如果是 安装插件时顺带配置主题 的话,则不需要额外操作。

    编辑 ~/.config/nvim/lua/lazy-plugins.lua 文件,移除掉刚刚安装的主题插件:

    require("lazy").setup({});
    

    然后保存文件,再打开 lazy.nvim 插件管理窗口,这时应该会显示如下图:

    输入大 X,就会去删除不存在于 require("lazy").setup({}); 插件注册表中的插件了,这里会去删掉 tokyonight.nvim 插件。

    参考