feat(statusline): support multibyte fillchar

This includes a partial port of Vim patch 8.2.2569 and some changes to
nvim_eval_statusline() to allow a multibyte fillchar. Literally every
line of C code touched by that patch has been refactored in Nvim, and
that patch contains some irrelevant foldcolumn tests I'm not sure how to
port (as Nvim's foldcolumn behavior has diverged from Vim's).
This commit is contained in:
zeertzjq
2022-01-16 18:44:28 +08:00
parent 7085e5b0c8
commit be15ac06ba
8 changed files with 152 additions and 91 deletions

View File

@@ -19,6 +19,7 @@
#include "nvim/ascii.h"
#include "nvim/buffer.h"
#include "nvim/buffer_defs.h"
#include "nvim/charset.h"
#include "nvim/context.h"
#include "nvim/decoration.h"
#include "nvim/edit.h"
@@ -2234,7 +2235,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
Dictionary result = ARRAY_DICT_INIT;
int maxwidth;
char fillchar = 0;
int fillchar = 0;
Window window = 0;
bool use_tabline = false;
bool highlights = false;
@@ -2249,12 +2250,12 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
}
if (HAS_KEY(opts->fillchar)) {
if (opts->fillchar.type != kObjectTypeString || opts->fillchar.data.string.size > 1) {
api_set_error(err, kErrorTypeValidation, "fillchar must be an ASCII character");
if (opts->fillchar.type != kObjectTypeString || opts->fillchar.data.string.size == 0
|| char2cells(fillchar = utf_ptr2char((char_u *)opts->fillchar.data.string.data)) != 1
|| (size_t)utf_char2len(fillchar) != opts->fillchar.data.string.size) {
api_set_error(err, kErrorTypeValidation, "fillchar must be a single-width character");
return result;
}
fillchar = opts->fillchar.data.string.data[0];
}
if (HAS_KEY(opts->highlights)) {
@@ -2285,7 +2286,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
if (fillchar == 0) {
int attr;
fillchar = (char)fillchar_status(&attr, wp);
fillchar = fillchar_status(&attr, wp);
}
}
@@ -2313,7 +2314,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
sizeof(buf),
(char_u *)str.data,
false,
(char_u)fillchar,
fillchar,
maxwidth,
hltab_ptr,
NULL);