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

2023-11-06

之前我们介绍了基础配置部分和快捷键配置部分。如果你配置了这两个部分,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来重新下载
在这里插入图片描述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零开始配置 vim(11)——插件管理 的相关文章

随机推荐

  • ActivityOptions副屏启动

    ActivityOptions副屏启动 1 ActivityOptions 2 ActivityStarter转化为SafeActivityOptions 2 1 Request activityOptions 2 2 ActivityRe
  • 使用prompt在页面中弹出提示对话框

    根据用户输入星期一 星期日的不同 弹出不同信息提示对话框 要求使用函数实现
  • 【代码随想录】哈希表刷题

    哈希表 有效的字母异位词 赎金信 字母异位词分组 找到字符串中所有字母异位词 两个数组的交集 两个数组的交集II 快乐数 两数之和 四数相加 II 三数之和 四数之和 心得技巧 数据范围小 可以使用数组模拟哈希 想清楚什么作为哈希的 Key
  • VMware Workstation 15 安装教程

    哈喽 大家好 今天一起学习的是VMware Workstation 15的安装 vm虚拟机是小编非常喜欢的生产力软件 小编之前发布的测试教程钧在vm上进行的实验 VMware Workstation是一款功能强大的桌面虚拟计算机软件 它能够
  • python测试开发工具库汇总

    https github com china testing python api tesing blob master books md 有相关书籍下载 Web UI测试自动化 splinter web UI测试工具 基于selnium封
  • Step1-权限管理介绍

    一 相关操作界面 1 能实现角色级权限 RBAC 2 能实现功能级和数据级别权限 权限管理界面 角色管理界面 用户管理界面 角色和权限关系维护界面 用户和角色关系维护界面 主流开源权限管理框架有 Spring Security 和 Apac
  • Linux下安装配置Ftp服务器

    Linux环境中安装配置FTP服务 1 安装Vsftpd服务 1 查看Linux环境中是否已经存在安装的ftp 查看并显示安装的版本号 没有安装则不显示 rpm qa grep vsftpd 2 如果存在已经安装的Vsftpd服务 则先卸载
  • 素数判断(C语言)

    素数就是除了本身和1外 不能整除任何数 通过c语言来判断素数是很容易的 我们只需要做一个for循环就行了 让这个数对所有小于它的数求余数 如果余数都不为0 那就说明这是一个素数 逻辑整明白了 就上代码 如图 在这个程序里 我做了一个函数调用
  • MySQL的查询及删除重复记录

    查询及删除重复记录的方法 一 1 查找表中多余的重复记录 重复记录是根据单个字段 peopleId 来判断 select from people where peopleId in select peopleId from people g
  • vtk部分filter介绍

    vtkAdaptiveSubdivisionFilter 基于边缘和 或面积度量细分三角形 vtkAdaptiveSubdivisionFilter是一个基于最大边长和 或三角形区域细分三角形的滤镜 通过指定任何给定三角形可能具有的最大边长
  • 用生成器实现斐波那契数列。

    生成器 在 Python 中 使用了 yield 的函数被称为生成器 generator 跟普通函数不同的是 生成器是一个返回迭代器的函数 只能用于迭代操作 更简单点理解生成器就是一个迭代器 在调用生成器运行的过程中 每次遇到 yield
  • 在Pycharm中安装opencv出现pip无法更新等等问题

    问题背景 想在Pycharm上安装opencv进行双目视觉学习 出现了一系列问题 具体问题 1 pip无法更新到最新版本 ValueError Unable to find resource t64 exe in package pip v
  • 消息对话框--安卓练习3-5

    一 实验要求 在本例中设计了两种形式的对话框程序 一种是发出提示信息的普通对话框 一种是用户登录对话框 二 让我们先来看一下运行结果 方便我们清楚实验需求 三 源码分析 见注释 3 1 布局文件 activity main xml
  • 【LeetCode刷题】88、合并两个有序数组

    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序 排列 注意 最终
  • 【VulnHub系列】West-Wlid1.1

    实验信息 Kali 192 168 10 106 WestWild 192 168 104 实验过程 通过arp scan查找目标主机 确定目标主机IP192 168 10 104 sudo arp scan interface eth0
  • WebComponents.exe插件安装后依然提示安装插件解决问题方法

    使用海康威视的摄像头使用网页查看监控页面 提示需要安装插件 安装完成后打开网页查看依然提示安装插件 后来经过查询后发现安装插件后需要使用ie内核的浏览器打开才能加载此插件进行显示 解决方法就是使用ie内核如ie浏览器
  • 使用ulisesbocchio对spring-boot项目properties.yml(bootstrap.yml)配置文件加密

    Spring boot项目中properties文件中的密码明文上传到公开的远程仓库后 不安全 可以使用Ulisesbocchio对配置文件进行加密 1 添加maven依赖
  • Qt - 元对象系统 - 信号与槽_信号与槽连接(一对多)

    信号与槽 信号与槽连接 一对多 信号与槽的关联方式有如下特点 一个信号连接一个槽 connect sender SIGNAL single1 receiver SLOT slotFun 如 一个信号连接一个信号 connect sender
  • 未释放资源的教训,开发MongoDB连接一定要关闭连接

    废不少工夫将数据存储 全部迁移至mongodb 未作大量改动则是主因 但遇到奇怪的现象 程序跑起不久后 mongodb即假死 另起客户端想登陆mongodb都不成 要重启mongodb服务器才好转 分析原因是mongodb的连接池满掉且不释
  • 从零开始配置 vim(11)——插件管理

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