commit 9e8f286a62c95f0b9e9dd4fcea207be536ed7f3e Author: newbieQQ Date: Thu Jun 11 19:09:41 2026 +0800 init: QQdock.nvim — persistent adaptive terminal dock diff --git a/README.md b/README.md new file mode 100644 index 0000000..1d78b98 --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# QQdock.nvim + +持久化自适应浮动终端管理器。 + +## 特性 + +- **持久化** — 同一个终端实例反复 show/hide,命令输出不丢 +- **自适应方向** — 横屏 → 右侧分屏(45%),竖屏 → 下方分屏(40%) +- **轻量** — 依赖 toggleQQdock.nvim,API 简洁 + +## 安装 + +```lua +{ + "newbie/QQdock.nvim", + dependencies = { "akinsho/toggleQQdock.nvim" }, + config = function() + require("QQdock").setup() + end, +} +``` + +## 用法 + +```lua +local T = require("QQdock") + +T.shell() -- 普通 shell +T.open("reasonix") -- Reasonix AI +T.open("lazygit") -- lazygit +``` + +## 推荐键位 + +```lua +vim.keymap.set("n", "", T.shell) +vim.keymap.set("i", "", T.shell) +vim.keymap.set("n", "", function() T.open("reasonix") end) +vim.keymap.set("n", "gg", function() T.open("lazygit") end) +``` + +## API + +| 函数 | 参数 | 作用 | +|------|------|------| +| `T.shell()` | — | 打开/关闭持久 shell | +| `T.open(cmd)` | cmd: string | 打开/关闭指定命令的持久终端 | + +## TODO + +- [ ] 翻译(trans) +- [ ] 系统监控(btop) +- [ ] 文件管理器(yazi) diff --git a/lua/QQdock.lua b/lua/QQdock.lua new file mode 100644 index 0000000..42b5610 --- /dev/null +++ b/lua/QQdock.lua @@ -0,0 +1,37 @@ +-- addons/term.lua — 持久化自适应终端 +-- +-- 用法: +-- local T = require('addons.term') +-- T.shell() -- 打开/关闭普通终端() +-- T.open('reasonix') -- 打开/关闭 Reasonix() +-- +-- 特性: +-- - 同一个终端实例持久化(关掉再开回来,对话不丢) +-- - 窗口方向自适应:横屏→右侧(45%),竖屏→下方(40%) +-- - 依赖 toggleterm.nvim + +local M = {} + +local terms = {} -- 缓存终端实例,key 是命令名(nil = 普通 shell) + +function M.open(cmd) + local ui = vim.api.nvim_list_uis()[1] + local tall = ui.height > ui.width + local name = cmd or '__shell__' + + if not terms[name] or not terms[name]:is_open() then + terms[name] = require('toggleterm.terminal').Terminal:new({ + direction = tall and 'horizontal' or 'vertical', + cmd = cmd, + size = tall and math.floor(ui.height * 0.4) or math.floor(ui.width * 0.45), + }) + end + + terms[name]:toggle() +end + +function M.shell() + M.open(nil) +end + +return M