在 Github 冲浪的时候偶然间看到一个NeoVim的欢迎页面,效果看起来蛮好看的,就动手折腾了下,官方预览如下:
其实最感兴趣的其实是其中的每日宜忌,但是搜了下仓库没找到相关的说明,作者的Nvim配置文件也没找到,只找到了一个相关的问题:Hyper图片里的宜忌是怎么实现的 回答里有个兄弟提供了一种思路,就是通过 lua 调用其他语言的脚本,来动态获取每日宜忌,渲染到欢迎页面上,这里我用 Nodejs来实现了。
安装
首先下载安装nvimdev/dashboard-nvim 插件,这里因为我使用的是 LazyVim, 已经内置了 dashboard-nvim 插件,所以不需要再安装。如果你使用的是其他的插件管理器,可以参考官方文档进行安装。
配置
获取每日宜忌
这里使用了 lunar 这个库来获取每日宜忌,通过官方提供的 CDN 地址下载 lunar.js
文件。
创建 .config/nvim/scripts
目录,将下载的文件放在目录下,并新建 yiji.js
文件,内容如下:
1const { Lunar } = require("./lunar");2const d = Lunar.fromDate(new Date());3
4const yi = d.getDayYi().join(" ");5const ji = d.getDayJi().join(" ");6
7function getTodayYiJi() {8 return {9 yi,10 ji,11 };12}13
14module.exports = {15 getTodayYiJi,16};
LazyVim 配置
主题需要选择 hyper
,并且开启 week_header
,因为宜忌效果展示需要通过 week_header
的 concat
属性来实现,其他配置可以参考官方文档。
另外我这里还自定义了一些常用的 shortcut
等,具体的配置可以查看官方文档。
宜忌的实现主要通过下面这段代码实现, 通过 node -e
命令来执行 yiji.js
文件,获取到每日宜忌, 使用 lua 的 io.popen
来执行命令,获取到结果。
再通过 string.match
来匹配到 yi
的值,最后将值通过 week_header
的 concat
属性来渲染到页面上。
! node -e 或者 —eval 是一个命令行选项,它允许你在命令行中执行 JavaScript 代码。当你在命令行中使用 node -e 并跟随一些 JavaScript 代码时,Node.js 将立即执行该代码并退出。
node -e "console.log("Hello World")"
1local cmd = "node -e \"console.log(require('${HOME}/.config/nvim/scripts/yiji.js').getTodayYiJi())\""2local handle = io.popen(cmd)3local result = handle:read("*a")4
5handle:close()6local yi = string.match(result, "yi: '(.*)',")
另外需要注意的是因为我这里是 Mac 系统,所以使用了 HOME
环境变量来获取到脚本目录,其他系统需要自己查询下环境变量的获取,或者直接写绝对路径。
完整的配置如下:
1{2 "nvimdev/dashboard-nvim",3 event = "VimEnter",4 opts = function()5 -- 宜忌6 local cmd = "node -e \"console.log(require('${HOME}/.config/nvim/scripts/yiji.js').getTodayYiJi())\""7 local handle = io.popen(cmd)8 local result = handle:read("*a")9
10 handle:close()11 local yi = string.match(result, "yi: '(.*)',")12 -- 宜忌13 local opts = {14 theme = "hyper",15 hide = {16 statusline = false,17 },18 config = {19 packages = { enable = true },20 week_header = {21 enable = true,22 concat = yi,23 },24 shortcut = {25 {26 icon = " ",27 icon_hl = "@variable",28 desc = "Files",29 group = "Label",30 action = "Telescope find_files",31 key = "f",32 },33 { action = "Lazy", group = "@property", desc = " Lazy", icon = " ", key = "l" },34 { action = "LazyExtras", group = "DiagnosticHint", desc = " Lazy Extras", icon = " ", key = "x" },35 { action = "Telescope live_grep", group = "Number", desc = " Find Text", icon = " ", key = "g" },36 { action = 'lua require("persistence").load()', desc = " Restore Session", icon = " ", key = "s" },37 { action = "qa", desc = " Quit", icon = " ", key = "q" },38 },39 footer = function()40 local stats = require("lazy").stats()41 local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)42 return { "⚡ Neovim loaded " .. stats.loaded .. "/" .. stats.count .. " plugins in " .. ms .. "ms" }43 end,44 },45 }46
47 if vim.o.filetype == "lazy" then48 vim.cmd.close()49 vim.api.nvim_create_autocmd("User", {50 pattern = "DashboardLoaded",51 callback = function()52 require("lazy").show()53 end,54 })55 end56
57 return opts58 end,59 },
配置详情可以查看我的 dotfiles