在 Neovim 中运行异步 Lua 函数

我正试图让 Vim 在白天自动更改主题,每 30 秒运行一次检查。我正在遵循 教程。但是,我想要将他的 Vimscript 函数使用 网站的帮助转换为 Lua。问题是,当我运行代码时,它在前台运行,这意味着我在杀死它之前无法做任何事情。

以下是 Vimscript 代码:

" 自动亮度模式/暗淡模式切换器
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")
    " 将所需位置添加到此处而不是 '@45 15'(我可能可以
    "将其变成一个变量)
    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) " 设置主题的初始调用
endfunction

call AutoDarkModeSetup()

这是我的 Lua 代码:

-- 自动亮度模式/暗淡模式切换器
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) -- 每 30 秒到期的计时器

  while true do
     if t1() then Sunshine() end
  end
end

AutoDarkModeSetup()

我通过简单地添加 require() 在我的 init.lua 中调用它。

如果我的问题太简单,请谅解,我以前从未在 Lua 中编写过代码。

点赞
用户13207428
用户13207428

你可以像这样使用vim.loop的定时器:

本地函数时间_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)和'light''dark'
    如果vim.o.bg〜= bg则vim.o.bg = bg
  end))
end
2021-08-18 10:07:32