aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/buffer.c')
-rw-r--r--src/nvim/buffer.c114
1 files changed, 77 insertions, 37 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 837fcb5cc1..c2573cf942 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -53,7 +53,7 @@
#include "nvim/indent_c.h"
#include "nvim/main.h"
#include "nvim/mark.h"
-#include "nvim/mark_extended.h"
+#include "nvim/extmark.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
@@ -763,6 +763,9 @@ static void free_buffer(buf_T *buf)
unref_var_dict(buf->b_vars);
aubuflocal_remove(buf);
tv_dict_unref(buf->additional_data);
+ xfree(buf->b_prompt_text);
+ callback_free(&buf->b_prompt_callback);
+ callback_free(&buf->b_prompt_interrupt);
clear_fmark(&buf->b_last_cursor);
clear_fmark(&buf->b_last_insert);
clear_fmark(&buf->b_last_change);
@@ -1876,6 +1879,10 @@ buf_T * buflist_new(char_u *ffname, char_u *sfname, linenr_T lnum, int flags)
}
}
+ buf->b_prompt_callback.type = kCallbackNone;
+ buf->b_prompt_interrupt.type = kCallbackNone;
+ buf->b_prompt_text = NULL;
+
return buf;
}
@@ -3068,18 +3075,15 @@ void col_print(char_u *buf, size_t buflen, int col, int vcol)
}
}
-/*
- * put file name in title bar of window and in icon title
- */
-
static char_u *lasttitle = NULL;
static char_u *lasticon = NULL;
+
+// Put the title name in the title bar and icon of the window.
void maketitle(void)
{
- char_u *t_str = NULL;
- char_u *i_name;
- char_u *i_str = NULL;
+ char_u *title_str = NULL;
+ char_u *icon_str = NULL;
int maxlen = 0;
int len;
int mustset;
@@ -3093,7 +3097,7 @@ void maketitle(void)
need_maketitle = false;
if (!p_title && !p_icon && lasttitle == NULL && lasticon == NULL) {
- return;
+ return; // nothing to do
}
if (p_title) {
@@ -3114,14 +3118,14 @@ void maketitle(void)
build_stl_str_hl(curwin, (char_u *)buf, sizeof(buf),
p_titlestring, use_sandbox,
0, maxlen, NULL, NULL);
- t_str = (char_u *)buf;
+ title_str = (char_u *)buf;
if (called_emsg) {
set_string_option_direct((char_u *)"titlestring", -1, (char_u *)"",
OPT_FREE, SID_ERROR);
}
called_emsg |= save_called_emsg;
} else {
- t_str = p_titlestring;
+ title_str = p_titlestring;
}
} else {
// Format: "fname + (path) (1 of 2) - VIM".
@@ -3205,16 +3209,16 @@ void maketitle(void)
trunc_string((char_u *)buf, (char_u *)buf, maxlen, sizeof(buf));
}
}
- t_str = (char_u *)buf;
+ title_str = (char_u *)buf;
#undef SPACE_FOR_FNAME
#undef SPACE_FOR_DIR
#undef SPACE_FOR_ARGNR
}
}
- mustset = ti_change(t_str, &lasttitle);
+ mustset = value_change(title_str, &lasttitle);
if (p_icon) {
- i_str = (char_u *)buf;
+ icon_str = (char_u *)buf;
if (*p_iconstring != NUL) {
if (stl_syntax & STL_IN_ICON) {
int use_sandbox = false;
@@ -3222,37 +3226,40 @@ void maketitle(void)
use_sandbox = was_set_insecurely((char_u *)"iconstring", 0);
called_emsg = false;
- build_stl_str_hl(curwin, i_str, sizeof(buf),
- p_iconstring, use_sandbox,
- 0, 0, NULL, NULL);
- if (called_emsg)
+ build_stl_str_hl(curwin, icon_str, sizeof(buf),
+ p_iconstring, use_sandbox,
+ 0, 0, NULL, NULL);
+ if (called_emsg) {
set_string_option_direct((char_u *)"iconstring", -1,
- (char_u *)"", OPT_FREE, SID_ERROR);
+ (char_u *)"", OPT_FREE, SID_ERROR);
+ }
called_emsg |= save_called_emsg;
- } else
- i_str = p_iconstring;
+ } else {
+ icon_str = p_iconstring;
+ }
} else {
+ char_u *buf_p;
if (buf_spname(curbuf) != NULL) {
- i_name = buf_spname(curbuf);
+ buf_p = buf_spname(curbuf);
} else { // use file name only in icon
- i_name = path_tail(curbuf->b_ffname);
+ buf_p = path_tail(curbuf->b_ffname);
}
- *i_str = NUL;
+ *icon_str = NUL;
// Truncate name at 100 bytes.
- len = (int)STRLEN(i_name);
+ len = (int)STRLEN(buf_p);
if (len > 100) {
len -= 100;
if (has_mbyte) {
- len += (*mb_tail_off)(i_name, i_name + len) + 1;
+ len += (*mb_tail_off)(buf_p, buf_p + len) + 1;
}
- i_name += len;
+ buf_p += len;
}
- STRCPY(i_str, i_name);
- trans_characters(i_str, IOSIZE);
+ STRCPY(icon_str, buf_p);
+ trans_characters(icon_str, IOSIZE);
}
}
- mustset |= ti_change(i_str, &lasticon);
+ mustset |= value_change(icon_str, &lasticon);
if (mustset) {
resettitle();
@@ -3266,8 +3273,8 @@ void maketitle(void)
/// @param str desired title string
/// @param[in,out] last current title string
//
-/// @return true when "*last" changed.
-static bool ti_change(char_u *str, char_u **last)
+/// @return true if resettitle() is to be called.
+static bool value_change(char_u *str, char_u **last)
FUNC_ATTR_WARN_UNUSED_RESULT
{
if ((str == NULL) != (*last == NULL)
@@ -3275,10 +3282,11 @@ static bool ti_change(char_u *str, char_u **last)
xfree(*last);
if (str == NULL) {
*last = NULL;
+ resettitle();
} else {
*last = vim_strsave(str);
+ return true;
}
- return true;
}
return false;
}
@@ -3389,14 +3397,27 @@ int build_stl_str_hl(
fillchar = '-';
}
+ // The cursor in windows other than the current one isn't always
+ // up-to-date, esp. because of autocommands and timers.
+ linenr_T lnum = wp->w_cursor.lnum;
+ if (lnum > wp->w_buffer->b_ml.ml_line_count) {
+ lnum = wp->w_buffer->b_ml.ml_line_count;
+ wp->w_cursor.lnum = lnum;
+ }
+
// Get line & check if empty (cursorpos will show "0-1").
- char_u *line_ptr = ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, false);
+ const char_u *line_ptr = ml_get_buf(wp->w_buffer, lnum, false);
bool empty_line = (*line_ptr == NUL);
// Get the byte value now, in case we need it below. This is more
// efficient than making a copy of the line.
int byteval;
- if (wp->w_cursor.col > (colnr_T)STRLEN(line_ptr)) {
+ const size_t len = STRLEN(line_ptr);
+ if (wp->w_cursor.col > (colnr_T)len) {
+ // Line may have changed since checking the cursor column, or the lnum
+ // was adjusted above.
+ wp->w_cursor.col = (colnr_T)len;
+ wp->w_cursor.coladd = 0;
byteval = 0;
} else {
byteval = utf_ptr2char(line_ptr + wp->w_cursor.col);
@@ -3530,6 +3551,12 @@ int build_stl_str_hl(
if (n == curitem && group_start_userhl == group_end_userhl) {
out_p = t;
group_len = 0;
+ // do not use the highlighting from the removed group
+ for (n = groupitems[groupdepth] + 1; n < curitem; n++) {
+ if (items[n].type == Highlight) {
+ items[n].type = Empty;
+ }
+ }
}
}
@@ -4817,6 +4844,12 @@ do_arg_all(
xfree(opened);
}
+// Return TRUE if "buf" is a prompt buffer.
+int bt_prompt(buf_T *buf)
+{
+ return buf != NULL && buf->b_p_bt[0] == 'p';
+}
+
/*
* Open a window for a number of buffers.
*/
@@ -5211,14 +5244,18 @@ bool bt_nofile(const buf_T *const buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
return buf != NULL && ((buf->b_p_bt[0] == 'n' && buf->b_p_bt[2] == 'f')
- || buf->b_p_bt[0] == 'a' || buf->terminal);
+ || buf->b_p_bt[0] == 'a'
+ || buf->terminal
+ || buf->b_p_bt[0] == 'p');
}
// Return true if "buf" is a "nowrite", "nofile" or "terminal" buffer.
bool bt_dontwrite(const buf_T *const buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- return buf != NULL && (buf->b_p_bt[0] == 'n' || buf->terminal);
+ return buf != NULL && (buf->b_p_bt[0] == 'n'
+ || buf->terminal
+ || buf->b_p_bt[0] == 'p');
}
bool bt_dontwrite_msg(const buf_T *const buf)
@@ -5271,6 +5308,9 @@ char_u *buf_spname(buf_T *buf)
if (buf->b_fname != NULL) {
return buf->b_fname;
}
+ if (bt_prompt(buf)) {
+ return (char_u *)_("[Prompt]");
+ }
return (char_u *)_("[Scratch]");
}
if (buf->b_fname == NULL) {