从零开始配置 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来重新下载


1.png

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容