vim-patch:8.1.0027: difficult to make a plugin that feeds a line to a job

Problem:    Difficult to make a plugin that feeds a line to a job.
Solution:   Add the nitial code for the "prompt" buftype.
f273245f64
This commit is contained in:
erw7
2019-05-20 11:57:45 +09:00
parent 58ec72f9fd
commit 4813ad48cd
13 changed files with 378 additions and 46 deletions

View File

@@ -574,6 +574,12 @@ static int insert_check(VimState *state)
foldCheckClose();
}
int cmdchar_todo = s->cmdchar;
if (bt_prompt(curbuf)) {
init_prompt(cmdchar_todo);
cmdchar_todo = NUL;
}
// If we inserted a character at the last position of the last line in the
// window, scroll the window one line up. This avoids an extra redraw. This
// is detected when the cursor column is smaller after inserting something.
@@ -1143,6 +1149,14 @@ check_pum:
cmdwin_result = CAR;
return 0;
}
if (bt_prompt(curbuf)) {
invoke_prompt_callback();
if (curbuf != buf) {
// buffer changed, get out of Insert mode
return 0;
}
break;
}
if (!ins_eol(s->c) && !p_im) {
return 0; // out of memory
}
@@ -1569,6 +1583,50 @@ void edit_putchar(int c, int highlight)
}
}
// Return the effective prompt for the current buffer.
char_u *prompt_text(void)
{
if (curbuf->b_prompt_text == NULL) {
return (char_u *)"% ";
}
return curbuf->b_prompt_text;
}
// Prepare for prompt mode: Make sure the last line has the prompt text.
// Move the cursor to this line.
static void init_prompt(int cmdchar_todo)
{
char_u *prompt = prompt_text();
char_u *text;
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
text = get_cursor_line_ptr();
if (STRNCMP(text, prompt, STRLEN(prompt)) != 0) {
// prompt is missing, insert it or append a line with it
if (*text == NUL) {
ml_replace(curbuf->b_ml.ml_line_count, prompt, true);
} else {
ml_append(curbuf->b_ml.ml_line_count, prompt, 0, false);
}
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
coladvance((colnr_T)MAXCOL);
changed_bytes(curbuf->b_ml.ml_line_count, 0);
}
if (cmdchar_todo == 'A') {
coladvance((colnr_T)MAXCOL);
}
if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt)) {
curwin->w_cursor.col = STRLEN(prompt);
}
}
// Return TRUE if the cursor is in the editable position of the prompt line.
int prompt_curpos_editable(void)
{
return curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count
&& curwin->w_cursor.col >= (int)STRLEN(prompt_text());
}
/*
* Undo the previous edit_putchar().
*/