• 从零开始配置 vim(11)——插件管理


    之前我们介绍了基础配置部分和快捷键配置部分。如果你配置了这两个部分,vim已经算是比较好用了。但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心。vim比较强大的一点是它拥有丰富的插件系统。大量高手在上面为它开发各种形式的插件。今天我们将从插件管理开始,利用前人的成果丰富我们的vim功能

    使用lua添加自动命令组

    在正式开始介绍插件之前我们先优化一下加载配置文件的时机。之前我们介绍自动命令的时候已经给出了如何自动加载配置

    augroup NVIMRC
    autocmd!
    autocmd BufWritePost init.lua source %
    augroup END
    

    在使用vimscript的场合它可以正常工作。但是如何在 neovim中配置它呢?
    目前有两种解决办法

    使用新版 neovim api

    neovim0.7 版本以后,我们可以使用下列 api 来创建并使用自动命令组

    • nvim_create_augroup({name}, {*opts}) : 创建自动命令组,如果创建成功,返回自动命令组的id
    • nvim_create_autocmd({event}, {*opts}):创建自动命令。

    nvim_create_augroup 传递一个自动命令组的名称,另外它可以接受一个 table 作为属性值,目前属性值可以传入一个 clear 的布尔值,相当于是否执行 autocmd!

    nvim_create_autocmd,第一个参数是一个或者多个事件字符串组成的 table,它的含义与 autocmd 中的事件相同,用的字符串也相同。第二个参数是一个表示属性的 table。常用的有:

    • group: 所属自动命令组
    • pattern: autocmd中的 pattern部分
    • callback: 一个lua的回调函数,当事件发生时,调用该回调函数
    • command: 该字段可以填入一个 vim命令的字符串,相当于 autocmd中的 command部分

    我们要将上述代码改为 lua 版本,首先使用创建一个自动命令组

    local nvimrc = vim.api.nvim_create_augroup("NVIMRC", {clear = true})
    

    接着为了方便我们使用 command 字段来完成这个自动命令

    vim.api.nvim_create_autocmd({"BufWritePost"}, {
        pattern = "init.lua",
        group = nvimrc,
        command = "source %"
    })
    

    在上一篇文章中,我们已经初步有了划分模块的概念。随着配置的越来越多,以后在 init.lua 中一定伴随着大量的 require。我们可以通过 gf 快速跳转到对应的模块,但是前提条件是我们已经设置了 path 变量。每次退出 nvim 再进来,需要重新设置,有没有觉得很麻烦呢?如果我们使用自动命令组,在进入 init.lua 之后自动设置 path 就好了。我们学会了使用自动命令组之后,来自己实现这个需求

    vim.api.nvim_create_autocmd({"BufWritePost"}, {
        pattern = "init.lua",
        group = nvimrc,
        callback = function()
          vim.o.path = vim.o.path .. ",**/*"
        end
    })
    

    path 中可以添加多个路径作为文件搜索的路径,多个路径之间以 , 分割。我们之前说过可以使用 **/* 表示当前目录下所有文件。这样退出重新进入 nvim 之后不需要再次手动输入 path 了。

    在lua中执行vim命令

    在 0.7以前的版本中无法通过上述api来创建自动命令。但是它提供了执行vim命令的接口。

    我们可以使用 vim.cmd 来执行 vim 命令。它接收一个字符串参数,该字符串表示将要执行的 vim 命令。可以使用引号括起来,但是需要对其中的特殊字符进行转义。也可以使用 [[]] 来括起来,此时就不需要进行转义了。使用上述函数我们可以很轻松的实现上面的功能

    vim.cmd[[
      augroup NVIMRC
        autocmd!
        autocmd BufWritePost init.lua source %
        autocmd BufReadPost init.lua set path+=**/*
      augroup END
    ]]
    

    两种方式各有千秋,但是既然使用 lua做配置,那么我想的是能使用 lua的地方尽量用 lua。

    为了照顾还在使用 0.6 版本的小伙伴,我们先进行一下版本判断。最后的代码如下所示

    if vim.fn.has "nvim-0.7" then
      local nvimrc = vim.api.nvim_create_augroup("NVIMRC", {clear = true})
      vim.api.nvim_create_autocmd({"BufWritePost"}, {
        pattern = "init.lua",
        group = nvimrc,
        command = "source %"
      })
      
      vim.api.nvim_create_autocmd({"BufWritePost"}, {
        pattern = "init.lua",
        group = nvimrc,
        callback = function()
          vim.o.path = vim.o.path .. ",**/*"
        end
      })
    else
      vim.cmd[[
        augroup NVIMRC
          autocmd!
          autocmd BufWritePost init.lua source %
          autocmd BufReadPost init.lua set path+=**/*
          augroup END
      ]]
    end
    

    我将这段代码放到了 lua/autocmd.lua 中。所以我需要在 init.lua 中加载这个文件

    require("autocmd")
    

    插件管理

    在新版 neovim (版本大于 0.5 ) 中,一般推荐使用 packer 这个插件管理工具。

    根据官方的描述,我们使用如下方式来进行安装

    git clone --depth 1 https://github.com/wbthomason/packer.nvim\
     ~/.local/share/nvim/site/pack/packer/start/packer.nvim
    

    根据官方的描述,我们可以在 lua/plugins.lua 中添加插件管理相关的代码。

    return require('packer').startup(function(use)
          -- Packer can manage itself
          use 'wbthomason/packer.nvim'
          -- 添加另外插件
    end)
    

    接着我们需要在 init.lua 中加载这个文件

    require("plugins")
    

    后面我们可以使用下面的一些命令来对插件进行管理

    • PackerInstall:先清理不需要的插件然后安装插件
    • PackerClean: 清理不需要的插件
    • PackerUpdate:先清理插件,然后更新已有的插件,再安装暂时没有的插件
    • PackerSync: 包括 PackerCleanPackerUpdate 的功能

    根据官方的描述,不管是要增删改哪些插件,都可以用 PackerSync 这一条命令搞定。

    完成之后我们可以使用 q来退出,如果出错可以使用 r来重新下载
    在这里插入图片描述

    本篇就到这里了。后面几篇文章主要通过该插件管理工具来下载并配置一些插件,敬请期待!

  • 相关阅读:
    webAPI身份验证
    vs调试的时候debug和release的区别
    webapi put 请求405问题
    WebApi跨域问题解决
    多车轨道路径规划算法设计
    Re:从零开始学流媒体(一):视频跳转、206、chunked、动态URL、断点续传
    Java面试题总结论(二)-IOC、AOP、Spring、注解
    Java面试题总结论(一)-数据结构
    从零开始部署发布Java项目到服务器的Docker中
    10天,从.Net转Java,并找到月薪2W的工作(三)
  • 原文地址:https://www.cnblogs.com/lanuage/p/16571100.html
Copyright © 2020-2023  润新知