mirror of
https://github.com/neovim/neovim.git
synced 2025-09-28 22:18:33 +00:00
buffer updates: mark sorted region as changed.
NB: currently this invalidates all extmarks inside the region. Later on within-line extmarks could be preserved
This commit is contained in:
@@ -629,6 +629,8 @@ void ex_sort(exarg_T *eap)
|
|||||||
if (sort_abort)
|
if (sort_abort)
|
||||||
goto sortend;
|
goto sortend;
|
||||||
|
|
||||||
|
bcount_t old_count = 0, new_count = 0;
|
||||||
|
|
||||||
// Insert the lines in the sorted order below the last one.
|
// Insert the lines in the sorted order below the last one.
|
||||||
lnum = eap->line2;
|
lnum = eap->line2;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
@@ -641,6 +643,8 @@ void ex_sort(exarg_T *eap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
s = ml_get(get_lnum);
|
s = ml_get(get_lnum);
|
||||||
|
size_t bytelen = STRLEN(s) + 1; // include EOL in bytelen
|
||||||
|
old_count += bytelen;
|
||||||
if (!unique || i == 0
|
if (!unique || i == 0
|
||||||
|| (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0) {
|
|| (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0) {
|
||||||
// Copy the line into a buffer, it may become invalid in
|
// Copy the line into a buffer, it may become invalid in
|
||||||
@@ -649,6 +653,7 @@ void ex_sort(exarg_T *eap)
|
|||||||
if (ml_append(lnum++, sortbuf1, (colnr_T)0, false) == FAIL) {
|
if (ml_append(lnum++, sortbuf1, (colnr_T)0, false) == FAIL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
new_count += bytelen;
|
||||||
}
|
}
|
||||||
fast_breakcheck();
|
fast_breakcheck();
|
||||||
if (got_int)
|
if (got_int)
|
||||||
@@ -668,11 +673,16 @@ void ex_sort(exarg_T *eap)
|
|||||||
deleted = (long)(count - (lnum - eap->line2));
|
deleted = (long)(count - (lnum - eap->line2));
|
||||||
if (deleted > 0) {
|
if (deleted > 0) {
|
||||||
mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted,
|
mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted,
|
||||||
kExtmarkUndo);
|
kExtmarkNOOP);
|
||||||
msgmore(-deleted);
|
msgmore(-deleted);
|
||||||
} else if (deleted < 0) {
|
} else if (deleted < 0) {
|
||||||
mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, kExtmarkUndo);
|
mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, kExtmarkNOOP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extmark_splice(curbuf, eap->line1-1, 0,
|
||||||
|
count, 0, old_count,
|
||||||
|
lnum - eap->line2, 0, new_count, kExtmarkUndo);
|
||||||
|
|
||||||
if (change_occurred || deleted != 0) {
|
if (change_occurred || deleted != 0) {
|
||||||
changed_lines(eap->line1, 0, eap->line2 + 1, -deleted, true);
|
changed_lines(eap->line1, 0, eap->line2 + 1, -deleted, true);
|
||||||
}
|
}
|
||||||
|
@@ -270,6 +270,81 @@ describe('treesitter highlighting', function()
|
|||||||
]]}
|
]]}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('is updated with :sort', function()
|
||||||
|
if pending_c_parser(pending) then return end
|
||||||
|
|
||||||
|
insert(test_text)
|
||||||
|
exec_lua [[
|
||||||
|
local parser = vim.treesitter.get_parser(0, "c")
|
||||||
|
test_hl = vim.treesitter.highlighter.new(parser, {queries = {c = hl_query}})
|
||||||
|
]]
|
||||||
|
screen:expect{grid=[[
|
||||||
|
{3:int} width = {5:INT_MAX}, height = {5:INT_MAX}; |
|
||||||
|
{3:bool} ext_widgets[kUIExtCount]; |
|
||||||
|
{4:for} ({3:UIExtension} i = {5:0}; ({3:int})i < kUIExtCount; i++) { |
|
||||||
|
ext_widgets[i] = true; |
|
||||||
|
} |
|
||||||
|
|
|
||||||
|
{3:bool} inclusive = ui_override(); |
|
||||||
|
{4:for} ({3:size_t} i = {5:0}; i < ui_count; i++) { |
|
||||||
|
{3:UI} *ui = uis[i]; |
|
||||||
|
width = {5:MIN}(ui->width, width); |
|
||||||
|
height = {5:MIN}(ui->height, height); |
|
||||||
|
foo = {5:BAR}(ui->bazaar, bazaar); |
|
||||||
|
{4:for} ({3:UIExtension} j = {5:0}; ({3:int})j < kUIExtCount; j++) { |
|
||||||
|
ext_widgets[j] &= (ui->ui_ext[j] || inclusive); |
|
||||||
|
} |
|
||||||
|
} |
|
||||||
|
^} |
|
||||||
|
|
|
||||||
|
]]}
|
||||||
|
|
||||||
|
feed ":sort<cr>"
|
||||||
|
screen:expect{grid=[[
|
||||||
|
^ |
|
||||||
|
ext_widgets[j] &= (ui->ui_ext[j] || inclusive); |
|
||||||
|
{3:UI} *ui = uis[i]; |
|
||||||
|
ext_widgets[i] = true; |
|
||||||
|
foo = {5:BAR}(ui->bazaar, bazaar); |
|
||||||
|
{4:for} ({3:UIExtension} j = {5:0}; ({3:int})j < kUIExtCount; j++) { |
|
||||||
|
height = {5:MIN}(ui->height, height); |
|
||||||
|
width = {5:MIN}(ui->width, width); |
|
||||||
|
} |
|
||||||
|
{3:bool} ext_widgets[kUIExtCount]; |
|
||||||
|
{3:bool} inclusive = ui_override(); |
|
||||||
|
{4:for} ({3:UIExtension} i = {5:0}; ({3:int})i < kUIExtCount; i++) { |
|
||||||
|
{4:for} ({3:size_t} i = {5:0}; i < ui_count; i++) { |
|
||||||
|
{3:int} width = {5:INT_MAX}, height = {5:INT_MAX}; |
|
||||||
|
} |
|
||||||
|
} |
|
||||||
|
{3:void} ui_refresh({3:void}) |
|
||||||
|
:sort |
|
||||||
|
]]}
|
||||||
|
|
||||||
|
feed "u"
|
||||||
|
|
||||||
|
screen:expect{grid=[[
|
||||||
|
{3:int} width = {5:INT_MAX}, height = {5:INT_MAX}; |
|
||||||
|
{3:bool} ext_widgets[kUIExtCount]; |
|
||||||
|
{4:for} ({3:UIExtension} i = {5:0}; ({3:int})i < kUIExtCount; i++) { |
|
||||||
|
ext_widgets[i] = true; |
|
||||||
|
} |
|
||||||
|
|
|
||||||
|
{3:bool} inclusive = ui_override(); |
|
||||||
|
{4:for} ({3:size_t} i = {5:0}; i < ui_count; i++) { |
|
||||||
|
{3:UI} *ui = uis[i]; |
|
||||||
|
width = {5:MIN}(ui->width, width); |
|
||||||
|
height = {5:MIN}(ui->height, height); |
|
||||||
|
foo = {5:BAR}(ui->bazaar, bazaar); |
|
||||||
|
{4:for} ({3:UIExtension} j = {5:0}; ({3:int})j < kUIExtCount; j++) { |
|
||||||
|
ext_widgets[j] &= (ui->ui_ext[j] || inclusive); |
|
||||||
|
} |
|
||||||
|
} |
|
||||||
|
^} |
|
||||||
|
19 changes; before #2 {MATCH:.*}|
|
||||||
|
]]}
|
||||||
|
end)
|
||||||
|
|
||||||
it("supports with custom parser", function()
|
it("supports with custom parser", function()
|
||||||
if pending_c_parser(pending) then return end
|
if pending_c_parser(pending) then return end
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user