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 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) local cmd = vim.split(vim.o.makeprg, ' ') 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 = '*' })