diff --git a/7.1.038 b/7.1.038 new file mode 100644 index 0000000..cdb3d66 --- /dev/null +++ b/7.1.038 @@ -0,0 +1,205 @@ +To: vim-dev@vim.org +Subject: patch 7.1.038 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.038 +Problem: When 'expandtab' is set then a Tab copied for 'copyindent' is + expanded to spaces, even when 'preserveindent' is set. (Alexei + Alexandrov) +Solution: Remove the check for 'expandtab'. Also fix that ">>" doesn't obey + 'preserveindent'. (Chris Lubinski) +Files: src/misc1.c + + +*** ../vim-7.1.037/src/misc1.c Thu May 10 21:03:33 2007 +--- src/misc1.c Tue Jul 24 15:24:50 2007 +*************** +*** 90,96 **** + */ + int + set_indent(size, flags) +! int size; + int flags; + { + char_u *p; +--- 90,96 ---- + */ + int + set_indent(size, flags) +! int size; /* measured in spaces */ + int flags; + { + char_u *p; +*************** +*** 98,109 **** + char_u *oldline; + char_u *s; + int todo; +! int ind_len; + int line_len; + int doit = FALSE; +! int ind_done; + int tab_pad; + int retval = FALSE; + + /* + * First check if there is anything to do and compute the number of +--- 98,111 ---- + char_u *oldline; + char_u *s; + int todo; +! int ind_len; /* measured in characters */ + int line_len; + int doit = FALSE; +! int ind_done = 0; /* measured in spaces */ + int tab_pad; + int retval = FALSE; ++ int orig_char_len = 0; /* number of initial whitespace chars when ++ 'et' and 'pi' are both set */ + + /* + * First check if there is anything to do and compute the number of +*************** +*** 116,123 **** + /* Calculate the buffer size for the new indent, and check to see if it + * isn't already set */ + +! /* if 'expandtab' isn't set: use TABs */ +! if (!curbuf->b_p_et) + { + /* If 'preserveindent' is set then reuse as much as possible of + * the existing indent structure for the new indent */ +--- 118,127 ---- + /* Calculate the buffer size for the new indent, and check to see if it + * isn't already set */ + +! /* if 'expandtab' isn't set: use TABs; if both 'expandtab' and +! * 'preserveindent' are set count the number of characters at the +! * beginning of the line to be copied */ +! if (!curbuf->b_p_et || (!(flags & SIN_INSERT) && curbuf->b_p_pi)) + { + /* If 'preserveindent' is set then reuse as much as possible of + * the existing indent structure for the new indent */ +*************** +*** 148,156 **** + ++p; + } + + /* Fill to next tabstop with a tab, if possible */ + tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts); +! if (todo >= tab_pad) + { + doit = TRUE; + todo -= tab_pad; +--- 152,165 ---- + ++p; + } + ++ /* Set initial number of whitespace chars to copy if we are ++ * preserving indent but expandtab is set */ ++ if (curbuf->b_p_et) ++ orig_char_len = ind_len; ++ + /* Fill to next tabstop with a tab, if possible */ + tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts); +! if (todo >= tab_pad && orig_char_len == 0) + { + doit = TRUE; + todo -= tab_pad; +*************** +*** 193,205 **** + else + p = skipwhite(p); + line_len = (int)STRLEN(p) + 1; +! newline = alloc(ind_len + line_len); +! if (newline == NULL) +! return FALSE; + + /* Put the characters in the new line. */ +- s = newline; +- todo = size; + /* if 'expandtab' isn't set: use TABs */ + if (!curbuf->b_p_et) + { +--- 202,239 ---- + else + p = skipwhite(p); + line_len = (int)STRLEN(p) + 1; +! +! /* If 'preserveindent' and 'expandtab' are both set keep the original +! * characters and allocate accordingly. We will fill the rest with spaces +! * after the if (!curbuf->b_p_et) below. */ +! if (orig_char_len != 0) +! { +! newline = alloc(orig_char_len + size - ind_done + line_len); +! if (newline == NULL) +! return FALSE; +! p = oldline; +! s = newline; +! while (orig_char_len > 0) +! { +! *s++ = *p++; +! orig_char_len--; +! } +! /* Skip over any additional white space (useful when newindent is less +! * than old) */ +! while (vim_iswhite(*p)) +! (void)*p++; +! todo = size-ind_done; +! } +! else +! { +! todo = size; +! newline = alloc(ind_len + line_len); +! if (newline == NULL) +! return FALSE; +! s = newline; +! } + + /* Put the characters in the new line. */ + /* if 'expandtab' isn't set: use TABs */ + if (!curbuf->b_p_et) + { +*************** +*** 1320,1327 **** + newindent += (int)curbuf->b_p_sw; + } + #endif +! /* Copy the indent only if expand tab is disabled */ +! if (curbuf->b_p_ci && !curbuf->b_p_et) + { + (void)copy_indent(newindent, saved_line); + +--- 1354,1361 ---- + newindent += (int)curbuf->b_p_sw; + } + #endif +! /* Copy the indent */ +! if (curbuf->b_p_ci) + { + (void)copy_indent(newindent, saved_line); + +*** ../vim-7.1.037/src/version.c Tue Jul 24 14:57:16 2007 +--- src/version.c Tue Jul 24 15:22:44 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 38, + /**/ + +-- +Time is an illusion. Lunchtime doubly so. + -- Ford Prefect, in Douglas Adams' + "The Hitchhiker's Guide to the Galaxy" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///