asynchronous - 在 Neovim 中运行异步 Lua 函数
问题描述
我试图让 Vim 在白天自动改变它的主题,每 30 秒运行一次检查。我正在遵循本指南。但是,我想在这个网站的帮助下将他的 Vimscript 函数移植到 Lua。问题是,当我运行它在前台运行的代码时,这意味着在我杀死它之前我什么都做不了。
这是 Vimscript 代码:
" Automatic light mode / dark mode switcher
function! ChangeColorScheme(channel, msg)
let time = trim(a:msg)
if time ==# "day"
call LightMode()
else
call DarkMode()
endif
endfunction
function! Sunshine(timer)
if executable("sunshine")
" Add your desired location here instead of '@45 15' (I probably could have
" made it into a variable)
let job = job_start(["sunshine", "-s", "@45 15"], {"out_cb": "ChangeColorScheme"})
else
call DarkMode()
endif
endfunction
function! AutoDarkModeSetup()
let timer = timer_start(30000, 'Sunshine', {'repeat': -1})
call Sunshine(timer) " Initial call to setup the theme
endfunction
call AutoDarkModeSetup()
这是我的 Lua 代码:
-- Automatic light mode / dark mode switcher
local loop = vim.loop
local cmd = vim.cmd
local stat = require("posix.sys.stat")
local socket = require ("socket")
local gettime = socket.gettime
function LightMode()
cmd [[colorscheme github]]
end
function DarkMode()
cmd [[colorscheme dracula]]
end
function trim(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
function ChangeColorScheme(msg)
local time = trim(msg)
if time == "day" then
return LightMode()
else
return DarkMode()
end
end
function Sunshine()
if stat["/usr/local/bin/sunshine"] then
job = loop.spawn('sunshine', {
args = {'-s', '@36 30'},
stdio = {nil,stdout,stderr}
},
vim.schedule_wrap(function()
stdout:read_stop()
stderr:read_stop()
stdout:close()
stderr:close()
job:close()
setQF()
end
)
)
loop.read_start(stdout, ChangeColorScheme)
loop.read_start(stderr, ChangeColorScheme)
else
return DarkMode()
end
end
function AutoDarkModeSetup()
local function timer(seconds)
local exp_time = gettime() + seconds
return function()
if gettime() < exp_time then return false end
exp_time = exp_time + seconds
return true
end
end
local t1 = timer(30) -- a timer that expires every 30 seconds
while true do
if t1() then Sunshine() end
end
end
AutoDarkModeSetup()
我在我的 init.lua 中通过简单地添加一个 require() 来调用它。
如果我的问题太明显,我深表歉意,我以前从未在 Lua 中编写过代码。
解决方案
您可以timer
像这样使用 vim.loop:
local function time_background()
local timer = vim.loop.new_timer()
timer:start(0, 600, vim.schedule_wrap(function()
local hour = tonumber(os.date('%H'))
local bg = (hour > 6 and hour < 18) and 'light' or 'dark'
if vim.o.bg ~= bg then vim.o.bg = bg end
end))
end
推荐阅读
- excel - 使用数组变量中的工作表数据创建图表
- php - 没有内置函数的数组键比较
- gradle - 在本地或 CI 中构建时如何在 Gradle 中的存储库之间切换
- docker - 在 Ubuntu Docker 容器中安装 Informix CSDK
- c++ - 为什么下面班级的大小是8
- linux - 用于 linux Debian 和 Arch 的 Docker 撰写文件
- android - Kotlin 多平台使用动态交付?
- python - python过滤器+多处理+迭代器延迟加载
- react-native - React-Native:如何知道渲染何时完成
- terraform - Terraform 依赖于其他资源的无效计数参数