aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/api-docs.yml3
-rw-r--r--src/nvim/option.c6
-rw-r--r--src/nvim/terminal.c16
-rw-r--r--test/functional/terminal/scrollback_spec.lua28
4 files changed, 45 insertions, 8 deletions
diff --git a/.github/workflows/api-docs.yml b/.github/workflows/api-docs.yml
index 52f312c75f..83554e2a3d 100644
--- a/.github/workflows/api-docs.yml
+++ b/.github/workflows/api-docs.yml
@@ -59,8 +59,7 @@ jobs:
run: |
echo "Job failed, run ./scripts/gen_vimdoc.py and commit your doc changes"
echo "The doc generation produces the following changes:"
- git --no-pager diff
- exit 1
+ git diff --color --exit-code
- name: Automatic PR
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 && !inputs.check_only }}
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 5565e6f167..a15c6f4854 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -4544,9 +4544,9 @@ static char *set_num_option(int opt_idx, char_u *varp, long value, char *errbuf,
check_colorcolumn(wp);
}
} else if (pp == &curbuf->b_p_scbk || pp == &p_scbk) {
- if (curbuf->terminal) {
- // Force the scrollback to take effect.
- terminal_check_size(curbuf->terminal);
+ if (curbuf->terminal && value < old_value) {
+ // Force the scrollback to take immediate effect only when decreasing it.
+ on_scrollback_option_changed(curbuf->terminal);
}
} else if (pp == &curwin->w_p_nuw) {
curwin->w_nrwidth_line_count = 0;
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index e4262c2ca9..c5b3bbcb01 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -233,6 +233,8 @@ Terminal *terminal_open(buf_T *buf, TerminalOptions opts)
RESET_BINDING(curwin);
// Reset cursor in current window.
curwin->w_cursor = (pos_T){ .lnum = 1, .col = 0, .coladd = 0 };
+ // Initialize to check if the scrollback buffer has been allocated inside a TermOpen autocmd
+ rv->sb_buffer = NULL;
// Apply TermOpen autocmds _before_ configuring the scrollback buffer.
apply_autocmds(EVENT_TERMOPEN, NULL, NULL, false, buf);
// Local 'scrollback' _after_ autocmds.
@@ -1481,8 +1483,16 @@ static void refresh_size(Terminal *term, buf_T *buf)
term->opts.resize_cb((uint16_t)width, (uint16_t)height, term->opts.data);
}
-/// Adjusts scrollback storage after 'scrollback' option changed.
-static void on_scrollback_option_changed(Terminal *term, buf_T *buf)
+void on_scrollback_option_changed(Terminal *term)
+{
+ // Scrollback buffer may not exist yet, e.g. if 'scrollback' is set in a TermOpen autocmd.
+ if (term->sb_buffer != NULL) {
+ refresh_terminal(term);
+ }
+}
+
+/// Adjusts scrollback storage and the terminal buffer scrollback lines
+static void adjust_scrollback(Terminal *term, buf_T *buf)
{
if (buf->b_p_scbk < 1) { // Local 'scrollback' was set to -1.
buf->b_p_scbk = SB_MAX;
@@ -1554,7 +1564,7 @@ static void refresh_scrollback(Terminal *term, buf_T *buf)
deleted_lines(buf->b_ml.ml_line_count, 1);
}
- on_scrollback_option_changed(term, buf);
+ adjust_scrollback(term, buf);
}
// Refresh the screen (visible part of the buffer when the terminal is
diff --git a/test/functional/terminal/scrollback_spec.lua b/test/functional/terminal/scrollback_spec.lua
index 34fcb6cab9..b1d3b502b2 100644
--- a/test/functional/terminal/scrollback_spec.lua
+++ b/test/functional/terminal/scrollback_spec.lua
@@ -465,6 +465,34 @@ describe("'scrollback' option", function()
matches((iswin() and '^27: line[ ]*$' or '^26: line[ ]*$'), eval("getline(line('w0') - 10)"))
end)
+ it('deletes extra lines immediately', function()
+ -- Scrollback is 10 on screen_setup
+ local screen = thelpers.screen_setup(nil, nil, 30)
+ local lines = {}
+ for i = 1, 30 do
+ table.insert(lines, 'line'..tostring(i))
+ end
+ table.insert(lines, '')
+ feed_data(lines)
+ screen:expect([[
+ line26 |
+ line27 |
+ line28 |
+ line29 |
+ line30 |
+ {1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ local term_height = 6 -- Actual terminal screen height, not the scrollback
+ -- Initial
+ local scrollback = curbufmeths.get_option('scrollback')
+ eq(scrollback + term_height, eval('line("$")'))
+ -- Reduction
+ scrollback = scrollback - 2
+ curbufmeths.set_option('scrollback', scrollback)
+ eq(scrollback + term_height, eval('line("$")'))
+ end)
+
it('defaults to 10000 in :terminal buffers', function()
set_fake_shell()
command('terminal')