local function termopen(opts) opts = opts or {} -- setup the buffer local buf = vim.api.nvim_create_buf(false, true) vim.api.nvim_set_option_value('bufhidden', 'wipe', { buf = buf }) vim.api.nvim_set_option_value('modifiable', false, { buf = buf }) -- setup keymappings vim.keymap.set('n', 'q', 'close', { buffer = buf }) vim.keymap.set('n', '', 'close', { buffer = buf }) -- setup the window local w = math.ceil(vim.o.columns * 1.0) local h = math.ceil(vim.o.lines * 0.4) local win = vim.api.nvim_open_win(buf, true, { style = 'minimal', relative = 'editor', width = w, height = h, row = math.ceil(vim.o.lines - h), col = vim.o.columns, border = { ' ', '─', ' ', ' ', ' ', '─', ' ', ' ' }, }) vim.api.nvim_set_current_win(win) -- spawn the command if #opts.cmd == 0 then opts.cmd = { vim.env.SHELL } end vim.fn.termopen(opts.cmd, { on_exit = function() -- if vim.api.nvim_win_is_valid(win) then -- vim.api.nvim_win_close(win, true) -- end end, }) -- put into insert mode vim.cmd.startinsert() end -- provide user commands vim.api.nvim_create_user_command('Termopen', function(a) termopen({ cmd = a.fargs }) end, { nargs = '*' }) -- alias vim.api.nvim_create_user_command('T', function(a) termopen({ cmd = a.fargs }) end, { nargs = '*' }) -- helper to spawn &makeprg vim.api.nvim_create_user_command('Make', function(a) if vim.opt_local.makeprg == nil then vim.ui.input({ prompt = 'Enter makeprg: ' }, function(input) vim.opt_local.makeprg = input end) end local cmd = vim.split(vim.opt_local.makeprg:get(), ' ') cmd = vim.tbl_map(function(p) p, _ = string.gsub(p, [[%$%*]], a.args) p, _ = vim.fn.expand(p) return p end, cmd) termopen({ cmd = cmd }) end, { nargs = '*' }) -- setup keymappings vim.keymap.set('n', 'm', 'Make', { desc = 'Run :Make' }) vim.keymap.set('n', 't', 'Termopen', { desc = 'Run :Termopen' })