To: vim_dev@googlegroups.com Subject: Patch 8.2.3615 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3615 Problem: When re-formatting with an indent expression the first line of a paragraph may get the wrong indent. (Martin F. Krafft) Solution: Apply the correct indenting function for the first line. (Christian Brabandt, closes #9150, closes #9056) Files: src/textformat.c, src/testdir/test_indent.vim *** ../vim-8.2.3614/src/textformat.c 2020-10-24 19:49:37.502683026 +0100 --- src/textformat.c 2021-11-18 13:54:06.595953779 +0000 *************** *** 1070,1078 **** if (is_end_par || force_format) { if (need_set_indent) // replace indent in first line with minimal number of // tabs and spaces, according to current options ! (void)set_indent(get_indent(), SIN_CHANGED); // put cursor on last non-space State = NORMAL; // don't go past end-of-line --- 1070,1101 ---- if (is_end_par || force_format) { if (need_set_indent) + { + int indent = 0; // amount of indent needed + // replace indent in first line with minimal number of // tabs and spaces, according to current options ! # ifdef FEAT_LISP ! if (curbuf->b_p_lisp) ! indent = get_lisp_indent(); ! else ! # endif ! { ! #ifdef FEAT_CINDENT ! if (cindent_on()) ! { ! indent = ! # ifdef FEAT_EVAL ! *curbuf->b_p_inde != NUL ? get_expr_indent() : ! # endif ! get_c_indent(); ! } ! else ! #endif ! indent = get_indent(); ! } ! (void)set_indent(indent, SIN_CHANGED); ! } // put cursor on last non-space State = NORMAL; // don't go past end-of-line *** ../vim-8.2.3614/src/testdir/test_indent.vim 2020-03-19 19:33:29.785091518 +0000 --- src/testdir/test_indent.vim 2021-11-18 13:52:52.240069084 +0000 *************** *** 142,145 **** --- 142,220 ---- call delete('Xfile.txt') endfunc + func Test_indent_func_with_gq() + + function GetTeXIndent() + " Sample indent expression for TeX files + let lnum = prevnonblank(v:lnum - 1) + " At the start of the file use zero indent. + if lnum == 0 + return 0 + endif + let line = getline(lnum) + let ind = indent(lnum) + " Add a 'shiftwidth' after beginning of environments. + if line =~ '\\begin{center}' + let ind = ind + shiftwidth() + endif + return ind + endfunction + + new + setl et sw=2 sts=2 ts=2 tw=50 indentexpr=GetTeXIndent() + put =[ '\documentclass{article}', '', '\begin{document}', '', + \ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce ut enim non', + \ 'libero efficitur aliquet. Maecenas metus justo, facilisis convallis blandit', + \ 'non, semper eu urna. Suspendisse diam diam, iaculis faucibus lorem eu,', + \ 'fringilla condimentum lectus. Quisque euismod diam at convallis vulputate.', + \ 'Pellentesque laoreet tortor sit amet mauris euismod ornare. Sed varius', + \ 'bibendum orci vel vehicula. Pellentesque tempor, ipsum et auctor accumsan,', + \ 'metus lectus ultrices odio, sed elementum mi ante at arcu.', '', '\begin{center}', '', + \ 'Proin nec risus consequat nunc dapibus consectetur. Mauris lacinia est a augue', + \ 'tristique accumsan. Morbi pretium, felis molestie eleifend condimentum, arcu', + \ 'ipsum congue nisl, quis euismod purus libero in ante. Donec id semper purus.', + \ 'Suspendisse eget aliquam nunc. Maecenas fringilla mauris vitae maximus', + \ 'condimentum. Cras a quam in mi dictum eleifend at a lorem. Sed convallis', + \ 'ante a commodo facilisis. Nam suscipit vulputate odio, vel dapibus nisl', + \ 'dignissim facilisis. Vestibulum ante ipsum primis in faucibus orci luctus et', + \ 'ultrices posuere cubilia curae;', '', ''] + 1d_ + call cursor(5, 1) + ka + call cursor(15, 1) + kb + norm! 'agqap + norm! 'bgqap + let expected = [ '\documentclass{article}', '', '\begin{document}', '', + \ 'Lorem ipsum dolor sit amet, consectetur adipiscing', + \ 'elit. Fusce ut enim non libero efficitur aliquet.', + \ 'Maecenas metus justo, facilisis convallis blandit', + \ 'non, semper eu urna. Suspendisse diam diam,', + \ 'iaculis faucibus lorem eu, fringilla condimentum', + \ 'lectus. Quisque euismod diam at convallis', + \ 'vulputate. Pellentesque laoreet tortor sit amet', + \ 'mauris euismod ornare. Sed varius bibendum orci', + \ 'vel vehicula. Pellentesque tempor, ipsum et auctor', + \ 'accumsan, metus lectus ultrices odio, sed', + \ 'elementum mi ante at arcu.', '', '\begin{center}', '', + \ ' Proin nec risus consequat nunc dapibus', + \ ' consectetur. Mauris lacinia est a augue', + \ ' tristique accumsan. Morbi pretium, felis', + \ ' molestie eleifend condimentum, arcu ipsum congue', + \ ' nisl, quis euismod purus libero in ante. Donec', + \ ' id semper purus. Suspendisse eget aliquam nunc.', + \ ' Maecenas fringilla mauris vitae maximus', + \ ' condimentum. Cras a quam in mi dictum eleifend', + \ ' at a lorem. Sed convallis ante a commodo', + \ ' facilisis. Nam suscipit vulputate odio, vel', + \ ' dapibus nisl dignissim facilisis. Vestibulum', + \ ' ante ipsum primis in faucibus orci luctus et', + \ ' ultrices posuere cubilia curae;', '', ''] + call assert_equal(expected, getline(1, '$')) + + bwipe! + delmark ab + delfunction GetTeXIndent + endfu + " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.3614/src/version.c 2021-11-17 20:39:29.135019718 +0000 --- src/version.c 2021-11-18 13:55:10.011855329 +0000 *************** *** 759,760 **** --- 759,762 ---- { /* Add new patch number below this line */ + /**/ + 3615, /**/ -- There are 10 kinds of people: Those who understand binary and those who don't. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///