Patch 8.1.0120
Problem: Buffer 'modified' set even when :sort has no changes.
Solution: Only set 'modified' when lines are moved. (Jason Franklin)
Files: src/ex_cmds.c, src/testdir/test_sort.vim
*** ../vim-8.1.0119/src/ex_cmds.c 2018-06-24 23:53:25.149526513 +0200
--- src/ex_cmds.c 2018-06-28 11:22:44.383108832 +0200
***************
*** 398,403 ****
--- 398,404 ----
colnr_T end_col;
int sort_what = 0;
int format_found = 0;
+ int change_occurred = FALSE; // Buffer contents changed.
/* Sorting one line is really quick! */
if (count <= 1)
***************
*** 616,627 ****
lnum = eap->line2;
for (i = 0; i < count; ++i)
{
! s = ml_get(nrs[eap->forceit ? count - i - 1 : i].lnum);
if (!unique || i == 0
|| (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0)
{
! /* Copy the line into a buffer, it may become invalid in
! * ml_append(). And it's needed for "unique". */
STRCPY(sortbuf1, s);
if (ml_append(lnum++, sortbuf1, (colnr_T)0, FALSE) == FAIL)
break;
--- 617,635 ----
lnum = eap->line2;
for (i = 0; i < count; ++i)
{
! linenr_T get_lnum = nrs[eap->forceit ? count - i - 1 : i].lnum;
!
! // If the original line number of the line being placed is not the same
! // as "lnum" (accounting for offset), we know that the buffer changed.
! if (get_lnum + ((linenr_T)count - 1) != lnum)
! change_occurred = TRUE;
!
! s = ml_get(get_lnum);
if (!unique || i == 0
|| (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0)
{
! // Copy the line into a buffer, it may become invalid in
! // ml_append(). And it's needed for "unique".
STRCPY(sortbuf1, s);
if (ml_append(lnum++, sortbuf1, (colnr_T)0, FALSE) == FAIL)
break;
***************
*** 644,650 ****
mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted);
else if (deleted < 0)
mark_adjust(eap->line2, MAXLNUM, -deleted, 0L);
! changed_lines(eap->line1, 0, eap->line2 + 1, -deleted);
curwin->w_cursor.lnum = eap->line1;
beginline(BL_WHITE | BL_FIX);
--- 652,660 ----
mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted);
else if (deleted < 0)
mark_adjust(eap->line2, MAXLNUM, -deleted, 0L);
!
! if (change_occurred || deleted != 0)
! changed_lines(eap->line1, 0, eap->line2 + 1, -deleted);
curwin->w_cursor.lnum = eap->line1;
beginline(BL_WHITE | BL_FIX);
*** ../vim-8.1.0119/src/testdir/test_sort.vim 2017-09-23 18:58:18.000000000
+0200
--- src/testdir/test_sort.vim 2018-06-28 11:21:15.071564844 +0200
***************
*** 1,13 ****
! " Test sort()
! :func Compare1(a, b) abort
call sort(range(3), 'Compare2')
return a:a - a:b
! :endfunc
! :func Compare2(a, b) abort
return a:a - a:b
! :endfunc
func Test_sort_strings()
" numbers compared as strings
--- 1,13 ----
! " Tests for the "sort()" function and for the ":sort" command.
! func Compare1(a, b) abort
call sort(range(3), 'Compare2')
return a:a - a:b
! endfunc
! func Compare2(a, b) abort
return a:a - a:b
! endfunc
func Test_sort_strings()
" numbers compared as strings
***************
*** 45,51 ****
call assert_fails('call sort([3.3, 1, "2"], 3)', "E474")
endfunc
! " Tests for the :sort command
func Test_sort_cmd()
let tests = [
\ {
--- 45,51 ----
call assert_fails('call sort([3.3, 1, "2"], 3)', "E474")
endfunc
! " Tests for the ":sort" command.
func Test_sort_cmd()
let tests = [
\ {
***************
*** 1167,1181 ****
\ '1.234',
\ '123.456'
\ ]
! \ }
\ ]
for t in tests
enew!
call append(0, t.input)
$delete _
! exe t.cmd
call assert_equal(t.expected, getline(1, '$'), t.name)
endfor
call assert_fails('sort no', 'E474')
--- 1167,1220 ----
\ '1.234',
\ '123.456'
\ ]
! \ },
! \ {
! \ 'name' : 'alphabetical, sorted input',
! \ 'cmd' : 'sort',
! \ 'input' : [
! \ 'a',
! \ 'b',
! \ 'c',
! \ ],
! \ 'expected' : [
! \ 'a',
! \ 'b',
! \ 'c',
! \ ]
! \ },
! \ {
! \ 'name' : 'alphabetical, sorted input, unique at end',
! \ 'cmd' : 'sort u',
! \ 'input' : [
! \ 'aa',
! \ 'bb',
! \ 'cc',
! \ 'cc',
! \ ],
! \ 'expected' : [
! \ 'aa',
! \ 'bb',
! \ 'cc',
! \ ]
! \ },
\ ]
for t in tests
enew!
call append(0, t.input)
$delete _
! setlocal nomodified
! execute t.cmd
!
call assert_equal(t.expected, getline(1, '$'), t.name)
+
+ " Previously, the ":sort" command would set 'modified' even if the buffer
+ " contents did not change. Here, we check that this problem is fixed.
+ if t.input == t.expected
+ call assert_false(&modified, t.name . ': &mod is not correct')
+ else
+ call assert_true(&modified, t.name . ': &mod is not correct')
+ endif
endfor
call assert_fails('sort no', 'E474')
*** ../vim-8.1.0119/src/version.c 2018-06-27 23:12:30.608811033 +0200
--- src/version.c 2018-06-28 11:09:56.954947638 +0200
***************
*** 791,792 ****
--- 791,794 ----
{ /* Add new patch number below this line */
+ /**/
+ 120,
/**/
--
You cannot have a baby in one month by getting nine women pregnant.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.