mirror of
https://github.com/neovim/neovim
synced 2025-07-16 01:01:49 +00:00
feat(options): per-buffer 'busy' status #34493
Problem: Plugins cannot mark a buffer as "busy". Solution: - Add a buffer-local 'busy' option. - Show a busy indicator in the default 'statusline'.
This commit is contained in:
@ -224,6 +224,7 @@ OPTIONS
|
|||||||
• 'pummaxwidth' sets maximum width for the completion popup menu.
|
• 'pummaxwidth' sets maximum width for the completion popup menu.
|
||||||
• 'winborder' "bold" style.
|
• 'winborder' "bold" style.
|
||||||
• |g:clipboard| accepts a string name to force any builtin clipboard tool.
|
• |g:clipboard| accepts a string name to force any builtin clipboard tool.
|
||||||
|
• 'busy' sets a buffer "busy" status. Indicated in the default statusline.
|
||||||
|
|
||||||
PERFORMANCE
|
PERFORMANCE
|
||||||
|
|
||||||
@ -265,6 +266,7 @@ UI
|
|||||||
• Error messages are more concise:
|
• Error messages are more concise:
|
||||||
• "Error detected while processing:" changed to "Error in:".
|
• "Error detected while processing:" changed to "Error in:".
|
||||||
• "Error executing Lua:" changed to "Lua:".
|
• "Error executing Lua:" changed to "Lua:".
|
||||||
|
• 'busy' status is shown in default statusline with symbol ◐
|
||||||
|
|
||||||
VIMSCRIPT
|
VIMSCRIPT
|
||||||
|
|
||||||
|
@ -1217,6 +1217,13 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
without saving. For writing there must be matching |BufWriteCmd|,
|
without saving. For writing there must be matching |BufWriteCmd|,
|
||||||
|FileWriteCmd| or |FileAppendCmd| autocommands.
|
|FileWriteCmd| or |FileAppendCmd| autocommands.
|
||||||
|
|
||||||
|
*'busy'*
|
||||||
|
'busy' number (default 0)
|
||||||
|
local to buffer
|
||||||
|
Sets a buffer "busy" status. Indicated in the default statusline.
|
||||||
|
When busy status is larger then 0 busy flag is shown in statusline.
|
||||||
|
The semantics of "busy" are arbitrary, typically decided by the plugin that owns the buffer.
|
||||||
|
|
||||||
*'casemap'* *'cmp'*
|
*'casemap'* *'cmp'*
|
||||||
'casemap' 'cmp' string (default "internal,keepascii")
|
'casemap' 'cmp' string (default "internal,keepascii")
|
||||||
global
|
global
|
||||||
@ -6184,7 +6191,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
an expensive expression can negatively affect render performance.
|
an expensive expression can negatively affect render performance.
|
||||||
|
|
||||||
*'statusline'* *'stl'* *E540* *E542*
|
*'statusline'* *'stl'* *E540* *E542*
|
||||||
'statusline' 'stl' string (default "%<%f %h%w%m%r %=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}")
|
'statusline' 'stl' string (default "%<%f %h%w%m%r %=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &busy > 0 ? '◐ ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}")
|
||||||
global or local to window |global-local|
|
global or local to window |global-local|
|
||||||
Sets the |status-line|.
|
Sets the |status-line|.
|
||||||
|
|
||||||
|
@ -404,6 +404,7 @@ Options:
|
|||||||
- 'ttimeout', 'ttimeoutlen' behavior was simplified
|
- 'ttimeout', 'ttimeoutlen' behavior was simplified
|
||||||
- 'winblend' pseudo-transparency in floating windows |api-floatwin|
|
- 'winblend' pseudo-transparency in floating windows |api-floatwin|
|
||||||
- 'winhighlight' window-local highlights
|
- 'winhighlight' window-local highlights
|
||||||
|
- 'busy' busy status for buffers
|
||||||
|
|
||||||
Performance:
|
Performance:
|
||||||
- Signs are implemented using Nvim's internal "marktree" (btree) structure.
|
- Signs are implemented using Nvim's internal "marktree" (btree) structure.
|
||||||
|
10
runtime/lua/vim/_meta/options.lua
generated
10
runtime/lua/vim/_meta/options.lua
generated
@ -664,6 +664,14 @@ vim.o.bt = vim.o.buftype
|
|||||||
vim.bo.buftype = vim.o.buftype
|
vim.bo.buftype = vim.o.buftype
|
||||||
vim.bo.bt = vim.bo.buftype
|
vim.bo.bt = vim.bo.buftype
|
||||||
|
|
||||||
|
--- Sets a buffer "busy" status. Indicated in the default statusline.
|
||||||
|
--- When busy status is larger then 0 busy flag is shown in statusline.
|
||||||
|
--- The semantics of "busy" are arbitrary, typically decided by the plugin that owns the buffer.
|
||||||
|
---
|
||||||
|
--- @type integer
|
||||||
|
vim.o.busy = 0
|
||||||
|
vim.bo.busy = vim.o.busy
|
||||||
|
|
||||||
--- Specifies details about changing the case of letters. It may contain
|
--- Specifies details about changing the case of letters. It may contain
|
||||||
--- these words, separated by a comma:
|
--- these words, separated by a comma:
|
||||||
--- internal Use internal case mapping functions, the current
|
--- internal Use internal case mapping functions, the current
|
||||||
@ -6853,7 +6861,7 @@ vim.wo.stc = vim.wo.statuscolumn
|
|||||||
---
|
---
|
||||||
---
|
---
|
||||||
--- @type string
|
--- @type string
|
||||||
vim.o.statusline = "%<%f %h%w%m%r %=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}"
|
vim.o.statusline = "%<%f %h%w%m%r %=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &busy > 0 ? '◐ ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}"
|
||||||
vim.o.stl = vim.o.statusline
|
vim.o.stl = vim.o.statusline
|
||||||
vim.wo.statusline = vim.o.statusline
|
vim.wo.statusline = vim.o.statusline
|
||||||
vim.wo.stl = vim.wo.statusline
|
vim.wo.stl = vim.wo.statusline
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "nvim/option_defs.h"
|
#include "nvim/option_defs.h"
|
||||||
#include "nvim/os/fs_defs.h"
|
#include "nvim/os/fs_defs.h"
|
||||||
#include "nvim/statusline_defs.h"
|
#include "nvim/statusline_defs.h"
|
||||||
|
#include "nvim/types_defs.h"
|
||||||
#include "nvim/undo_defs.h"
|
#include "nvim/undo_defs.h"
|
||||||
|
|
||||||
/// Reference to a buffer that stores the value of buf_free_count.
|
/// Reference to a buffer that stores the value of buf_free_count.
|
||||||
@ -522,6 +523,7 @@ struct file_buffer {
|
|||||||
int b_p_bomb; ///< 'bomb'
|
int b_p_bomb; ///< 'bomb'
|
||||||
char *b_p_bh; ///< 'bufhidden'
|
char *b_p_bh; ///< 'bufhidden'
|
||||||
char *b_p_bt; ///< 'buftype'
|
char *b_p_bt; ///< 'buftype'
|
||||||
|
OptInt b_p_busy; ///< 'busy'
|
||||||
int b_has_qf_entry; ///< quickfix exists for buffer
|
int b_has_qf_entry; ///< quickfix exists for buffer
|
||||||
int b_p_bl; ///< 'buflisted'
|
int b_p_bl; ///< 'buflisted'
|
||||||
OptInt b_p_channel; ///< 'channel'
|
OptInt b_p_channel; ///< 'channel'
|
||||||
|
@ -4681,6 +4681,8 @@ void *get_varp_from(vimoption_T *p, buf_T *buf, win_T *win)
|
|||||||
return &(buf->b_p_bt);
|
return &(buf->b_p_bt);
|
||||||
case kOptBuflisted:
|
case kOptBuflisted:
|
||||||
return &(buf->b_p_bl);
|
return &(buf->b_p_bl);
|
||||||
|
case kOptBusy:
|
||||||
|
return &(buf->b_p_busy);
|
||||||
case kOptChannel:
|
case kOptChannel:
|
||||||
return &(buf->b_p_channel);
|
return &(buf->b_p_channel);
|
||||||
case kOptCopyindent:
|
case kOptCopyindent:
|
||||||
|
@ -280,6 +280,7 @@ EXTERN char *p_bsk; ///< 'backupskip'
|
|||||||
EXTERN char *p_breakat; ///< 'breakat'
|
EXTERN char *p_breakat; ///< 'breakat'
|
||||||
EXTERN char *p_bh; ///< 'bufhidden'
|
EXTERN char *p_bh; ///< 'bufhidden'
|
||||||
EXTERN char *p_bt; ///< 'buftype'
|
EXTERN char *p_bt; ///< 'buftype'
|
||||||
|
EXTERN OptInt p_busy; ///< 'busy'
|
||||||
EXTERN char *p_cmp; ///< 'casemap'
|
EXTERN char *p_cmp; ///< 'casemap'
|
||||||
EXTERN unsigned cmp_flags;
|
EXTERN unsigned cmp_flags;
|
||||||
EXTERN char *p_enc; ///< 'encoding'
|
EXTERN char *p_enc; ///< 'encoding'
|
||||||
|
@ -950,6 +950,21 @@ local options = {
|
|||||||
type = 'string',
|
type = 'string',
|
||||||
varname = 'p_bt',
|
varname = 'p_bt',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
defaults = 0,
|
||||||
|
desc = [=[
|
||||||
|
Sets a buffer "busy" status. Indicated in the default statusline.
|
||||||
|
When busy status is larger then 0 busy flag is shown in statusline.
|
||||||
|
The semantics of "busy" are arbitrary, typically decided by the plugin that owns the buffer.
|
||||||
|
]=],
|
||||||
|
full_name = 'busy',
|
||||||
|
redraw = { 'statuslines' },
|
||||||
|
noglob = true,
|
||||||
|
scope = { 'buf' },
|
||||||
|
short_desc = N_('buffer is busy'),
|
||||||
|
type = 'number',
|
||||||
|
varname = 'p_busy',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
abbreviation = 'cmp',
|
abbreviation = 'cmp',
|
||||||
defaults = 'internal,keepascii',
|
defaults = 'internal,keepascii',
|
||||||
@ -8640,6 +8655,7 @@ local options = {
|
|||||||
'%=',
|
'%=',
|
||||||
"%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}",
|
"%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}",
|
||||||
"%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}",
|
"%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}",
|
||||||
|
"%{% &busy > 0 ? '◐ ' : '' %}",
|
||||||
"%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
"%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
||||||
}),
|
}),
|
||||||
desc = [=[
|
desc = [=[
|
||||||
|
@ -355,8 +355,7 @@ describe('au OptionSet', function()
|
|||||||
|
|
||||||
it('with string global-local (to window) option', function()
|
it('with string global-local (to window) option', function()
|
||||||
local oldval = eval('&statusline')
|
local oldval = eval('&statusline')
|
||||||
local default_statusline =
|
local default_statusline = api.nvim_get_option_info2('statusline', {}).default
|
||||||
"%<%f %h%w%m%r %=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}"
|
|
||||||
|
|
||||||
command('set statusline=foo')
|
command('set statusline=foo')
|
||||||
expected_combination({
|
expected_combination({
|
||||||
|
@ -785,8 +785,15 @@ describe('default statusline', function()
|
|||||||
exec_lua("vim.o.statusline = 'asdf'")
|
exec_lua("vim.o.statusline = 'asdf'")
|
||||||
eq('asdf', eval('&statusline'))
|
eq('asdf', eval('&statusline'))
|
||||||
|
|
||||||
local default_statusline =
|
local default_statusline = table.concat({
|
||||||
"%<%f %h%w%m%r %=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}"
|
'%<',
|
||||||
|
'%f %h%w%m%r ',
|
||||||
|
'%=',
|
||||||
|
"%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}",
|
||||||
|
"%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}",
|
||||||
|
"%{% &busy > 0 ? '◐ ' : '' %}",
|
||||||
|
"%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
||||||
|
})
|
||||||
|
|
||||||
exec_lua("vim.o.statusline = ''")
|
exec_lua("vim.o.statusline = ''")
|
||||||
|
|
||||||
@ -799,4 +806,30 @@ describe('default statusline', function()
|
|||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('shows busy status when buffer is set to be busy', function()
|
||||||
|
exec_lua("vim.o.statusline = ''")
|
||||||
|
|
||||||
|
screen:expect([[
|
||||||
|
^ |
|
||||||
|
{1:~ }|*13
|
||||||
|
{3:[No Name] 0,0-1 All}|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
exec_lua('vim.o.busy = 1')
|
||||||
|
screen:expect([[
|
||||||
|
^ |
|
||||||
|
{1:~ }|*13
|
||||||
|
{3:[No Name] ◐ 0,0-1 All}|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
exec_lua('vim.o.busy = 0')
|
||||||
|
screen:expect([[
|
||||||
|
^ |
|
||||||
|
{1:~ }|*13
|
||||||
|
{3:[No Name] 0,0-1 All}|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Reference in New Issue
Block a user