floatingterminal.lua 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. return {
  2. {
  3. dir = vim.fn.stdpath("config") .. "/custom/like-a-butterfly",
  4. name = "like-a-butterfly",
  5. enabled = true,
  6. lazy = false,
  7. config = function()
  8. local lab = require('like-a-butterfly')
  9. local augroup = vim.api.nvim_create_augroup(
  10. 'like-a-butterfly', { clear = true })
  11. -- Configure eight homerow terminals
  12. -- Some TUIs are "flaky" (*cough* lazygit *cough*), and don't redraw
  13. -- properly after being hidden. We try to fix this by aggressively
  14. -- resizing and redrawing flaky programs' windows.
  15. function MakeTerm(shortcut, name, command, flaky)
  16. lab.create_term(name, command)
  17. vim.keymap.set("n", shortcut, function()
  18. if flaky then
  19. local flaky_redraw_time = 10
  20. vim.api.nvim_create_autocmd({ "BufEnter" },
  21. {
  22. pattern = { "*" },
  23. group = augroup,
  24. once = true,
  25. callback = function()
  26. if (vim.bo.filetype ~= "butterfly") then
  27. return
  28. end
  29. local window = vim.api
  30. .nvim_get_current_win()
  31. vim.cmd(
  32. "setlocal sidescrolloff=" ..
  33. vim.o
  34. .columns)
  35. vim.defer_fn(function()
  36. vim.api.nvim_win_set_height(
  37. window,
  38. vim.api
  39. .nvim_win_get_height(
  40. window) -
  41. 1)
  42. vim.defer_fn(function()
  43. vim.api
  44. .nvim_win_set_height(
  45. window,
  46. vim.api
  47. .nvim_win_get_height(
  48. window) + 1)
  49. vim.api.nvim_feedkeys(
  50. vim.api
  51. .nvim_replace_termcodes(
  52. '<C-\\><C-n>^zei',
  53. true, true, true),
  54. 'i', true)
  55. vim.schedule(function()
  56. vim.cmd("redraw!")
  57. end)
  58. end, flaky_redraw_time)
  59. end, flaky_redraw_time)
  60. vim.cmd("redraw!")
  61. end
  62. })
  63. end
  64. lab.open_term(name)
  65. end)
  66. end
  67. vim.api.nvim_create_autocmd({ "BufEnter" },
  68. {
  69. pattern = { "*" },
  70. group = augroup,
  71. callback = function()
  72. vim
  73. .schedule(function()
  74. if (vim.bo.filetype ~= "butterfly") then
  75. lab.close_all()
  76. end
  77. end)
  78. end
  79. })
  80. MakeTerm("stt", "Alpha", "zsh")
  81. MakeTerm("sts", "Beta", "zsh")
  82. MakeTerm("str", "Gamma", "zsh")
  83. MakeTerm("sta", "Delta", "zsh")
  84. MakeTerm("stn", "Epsilon", "zsh")
  85. MakeTerm("ste", "Zeta", "/bin/zsh ~/.scripts/omniscratch.zsh")
  86. MakeTerm("sti", "Eta", "lazydocker", true)
  87. MakeTerm("sto", "Theta", "lazygit", true)
  88. -- Keymaps
  89. vim.keymap.set("t", "<Esc><Esc>", lab.close_all)
  90. vim.keymap.set("t", "<Esc><Space>", "<Esc>")
  91. vim.keymap.set("t", "<C-S-t>", "<C-\\><C-n>")
  92. vim.keymap.set("t", "<S-Space>", "<Esc>")
  93. end
  94. }
  95. }