From f62c0d4f222b7777e7097924cd12899e07a7e806 Mon Sep 17 00:00:00 2001 From: hoob3rt <41551030+hoob3rt@users.noreply.github.com> Date: Mon, 4 Jan 2021 01:38:01 +0100 Subject: [PATCH] added initial async support (#20) * added inital async setup * update README.md --- README.md | 2 + lua/lualine/async.lua | 75 +++++++++++++++++++++++++++++++ lua/lualine/components/branch.lua | 26 ++++++++--- 3 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 lua/lualine/async.lua diff --git a/README.md b/README.md index 7ac0cff..31d7a23 100644 --- a/README.md +++ b/README.md @@ -229,6 +229,8 @@ EOF ## TODO's Please create an issue/ pr if you want to see more functionality implemented - General + - [x] async support + - [ ] additional settings for components - [ ] create doc file - Components - [x] branch component diff --git a/lua/lualine/async.lua b/lua/lualine/async.lua new file mode 100644 index 0000000..fba27f6 --- /dev/null +++ b/lua/lualine/async.lua @@ -0,0 +1,75 @@ +local M = {} + +function M:new(args) + args = args or {} + for index, arg in pairs(args) do + self[index] = arg + end + setmetatable(args, self) + self.__index = self + return args +end + +local function close_pipe(pipe) + if pipe ~= nil and not pipe:is_closing() then + pipe:close() + end +end + +function M.close_all() + close_pipe(M.stdin) + close_pipe(M.stderr) + close_pipe(M.stdout) + close_pipe(M.handle) +end + +function M.init_options() + local options = {} + local args = vim.fn.split(M.cmd, ' ') + M.stdin = vim.loop.new_pipe(false) + M.stdout = vim.loop.new_pipe(false) + M.stderr = vim.loop.new_pipe(false) + options.command = table.remove(args, 1) + options.args = args + options.stdio = { + M.stdin, + M.stdout, + M.stderr + } + if M.cwd then + options.cwd = M.cwd + end + if M.env then + options.env = M.env + end + if M.detach then + options.detach = M.detach + end + return options +end + +function M.start() + local options = M.init_options() + M.handle = vim.loop.spawn(options.command, options, vim.schedule_wrap(M.stop)) + if M.on_stdout then + M.stdout:read_start(vim.schedule_wrap(M.on_stdout)) + end + if M.on_stderr then + M.stderr:read_start(vim.schedule_wrap(M.on_stderr)) + end +end + +function M.stop(code, signal) + if M.on_exit then + M.on_exit(code, signal) + end + if M.on_stdout then + M.stdout:read_stop() + end + if M.on_stderr then + M.stderr:read_stop() + end + M.close_all() +end + +return M diff --git a/lua/lualine/components/branch.lua b/lua/lualine/components/branch.lua index bb0ee9a..1600e2f 100644 --- a/lua/lualine/components/branch.lua +++ b/lua/lualine/components/branch.lua @@ -1,11 +1,23 @@ -local function Branch() - local branch = vim.fn.systemlist( - 'cd '..vim.fn.expand('%:p:h:S')..' 2>/dev/null && git status --porcelain -b 2>/dev/null')[1] - if not branch or #branch == 0 then - return '' +local async = require('lualine.async') + +local branch + +local git_branch = async:new({ + cmd = 'git branch --show-current', + on_stdout = function(_, data) + if data then + branch = data:gsub('\n', '') + end end - branch = branch:gsub([[^## No commits yet on (%w+)$]], '%1') - branch = branch:gsub([[^##%s+(%w+).*$]], '%1') +}) + +local timer = vim.loop.new_timer() +timer:start(0, 1000, vim.schedule_wrap(function() + git_branch:start() +end)) + +local function Branch() + if not branch or #branch == 0 then return '' end local ok,devicons = pcall(require,'nvim-web-devicons') if ok then local icon = devicons.get_icon('git')