floatingterminal.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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", "gemini --model gemini-2.5-pro")
  85. MakeTerm("ste", "Zeta", "/bin/zsh $DOTFILES_DIR/.scripts/omniscratch.zsh")
  86. MakeTerm("sti", "Eta", "lazydocker", true)
  87. MakeTerm("sto", "Theta", "lazygit", true)
  88. -- Keymaps
  89. vim.keymap.set("t", "<C-S-t>", "<C-\\><C-n>")
  90. vim.keymap.set("t", "<S-Space>", "<Esc>")
  91. -- Double-tapping <Esc> within 150ms closes floating terminals;
  92. -- implemented as a timer to minimize normal <ESC> interruptions
  93. local timer_var = "lab_doubletap_timer"
  94. vim.keymap.set("t", "<Esc>", function()
  95. if vim.b[timer_var] then
  96. vim.fn.timer_stop(vim.b[timer_var])
  97. vim.b[timer_var] = nil
  98. lab.close_all()
  99. else
  100. vim.b[timer_var] = vim.fn.timer_start(150, function()
  101. vim.b[timer_var] = nil
  102. vim.api.nvim_chan_send(
  103. vim.b.terminal_job_id,
  104. vim.api.nvim_replace_termcodes("<Esc>", true, false, true))
  105. end)
  106. end
  107. end, { noremap = true, silent = true})
  108. end
  109. }
  110. }