From 3fb372eba48796b5d0a7758f91e168be8e70e183 Mon Sep 17 00:00:00 2001 From: Gregory Anders Date: Thu, 10 Aug 2023 09:53:56 -0500 Subject: [PATCH] Use Lua autocommand and make TermClose autocommand global --- runtime/doc/news.txt | 4 ++++ runtime/doc/various.txt | 4 ++++ runtime/doc/vim_diff.txt | 2 ++ runtime/lua/vim/_editor.lua | 17 +++++++++++++++-- src/nvim/eval/funcs.c | 10 ---------- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 713569e1ad..179cdfef25 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -181,6 +181,10 @@ The following changes to existing APIs or features add new behavior. supports it, unless |'keywordprg'| was customized before calling |vim.lsp.start()|. +• Terminal buffers started with no arguments (and use 'shell') close + automatically if the job exited without error, eliminating the (often + unwanted) "[Process exited 0]" message. + ============================================================================== REMOVED FEATURES *news-removed* diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 52e8f4d86c..33f57580c7 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -249,6 +249,10 @@ gx Opens the current filepath or URL (decided by Fails if changes have been made to the current buffer, unless 'hidden' is set. + If {cmd} is omitted, and the 'shell' job exits with no + error, the buffer is closed automatically + |default-autocmds|. + To enter |Terminal-mode| automatically: > autocmd TermOpen * startinsert < diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt index 15bb13d5a9..07b4572a27 100644 --- a/runtime/doc/vim_diff.txt +++ b/runtime/doc/vim_diff.txt @@ -133,6 +133,8 @@ remove them and ":autocmd {group}" to see how they're defined. nvim_terminal: - BufReadCmd: Treats "term://" buffers as |terminal| buffers. |terminal-start| +- TermClose: A |terminal| buffer started with no arguments (which thus uses + 'shell') and which exits with no error is closed automatically. nvim_cmdwin: - CmdwinEnter: Limits syntax sync to maxlines=1 in the |cmdwin|. diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua index 58fbc923e1..8c10cc7da3 100644 --- a/runtime/lua/vim/_editor.lua +++ b/runtime/lua/vim/_editor.lua @@ -1107,13 +1107,26 @@ end function vim._init_default_autocmds() local nvim_terminal_augroup = vim.api.nvim_create_augroup('nvim_terminal', {}) - vim.api.nvim_create_autocmd({ 'bufreadcmd' }, { + vim.api.nvim_create_autocmd({ 'BufReadCmd' }, { pattern = 'term://*', group = nvim_terminal_augroup, nested = true, command = "if !exists('b:term_title')|call termopen(matchstr(expand(\"\"), '\\c\\mterm://\\%(.\\{-}//\\%(\\d\\+:\\)\\?\\)\\?\\zs.*'), {'cwd': expand(get(matchlist(expand(\"\"), '\\c\\mterm://\\(.\\{-}\\)//'), 1, ''))})", }) - vim.api.nvim_create_autocmd({ 'cmdwinenter' }, { + vim.api.nvim_create_autocmd({ 'TermClose' }, { + group = nvim_terminal_augroup, + desc = 'Automatically close terminal buffers when started with no arguments and exiting without an error', + callback = function(args) + if vim.v.event.status == 0 then + local info = vim.api.nvim_get_chan_info(vim.bo[args.buf].channel) + local argv = info.argv or {} + if #argv == 1 and argv[1] == vim.o.shell then + vim.cmd({ cmd = 'bdelete', args = { args.buf }, bang = true }) + end + end + end, + }) + vim.api.nvim_create_autocmd({ 'CmdwinEnter' }, { pattern = '[:>]', group = vim.api.nvim_create_augroup('nvim_cmdwin', {}), command = 'syntax sync minlines=1 maxlines=1', diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index aebd6b25f6..177f64ebba 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -8502,16 +8502,6 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) channel_terminal_open(curbuf, chan); channel_create_event(chan, NULL); - - do_cmdline_cmd("augroup nvim_terminal_close"); - do_cmdline_cmd("autocmd! TermClose " - " if !v:event.status |" - " let info = nvim_get_chan_info(&channel) |" - " if get(info, 'argv', []) ==# [&shell] |" - " exec 'bdelete! ' .. expand('') |" - " endif |" - " endif"); - do_cmdline_cmd("augroup END"); } /// "timer_info([timer])" function