diff --git a/.gitignore b/.gitignore index c317064..f620718 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ AGENTS.md +reasonix.toml diff --git a/.luarc.json b/.luarc.json new file mode 100644 index 0000000..36df530 --- /dev/null +++ b/.luarc.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", + "runtime.version": "LuaJIT", + "runtime.path": [ + "lua/?.lua", + "lua/?/init.lua" + ], + "diagnostics.globals": [ + "vim" + ], + "workspace.checkThirdParty": false, + "workspace.library": [ + "$VIMRUNTIME/lua", + "$VIMRUNTIME" + ] +} diff --git a/doc/QQdock.txt b/doc/QQdock.txt new file mode 100644 index 0000000..917c73c --- /dev/null +++ b/doc/QQdock.txt @@ -0,0 +1,151 @@ +*QQdock.nvim.txt* Persistent Adaptive Terminal Dock + +Author: newbie +License: MIT + + +============================================================================== +CONTENTS *QQdock-contents* + + 1. Introduction .............................. |QQdock-intro| + 2. Installation .............................. |QQdock-install| + 3. Configuration ............................. |QQdock-config| + 4. Usage ..................................... |QQdock-usage| + 5. API ....................................... |QQdock-api| + 6. Layout Logic .............................. |QQdock-layout| + 7. Keymaps ................................... |QQdock-keymaps| + +============================================================================== +INTRODUCTION *QQdock-intro* + +QQdock.nvim is a zero-dependency, persistent terminal dock for Neovim. It uses +Neovim's native `vim.fn.termopen()` — no external plugins required. + +Key features: + +- **Persistent** — toggle hide/show, terminal process keeps running. +- **Adaptive split** — vertical vsplit on wide screens, horizontal split on + tall screens; based on the current window, not the tabpage. +- **Main window mode** — when no file is open, the terminal occupies the + current window directly instead of creating a split. +- **Dynamic commands** — add new tools with two lines of config; keymaps are + auto-registered from `commands` and `keymaps` tables. +- **Single file** — ~220 lines of Lua. + +============================================================================== +INSTALLATION *QQdock-install* + +Using lazy.nvim >~ + { + 'newbie/QQdock.nvim', + url = 'https://github.com/newbie/QQdock.nvim', + config = function() + require('QQdock').setup({}) + end, + } + +No dependencies required. + +============================================================================== +CONFIGURATION *QQdock-config* + +QQdock.setup({opts}) accepts the following options: + + require('QQdock').setup({ + size = { + horizontal = nil, -- terminal height in rows (nil = auto) + vertical = nil, -- terminal width in columns (nil = auto) + }, + commands = { + reasonix = 'reasonix', + lazygit = 'lazygit', + -- key = command name, value = shell command or function + }, + keymaps = { + shell = { 'n', '' }, + shell_i = { 'i', '' }, + reasonix = { 'n', '' }, + lazygit = { 'n', 'gg' }, + -- key = must match a key in `commands`, value = {mode, lhs} + }, + debug = false, -- log layout decisions to :messages + }) + +`commands` values can be strings or functions (lazy evaluation). + +If `keymaps` is empty or omitted, no keymaps are registered. You can bind +everything manually via the API. + +============================================================================== +USAGE *QQdock-usage* + + *QQdock.shell* +QQdock.shell()~ + Open/close a persistent plain shell. Equivalent to `QQdock.open(nil)`. + + *QQdock.open* +QQdock.open({cmd})~ + Open/close a persistent terminal running the given command. Each unique + {cmd} gets its own cached terminal instance. + +Examples: > + local Q = require('QQdock') + Q.shell() + Q.open('reasonix') + Q.open('lazygit') + Q.open('btop') + Q.open('yazi') + +Inside any terminal, press (Ctrl+\\ twice) to hide it. +The process keeps running in the background. + +============================================================================== +API *QQdock-api* + +QQdock.setup({opts}) *QQdock.setup* + Configure and register keymaps. Call once, typically in your plugin + manager's `config` function. + + Parameters: ~ + {opts} (table) Configuration table, see |QQdock-config|. + +QQdock.shell() *QQdock.shell* + Toggle a plain shell terminal. Shortcut for `QQdock.open(nil)`. + +QQdock.open({cmd}) *QQdock.open* + Toggle a persistent terminal for the given command. + + Parameters: ~ + {cmd} (string|nil) Shell command to run, or nil for default shell. + +============================================================================== +LAYOUT LOGIC *QQdock-layout* + +The layout is determined automatically based on the current window dimensions: + + Condition Result + ----------------------------------- ------------------------------- + Empty unnamed buffer, not modified Main window (no split) + width ≥ 110 and width > height × 2 Right vsplit, 40% width + Otherwise Bottom split, 35% height (min 10) + +Splits use `rightbelow`, meaning they open relative to the current window +without disrupting the rest of the tabpage layout. + +Set `debug = true` to see layout decisions in `:messages`. + +============================================================================== +KEYMAPS *QQdock-keymaps* + + *QQdock-ctrl-backslash* + (terminal mode)~ + Hide the current terminal. Bound automatically in every QQdock terminal + buffer. Does not affect TUI programs that use Ctrl+\ for other purposes. + +Custom keymaps are defined in the `keymaps` table passed to |QQdock.setup|. +Each entry is {mode, lhs}. Key names must match entries in `commands`. + +The `shell` and `shell_i` keys are special and are not driven by `commands`. + +============================================================================== + vim:tw=78:ts=8:ft=help:norl: