" Test for joining lines. func Test_join_with_count() new call setline(1, ['one', 'two', 'three', 'four']) normal J call assert_equal('one two', getline(1)) %del call setline(1, ['one', 'two', 'three', 'four']) normal 10J call assert_equal('one two three four', getline(1)) call setline(1, ['one', '', 'two']) normal J call assert_equal('one', getline(1)) call setline(1, ['one', ' ', 'two']) normal J call assert_equal('one', getline(1)) call setline(1, ['one', '', '', 'two']) normal JJ call assert_equal('one', getline(1)) call setline(1, ['one', ' ', ' ', 'two']) normal JJ call assert_equal('one', getline(1)) call setline(1, ['one', '', '', 'two']) normal 2J call assert_equal('one', getline(1)) quit! endfunc " Tests for setting the '[,'] marks when joining lines. func Test_join_marks() enew call append(0, [ \ "\t\tO sodales, ludite, vos qui", \ "attamen consulite per voster honur. Tua pulchra " . \ "facies me fay planszer milies", \ "", \ "This line.", \ "Should be joined with the next line", \ "and with this line"]) normal gg0gqj call assert_equal([0, 1, 1, 0], getpos("'[")) call assert_equal([0, 2, 1, 0], getpos("']")) /^This line/;'}-join call assert_equal([0, 4, 11, 0], getpos("'[")) call assert_equal([0, 4, 67, 0], getpos("']")) enew! 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, '$')) 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\" .,+2join exe "normal j3J\" .,+2join exe "normal j3J\" .,+2join exe "normal jj3J\" " 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\" .,+8join exe "normal j9J\" .,+2join exe "normal j3J\" .,+2join exe "normal j3J\" .,+2join exe "normal jj3J\j" .,+2join exe "normal jj3J\j" .,+5join exe "normal j6J\" exe "normal oSome code!\// Make sure backspacing does not remove this comment leader.\0i\\" " 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)) call setline(1, ['a', 'b', 'c']) 2,2join call assert_equal(['a', 'b', 'c'], getline(1, '$')) call assert_equal(2, line('.')) 2join call assert_equal(['a', 'b c'], getline(1, '$')) bwipe! endfunc " vim: shiftwidth=2 sts=2 expandtab