mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.0018: :join does not add white space where it should
Problem: :join does not add white space where it should. (Zdenek Dohnal)
Solution: Handle joining multiple lines propely.
91b65e4944
This commit is contained in:
parent
74a547d340
commit
04ebfeb881
@ -3772,7 +3772,7 @@ int do_join(size_t count,
|
|||||||
curr = skipwhite(curr);
|
curr = skipwhite(curr);
|
||||||
if (*curr != NUL
|
if (*curr != NUL
|
||||||
&& *curr != ')'
|
&& *curr != ')'
|
||||||
&& currsize != 0
|
&& sumsize != 0
|
||||||
&& endcurr1 != TAB
|
&& endcurr1 != TAB
|
||||||
&& (!has_format_option(FO_MBYTE_JOIN)
|
&& (!has_format_option(FO_MBYTE_JOIN)
|
||||||
|| (utf_ptr2char(curr) < 0x100 && endcurr1 < 0x100))
|
|| (utf_ptr2char(curr) < 0x100 && endcurr1 < 0x100))
|
||||||
|
@ -54,3 +54,388 @@ func Test_join_marks()
|
|||||||
call assert_equal([0, 4, 67, 0], getpos("']"))
|
call assert_equal([0, 4, 67, 0], getpos("']"))
|
||||||
enew!
|
enew!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for joining lines and marks in them
|
||||||
|
" in compatible and nocompatible modes
|
||||||
|
" and with 'joinspaces' set or not
|
||||||
|
" and with 'cpoptions' flag 'j' set or not
|
||||||
|
func Test_join_spaces_marks()
|
||||||
|
new
|
||||||
|
" Text used for the test
|
||||||
|
insert
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf.
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
asdfasdf
|
||||||
|
asdf
|
||||||
|
zx cvn.
|
||||||
|
as dfg?
|
||||||
|
hjkl iop!
|
||||||
|
ert
|
||||||
|
zx cvn.
|
||||||
|
as dfg?
|
||||||
|
hjkl iop!
|
||||||
|
ert
|
||||||
|
.
|
||||||
|
let text = getline(1, '$')
|
||||||
|
normal gg
|
||||||
|
|
||||||
|
set nojoinspaces
|
||||||
|
set cpoptions-=j
|
||||||
|
normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
|
||||||
|
normal j05lmx
|
||||||
|
normal 2j06lmy
|
||||||
|
normal 2k4Jy3l$p
|
||||||
|
normal `xyl$p
|
||||||
|
normal `yy2l$p
|
||||||
|
|
||||||
|
" set cpoptions+=j
|
||||||
|
normal j05lmx
|
||||||
|
normal 2j06lmy
|
||||||
|
normal 2k4Jy3l$p
|
||||||
|
normal `xyl$p
|
||||||
|
normal `yy2l$p
|
||||||
|
|
||||||
|
" Expected output
|
||||||
|
let expected =<< trim [DATA]
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
zx cvn. as dfg? hjkl iop! ert ernop
|
||||||
|
zx cvn. as dfg? hjkl iop! ert ernop
|
||||||
|
[DATA]
|
||||||
|
|
||||||
|
call assert_equal(expected, getline(1, '$'))
|
||||||
|
throw 'skipped: Nvim does not support "set compatible" or "set cpoptions+=j"'
|
||||||
|
|
||||||
|
enew!
|
||||||
|
call append(0, text)
|
||||||
|
normal gg
|
||||||
|
|
||||||
|
set cpoptions-=j
|
||||||
|
set joinspaces
|
||||||
|
normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
|
||||||
|
normal j05lmx
|
||||||
|
normal 2j06lmy
|
||||||
|
normal 2k4Jy3l$p
|
||||||
|
normal `xyl$p
|
||||||
|
normal `yy2l$p
|
||||||
|
|
||||||
|
set cpoptions+=j
|
||||||
|
normal j05lmx
|
||||||
|
normal 2j06lmy
|
||||||
|
normal 2k4Jy3l$p
|
||||||
|
normal `xyl$p
|
||||||
|
normal `yy2l$p
|
||||||
|
|
||||||
|
" Expected output
|
||||||
|
let expected =<< trim [DATA]
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
zx cvn. as dfg? hjkl iop! ert enop
|
||||||
|
zx cvn. as dfg? hjkl iop! ert ernop
|
||||||
|
|
||||||
|
[DATA]
|
||||||
|
|
||||||
|
call assert_equal(expected, getline(1, '$'))
|
||||||
|
|
||||||
|
enew!
|
||||||
|
call append(0, text)
|
||||||
|
normal gg
|
||||||
|
|
||||||
|
set cpoptions-=j
|
||||||
|
set nojoinspaces
|
||||||
|
set compatible
|
||||||
|
|
||||||
|
normal JjJjJjJjJjJjJjJjJjJjJjJjJjJ
|
||||||
|
normal j4Jy3l$pjdG
|
||||||
|
|
||||||
|
" Expected output
|
||||||
|
let expected =<< trim [DATA]
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf. asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
asdfasdf asdf
|
||||||
|
zx cvn. as dfg? hjkl iop! ert a
|
||||||
|
[DATA]
|
||||||
|
|
||||||
|
call assert_equal(expected, getline(1, '$'))
|
||||||
|
|
||||||
|
set nocompatible
|
||||||
|
set cpoptions&vim
|
||||||
|
set joinspaces&vim
|
||||||
|
close!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for joining lines with comments
|
||||||
|
func Test_join_lines_with_comments()
|
||||||
|
new
|
||||||
|
|
||||||
|
" Text used by the test
|
||||||
|
insert
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the previous comment leader is not removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the previous comment leader is not removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Should the next comment leader be left alone?
|
||||||
|
// Yes.
|
||||||
|
|
||||||
|
// Should the next comment leader be left alone?
|
||||||
|
// Yes.
|
||||||
|
|
||||||
|
/* Here the comment leader should be left intact. */
|
||||||
|
// And so should this one.
|
||||||
|
|
||||||
|
/* Here the comment leader should be left intact. */
|
||||||
|
// And so should this one.
|
||||||
|
|
||||||
|
if (condition) // Remove the next comment leader!
|
||||||
|
// OK, I will.
|
||||||
|
action();
|
||||||
|
|
||||||
|
if (condition) // Remove the next comment leader!
|
||||||
|
// OK, I will.
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
.
|
||||||
|
|
||||||
|
call cursor(2, 1)
|
||||||
|
set comments=s1:/*,mb:*,ex:*/,://
|
||||||
|
set nojoinspaces fo=j
|
||||||
|
set backspace=eol,start
|
||||||
|
|
||||||
|
.,+3join
|
||||||
|
exe "normal j4J\<CR>"
|
||||||
|
.,+2join
|
||||||
|
exe "normal j3J\<CR>"
|
||||||
|
.,+2join
|
||||||
|
exe "normal j3J\<CR>"
|
||||||
|
.,+2join
|
||||||
|
exe "normal jj3J\<CR>"
|
||||||
|
|
||||||
|
" Expected output
|
||||||
|
let expected =<< trim [CODE]
|
||||||
|
{
|
||||||
|
/* Make sure the previous comment leader is not removed. */
|
||||||
|
/* Make sure the previous comment leader is not removed. */
|
||||||
|
// Should the next comment leader be left alone? Yes.
|
||||||
|
// Should the next comment leader be left alone? Yes.
|
||||||
|
/* Here the comment leader should be left intact. */ // And so should this one.
|
||||||
|
/* Here the comment leader should be left intact. */ // And so should this one.
|
||||||
|
if (condition) // Remove the next comment leader! OK, I will.
|
||||||
|
action();
|
||||||
|
if (condition) // Remove the next comment leader! OK, I will.
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
[CODE]
|
||||||
|
|
||||||
|
call assert_equal(expected, getline(1, '$'))
|
||||||
|
|
||||||
|
set comments&vim
|
||||||
|
set joinspaces&vim
|
||||||
|
set fo&vim
|
||||||
|
set backspace&vim
|
||||||
|
close!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for joining lines with different comment leaders
|
||||||
|
func Test_join_comments_2()
|
||||||
|
new
|
||||||
|
|
||||||
|
insert
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the previous comment leader is not removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the previous comment leader is not removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* List:
|
||||||
|
* - item1
|
||||||
|
* foo bar baz
|
||||||
|
* foo bar baz
|
||||||
|
* - item2
|
||||||
|
* foo bar baz
|
||||||
|
* foo bar baz
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* List:
|
||||||
|
* - item1
|
||||||
|
* foo bar baz
|
||||||
|
* foo bar baz
|
||||||
|
* - item2
|
||||||
|
* foo bar baz
|
||||||
|
* foo bar baz
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Should the next comment leader be left alone?
|
||||||
|
// Yes.
|
||||||
|
|
||||||
|
// Should the next comment leader be left alone?
|
||||||
|
// Yes.
|
||||||
|
|
||||||
|
/* Here the comment leader should be left intact. */
|
||||||
|
// And so should this one.
|
||||||
|
|
||||||
|
/* Here the comment leader should be left intact. */
|
||||||
|
// And so should this one.
|
||||||
|
|
||||||
|
if (condition) // Remove the next comment leader!
|
||||||
|
// OK, I will.
|
||||||
|
action();
|
||||||
|
|
||||||
|
if (condition) // Remove the next comment leader!
|
||||||
|
// OK, I will.
|
||||||
|
action();
|
||||||
|
|
||||||
|
int i = 7 /* foo *// 3
|
||||||
|
// comment
|
||||||
|
;
|
||||||
|
|
||||||
|
int i = 7 /* foo *// 3
|
||||||
|
// comment
|
||||||
|
;
|
||||||
|
|
||||||
|
># Note that the last character of the ending comment leader (left angle
|
||||||
|
# bracket) is a comment leader itself. Make sure that this comment leader is
|
||||||
|
# not removed from the next line #<
|
||||||
|
< On this line a new comment is opened which spans 2 lines. This comment should
|
||||||
|
< retain its comment leader.
|
||||||
|
|
||||||
|
># Note that the last character of the ending comment leader (left angle
|
||||||
|
# bracket) is a comment leader itself. Make sure that this comment leader is
|
||||||
|
# not removed from the next line #<
|
||||||
|
< On this line a new comment is opened which spans 2 lines. This comment should
|
||||||
|
< retain its comment leader.
|
||||||
|
|
||||||
|
}
|
||||||
|
.
|
||||||
|
|
||||||
|
call cursor(2, 1)
|
||||||
|
set comments=sO:*\ -,mO:*\ \ ,exO:*/
|
||||||
|
set comments+=s1:/*,mb:*,ex:*/,://
|
||||||
|
set comments+=s1:>#,mb:#,ex:#<,:<
|
||||||
|
set cpoptions-=j joinspaces fo=j
|
||||||
|
set backspace=eol,start
|
||||||
|
|
||||||
|
.,+3join
|
||||||
|
exe "normal j4J\<CR>"
|
||||||
|
.,+8join
|
||||||
|
exe "normal j9J\<CR>"
|
||||||
|
.,+2join
|
||||||
|
exe "normal j3J\<CR>"
|
||||||
|
.,+2join
|
||||||
|
exe "normal j3J\<CR>"
|
||||||
|
.,+2join
|
||||||
|
exe "normal jj3J\<CR>j"
|
||||||
|
.,+2join
|
||||||
|
exe "normal jj3J\<CR>j"
|
||||||
|
.,+5join
|
||||||
|
exe "normal j6J\<CR>"
|
||||||
|
exe "normal oSome code!\<CR>// Make sure backspacing does not remove this comment leader.\<Esc>0i\<C-H>\<Esc>"
|
||||||
|
|
||||||
|
" Expected output
|
||||||
|
let expected =<< trim [CODE]
|
||||||
|
{
|
||||||
|
/* Make sure the previous comment leader is not removed. */
|
||||||
|
/* Make sure the previous comment leader is not removed. */
|
||||||
|
/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
|
||||||
|
/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
|
||||||
|
// Should the next comment leader be left alone? Yes.
|
||||||
|
// Should the next comment leader be left alone? Yes.
|
||||||
|
/* Here the comment leader should be left intact. */ // And so should this one.
|
||||||
|
/* Here the comment leader should be left intact. */ // And so should this one.
|
||||||
|
if (condition) // Remove the next comment leader! OK, I will.
|
||||||
|
action();
|
||||||
|
if (condition) // Remove the next comment leader! OK, I will.
|
||||||
|
action();
|
||||||
|
int i = 7 /* foo *// 3 // comment
|
||||||
|
;
|
||||||
|
int i = 7 /* foo *// 3 // comment
|
||||||
|
;
|
||||||
|
># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
|
||||||
|
># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
|
||||||
|
|
||||||
|
Some code!// Make sure backspacing does not remove this comment leader.
|
||||||
|
}
|
||||||
|
[CODE]
|
||||||
|
|
||||||
|
call assert_equal(expected, getline(1, '$'))
|
||||||
|
close!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_join_lines()
|
||||||
|
new
|
||||||
|
call setline(1, ['a', 'b', '', 'c', 'd'])
|
||||||
|
%join
|
||||||
|
call assert_equal('a b c d', getline(1))
|
||||||
|
call setline(1, ['a', 'b', '', 'c', 'd'])
|
||||||
|
normal 5J
|
||||||
|
call assert_equal('a b c d', getline(1))
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
Loading…
Reference in New Issue
Block a user