From d86fef06a5dbccc71b7b357ca30b497b70d7eb0c Mon Sep 17 00:00:00 2001 From: zbirenbaum Date: Wed, 22 Jun 2022 16:07:19 -0400 Subject: fix #13 --- README.md | 4 ++++ lua/nvterm/init.lua | 28 ++++++++++++++++++++++++++++ lua/nvterm/terminal.lua | 21 +++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/README.md b/README.md index 69f6672..f8bf827 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,10 @@ require("nvterm").setup({ } }, behavior = { + autoclose_on_quit = { + enabled = false, + confirm = true, + }, close_on_exit = true, auto_insert = true, }, diff --git a/lua/nvterm/init.lua b/lua/nvterm/init.lua index 3794f35..0e53550 100644 --- a/lua/nvterm/init.lua +++ b/lua/nvterm/init.lua @@ -17,12 +17,40 @@ local defaults = { }, }, behavior = { + autoclose_on_quit = { + enabled = false, + confirm = true, + }, close_on_exit = true, auto_insert = true, }, } local set_behavior = function(behavior) + if behavior.autoclose_on_quit.enabled then + local function force_exit () + require("nvterm.terminal").close_all_terms() + vim.api.nvim_command("qa") + end + vim.api.nvim_create_autocmd({ "WinClosed" }, { + callback = vim.schedule_wrap(function() + local open_terms = require("nvterm.terminal").list_active_terms("win") + + local non_terms = vim.tbl_filter(function(win) + return not vim.tbl_contains(open_terms, win) + end, vim.api.nvim_list_wins()) + + if not vim.tbl_isempty(non_terms) then return end + + if not behavior.autoclose_on_quit.confirm then return force_exit() end + + vim.ui.input({ prompt = "Close all terms and quit? (Y/N): " }, function (input) + if not input or not string.lower(input) == "y" then return end + force_exit() + end) + end), + }) + end if behavior.close_on_exit then vim.api.nvim_create_autocmd({ "TermClose" }, { callback = function() diff --git a/lua/nvterm/terminal.lua b/lua/nvterm/terminal.lua index 45f1569..970bd12 100644 --- a/lua/nvterm/terminal.lua +++ b/lua/nvterm/terminal.lua @@ -18,6 +18,7 @@ local function get_type(type, list) end local function get_still_open() + if not terminals.list then return {} end return #terminals.list > 0 and vim.tbl_filter(function(t) return t.open == true end, terminals.list) or {} @@ -131,6 +132,26 @@ nvterm.toggle = function(type) end end +nvterm.close_all_terms = function () + for _, buf in ipairs(nvterm.list_active_terms("buf")) do + vim.cmd("bd! " .. tostring(buf)) + end +end + +nvterm.list_active_terms = function (property) + local terms = get_still_open() + if property then + return vim.tbl_map(function(t) + return t[property] + end, terms) + end + return terms +end + +nvterm.list_terms = function () + return terminals.list +end + nvterm.init = function(term_config) terminals = term_config end -- cgit v1.2.3-70-g09d2