Ein Terminal in Neovim ohne Plugins öffnen
Geschrieben am 18-07-2025 - ⧖ 4 minJa. Sorry; eine blödere Überschrift ist mir grad nicht eingefallen. Ich habe vorhin das Verzeichnis ~/Scripts ausgemistet und dort folgenden Lua-Code gefunden.
set("n", "p", function()
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
vim.cmd("put")
vim.api.nvim_win_set_cursor(0, { row + 1, col })
end)
local terminal_state = {
buf = nil,
win = nil,
is_open = false
}
local function FloatingTerminal()
-- If terminal is already open, close it (toggle behavior)
if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then
vim.api.nvim_win_close(terminal_state.win, false)
terminal_state.is_open = false
return
end
-- Create buffer if it doesn't exist or is invalid
if not terminal_state.buf or not vim.api.nvim_buf_is_valid(terminal_state.buf) then
terminal_state.buf = vim.api.nvim_create_buf(false, true)
-- Set buffer options for better terminal experience
vim.api.nvim_buf_set_option(terminal_state.buf, 'bufhidden', 'hide')
end
-- Calculate window dimensions
local width = math.floor(vim.o.columns * 0.8)
local height = math.floor(vim.o.lines * 0.8)
local row = math.floor((vim.o.lines - height) / 2)
local col = math.floor((vim.o.columns - width) / 2)
-- Create the floating window
terminal_state.win = vim.api.nvim_open_win(terminal_state.buf, true, {
relative = 'editor',
width = width,
height = height,
row = row,
col = col,
style = 'minimal',
border = 'rounded',
})
-- Set transparency for the floating window
vim.api.nvim_win_set_option(terminal_state.win, 'winblend', 0)
-- Set transparent background for the window
vim.api.nvim_win_set_option(terminal_state.win, 'winhighlight',
'Normal:FloatingTermNormal,FloatBorder:FloatingTermBorder')
-- Define highlight groups for transparency
vim.api.nvim_set_hl(0, "FloatingTermNormal", { bg = "none" })
vim.api.nvim_set_hl(0, "FloatingTermBorder", { bg = "none", })
-- Start terminal if not already running
local has_terminal = false
local lines = vim.api.nvim_buf_get_lines(terminal_state.buf, 0, -1, false)
for _, line in ipairs(lines) do
if line ~= "" then
has_terminal = true
break
end
end
if not has_terminal then
vim.fn.termopen(os.getenv("SHELL"))
end
terminal_state.is_open = true
vim.cmd("startinsert")
-- Set up auto-close on buffer leave
vim.api.nvim_create_autocmd("BufLeave", {
buffer = terminal_state.buf,
callback = function()
if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then
vim.api.nvim_win_close(terminal_state.win, false)
terminal_state.is_open = false
end
end,
once = true
})
end
-- Function to explicitly close the terminal
local function CloseFloatingTerminal()
if terminal_state.is_open and vim.api.nvim_win_is_valid(terminal_state.win) then
vim.api.nvim_win_close(terminal_state.win, false)
terminal_state.is_open = false
end
end
-- Key mappings
vim.keymap.set("n", "<leader>t", FloatingTerminal, { noremap = true, silent = true, desc = "Toggle floating terminal" })
vim.keymap.set("t", "<Esc>", function()
if terminal_state.is_open then
vim.api.nvim_win_close(terminal_state.win, false)
terminal_state.is_open = false
end
end, { noremap = true, silent = true, desc = "Close floating terminal from terminal mode" })
-- Auto-close terminal when process exits
vim.api.nvim_create_autocmd("TermClose", {
group = augroup,
callback = function()
if vim.v.event.status == 0 then
vim.api.nvim_buf_delete(0, {})
end
end,
})
-- Disable line numbers in terminal
vim.api.nvim_create_autocmd("TermOpen", {
group = augroup,
callback = function()
vim.opt_local.number = false
vim.opt_local.relativenumber = false
vim.opt_local.signcolumn = "no"
end,
})
Das ist nicht von mir und ich weiß den originalen Author nicht mehr, aber ich
bin mir ziemlich sicher, das ich es bei GitHub gefunden habe.
Was das macht ist, das man mit <Leader>t ein
FloatingTerminal öffnet und man es mit <ESC> wieder
schließen kann. Sobald man es erneut öffnet, bleibt der Inhalt bestehen. Ich
nutze das aktuell regelmäßig wenn ich mal schnell was erledigen will.