0
0
Просмотр исходного кода

fix(neovim): handle flaky TUIs

Joe 10 месяцев назад
Родитель
Сommit
dea667f201
1 измененных файлов с 55 добавлено и 13 удалено
  1. 55 13
      .config/nvim/lua/plugins/floatingterminal.lua

+ 55 - 13
.config/nvim/lua/plugins/floatingterminal.lua

@@ -6,10 +6,61 @@ return {
         lazy = false,
         config = function()
             local lab = require('like-a-butterfly')
+            local augroup = vim.api.nvim_create_augroup(
+                'like-a-butterfly', { clear = true })
             -- Configure eight homerow terminals
-            function MakeTerm(shortcut, name, command)
+            -- Some TUIs are "flaky" (*cough* lazygit *cough*), and don't redraw
+            -- properly after being hidden. We try to fix this by aggressively
+            -- resizing and redrawing flaky programs' windows.
+            function MakeTerm(shortcut, name, command, flaky)
                 lab.create_term(name, command)
                 vim.keymap.set("n", shortcut, function()
+                    if flaky then
+                        local flaky_redraw_time = 10
+                        vim.api.nvim_create_autocmd({ "BufEnter" },
+                            {
+                                pattern = { "*" },
+                                group = augroup,
+                                once = true,
+                                callback = function()
+                                    if (vim.bo.filetype ~= "butterfly") then
+                                        return
+                                    end
+                                    local window = vim.api
+                                        .nvim_get_current_win()
+                                    vim.cmd(
+                                        "setlocal sidescrolloff=" ..
+                                        vim.o
+                                        .columns)
+                                    vim.defer_fn(function()
+                                        vim.api.nvim_win_set_height(
+                                            window,
+                                            vim.api
+                                            .nvim_win_get_height(
+                                                window) -
+                                            1)
+                                        vim.defer_fn(function()
+                                            vim.api
+                                                .nvim_win_set_height(
+                                                    window,
+                                                    vim.api
+                                                    .nvim_win_get_height(
+                                                        window) + 1)
+                                            vim.api.nvim_feedkeys(
+                                                vim.api
+                                                .nvim_replace_termcodes(
+                                                    '<C-\\><C-n>^zei',
+                                                    true, true, true),
+                                                'i', true)
+                                            vim.schedule(function()
+                                                vim.cmd("redraw!")
+                                            end)
+                                        end, flaky_redraw_time)
+                                    end, flaky_redraw_time)
+                                    vim.cmd("redraw!")
+                                end
+                            })
+                    end
                     lab.open_term(name)
                 end)
             end
@@ -17,21 +68,12 @@ return {
             vim.api.nvim_create_autocmd({ "BufEnter" },
                 {
                     pattern = { "*" },
-                    group = vim.api.nvim_create_augroup(
-                        'like-a-butterfly', { clear = true }),
+                    group = augroup,
                     callback = function()
                         vim
                             .schedule(function()
                                 if (vim.bo.filetype ~= "butterfly") then
                                     lab.close_all()
-                                else
-                                    vim.api.nvim_feedkeys(
-                                        vim.api.nvim_replace_termcodes(
-                                            '<C-\\><C-n>^zei',
-                                            true, true, true), 'i', true)
-                                    vim.cmd("setlocal sidescrolloff=" .. vim.o
-                                        .columns)
-                                    vim.cmd("redraw!")
                                 end
                             end)
                     end
@@ -42,8 +84,8 @@ return {
             MakeTerm("sta", "Delta", "zsh")
             MakeTerm("stn", "Epsilon", "zsh")
             MakeTerm("ste", "Zeta", "/bin/zsh ~/.scripts/omniscratch.zsh")
-            MakeTerm("sti", "Eta", "lazydocker")
-            MakeTerm("sto", "Theta", "lazygit")
+            MakeTerm("sti", "Eta", "lazydocker", true)
+            MakeTerm("sto", "Theta", "lazygit", true)
 
             -- Keymaps
             vim.keymap.set("t", "<Esc><Esc>", lab.close_all)