Yang

给NeoVim启动页加点有趣的宜忌文案

0 views
2 mins

在 Github 冲浪的时候偶然间看到一个NeoVim的欢迎页面,效果看起来蛮好看的,就动手折腾了下,官方预览如下: image.png

仓库地址:nvimdev/dashboard-nvim

其实最感兴趣的其实是其中的每日宜忌,但是搜了下仓库没找到相关的说明,作者的Nvim配置文件也没找到,只找到了一个相关的问题:Hyper图片里的宜忌是怎么实现的 回答里有个兄弟提供了一种思路,就是通过 lua 调用其他语言的脚本,来动态获取每日宜忌,渲染到欢迎页面上,这里我用 Nodejs来实现了。

安装

首先下载安装nvimdev/dashboard-nvim 插件,这里因为我使用的是 LazyVim, 已经内置了 dashboard-nvim 插件,所以不需要再安装。如果你使用的是其他的插件管理器,可以参考官方文档进行安装。

配置

获取每日宜忌

这里使用了 lunar 这个库来获取每日宜忌,通过官方提供的 CDN 地址下载 lunar.js 文件。 创建 .config/nvim/scripts 目录,将下载的文件放在目录下,并新建 yiji.js 文件,内容如下:

 
1
const { Lunar } = require("./lunar");
2
const d = Lunar.fromDate(new Date());
3
4
const yi = d.getDayYi().join(" ");
5
const ji = d.getDayJi().join(" ");
6
7
function getTodayYiJi() {
8
return {
9
yi,
10
ji,
11
};
12
}
13
14
module.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")"

 
1
local cmd = "node -e \"console.log(require('${HOME}/.config/nvim/scripts/yiji.js').getTodayYiJi())\""
2
local handle = io.popen(cmd)
3
local result = handle:read("*a")
4
5
handle:close()
6
local 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" then
48
vim.cmd.close()
49
vim.api.nvim_create_autocmd("User", {
50
pattern = "DashboardLoaded",
51
callback = function()
52
require("lazy").show()
53
end,
54
})
55
end
56
57
return opts
58
end,
59
},

配置详情可以查看我的 dotfiles

最终效果预览

image.png