试着用 luv 写个读取文件内容方法,实在是写不下去

2022-09-11 19:35:38 +08:00
 haoliang
local uv = vim.loop

local readall = function(path, callback)
  uv.fs_open(path, "r", 384, function(open_err, fd)
    assert(open_err == nil, open_err)
    uv.fs_stat(path, function(stat_err, stat)
      assert(stat_err == nil, stat_err)
      uv.fs_read(fd, stat.size, 0, function(read_err, data)
        assert(read_err == nil, read_err)
        assert(#data == stat.size)
        uv.fs_close(fd, function(close_err, success)
          assert(close_err == nil, close_err)
          assert(success)
          callback(data)
        end)
      end)
    end)
  end)
end

readall("/tmp/seq30", function(data)
  for _, line in ipairs(vim.split(data, "\n")) do
    print(line)
  end
end)

贴出来给大家瞅瞅啊。

其实就一个 io.lines(path),写完上面这篇代码我不由得犹豫,我就写个小插件,有必要强上异步吗? 还只是个这么简单的需求。

( vim.loop 是 neovim 提供的 libuv/luv 访问入口)

1360 次点击
所在节点    程序员
3 条回复
pursuer
2022-09-11 20:07:06 +08:00
vim 不熟悉,不过 lua 有 promise 的实现,lua 中还可以用 yield 模拟 async/await 协程。
haoliang
2022-09-11 23:11:25 +08:00
谢谢回复!巧了,我从聊天室里听到了相关的实现
* https://github.com/kevinhwang91/promise-async
* https://github.com/notomo/promise.nvim

不过这两天的相关 lua 使用体验,我暂时不想用这种异步了; thread 、process 这样的一般实现我觉得够用,自己写的插件性能消耗可控
zhuangzhuang1988
2022-09-12 20:05:05 +08:00
lua 的官方书上 有用 协程 举例 libuv 的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879326

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX