mirror of
https://github.com/folke/snacks.nvim
synced 2025-12-23 08:47:57 +00:00
feat: terminal
This commit is contained in:
parent
6e825f509e
commit
e6cc7c998a
2 changed files with 90 additions and 0 deletions
|
|
@ -6,6 +6,7 @@
|
|||
---@field words snacks.words
|
||||
---@field rename snacks.rename
|
||||
---@field float snacks.float
|
||||
---@field terminal snacks.terminal
|
||||
local M = {}
|
||||
|
||||
setmetatable(M, {
|
||||
|
|
@ -24,6 +25,7 @@ _G.Snacks = M
|
|||
---@field statuscolumn snacks.statuscolumn.Config | { enabled: boolean }
|
||||
---@field words snacks.words.Config
|
||||
---@field float snacks.float.Config
|
||||
---@field terminal snacks.terminal.Config
|
||||
local config = {
|
||||
bigfile = { enabled = true },
|
||||
quickfile = { enabled = true },
|
||||
|
|
|
|||
88
lua/snacks/terminal.lua
Normal file
88
lua/snacks/terminal.lua
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
---@class snacks.terminal
|
||||
---@overload fun(opts? :snacks.terminal.Config): snacks.float
|
||||
local M = setmetatable({}, {
|
||||
__call = function(t, ...)
|
||||
return t.toggle(...)
|
||||
end,
|
||||
})
|
||||
|
||||
---@class snacks.terminal.Config
|
||||
---@field cwd? string
|
||||
---@field env? table<string, string>
|
||||
---@field float? snacks.float.Config
|
||||
---@field interactive? boolean
|
||||
local defaults = {
|
||||
float = {
|
||||
bo = {
|
||||
filetype = "snacks_terminal",
|
||||
},
|
||||
keys = {
|
||||
gf = function(self)
|
||||
local f = vim.fn.findfile(vim.fn.expand("<cfile>"))
|
||||
if f ~= "" then
|
||||
vim.cmd("close")
|
||||
vim.cmd("e " .. f)
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
---@type table<string, snacks.float>
|
||||
local terminals = {}
|
||||
|
||||
---@param cmd? string | string[]
|
||||
---@param opts? snacks.terminal.Config
|
||||
function M.open(cmd, opts)
|
||||
---@type snacks.terminal.Config
|
||||
opts = vim.tbl_deep_extend("force", {}, Snacks.config.get("terminal", defaults), opts or {}, {
|
||||
float = {
|
||||
b = {
|
||||
snacks_terminal_cmd = cmd,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
local float = Snacks.float(opts.float)
|
||||
vim.api.nvim_buf_call(float.buf, function()
|
||||
vim.fn.termopen(cmd or vim.o.shell, vim.tbl_isempty(opts) and vim.empty_dict() or opts)
|
||||
end)
|
||||
|
||||
if opts.interactive ~= false then
|
||||
vim.cmd.startinsert()
|
||||
vim.api.nvim_create_autocmd("TermClose", {
|
||||
once = true,
|
||||
buffer = float.buf,
|
||||
callback = function()
|
||||
float:close()
|
||||
vim.cmd.checktime()
|
||||
end,
|
||||
})
|
||||
vim.api.nvim_create_autocmd("BufEnter", {
|
||||
buffer = float.buf,
|
||||
callback = function()
|
||||
vim.cmd.startinsert()
|
||||
end,
|
||||
})
|
||||
vim.cmd("noh")
|
||||
end
|
||||
return float
|
||||
end
|
||||
|
||||
---@param cmd? string | string[]
|
||||
---@param opts? snacks.terminal.Config
|
||||
function M.toggle(cmd, opts)
|
||||
---@type snacks.terminal.Config
|
||||
opts = vim.tbl_deep_extend("force", {}, defaults, opts or {})
|
||||
|
||||
local id = vim.inspect({ cmd = cmd, cwd = opts.cwd, env = opts.env, count = vim.v.count1 })
|
||||
|
||||
if terminals[id] and terminals[id]:buf_valid() then
|
||||
terminals[id]:toggle()
|
||||
else
|
||||
terminals[id] = M.open(cmd, opts)
|
||||
end
|
||||
return terminals[id]
|
||||
end
|
||||
|
||||
return M
|
||||
Loading…
Add table
Add a link
Reference in a new issue