mirror of
https://github.com/neovim/neovim.git
synced 2026-08-14 11:29:31 +00:00
Merge #41114 from epithet/default-ruler-as-expression
This commit is contained in:
@@ -154,6 +154,8 @@ OPTIONS
|
||||
To restore the previous truncation from the left, add a `%<` to the start.
|
||||
The same applies to 'rulerformat', 'statuscolumn', 'tabline', 'winbar',
|
||||
'titlestring', and 'iconstring'.
|
||||
• 'rulerformat' can no longer be set empty, the new default expression will be
|
||||
restored instead.
|
||||
|
||||
PLUGINS
|
||||
|
||||
@@ -163,6 +165,12 @@ TREESITTER
|
||||
|
||||
• todo
|
||||
|
||||
UI
|
||||
|
||||
• The bottom right cell of the screen is no longer left empty when the ruler
|
||||
is shown. This was originally intended to prevent unwanted scrolling on
|
||||
quirky terminals.
|
||||
|
||||
VIMSCRIPT
|
||||
|
||||
• Removed: ctxget(), ctxpop(), ctxpush(), ctxset(), ctxsize(). Use
|
||||
@@ -227,7 +235,8 @@ BUILD
|
||||
|
||||
DEFAULTS
|
||||
|
||||
• todo
|
||||
• 'rulerformat' default is exposed as a statusline expression (previously it
|
||||
was implemented as an internal C routine).
|
||||
|
||||
DIAGNOSTICS
|
||||
|
||||
|
||||
@@ -5181,43 +5181,45 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
*'ruler'* *'ru'* *'noruler'* *'noru'*
|
||||
'ruler' 'ru' boolean (default on)
|
||||
global
|
||||
Show the line and column number of the cursor position, separated by a
|
||||
comma. When there is room, the relative position of the displayed
|
||||
text in the file is shown on the far right:
|
||||
Top first line is visible
|
||||
Bot last line is visible
|
||||
All first and last line are visible
|
||||
45% relative position in the file
|
||||
If 'rulerformat' is set, it will determine the contents of the ruler.
|
||||
Each window has its own ruler. If a window has a status line, the
|
||||
ruler is shown there. If a window doesn't have a status line and
|
||||
'cmdheight' is zero, the ruler is not shown. Otherwise it is shown in
|
||||
the last line of the screen. If the statusline is given by
|
||||
'statusline' (i.e. not empty), this option takes precedence over
|
||||
'ruler' and 'rulerformat'.
|
||||
When on, show some buffer information in the ruler. Each window has
|
||||
its own ruler. The ruler of the active window is shown in the last
|
||||
line of the screen, unless 'cmdheight' is zero, or the window has a
|
||||
status line, which (by default) contains the window's ruler.
|
||||
|
||||
'rulerformat' determines the contents of the ruler.
|
||||
By default, the line and column number of the current cursor position
|
||||
are shown, separated by a comma.
|
||||
If the number of characters displayed is different from the number of
|
||||
bytes in the text (e.g., for a TAB or a multibyte character), both
|
||||
the text column (byte number) and the screen column are shown,
|
||||
separated with a dash.
|
||||
For an empty line "0-1" is shown.
|
||||
For an empty buffer the line number will also be zero: "0,0-1".
|
||||
Finally, the relative position of the displayed text in the file is
|
||||
shown on the far right:
|
||||
Top first line is visible
|
||||
Bot last line is visible
|
||||
All first and last line are visible
|
||||
45% relative position in the file
|
||||
|
||||
If you don't want to see the ruler all the time but want to know where
|
||||
you are, use "g CTRL-G" |g_CTRL-G|.
|
||||
When 'ruler' is on, the output of |CTRL-G| doen't contain the current
|
||||
line number of the cursor position.
|
||||
|
||||
*'rulerformat'* *'ruf'*
|
||||
'rulerformat' 'ruf' string (default "")
|
||||
'rulerformat' 'ruf' string (default "%18(%l,%c%V%= %P%)%<")
|
||||
global
|
||||
When this option is not empty, it determines the content of the ruler
|
||||
string, as displayed for the 'ruler' option.
|
||||
This option determines the content of the ruler string, as displayed
|
||||
for the 'ruler' option.
|
||||
The format of this option is like that of 'statusline'.
|
||||
Setting to empty (`:set rulerformat=`) sets the value to the default.
|
||||
This option cannot be set in a modeline when 'modelineexpr' is off.
|
||||
|
||||
The default ruler width is 17 characters. To make the ruler 15
|
||||
characters wide, put "%15(" at the start and "%)" at the end.
|
||||
Example: >vim
|
||||
set rulerformat=%15(%c%V\ %p%%%)
|
||||
<
|
||||
This looks like an item group, but there are some differences in this
|
||||
When 'ruler' is on, the default 'statusline' includes 'rulerformat'.
|
||||
|
||||
The default ruler width is 18 characters, which is configured with
|
||||
what looks like an item group. But there are some differences in this
|
||||
particular case. Most notably, the width is fixed and not a minimum,
|
||||
and the ruler is left-aligned, whereas the alignment of item groups is
|
||||
configurable and right-aligned by default.
|
||||
@@ -6429,8 +6431,11 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
would loop. When the result contains unprintable characters the
|
||||
result is unpredictable.
|
||||
|
||||
Note that the only effect of 'ruler' when this option is set (and
|
||||
'laststatus' is 2 or 3) is controlling the output of |CTRL-G|.
|
||||
When 'ruler' is on, the default 'statusline' includes 'rulerformat'.
|
||||
See note below.
|
||||
Note that if 'statusline' is configured without including the ruler,
|
||||
the only effect of 'ruler' when this option is set (and 'laststatus'
|
||||
is 2 or 3) is controlling the output of |CTRL-G|.
|
||||
|
||||
field meaning ~
|
||||
- Left justify the item. The default is right justified
|
||||
@@ -6447,10 +6452,10 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
|
||||
Following is a description of the possible statusline items. The
|
||||
second character in "item" is the type:
|
||||
N for number
|
||||
S for string
|
||||
F for flags as described below
|
||||
- not applicable
|
||||
"N" for number
|
||||
"S" for string
|
||||
"F" for flags as described below
|
||||
"-" not applicable
|
||||
|
||||
item meaning ~
|
||||
f S Path to the file in the buffer, as typed or relative to current
|
||||
@@ -6504,6 +6509,8 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
endfunc
|
||||
< `stl=%{Stl_filename()}` results in `"%t"`
|
||||
`stl=%{%Stl_filename()%}` results in `"Name of current file"`
|
||||
The default status line uses this to include 'rulerformat', see
|
||||
note below.
|
||||
%} - End of "{%" expression
|
||||
( - Start of item group. Can be used for setting the width and
|
||||
alignment of a section. Must be followed by %) somewhere.
|
||||
@@ -6540,11 +6547,13 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
is a bug that denotes that new mouse button recognition was
|
||||
added without modifying code that reacts on mouse clicks on
|
||||
this label.
|
||||
|
||||
Use |getmousepos()|.winid in the specified function to get the
|
||||
corresponding |window-ID| of the clicked item.
|
||||
< - Where to truncate line if too long. Default is at the first
|
||||
item. Truncation markers within item groups apply to the
|
||||
truncation of that group until its maxwid is reached.
|
||||
In case of several competing truncation markers, the first wins.
|
||||
No width fields allowed.
|
||||
= - Separation point between alignment sections. Each section will
|
||||
be separated by an equal number of spaces. With one %= what
|
||||
@@ -6607,12 +6616,12 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
edit your vimrc or whatever with "vim --clean" to get it right.
|
||||
|
||||
Examples:
|
||||
Emulate standard status line with 'ruler' set >vim
|
||||
set statusline=%<%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
|
||||
A simple version of the standard status line with 'ruler' set >vim
|
||||
set statusline=%f\ %h%w%m%r%=\ %-14.(%l,%c%V%)\ %P
|
||||
< Similar, but add ASCII value of char under the cursor (like "ga") >vim
|
||||
set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P
|
||||
set statusline=%f%h%m%r%=\ %b\ 0x%B\ \ %l,%c%V\ %P
|
||||
< Display byte count and byte value, modified flag in red. >vim
|
||||
set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
|
||||
set statusline=%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
|
||||
hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red
|
||||
< Display a ,GZ flag if a compressed file is loaded >vim
|
||||
set statusline=...%r%{VarExists('b:gzflag','\ [GZ]')}%h...
|
||||
@@ -6625,6 +6634,17 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
if exists(a:var) | return a:val | else | return '' | endif
|
||||
endfunction
|
||||
<
|
||||
Note: By default, the status line is truncated from the left, and the
|
||||
ruler from the right. But the status line can include the ruler.
|
||||
To ensure that a top-level (i.e. not inside an item group) `%<` in
|
||||
'rulerformat' doesn't change the truncation of the status line,
|
||||
- 'statusline' can be prepended with an explicit `%<`, which otherwise
|
||||
would not be necessary. Example: >vim
|
||||
set statusline=%<%f%=\ %{%&rulerformat%}
|
||||
< - Or the ruler can be wrapped in an item group, which also collapses
|
||||
any top-level `%=` in 'rulerformat' unless minwid is specified: >vim
|
||||
set statusline=%f%=\ %(%{%&rulerformat%}%)
|
||||
<
|
||||
|
||||
*'suffixes'* *'su'*
|
||||
'suffixes' 'su' string (default ".bak,~,.o,.h,.info,.swp,.obj")
|
||||
|
||||
95
runtime/lua/vim/_meta/options.gen.lua
generated
95
runtime/lua/vim/_meta/options.gen.lua
generated
@@ -5369,28 +5369,31 @@ vim.o.rlc = vim.o.rightleftcmd
|
||||
vim.wo.rightleftcmd = vim.o.rightleftcmd
|
||||
vim.wo.rlc = vim.wo.rightleftcmd
|
||||
|
||||
--- Show the line and column number of the cursor position, separated by a
|
||||
--- comma. When there is room, the relative position of the displayed
|
||||
--- text in the file is shown on the far right:
|
||||
--- Top first line is visible
|
||||
--- Bot last line is visible
|
||||
--- All first and last line are visible
|
||||
--- 45% relative position in the file
|
||||
--- If 'rulerformat' is set, it will determine the contents of the ruler.
|
||||
--- Each window has its own ruler. If a window has a status line, the
|
||||
--- ruler is shown there. If a window doesn't have a status line and
|
||||
--- 'cmdheight' is zero, the ruler is not shown. Otherwise it is shown in
|
||||
--- the last line of the screen. If the statusline is given by
|
||||
--- 'statusline' (i.e. not empty), this option takes precedence over
|
||||
--- 'ruler' and 'rulerformat'.
|
||||
--- When on, show some buffer information in the ruler. Each window has
|
||||
--- its own ruler. The ruler of the active window is shown in the last
|
||||
--- line of the screen, unless 'cmdheight' is zero, or the window has a
|
||||
--- status line, which (by default) contains the window's ruler.
|
||||
---
|
||||
--- 'rulerformat' determines the contents of the ruler.
|
||||
--- By default, the line and column number of the current cursor position
|
||||
--- are shown, separated by a comma.
|
||||
--- If the number of characters displayed is different from the number of
|
||||
--- bytes in the text (e.g., for a TAB or a multibyte character), both
|
||||
--- the text column (byte number) and the screen column are shown,
|
||||
--- separated with a dash.
|
||||
--- For an empty line "0-1" is shown.
|
||||
--- For an empty buffer the line number will also be zero: "0,0-1".
|
||||
--- Finally, the relative position of the displayed text in the file is
|
||||
--- shown on the far right:
|
||||
--- Top first line is visible
|
||||
--- Bot last line is visible
|
||||
--- All first and last line are visible
|
||||
--- 45% relative position in the file
|
||||
---
|
||||
--- If you don't want to see the ruler all the time but want to know where
|
||||
--- you are, use "g CTRL-G" `g_CTRL-G`.
|
||||
--- When 'ruler' is on, the output of `CTRL-G` doen't contain the current
|
||||
--- line number of the cursor position.
|
||||
---
|
||||
--- @type boolean
|
||||
vim.o.ruler = true
|
||||
@@ -5398,20 +5401,16 @@ vim.o.ru = vim.o.ruler
|
||||
vim.go.ruler = vim.o.ruler
|
||||
vim.go.ru = vim.go.ruler
|
||||
|
||||
--- When this option is not empty, it determines the content of the ruler
|
||||
--- string, as displayed for the 'ruler' option.
|
||||
--- This option determines the content of the ruler string, as displayed
|
||||
--- for the 'ruler' option.
|
||||
--- The format of this option is like that of 'statusline'.
|
||||
--- Setting to empty (`:set rulerformat=`) sets the value to the default.
|
||||
--- This option cannot be set in a modeline when 'modelineexpr' is off.
|
||||
---
|
||||
--- The default ruler width is 17 characters. To make the ruler 15
|
||||
--- characters wide, put "%15(" at the start and "%)" at the end.
|
||||
--- Example:
|
||||
--- When 'ruler' is on, the default 'statusline' includes 'rulerformat'.
|
||||
---
|
||||
--- ```vim
|
||||
--- set rulerformat=%15(%c%V\ %p%%%)
|
||||
--- ```
|
||||
---
|
||||
--- This looks like an item group, but there are some differences in this
|
||||
--- The default ruler width is 18 characters, which is configured with
|
||||
--- what looks like an item group. But there are some differences in this
|
||||
--- particular case. Most notably, the width is fixed and not a minimum,
|
||||
--- and the ruler is left-aligned, whereas the alignment of item groups is
|
||||
--- configurable and right-aligned by default.
|
||||
@@ -5420,7 +5419,7 @@ vim.go.ru = vim.go.ruler
|
||||
--- item group syntax has no special meaning for 'rulerformat'.
|
||||
---
|
||||
--- @type string
|
||||
vim.o.rulerformat = ""
|
||||
vim.o.rulerformat = "%18(%l,%c%V%= %P%)%<"
|
||||
vim.o.ruf = vim.o.rulerformat
|
||||
vim.go.rulerformat = vim.o.rulerformat
|
||||
vim.go.ruf = vim.go.rulerformat
|
||||
@@ -6808,8 +6807,11 @@ vim.wo.stc = vim.wo.statuscolumn
|
||||
--- would loop. When the result contains unprintable characters the
|
||||
--- result is unpredictable.
|
||||
---
|
||||
--- Note that the only effect of 'ruler' when this option is set (and
|
||||
--- 'laststatus' is 2 or 3) is controlling the output of `CTRL-G`.
|
||||
--- When 'ruler' is on, the default 'statusline' includes 'rulerformat'.
|
||||
--- See note below.
|
||||
--- Note that if 'statusline' is configured without including the ruler,
|
||||
--- the only effect of 'ruler' when this option is set (and 'laststatus'
|
||||
--- is 2 or 3) is controlling the output of `CTRL-G`.
|
||||
---
|
||||
--- field meaning ~
|
||||
--- - Left justify the item. The default is right justified
|
||||
@@ -6826,10 +6828,10 @@ vim.wo.stc = vim.wo.statuscolumn
|
||||
---
|
||||
--- Following is a description of the possible statusline items. The
|
||||
--- second character in "item" is the type:
|
||||
--- N for number
|
||||
--- S for string
|
||||
--- F for flags as described below
|
||||
--- - not applicable
|
||||
--- "N" for number
|
||||
--- "S" for string
|
||||
--- "F" for flags as described below
|
||||
--- "-" not applicable
|
||||
---
|
||||
--- item meaning ~
|
||||
--- f S Path to the file in the buffer, as typed or relative to current
|
||||
@@ -6886,6 +6888,8 @@ vim.wo.stc = vim.wo.statuscolumn
|
||||
--- ```
|
||||
--- `stl=%{Stl_filename()}` results in `"%t"`
|
||||
--- `stl=%{%Stl_filename()%}` results in `"Name of current file"`
|
||||
--- The default status line uses this to include 'rulerformat', see
|
||||
--- note below.
|
||||
--- %} - End of "{%" expression
|
||||
--- ( - Start of item group. Can be used for setting the width and
|
||||
--- alignment of a section. Must be followed by %) somewhere.
|
||||
@@ -6922,11 +6926,13 @@ vim.wo.stc = vim.wo.statuscolumn
|
||||
--- is a bug that denotes that new mouse button recognition was
|
||||
--- added without modifying code that reacts on mouse clicks on
|
||||
--- this label.
|
||||
---
|
||||
--- Use `getmousepos()`.winid in the specified function to get the
|
||||
--- corresponding `window-ID` of the clicked item.
|
||||
--- \< - Where to truncate line if too long. Default is at the first
|
||||
--- item. Truncation markers within item groups apply to the
|
||||
--- truncation of that group until its maxwid is reached.
|
||||
--- In case of several competing truncation markers, the first wins.
|
||||
--- No width fields allowed.
|
||||
--- = - Separation point between alignment sections. Each section will
|
||||
--- be separated by an equal number of spaces. With one %= what
|
||||
@@ -6992,20 +6998,20 @@ vim.wo.stc = vim.wo.statuscolumn
|
||||
--- edit your vimrc or whatever with "vim --clean" to get it right.
|
||||
---
|
||||
--- Examples:
|
||||
--- Emulate standard status line with 'ruler' set
|
||||
--- A simple version of the standard status line with 'ruler' set
|
||||
---
|
||||
--- ```vim
|
||||
--- set statusline=%<%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
|
||||
--- set statusline=%f\ %h%w%m%r%=\ %-14.(%l,%c%V%)\ %P
|
||||
--- ```
|
||||
--- Similar, but add ASCII value of char under the cursor (like "ga")
|
||||
---
|
||||
--- ```vim
|
||||
--- set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P
|
||||
--- set statusline=%f%h%m%r%=\ %b\ 0x%B\ \ %l,%c%V\ %P
|
||||
--- ```
|
||||
--- Display byte count and byte value, modified flag in red.
|
||||
---
|
||||
--- ```vim
|
||||
--- set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
|
||||
--- set statusline=%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
|
||||
--- hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red
|
||||
--- ```
|
||||
--- Display a ,GZ flag if a compressed file is loaded
|
||||
@@ -7031,9 +7037,26 @@ vim.wo.stc = vim.wo.statuscolumn
|
||||
--- endfunction
|
||||
--- ```
|
||||
---
|
||||
--- Note: By default, the status line is truncated from the left, and the
|
||||
--- ruler from the right. But the status line can include the ruler.
|
||||
--- To ensure that a top-level (i.e. not inside an item group) `%<` in
|
||||
--- 'rulerformat' doesn't change the truncation of the status line,
|
||||
--- - 'statusline' can be prepended with an explicit `%<`, which otherwise
|
||||
--- would not be necessary. Example:
|
||||
---
|
||||
--- ```vim
|
||||
--- set statusline=%<%f%=\ %{%&rulerformat%}
|
||||
--- ```
|
||||
--- - Or the ruler can be wrapped in an item group, which also collapses
|
||||
--- any top-level `%=` in 'rulerformat' unless minwid is specified:
|
||||
---
|
||||
--- ```vim
|
||||
--- set statusline=%f%=\ %(%{%&rulerformat%}%)
|
||||
--- ```
|
||||
---
|
||||
---
|
||||
--- @type string
|
||||
vim.o.statusline = "%<%f %h%w%m%r %{% v:lua.require('vim._core.util').term_exitcode() %}%=%{% luaeval('(package.loaded[''vim.ui''] and vim.api.nvim_get_current_win() == tonumber(vim.g.actual_curwin or -1) and vim.ui.progress_status()) or '''' ')%}%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &busy > 0 ? '◐ ' : '' %}%{% luaeval('(package.loaded[''vim.diagnostic''] and next(vim.diagnostic.count()) and vim.diagnostic.status() .. '' '') or '''' ') %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}"
|
||||
vim.o.statusline = "%<%f %h%w%m%r %{% v:lua.require('vim._core.util').term_exitcode() %}%=%{% luaeval('(package.loaded[''vim.ui''] and vim.api.nvim_get_current_win() == tonumber(vim.g.actual_curwin or -1) and vim.ui.progress_status()) or '''' ')%}%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &busy > 0 ? '◐ ' : '' %}%{% luaeval('(package.loaded[''vim.diagnostic''] and next(vim.diagnostic.count()) and vim.diagnostic.status() .. '' '') or '''' ') %}%{% &ruler ? &rulerformat : '' %}"
|
||||
vim.o.stl = vim.o.statusline
|
||||
vim.wo.statusline = vim.o.statusline
|
||||
vim.wo.stl = vim.wo.statusline
|
||||
|
||||
@@ -1125,7 +1125,7 @@ static void recording_mode(int hl_id)
|
||||
msg_puts_hl(s, hl_id, false);
|
||||
}
|
||||
|
||||
#define COL_RULER 17 // columns needed by standard ruler
|
||||
#define COL_RULER 18 // columns needed by standard ruler
|
||||
|
||||
/// Compute columns for ruler and shown command. 'sc_col' is also used to
|
||||
/// decide what the maximum length of a message on the status line can be.
|
||||
@@ -1138,7 +1138,7 @@ void comp_col(void)
|
||||
sc_col = 0;
|
||||
ru_col = 0;
|
||||
if (p_ru) {
|
||||
ru_col = (ru_wid ? ru_wid : COL_RULER) + 1;
|
||||
ru_col = (ru_wid ? ru_wid : COL_RULER);
|
||||
// no last status line, adjust sc_col
|
||||
if (!last_has_status) {
|
||||
sc_col = ru_col;
|
||||
|
||||
@@ -7272,28 +7272,31 @@ local options = {
|
||||
abbreviation = 'ru',
|
||||
defaults = true,
|
||||
desc = [=[
|
||||
Show the line and column number of the cursor position, separated by a
|
||||
comma. When there is room, the relative position of the displayed
|
||||
text in the file is shown on the far right:
|
||||
Top first line is visible
|
||||
Bot last line is visible
|
||||
All first and last line are visible
|
||||
45% relative position in the file
|
||||
If 'rulerformat' is set, it will determine the contents of the ruler.
|
||||
Each window has its own ruler. If a window has a status line, the
|
||||
ruler is shown there. If a window doesn't have a status line and
|
||||
'cmdheight' is zero, the ruler is not shown. Otherwise it is shown in
|
||||
the last line of the screen. If the statusline is given by
|
||||
'statusline' (i.e. not empty), this option takes precedence over
|
||||
'ruler' and 'rulerformat'.
|
||||
When on, show some buffer information in the ruler. Each window has
|
||||
its own ruler. The ruler of the active window is shown in the last
|
||||
line of the screen, unless 'cmdheight' is zero, or the window has a
|
||||
status line, which (by default) contains the window's ruler.
|
||||
|
||||
'rulerformat' determines the contents of the ruler.
|
||||
By default, the line and column number of the current cursor position
|
||||
are shown, separated by a comma.
|
||||
If the number of characters displayed is different from the number of
|
||||
bytes in the text (e.g., for a TAB or a multibyte character), both
|
||||
the text column (byte number) and the screen column are shown,
|
||||
separated with a dash.
|
||||
For an empty line "0-1" is shown.
|
||||
For an empty buffer the line number will also be zero: "0,0-1".
|
||||
Finally, the relative position of the displayed text in the file is
|
||||
shown on the far right:
|
||||
Top first line is visible
|
||||
Bot last line is visible
|
||||
All first and last line are visible
|
||||
45% relative position in the file
|
||||
|
||||
If you don't want to see the ruler all the time but want to know where
|
||||
you are, use "g CTRL-G" |g_CTRL-G|.
|
||||
When 'ruler' is on, the output of |CTRL-G| doen't contain the current
|
||||
line number of the cursor position.
|
||||
]=],
|
||||
full_name = 'ruler',
|
||||
redraw = { 'statuslines' },
|
||||
@@ -7305,19 +7308,18 @@ local options = {
|
||||
{
|
||||
abbreviation = 'ruf',
|
||||
cb = 'did_set_rulerformat',
|
||||
defaults = '',
|
||||
defaults = '%18(%l,%c%V%= %P%)%<',
|
||||
desc = [=[
|
||||
When this option is not empty, it determines the content of the ruler
|
||||
string, as displayed for the 'ruler' option.
|
||||
This option determines the content of the ruler string, as displayed
|
||||
for the 'ruler' option.
|
||||
The format of this option is like that of 'statusline'.
|
||||
Setting to empty (`:set rulerformat=`) sets the value to the default.
|
||||
This option cannot be set in a modeline when 'modelineexpr' is off.
|
||||
|
||||
The default ruler width is 17 characters. To make the ruler 15
|
||||
characters wide, put "%15(" at the start and "%)" at the end.
|
||||
Example: >vim
|
||||
set rulerformat=%15(%c%V\ %p%%%)
|
||||
<
|
||||
This looks like an item group, but there are some differences in this
|
||||
When 'ruler' is on, the default 'statusline' includes 'rulerformat'.
|
||||
|
||||
The default ruler width is 18 characters, which is configured with
|
||||
what looks like an item group. But there are some differences in this
|
||||
particular case. Most notably, the width is fixed and not a minimum,
|
||||
and the ruler is left-aligned, whereas the alignment of item groups is
|
||||
configurable and right-aligned by default.
|
||||
@@ -9086,7 +9088,7 @@ local options = {
|
||||
cb = 'did_set_statusline',
|
||||
defaults = {
|
||||
if_true = table.concat({
|
||||
'%<',
|
||||
'%<', -- guards the default truncation from the left against a %< injected via rulerformat
|
||||
'%f %h%w%m%r ',
|
||||
"%{% v:lua.require('vim._core.util').term_exitcode() %}",
|
||||
'%=',
|
||||
@@ -9095,7 +9097,7 @@ local options = {
|
||||
"%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}",
|
||||
"%{% &busy > 0 ? '◐ ' : '' %}",
|
||||
"%{% luaeval('(package.loaded[''vim.diagnostic''] and next(vim.diagnostic.count()) and vim.diagnostic.status() .. '' '') or '''' ') %}",
|
||||
"%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
||||
"%{% &ruler ? &rulerformat : '' %}",
|
||||
}),
|
||||
doc = 'is very long',
|
||||
},
|
||||
@@ -9126,8 +9128,11 @@ local options = {
|
||||
would loop. When the result contains unprintable characters the
|
||||
result is unpredictable.
|
||||
|
||||
Note that the only effect of 'ruler' when this option is set (and
|
||||
'laststatus' is 2 or 3) is controlling the output of |CTRL-G|.
|
||||
When 'ruler' is on, the default 'statusline' includes 'rulerformat'.
|
||||
See note below.
|
||||
Note that if 'statusline' is configured without including the ruler,
|
||||
the only effect of 'ruler' when this option is set (and 'laststatus'
|
||||
is 2 or 3) is controlling the output of |CTRL-G|.
|
||||
|
||||
field meaning ~
|
||||
- Left justify the item. The default is right justified
|
||||
@@ -9144,10 +9149,10 @@ local options = {
|
||||
|
||||
Following is a description of the possible statusline items. The
|
||||
second character in "item" is the type:
|
||||
N for number
|
||||
S for string
|
||||
F for flags as described below
|
||||
- not applicable
|
||||
"N" for number
|
||||
"S" for string
|
||||
"F" for flags as described below
|
||||
"-" not applicable
|
||||
|
||||
item meaning ~
|
||||
f S Path to the file in the buffer, as typed or relative to current
|
||||
@@ -9201,6 +9206,8 @@ local options = {
|
||||
endfunc
|
||||
< `stl=%{Stl_filename()}` results in `"%t"`
|
||||
`stl=%{%Stl_filename()%}` results in `"Name of current file"`
|
||||
The default status line uses this to include 'rulerformat', see
|
||||
note below.
|
||||
%} - End of "{%" expression
|
||||
( - Start of item group. Can be used for setting the width and
|
||||
alignment of a section. Must be followed by %) somewhere.
|
||||
@@ -9237,11 +9244,13 @@ local options = {
|
||||
is a bug that denotes that new mouse button recognition was
|
||||
added without modifying code that reacts on mouse clicks on
|
||||
this label.
|
||||
|
||||
Use |getmousepos()|.winid in the specified function to get the
|
||||
corresponding |window-ID| of the clicked item.
|
||||
\< - Where to truncate line if too long. Default is at the first
|
||||
item. Truncation markers within item groups apply to the
|
||||
truncation of that group until its maxwid is reached.
|
||||
In case of several competing truncation markers, the first wins.
|
||||
No width fields allowed.
|
||||
= - Separation point between alignment sections. Each section will
|
||||
be separated by an equal number of spaces. With one %= what
|
||||
@@ -9304,12 +9313,12 @@ local options = {
|
||||
edit your vimrc or whatever with "vim --clean" to get it right.
|
||||
|
||||
Examples:
|
||||
Emulate standard status line with 'ruler' set >vim
|
||||
set statusline=%<%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
|
||||
A simple version of the standard status line with 'ruler' set >vim
|
||||
set statusline=%f\ %h%w%m%r%=\ %-14.(%l,%c%V%)\ %P
|
||||
< Similar, but add ASCII value of char under the cursor (like "ga") >vim
|
||||
set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P
|
||||
set statusline=%f%h%m%r%=\ %b\ 0x%B\ \ %l,%c%V\ %P
|
||||
< Display byte count and byte value, modified flag in red. >vim
|
||||
set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
|
||||
set statusline=%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
|
||||
hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red
|
||||
< Display a ,GZ flag if a compressed file is loaded >vim
|
||||
set statusline=...%r%{VarExists('b:gzflag','\ [GZ]')}%h...
|
||||
@@ -9322,6 +9331,17 @@ local options = {
|
||||
if exists(a:var) | return a:val | else | return '' | endif
|
||||
endfunction
|
||||
<
|
||||
Note: By default, the status line is truncated from the left, and the
|
||||
ruler from the right. But the status line can include the ruler.
|
||||
To ensure that a top-level (i.e. not inside an item group) `%<` in
|
||||
'rulerformat' doesn't change the truncation of the status line,
|
||||
- 'statusline' can be prepended with an explicit `%<`, which otherwise
|
||||
would not be necessary. Example: >vim
|
||||
set statusline=%<%f%=\ %{%&rulerformat%}
|
||||
< - Or the ruler can be wrapped in an item group, which also collapses
|
||||
any top-level `%=` in 'rulerformat' unless minwid is specified: >vim
|
||||
set statusline=%f%=\ %(%{%&rulerformat%}%)
|
||||
<
|
||||
]=],
|
||||
full_name = 'statusline',
|
||||
modelineexpr = true,
|
||||
|
||||
@@ -1838,8 +1838,8 @@ static const char *did_set_statustabline_rulerformat(optset_T *args, bool rulerf
|
||||
char *s = *varp;
|
||||
bool is_stl = args->os_idx == kOptStatusline;
|
||||
|
||||
// reset statusline to default when setting global option and empty string is being set
|
||||
if (is_stl
|
||||
// reset global statusline/rulerformat option to default when it is being set to an empty string
|
||||
if ((is_stl || rulerformat)
|
||||
&& ((args->os_flags & OPT_GLOBAL) || !(args->os_flags & OPT_LOCAL))
|
||||
&& s[0] == NUL) {
|
||||
xfree(*varp);
|
||||
|
||||
@@ -460,13 +460,6 @@ msgstr "Katakana"
|
||||
msgid "Bopomofo"
|
||||
msgstr "Bopomofo"
|
||||
|
||||
#. row number, column number is appended
|
||||
#. l10n: leave as-is unless a space after the comma is preferred
|
||||
#. l10n: do not add any row/column label, due to the limited space
|
||||
#, c-format
|
||||
msgid "%ld,"
|
||||
msgstr "%ld,"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
"\tLast set from "
|
||||
|
||||
@@ -5477,10 +5477,6 @@ msgstr "Замінити «%.*s» на:"
|
||||
msgid " < \"%.*s\""
|
||||
msgstr " < «%.*s»"
|
||||
|
||||
#, c-format
|
||||
msgid "%<PRId64>,"
|
||||
msgstr "%<PRId64>, "
|
||||
|
||||
msgid "[Help]"
|
||||
msgstr "[Допомога]"
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ static void win_redr_stl_expr(win_T *wp, bool draw_winbar, bool draw_ruler, bool
|
||||
OptIndex opt_idx = kOptInvalid;
|
||||
int opt_scope = 0;
|
||||
stl_hlrec_t *hltab;
|
||||
StlClickRecord *tabtab;
|
||||
StlClickDefinition *click_defs;
|
||||
bool is_stl_global = global_stl_height() > 0;
|
||||
|
||||
ScreenGrid *grid = wp && wp->w_floating && !is_stl_global ? &wp->w_grid_alloc : &default_grid;
|
||||
@@ -274,6 +274,7 @@ static void win_redr_stl_expr(win_T *wp, bool draw_winbar, bool draw_ruler, bool
|
||||
attr = HL_ATTR(group);
|
||||
maxwidth = Columns;
|
||||
opt_idx = kOptTabline;
|
||||
click_defs = tab_page_click_defs;
|
||||
} else if (draw_winbar) {
|
||||
opt_idx = kOptWinbar;
|
||||
stl = ((*wp->w_p_wbr != NUL) ? wp->w_p_wbr : p_wbr);
|
||||
@@ -293,65 +294,66 @@ static void win_redr_stl_expr(win_T *wp, bool draw_winbar, bool draw_ruler, bool
|
||||
stl_clear_click_defs(wp->w_winbar_click_defs, wp->w_winbar_click_defs_size);
|
||||
wp->w_winbar_click_defs = stl_alloc_click_defs(wp->w_winbar_click_defs, maxwidth,
|
||||
&wp->w_winbar_click_defs_size);
|
||||
click_defs = wp->w_winbar_click_defs;
|
||||
} else if (draw_ruler && ui_event) {
|
||||
stl = p_ruf;
|
||||
opt_idx = kOptRulerformat;
|
||||
maxwidth = Columns / 2;
|
||||
fillchar = schar_from_ascii(' ');
|
||||
group = HLF_MSG;
|
||||
attr = HL_ATTR(group);
|
||||
click_defs = NULL;
|
||||
} else if (draw_ruler) {
|
||||
stl = p_ruf;
|
||||
opt_idx = kOptRulerformat;
|
||||
// advance past any leading group spec - implicit in ru_col
|
||||
if (*stl == '%') {
|
||||
if (*++stl == '-') {
|
||||
stl++;
|
||||
}
|
||||
if (atoi(stl)) {
|
||||
while (ascii_isdigit(*stl)) {
|
||||
stl++;
|
||||
}
|
||||
}
|
||||
if (*stl++ != '(') {
|
||||
stl = p_ruf;
|
||||
}
|
||||
}
|
||||
row = Rows - 1;
|
||||
col = MAX(ru_col, Columns / 2);
|
||||
grid = grid_adjust(&msg_grid_adj, &row, &col);
|
||||
maxwidth = Columns - col;
|
||||
fillchar = schar_from_ascii(' ');
|
||||
group = HLF_MSG;
|
||||
attr = HL_ATTR(group);
|
||||
click_defs = NULL;
|
||||
} else {
|
||||
const bool in_status_line = wp->w_status_height != 0 || is_stl_global;
|
||||
if (wp->w_floating && !is_stl_global && !draw_ruler) {
|
||||
// statusline
|
||||
stl = ((*wp->w_p_stl != NUL) ? wp->w_p_stl : p_stl);
|
||||
opt_idx = kOptStatusline;
|
||||
opt_scope = ((*wp->w_p_stl != NUL) ? OPT_LOCAL : 0);
|
||||
if (is_stl_global) {
|
||||
row = Rows - (int)p_ch - 1;
|
||||
col = 0;
|
||||
maxwidth = Columns;
|
||||
} else if (wp->w_status_height == 0) {
|
||||
goto theend;
|
||||
} else if (wp->w_floating) {
|
||||
row = wp->w_winrow_off + wp->w_view_height;
|
||||
col = wp->w_wincol_off;
|
||||
maxwidth = wp->w_view_width;
|
||||
} else {
|
||||
row = is_stl_global ? (Rows - (int)p_ch - 1) : W_ENDROW(wp);
|
||||
maxwidth = in_status_line && !is_stl_global ? wp->w_width : Columns;
|
||||
row = W_ENDROW(wp);
|
||||
col = wp->w_wincol;
|
||||
maxwidth = wp->w_width;
|
||||
}
|
||||
fillchar = fillchar_status(&group, wp);
|
||||
attr = win_hl_attr(wp, (int)group);
|
||||
stl_clear_click_defs(wp->w_status_click_defs, wp->w_status_click_defs_size);
|
||||
wp->w_status_click_defs = stl_alloc_click_defs(wp->w_status_click_defs, maxwidth,
|
||||
&wp->w_status_click_defs_size);
|
||||
|
||||
if (draw_ruler && ui_event) {
|
||||
stl = p_ruf;
|
||||
opt_idx = kOptRulerformat;
|
||||
maxwidth = Columns / 2;
|
||||
if (!in_status_line) {
|
||||
fillchar = schar_from_ascii(' ');
|
||||
group = HLF_MSG;
|
||||
}
|
||||
} else if (draw_ruler) {
|
||||
stl = p_ruf;
|
||||
opt_idx = kOptRulerformat;
|
||||
// advance past any leading group spec - implicit in ru_col
|
||||
if (*stl == '%') {
|
||||
if (*++stl == '-') {
|
||||
stl++;
|
||||
}
|
||||
if (atoi(stl)) {
|
||||
while (ascii_isdigit(*stl)) {
|
||||
stl++;
|
||||
}
|
||||
}
|
||||
if (*stl++ != '(') {
|
||||
stl = p_ruf;
|
||||
}
|
||||
}
|
||||
col = MAX(ru_col - (Columns - maxwidth), (maxwidth + 1) / 2);
|
||||
maxwidth -= col;
|
||||
if (!in_status_line) {
|
||||
row = Rows - 1;
|
||||
grid = grid_adjust(&msg_grid_adj, &row, &col);
|
||||
maxwidth--; // writing in last column may cause scrolling
|
||||
fillchar = schar_from_ascii(' ');
|
||||
group = HLF_MSG;
|
||||
}
|
||||
} else {
|
||||
opt_idx = kOptStatusline;
|
||||
stl = ((*wp->w_p_stl != NUL) ? wp->w_p_stl : p_stl);
|
||||
opt_scope = ((*wp->w_p_stl != NUL) ? OPT_LOCAL : 0);
|
||||
}
|
||||
|
||||
attr = win_hl_attr(wp, (int)group);
|
||||
if (!wp->w_floating && in_status_line && !is_stl_global) {
|
||||
col += wp->w_wincol;
|
||||
}
|
||||
click_defs = wp->w_status_click_defs;
|
||||
}
|
||||
|
||||
if (maxwidth <= 0) {
|
||||
@@ -367,8 +369,11 @@ static void win_redr_stl_expr(win_T *wp, bool draw_winbar, bool draw_ruler, bool
|
||||
// Make a copy, because the statusline may include a function call that
|
||||
// might change the option value and free the memory.
|
||||
stl = xstrdup(stl);
|
||||
|
||||
StlClickRecord *tabtab = NULL;
|
||||
build_stl_str_hl(ewp, buf, sizeof(buf), stl, opt_idx, opt_scope,
|
||||
fillchar, maxwidth, &hltab, NULL, &tabtab, NULL);
|
||||
fillchar, maxwidth, &hltab, NULL, click_defs ? &tabtab : NULL, NULL);
|
||||
stl_fill_click_defs(click_defs, tabtab, buf, maxwidth, wp == NULL);
|
||||
|
||||
xfree(stl);
|
||||
ewp->w_p_crb = p_crb_save;
|
||||
@@ -443,14 +448,6 @@ static void win_redr_stl_expr(win_T *wp, bool draw_winbar, bool draw_ruler, bool
|
||||
grid_line_fill(col, maxcol, fillchar, curattr);
|
||||
grid_line_flush();
|
||||
|
||||
// Fill the tab_page_click_defs, w_status_click_defs or w_winbar_click_defs array for clicking
|
||||
// in the tab page line, status line or window bar
|
||||
StlClickDefinition *click_defs = (wp == NULL) ? tab_page_click_defs
|
||||
: draw_winbar ? wp->w_winbar_click_defs
|
||||
: wp->w_status_click_defs;
|
||||
|
||||
stl_fill_click_defs(click_defs, tabtab, buf, maxwidth, wp == NULL);
|
||||
|
||||
theend:
|
||||
entered = false;
|
||||
|
||||
@@ -482,22 +479,21 @@ void win_redr_winbar(win_T *wp)
|
||||
|
||||
void redraw_ruler(void)
|
||||
{
|
||||
static int did_ruler_col = -1;
|
||||
static bool did_show_ruler = false;
|
||||
win_T *wp = !curwin->w_config.hide
|
||||
&& curwin->w_status_height == 0 ? curwin : lastwin_nofloating(NULL);
|
||||
bool is_stl_global = global_stl_height() > 0;
|
||||
|
||||
// Check if ruler should be drawn, clear if it was drawn before.
|
||||
if (!p_ru || wp->w_status_height > 0 || is_stl_global || (p_ch == 0 && !ui_has(kUIMessages))) {
|
||||
bool part_of_status = wp->w_status_height != 0 || is_stl_global;
|
||||
if (!p_ru || part_of_status || (p_ch == 0 && !ui_has(kUIMessages))) {
|
||||
if (did_show_ext_ruler && ui_has(kUIMessages)) {
|
||||
ui_call_msg_ruler((Array)ARRAY_DICT_INIT);
|
||||
did_show_ext_ruler = false;
|
||||
} else if (did_ruler_col > 0) {
|
||||
msg_col = did_ruler_col;
|
||||
msg_row = Rows - 1;
|
||||
} else if (did_show_ruler && !ui_has(kUIMessages)) {
|
||||
msg_clr_eos();
|
||||
}
|
||||
did_ruler_col = -1;
|
||||
did_show_ruler = false;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -513,103 +509,8 @@ void redraw_ruler(void)
|
||||
return;
|
||||
}
|
||||
|
||||
bool part_of_status = wp->w_status_height || is_stl_global;
|
||||
if (*p_ruf && (p_ch > 0 || (ui_has(kUIMessages) && !part_of_status))) {
|
||||
win_redr_stl_expr(wp, false, true, ui_has(kUIMessages));
|
||||
return;
|
||||
}
|
||||
|
||||
hlf_T group = HLF_MSG;
|
||||
int off = wp->w_status_height ? wp->w_wincol : 0;
|
||||
int width = wp->w_status_height ? wp->w_width : Columns;
|
||||
schar_T fillchar = part_of_status ? fillchar_status(&group, wp) : schar_from_ascii(' ');
|
||||
int attr = part_of_status ? win_hl_attr(wp, (int)group) : HL_ATTR(group);
|
||||
|
||||
// In list mode virtcol needs to be recomputed
|
||||
colnr_T virtcol = wp->w_virtcol;
|
||||
if (wp->w_p_list && wp->w_p_lcs_chars.tab1 == NUL) {
|
||||
wp->w_p_list = false;
|
||||
getvvcol(wp, &wp->w_cursor, NULL, &virtcol, NULL, 0);
|
||||
wp->w_p_list = true;
|
||||
}
|
||||
|
||||
// Check if not in Insert mode and the line is empty (will show "0-1").
|
||||
int empty_line = (State & MODE_INSERT) == 0
|
||||
&& *ml_get_buf(wp->w_buffer, wp->w_cursor.lnum) == NUL;
|
||||
|
||||
#define RULER_BUF_LEN 70
|
||||
char buffer[RULER_BUF_LEN];
|
||||
|
||||
// row number, column number is appended
|
||||
// l10n: leave as-is unless a space after the comma is preferred
|
||||
// l10n: do not add any row/column label, due to the limited space
|
||||
int bufferlen = vim_snprintf(buffer, RULER_BUF_LEN, _("%" PRId64 ","),
|
||||
(wp->w_buffer->b_ml.ml_flags & ML_EMPTY)
|
||||
? 0
|
||||
: (int64_t)wp->w_cursor.lnum);
|
||||
bufferlen += col_print(buffer + bufferlen, RULER_BUF_LEN - (size_t)bufferlen,
|
||||
empty_line ? 0 : (int)wp->w_cursor.col + 1,
|
||||
(int)virtcol + 1);
|
||||
|
||||
// Add a "50%" if there is room for it.
|
||||
// On the last line, don't print in the last column (scrolls the
|
||||
// screen up on some terminals).
|
||||
char rel_pos[RULER_BUF_LEN];
|
||||
int rel_poslen = get_rel_pos(wp, rel_pos, RULER_BUF_LEN);
|
||||
int n1 = bufferlen + vim_strsize(rel_pos);
|
||||
if (wp->w_status_height == 0 && !is_stl_global && !ui_has(kUIMessages)) {
|
||||
n1++; // can't use last char of screen
|
||||
}
|
||||
|
||||
int this_ru_col = ru_col - (Columns - width);
|
||||
// Never use more than half the window/screen width, leave the other half
|
||||
// for the filename.
|
||||
int n2 = (width + 1) / 2;
|
||||
this_ru_col = MAX(this_ru_col, n2);
|
||||
if (this_ru_col + n1 < width) {
|
||||
// need at least space for rel_pos + NUL
|
||||
while (this_ru_col + n1 < width
|
||||
&& RULER_BUF_LEN > bufferlen + rel_poslen + 1) { // +1 for NUL
|
||||
bufferlen += (int)schar_get(buffer + bufferlen, fillchar);
|
||||
n1++;
|
||||
}
|
||||
bufferlen += vim_snprintf(buffer + bufferlen, RULER_BUF_LEN - (size_t)bufferlen,
|
||||
"%s", rel_pos);
|
||||
}
|
||||
(void)bufferlen;
|
||||
|
||||
if (ui_has(kUIMessages) && !part_of_status) {
|
||||
MAXSIZE_TEMP_ARRAY(content, 1);
|
||||
MAXSIZE_TEMP_ARRAY(chunk, 3);
|
||||
ADD_C(chunk, INTEGER_OBJ(attr));
|
||||
ADD_C(chunk, CSTR_AS_OBJ(buffer));
|
||||
ADD_C(chunk, INTEGER_OBJ(HLF_MSG));
|
||||
assert(attr == HL_ATTR(HLF_MSG));
|
||||
ADD_C(content, ARRAY_OBJ(chunk));
|
||||
ui_call_msg_ruler(content);
|
||||
did_show_ext_ruler = true;
|
||||
did_ruler_col = 1;
|
||||
} else {
|
||||
if (did_show_ext_ruler) {
|
||||
ui_call_msg_ruler((Array)ARRAY_DICT_INIT);
|
||||
did_show_ext_ruler = false;
|
||||
}
|
||||
// Truncate at window boundary.
|
||||
for (n1 = 0, n2 = 0; buffer[n1] != NUL; n1 += utfc_ptr2len(buffer + n1)) {
|
||||
n2 += utf_ptr2cells(buffer + n1);
|
||||
if (this_ru_col + n2 > width) {
|
||||
bufferlen = n1;
|
||||
buffer[bufferlen] = NUL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
grid_line_start(&msg_grid_adj, Rows - 1);
|
||||
did_ruler_col = off + this_ru_col;
|
||||
int w = grid_line_puts(did_ruler_col, buffer, -1, attr);
|
||||
grid_line_fill(did_ruler_col + w, off + width, fillchar, attr);
|
||||
grid_line_flush();
|
||||
}
|
||||
win_redr_stl_expr(wp, false, true, ui_has(kUIMessages));
|
||||
did_show_ruler = !ui_has(kUIMessages);
|
||||
}
|
||||
|
||||
/// Get the character to use in a status line. Get its attributes in "*attr".
|
||||
|
||||
@@ -561,14 +561,14 @@ describe('API/win', function()
|
||||
api.nvim_set_option_value('statusline', 'window-status', { win = 0 })
|
||||
eq('window-status', api.nvim_get_option_value('statusline', { win = 0 }))
|
||||
eq(
|
||||
"%<%f %{%nvim_eval_statusline('%h%w%m%r', {'maxwidth': 30}).width > 0 ? '%h%w%m%r ' : ''%}%=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
||||
"%<%f %{%nvim_eval_statusline('%h%w%m%r', {'maxwidth': 30}).width > 0 ? '%h%w%m%r ' : ''%}%=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? &rulerformat : '' %}",
|
||||
api.nvim_get_option_value('statusline', { scope = 'global' })
|
||||
)
|
||||
command('set modified')
|
||||
command('enew') -- global-local: not preserved in new buffer
|
||||
-- confirm local value was not copied
|
||||
eq(
|
||||
"%<%f %{%nvim_eval_statusline('%h%w%m%r', {'maxwidth': 30}).width > 0 ? '%h%w%m%r ' : ''%}%=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
||||
"%<%f %{%nvim_eval_statusline('%h%w%m%r', {'maxwidth': 30}).width > 0 ? '%h%w%m%r ' : ''%}%=%{% &showcmdloc == 'statusline' ? '%-10.S ' : '' %}%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}%{% &ruler ? &rulerformat : '' %}",
|
||||
api.nvim_get_option_value('statusline', { win = 0 })
|
||||
)
|
||||
eq('', eval('&l:statusline'))
|
||||
@@ -2337,7 +2337,7 @@ describe('API/win', function()
|
||||
screen:expect([[
|
||||
│^ |
|
||||
~ │~ |*4
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
{5:-- TERMINAL --} |
|
||||
]])
|
||||
screen:detach()
|
||||
@@ -2351,7 +2351,7 @@ describe('API/win', function()
|
||||
screen:expect([[
|
||||
^ │ |
|
||||
~ │~ |*4
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
{5:-- TERMINAL --} |
|
||||
]])
|
||||
end)
|
||||
|
||||
@@ -1507,7 +1507,7 @@ describe('completion', function()
|
||||
{12:hello }{1: }|
|
||||
{4:hullo }{1: }|
|
||||
{4:heee }{1: }|
|
||||
{5:-- INSERT --} 4,6 All |
|
||||
{5:-- INSERT --} 4,6 All|
|
||||
]])
|
||||
end)
|
||||
|
||||
|
||||
@@ -429,7 +429,7 @@ describe('swapfile detection', function()
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*16
|
||||
{19:W325: Ignoring swapfile from Nvim process }0,0-1 All |
|
||||
{19:W325: Ignoring swapfile from Nvim process }0,0-1 All|
|
||||
]])
|
||||
eq(('\n' .. msg_expected):rep(3):sub(2), n.exec_capture('messages'))
|
||||
command('bwipe!')
|
||||
|
||||
@@ -386,7 +386,7 @@ describe('cmdline', function()
|
||||
api.nvim_set_option_value('rulerformat', '%!TestRulerFn()', {})
|
||||
screen:expect([[
|
||||
^ |
|
||||
10,20 30% |
|
||||
10,20 30%|
|
||||
]])
|
||||
end)
|
||||
|
||||
|
||||
@@ -263,7 +263,7 @@ describe(':confirm command dialog', function()
|
||||
fooba^r |
|
||||
{1:~ }|*5
|
||||
|
|
||||
1,6 All |
|
||||
1,6 All|
|
||||
]])
|
||||
eq('foo\n', read_file('Xconfirm_write_ro'))
|
||||
|
||||
@@ -377,7 +377,7 @@ describe(':confirm command dialog', function()
|
||||
d |
|
||||
{1:~ }|*2
|
||||
|
|
||||
1,1 All |
|
||||
1,1 All|
|
||||
]])
|
||||
eq('a\nb\nc\nd\n', read_file('Xwrite_partial'))
|
||||
os.remove('Xwrite_partial')
|
||||
|
||||
@@ -249,7 +249,7 @@ describe('linebreak', function()
|
||||
{17:foo}^ │{1:~ }|
|
||||
xxxxxxxxxxxxxxxxxxxx│{1:~ }|
|
||||
{1:~ }│{1:~ }|*2
|
||||
{5:-- VISUAL BLOCK --} 2x4 2,4 All |
|
||||
{5:-- VISUAL BLOCK --} 2x4 2,4 All|
|
||||
]])
|
||||
|
||||
-- TAB as end char: 'linebreak' shouldn't break Visual block hl
|
||||
@@ -264,7 +264,7 @@ describe('linebreak', function()
|
||||
f{17:oo12345}bar |
|
||||
f^o{17:o }bar |
|
||||
{1:~ }|*2
|
||||
{5:-- VISUAL BLOCK --} 3x7 3,2 All |
|
||||
{5:-- VISUAL BLOCK --} 3x7 3,2 All|
|
||||
]])
|
||||
feed('<Esc>:setlocal linebreak<CR>gv')
|
||||
screen:expect_unchanged(true)
|
||||
@@ -281,7 +281,7 @@ describe('linebreak', function()
|
||||
f{17:oo123456}bar |
|
||||
f^o{17:o<ffff>}bar |
|
||||
{1:~ }|*2
|
||||
{5:-- VISUAL BLOCK --} 3x8 3,2 All |
|
||||
{5:-- VISUAL BLOCK --} 3x8 3,2 All|
|
||||
]])
|
||||
feed('<Esc>:setlocal linebreak<CR>gv')
|
||||
screen:expect_unchanged(true)
|
||||
@@ -303,7 +303,7 @@ describe('linebreak', function()
|
||||
xx{17:xx}foo: {17:x}xxxxx |
|
||||
xx{17:xx}bar: ^xxxxxx |
|
||||
{1:~ }|*2
|
||||
{5:-- VISUAL BLOCK --} 3x8 3,5-10 All |
|
||||
{5:-- VISUAL BLOCK --} 3x8 3,5-10 All|
|
||||
]])
|
||||
feed('<Esc>:setlocal linebreak<CR>gv')
|
||||
screen:expect_unchanged(true)
|
||||
|
||||
@@ -158,7 +158,7 @@ describe('normal', function()
|
||||
^4 |
|
||||
5 |
|
||||
6 |
|
||||
40 more lines 5,1 %8 |
|
||||
40 more lines 5,1 %8|
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -31,7 +31,7 @@ it('scrolling with laststatus=0 and :botright split', function()
|
||||
98 |
|
||||
99 |
|
||||
^100 |
|
||||
100,1 Bot |
|
||||
100,1 Bot|
|
||||
]])
|
||||
end)
|
||||
|
||||
|
||||
@@ -853,7 +853,7 @@ describe('TUI :restart', function()
|
||||
screen:expect([[
|
||||
^ |
|
||||
~ |*4
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
{5:-- TERMINAL --} |
|
||||
]])
|
||||
|
||||
@@ -865,7 +865,7 @@ describe('TUI :restart', function()
|
||||
0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; |
|
||||
0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; |
|
||||
0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;|
|
||||
TRIGGERED: 1 1,1 Top |
|
||||
TRIGGERED: 1 1,1 Top|
|
||||
{5:-- TERMINAL --} |
|
||||
]])
|
||||
|
||||
|
||||
@@ -423,7 +423,7 @@ describe(':terminal window', function()
|
||||
cool line 8 |
|
||||
cool line 9 |
|
||||
cool line 10 |
|
||||
{5:-- TERMINAL --} 6,1 Bot |
|
||||
{5:-- TERMINAL --} 6,1 Bot|
|
||||
]])
|
||||
command('call nvim_win_set_cursor(0, [1, 0])')
|
||||
screen:expect_unchanged()
|
||||
@@ -436,7 +436,7 @@ describe(':terminal window', function()
|
||||
cool line 8 |
|
||||
cool line 9 |
|
||||
cool line 10 |
|
||||
{5:-- TERMINAL --} 7,5 Bot |
|
||||
{5:-- TERMINAL --} 7,5 Bot|
|
||||
]])
|
||||
-- Check topline correct after leaving terminal mode.
|
||||
-- The new cursor position is one column left of the terminal's actual cursor position.
|
||||
@@ -448,7 +448,7 @@ describe(':terminal window', function()
|
||||
cool line 8 |
|
||||
cool line 9 |
|
||||
cool line 10 |
|
||||
7,4 Bot |
|
||||
7,4 Bot|
|
||||
]])
|
||||
end)
|
||||
|
||||
|
||||
@@ -27,7 +27,8 @@ M.nvim_set = (
|
||||
'set shortmess+=IS background=light noswapfile noautoindent startofline'
|
||||
.. ' laststatus=1 undodir=. directory=. viewdir=. backupdir=.'
|
||||
.. " belloff= wildoptions-=pum joinspaces noshowcmd noruler nomore redrawdebug=invalid shada=!,'100,<50,s10,h"
|
||||
.. [[ statusline=%<%f\ %{%nvim_eval_statusline('%h%w%m%r',\ {'maxwidth':\ 30}).width\ >\ 0\ ?\ '%h%w%m%r\ '\ :\ ''%}%=%{%\ &showcmdloc\ ==\ 'statusline'\ ?\ '%-10.S\ '\ :\ ''\ %}%{%\ exists('b:keymap_name')\ ?\ '<'..b:keymap_name..'>\ '\ :\ ''\ %}%{%\ &ruler\ ?\ (\ &rulerformat\ ==\ ''\ ?\ '%-14.(%l,%c%V%)\ %P'\ :\ &rulerformat\ )\ :\ ''\ %}]]
|
||||
.. [[ statusline=%<%f\ %{%nvim_eval_statusline('%h%w%m%r',\ {'maxwidth':\ 30}).width\ >\ 0\ ?\ '%h%w%m%r\ '\ :\ ''%}%=%{%\ &showcmdloc\ ==\ 'statusline'\ ?\ '%-10.S\ '\ :\ ''\ %}%{%\ exists('b:keymap_name')\ ?\ '<'..b:keymap_name..'>\ '\ :\ ''\ %}%{%\ &ruler\ ?\ &rulerformat\ :\ ''\ %}]]
|
||||
.. ' rulerformat=%18(%l,%c%V%=%P%)'
|
||||
)
|
||||
M.nvim_argv = {
|
||||
M.nvim_prog,
|
||||
|
||||
@@ -3578,7 +3578,7 @@ describe('float window', function()
|
||||
|
|
||||
{0:~ }|*5
|
||||
## grid 3
|
||||
1,1 All |
|
||||
1,1 All|
|
||||
## grid 4
|
||||
{1:^aaa aab }|
|
||||
{1:abb acc }|
|
||||
@@ -3597,7 +3597,7 @@ describe('float window', function()
|
||||
{0:~ }{1:abb acc }{0: }|
|
||||
{0:~ }{2:~ }{0: }|
|
||||
{0:~ }|*3
|
||||
1,1 All |
|
||||
1,1 All|
|
||||
]],
|
||||
}
|
||||
end
|
||||
@@ -3613,7 +3613,7 @@ describe('float window', function()
|
||||
|
|
||||
{0:~ }|*5
|
||||
## grid 3
|
||||
1,5 All |
|
||||
1,5 All|
|
||||
## grid 4
|
||||
{1:aaa ^aab }|
|
||||
{1:abb acc }|
|
||||
@@ -3632,7 +3632,7 @@ describe('float window', function()
|
||||
{0:~ }{1:abb acc }{0: }|
|
||||
{0:~ }{2:~ }{0: }|
|
||||
{0:~ }|*3
|
||||
1,5 All |
|
||||
1,5 All|
|
||||
]],
|
||||
}
|
||||
end
|
||||
@@ -3692,7 +3692,7 @@ describe('float window', function()
|
||||
|
|
||||
{0:~ }|*7
|
||||
## grid 3
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
## grid 4
|
||||
{1: }|
|
||||
{2:~ }|*2
|
||||
@@ -3716,7 +3716,7 @@ describe('float window', function()
|
||||
{1: } {1:^ } |
|
||||
{2:~ }{0: }{2:~ }{0: }|*2
|
||||
{0:~ }|*5
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
]],
|
||||
}
|
||||
end
|
||||
|
||||
@@ -936,7 +936,7 @@ describe('ui/ext_messages', function()
|
||||
end)
|
||||
|
||||
it("supports 'showcmd' and 'ruler(format)'", function()
|
||||
command('set showcmd ruler')
|
||||
command('set showcmd ruler rulerformat=%12(%l,%c%V%=%P%)')
|
||||
command('hi link MsgArea ErrorMsg')
|
||||
screen:expect({
|
||||
grid = [[
|
||||
@@ -1890,25 +1890,11 @@ describe('ui/builtin messages', function()
|
||||
end)
|
||||
|
||||
it('supports ruler with laststatus=0', function()
|
||||
command('set ruler laststatus=0')
|
||||
command('set laststatus=0 ruler rulerformat=%-15(%c%V\\ %p%%%)')
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*5
|
||||
0,0-1 All |
|
||||
]])
|
||||
|
||||
command('hi MsgArea guibg=#333333')
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*5
|
||||
{101: 0,0-1 All }|
|
||||
]])
|
||||
|
||||
command('set rulerformat=%15(%c%V\\ %p%%%)')
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*5
|
||||
{101: 0,0-1 100% }|
|
||||
0-1 100% |
|
||||
]])
|
||||
|
||||
-- Ruler is cleared when it is no longer drawn.
|
||||
@@ -1916,7 +1902,21 @@ describe('ui/builtin messages', function()
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*5
|
||||
{101: }|
|
||||
|
|
||||
]])
|
||||
|
||||
command('set ruler rulerformat&')
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*5
|
||||
0,0-1 All|
|
||||
]])
|
||||
|
||||
command('hi MsgArea guibg=#333333')
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*5
|
||||
{101: 0,0-1 All}|
|
||||
]])
|
||||
end)
|
||||
|
||||
|
||||
@@ -303,35 +303,35 @@ describe('multibyte rendering', function()
|
||||
screen:expect([[
|
||||
^🏳️⚧️ |
|
||||
{1:~ }|*4
|
||||
1,1 All |
|
||||
1,1 All|
|
||||
]])
|
||||
|
||||
feed('a word<esc>')
|
||||
screen:expect([[
|
||||
🏳️⚧️ wor^d |
|
||||
{1:~ }|*4
|
||||
1,21-7 All |
|
||||
1,21-7 All|
|
||||
]])
|
||||
|
||||
feed('0')
|
||||
screen:expect([[
|
||||
^🏳️⚧️ word |
|
||||
{1:~ }|*4
|
||||
1,1 All |
|
||||
1,1 All|
|
||||
]])
|
||||
|
||||
feed('l')
|
||||
screen:expect([[
|
||||
🏳️⚧️^ word |
|
||||
{1:~ }|*4
|
||||
1,17-3 All |
|
||||
1,17-3 All|
|
||||
]])
|
||||
|
||||
feed('h')
|
||||
screen:expect([[
|
||||
^🏳️⚧️ word |
|
||||
{1:~ }|*4
|
||||
1,1 All |
|
||||
1,1 All|
|
||||
]])
|
||||
|
||||
feed('o❤️ variant selected<esc>')
|
||||
@@ -339,7 +339,7 @@ describe('multibyte rendering', function()
|
||||
🏳️⚧️ word |
|
||||
❤️ variant selecte^d |
|
||||
{1:~ }|*3
|
||||
2,23-19 All |
|
||||
2,23-19 All|
|
||||
]])
|
||||
|
||||
feed('0')
|
||||
@@ -347,7 +347,7 @@ describe('multibyte rendering', function()
|
||||
🏳️⚧️ word |
|
||||
^❤️ variant selected |
|
||||
{1:~ }|*3
|
||||
2,1 All |
|
||||
2,1 All|
|
||||
]])
|
||||
|
||||
feed('l')
|
||||
@@ -355,7 +355,7 @@ describe('multibyte rendering', function()
|
||||
🏳️⚧️ word |
|
||||
❤️^ variant selected |
|
||||
{1:~ }|*3
|
||||
2,7-3 All |
|
||||
2,7-3 All|
|
||||
]])
|
||||
|
||||
feed('h')
|
||||
@@ -363,7 +363,7 @@ describe('multibyte rendering', function()
|
||||
🏳️⚧️ word |
|
||||
^❤️ variant selected |
|
||||
{1:~ }|*3
|
||||
2,1 All |
|
||||
2,1 All|
|
||||
]])
|
||||
|
||||
-- without selector: single width (note column 18 and not 19)
|
||||
@@ -373,7 +373,7 @@ describe('multibyte rendering', function()
|
||||
❤️ variant selected |
|
||||
❤ variant selecte^d |
|
||||
{1:~ }|*2
|
||||
3,20-18 All |
|
||||
3,20-18 All|
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -366,7 +366,7 @@ local function screen_tests(linegrid)
|
||||
0123^456 |
|
||||
789 |
|
||||
{1:~ }|*11
|
||||
1,5 All |
|
||||
1,5 All|
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -346,7 +346,7 @@ describe('global statusline', function()
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*14
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
]])
|
||||
|
||||
command('set laststatus=3')
|
||||
@@ -402,7 +402,7 @@ describe('global statusline', function()
|
||||
{2:< 0,0-1 All <-1 All <}│{1:~ }|
|
||||
│{1:~ }|
|
||||
{1:~ }│{1:~ }|*4
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
]])
|
||||
|
||||
command('set laststatus=3')
|
||||
@@ -816,7 +816,7 @@ describe('statusline', function()
|
||||
{1:~}{15:^ }{1: }|
|
||||
{1:~ }|*4
|
||||
{2:[No Name] 0,0-1 All}|
|
||||
0,0-1 All |
|
||||
0,0-1 All|
|
||||
]])
|
||||
api.nvim_win_close(win, true)
|
||||
screen:expect([[
|
||||
@@ -1142,7 +1142,7 @@ describe('default statusline', function()
|
||||
"%{% exists('b:keymap_name') ? '<'..b:keymap_name..'> ' : '' %}",
|
||||
"%{% &busy > 0 ? '◐ ' : '' %}",
|
||||
"%{% luaeval('(package.loaded[''vim.diagnostic''] and next(vim.diagnostic.count()) and vim.diagnostic.status() .. '' '') or '''' ') %}",
|
||||
"%{% &ruler ? ( &rulerformat == '' ? '%-14.(%l,%c%V%) %P' : &rulerformat ) : '' %}",
|
||||
"%{% &ruler ? &rulerformat : '' %}",
|
||||
})
|
||||
|
||||
exec_lua("vim.o.statusline = ''")
|
||||
@@ -1295,6 +1295,48 @@ describe('default statusline', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('default rulerformat', function()
|
||||
local screen
|
||||
|
||||
before_each(function()
|
||||
clear()
|
||||
screen = Screen.new(60, 16)
|
||||
command('set ruler')
|
||||
end)
|
||||
|
||||
it('setting rulerformat to empty string sets default rulerformat', function()
|
||||
exec_lua("vim.o.rulerformat = 'hjkl'")
|
||||
eq('hjkl', eval('&rulerformat'))
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*14
|
||||
hjkl |
|
||||
]])
|
||||
|
||||
local default_rulerformat = '%18(%l,%c%V%= %P%)%<'
|
||||
|
||||
exec_lua("vim.o.rulerformat = ''")
|
||||
eq(default_rulerformat, eval('&rulerformat'))
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*14
|
||||
0,0-1 All|
|
||||
]])
|
||||
|
||||
-- Reset to default if there's an error.
|
||||
command('set rulerformat=%{a%}')
|
||||
eq(default_rulerformat, eval('&rulerformat'))
|
||||
eq(default_rulerformat, eval('&g:rulerformat'))
|
||||
eq(default_rulerformat, eval('&l:rulerformat'))
|
||||
command('redrawstatus') -- like Vim, rulerformat isn't immediately redrawn after an error
|
||||
screen:expect([[
|
||||
^ |
|
||||
{1:~ }|*14
|
||||
{9:E121: Undefined variable: a} 0,0-1 All|
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("'statusline' in floatwin", function()
|
||||
local screen
|
||||
before_each(function()
|
||||
|
||||
Reference in New Issue
Block a user