vim-patch:8.2.1597: the channel source file is too big

Problem:    The channel source file is too big.
Solution:   Move job related code to a new source file.

----

Move eval-related prompt-buffer API to src/nvim/nvim/eval/buffer.c.

https://github.com/neovim/neovim/pull/37743#issuecomment-3897416840

----

8b5866ded6

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
Jan Edmund Lazo
2026-08-08 12:28:30 -04:00
parent 9c6ea122a8
commit b3a0cfcd0a
5 changed files with 154 additions and 143 deletions

View File

@@ -6750,101 +6750,6 @@ char *prompt_get_input(buf_T *buf)
return full_text;
}
/// Trim lines above the prompt to enforce 'scrollback' limit
void prompt_trim_scrollback(buf_T *buf)
{
if (buf->b_p_scbk <= 0) {
return;
}
linenr_T prompt_line = buf->b_prompt_start.mark.lnum;
linenr_T above_prompt = prompt_line - 1;
if (above_prompt <= (linenr_T)buf->b_p_scbk) {
return;
}
linenr_T to_delete = above_prompt - (linenr_T)buf->b_p_scbk;
for (linenr_T i = 0; i < to_delete; i++) {
ml_delete_buf(buf, 1, false);
}
mark_adjust_buf(buf, 1, to_delete, MAXLNUM, -to_delete, true,
kMarkAdjustNormal, kExtmarkUndo);
deleted_lines_buf(buf, 1, to_delete);
FOR_ALL_TAB_WINDOWS(tp, wp) {
if (wp->w_buffer == buf) {
wp->w_cursor.lnum = wp->w_cursor.lnum <= to_delete
? 1
: wp->w_cursor.lnum - to_delete;
if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count) {
wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
}
}
}
check_cursor_col(curwin);
}
/// Invokes the user-defined callback defined for the current prompt-buffer.
void prompt_invoke_callback(void)
{
typval_T rettv;
typval_T argv[2];
linenr_T lnum = curbuf->b_ml.ml_line_count;
char *user_input = prompt_get_input(curbuf);
if (!user_input) {
return;
}
// Add a new line for the prompt before invoking the callback, so that
// text can always be inserted above the last line.
ml_append(lnum, "", 0, false);
appended_lines_mark(lnum, 1);
curwin->w_cursor.lnum = lnum + 1;
curwin->w_cursor.col = 0;
curbuf->b_prompt_start.mark.lnum = lnum + 1;
if (curbuf->b_prompt_callback.type == kCallbackNone) {
xfree(user_input);
goto theend;
}
argv[0].v_type = VAR_STRING;
argv[0].vval.v_string = user_input;
argv[1].v_type = VAR_UNKNOWN;
callback_call(&curbuf->b_prompt_callback, 1, argv, &rettv);
tv_clear(&argv[0]);
tv_clear(&rettv);
theend:
// clear undo history on submit
u_clearallandblockfree(curbuf);
curbuf->b_prompt_start.mark.lnum = curbuf->b_ml.ml_line_count;
curbuf->b_prompt_append_new_line = true;
prompt_trim_scrollback(curbuf);
}
/// @return true when the interrupt callback was invoked.
bool invoke_prompt_interrupt(void)
{
typval_T rettv;
typval_T argv[1];
if (curbuf->b_prompt_interrupt.type == kCallbackNone) {
return false;
}
argv[0].v_type = VAR_UNKNOWN;
got_int = false; // don't skip executing commands
int ret = callback_call(&curbuf->b_prompt_interrupt, 0, argv, &rettv);
tv_clear(&rettv);
return ret != FAIL;
}
/// Compare "typ1" and "typ2". Put the result in "typ1".
///
/// @param typ1 first operand

View File

@@ -24,6 +24,7 @@
#include "nvim/globals.h"
#include "nvim/insert.h"
#include "nvim/macros_defs.h"
#include "nvim/mark.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/move.h"
@@ -275,6 +276,102 @@ void f_appendbufline(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
buf_set_append_line(argvars, rettv, true);
}
/// Trim lines above the prompt to enforce 'scrollback' limit
static void prompt_trim_scrollback(buf_T *buf)
FUNC_ATTR_NONNULL_ALL
{
if (buf->b_p_scbk <= 0) {
return;
}
linenr_T prompt_line = buf->b_prompt_start.mark.lnum;
linenr_T above_prompt = prompt_line - 1;
if (above_prompt <= (linenr_T)buf->b_p_scbk) {
return;
}
linenr_T to_delete = above_prompt - (linenr_T)buf->b_p_scbk;
for (linenr_T i = 0; i < to_delete; i++) {
ml_delete_buf(buf, 1, false);
}
mark_adjust_buf(buf, 1, to_delete, MAXLNUM, -to_delete, true,
kMarkAdjustNormal, kExtmarkUndo);
deleted_lines_buf(buf, 1, to_delete);
FOR_ALL_TAB_WINDOWS(tp, wp) {
if (wp->w_buffer == buf) {
wp->w_cursor.lnum = wp->w_cursor.lnum <= to_delete
? 1
: wp->w_cursor.lnum - to_delete;
if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count) {
wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
}
}
}
check_cursor_col(curwin);
}
/// Invokes the user-defined callback defined for the current prompt-buffer.
void prompt_invoke_callback(void)
{
typval_T rettv;
typval_T argv[2];
linenr_T lnum = curbuf->b_ml.ml_line_count;
char *user_input = prompt_get_input(curbuf);
if (!user_input) {
return;
}
// Add a new line for the prompt before invoking the callback, so that
// text can always be inserted above the last line.
ml_append(lnum, "", 0, false);
appended_lines_mark(lnum, 1);
curwin->w_cursor.lnum = lnum + 1;
curwin->w_cursor.col = 0;
curbuf->b_prompt_start.mark.lnum = lnum + 1;
if (curbuf->b_prompt_callback.type == kCallbackNone) {
xfree(user_input);
goto theend;
}
argv[0].v_type = VAR_STRING;
argv[0].vval.v_string = user_input;
argv[1].v_type = VAR_UNKNOWN;
callback_call(&curbuf->b_prompt_callback, 1, argv, &rettv);
tv_clear(&argv[0]);
tv_clear(&rettv);
theend:
// clear undo history on submit
u_clearallandblockfree(curbuf);
curbuf->b_prompt_start.mark.lnum = curbuf->b_ml.ml_line_count;
curbuf->b_prompt_append_new_line = true;
prompt_trim_scrollback(curbuf);
}
/// @return true when the interrupt callback was invoked.
bool invoke_prompt_interrupt(void)
{
typval_T rettv;
typval_T argv[1];
if (curbuf->b_prompt_interrupt.type == kCallbackNone) {
return false;
}
argv[0].v_type = VAR_UNKNOWN;
got_int = false; // don't skip executing commands
int ret = callback_call(&curbuf->b_prompt_interrupt, 0, argv, &rettv);
tv_clear(&rettv);
return ret != FAIL;
}
/// "prompt_appendbuf({buffer}, string/list)" function
void f_prompt_appendbuf(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
FUNC_ATTR_NONNULL_ALL
@@ -821,6 +918,46 @@ void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
buf->b_prompt_interrupt = interrupt_callback;
}
/// "prompt_getprompt({buffer})" function
void f_prompt_getprompt(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
FUNC_ATTR_NONNULL_ALL
{
// return an empty string by default, e.g. it's not a prompt buffer
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
buf_T *const buf = tv_get_buf_from_arg(&argvars[0]);
if (buf == NULL) {
return;
}
if (!bt_prompt(buf)) {
return;
}
rettv->vval.v_string = xstrdup(buf_prompt_text(buf));
}
/// "prompt_getinput({buffer})" function
void f_prompt_getinput(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
FUNC_ATTR_NONNULL_ALL
{
// return an empty string by default, e.g. it's not a prompt buffer
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
buf_T *const buf = tv_get_buf_from_arg(&argvars[0]);
if (buf == NULL) {
return;
}
if (!bt_prompt(buf)) {
return;
}
rettv->vval.v_string = prompt_get_input(buf);
}
/// "prompt_setprompt({buffer}, {text})" function
void f_prompt_setprompt(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{

View File

@@ -4771,46 +4771,6 @@ static void f_printf(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
}
}
/// "prompt_getprompt({buffer})" function
static void f_prompt_getprompt(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
FUNC_ATTR_NONNULL_ALL
{
// return an empty string by default, e.g. it's not a prompt buffer
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
buf_T *const buf = tv_get_buf_from_arg(&argvars[0]);
if (buf == NULL) {
return;
}
if (!bt_prompt(buf)) {
return;
}
rettv->vval.v_string = xstrdup(buf_prompt_text(buf));
}
/// "prompt_getinput({buffer})" function
static void f_prompt_getinput(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
FUNC_ATTR_NONNULL_ALL
{
// return an empty string by default, e.g. it's not a prompt buffer
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
buf_T *const buf = tv_get_buf_from_arg(&argvars[0]);
if (buf == NULL) {
return;
}
if (!bt_prompt(buf)) {
return;
}
rettv->vval.v_string = prompt_get_input(buf);
}
/// "pum_getpos()" function
static void f_pum_getpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{

View File

@@ -23,7 +23,7 @@
#include "nvim/digraph.h"
#include "nvim/drawscreen.h"
#include "nvim/errors.h"
#include "nvim/eval.h"
#include "nvim/eval/buffer.h"
#include "nvim/eval/typval_defs.h"
#include "nvim/eval/vars.h"
#include "nvim/ex_cmds_defs.h"
@@ -1641,12 +1641,7 @@ static void init_prompt(int cmdchar_todo)
// Insert always starts after the prompt, allow editing text after it.
if (Ins.start_orig.lnum != curbuf->b_prompt_start.mark.lnum
|| Ins.start_orig.col != curbuf->b_prompt_start.mark.col) {
Ins.start.lnum = curbuf->b_prompt_start.mark.lnum;
Ins.start.col = curbuf->b_prompt_start.mark.col;
Ins.start_orig = Ins.start;
Ins.start_textlen = Ins.start.col;
Ins.start_blank_vcol = MAXCOL;
Ins.arrow_used = false;
set_insstart(curbuf->b_prompt_start.mark.lnum, curbuf->b_prompt_start.mark.col);
}
if (cmdchar_todo == 'A') {
@@ -1668,6 +1663,20 @@ bool prompt_curpos_editable(void)
&& curwin->w_cursor.col >= curbuf->b_prompt_start.mark.col);
}
/// Set the insert start position for when using a prompt buffer.
///
/// @param[in] lnum
/// @param[in] col
static void set_insstart(linenr_T lnum, colnr_T col)
{
Ins.start.lnum = lnum;
Ins.start.col = col;
Ins.start_orig = Ins.start;
Ins.start_textlen = Ins.start.col;
Ins.start_blank_vcol = MAXCOL;
Ins.arrow_used = false;
}
// Undo the previous edit_putchar().
void edit_unputchar(void)
{

View File

@@ -29,7 +29,7 @@
#include "nvim/digraph.h"
#include "nvim/drawscreen.h"
#include "nvim/errors.h"
#include "nvim/eval.h"
#include "nvim/eval/buffer.h"
#include "nvim/eval/vars.h"
#include "nvim/ex_cmds.h"
#include "nvim/ex_cmds2.h"