To: vim_dev@googlegroups.com Subject: Patch 7.3.281 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.281 Problem: After using "expand('%:8')" the buffer name is changed. Solution: Make a copy of the file name before shortening it. Files: src/eval.c *** ../vim-7.3.280/src/eval.c 2011-08-10 12:38:02.000000000 +0200 --- src/eval.c 2011-08-17 15:12:39.000000000 +0200 *************** *** 23205,23210 **** --- 23205,23211 ---- int c; int has_fullname = 0; #ifdef WIN3264 + char_u *fname_start = *fnamep; int has_shortname = 0; #endif *************** *** 23379,23402 **** } #ifdef WIN3264 ! /* Check shortname after we have done 'heads' and before we do 'tails' */ if (has_shortname) { ! pbuf = NULL; ! /* Copy the string if it is shortened by :h */ ! if (*fnamelen < (int)STRLEN(*fnamep)) { p = vim_strnsave(*fnamep, *fnamelen); ! if (p == 0) return -1; vim_free(*bufp); *bufp = *fnamep = p; } /* Split into two implementations - makes it easier. First is where ! * there isn't a full name already, second is where there is. ! */ if (!has_fullname && !vim_isAbsName(*fnamep)) { if (shortpath_for_partial(fnamep, bufp, fnamelen) == FAIL) --- 23380,23404 ---- } #ifdef WIN3264 ! /* ! * Handle ":8" after we have done 'heads' and before we do 'tails'. */ if (has_shortname) { ! /* Copy the string if it is shortened by :h and when it wasn't copied ! * yet, because we are going to change it in place. Avoids changing ! * the buffer name for "%:8". */ ! if (*fnamelen < (int)STRLEN(*fnamep) || *fnamep == fname_start) { p = vim_strnsave(*fnamep, *fnamelen); ! if (p == NULL) return -1; vim_free(*bufp); *bufp = *fnamep = p; } /* Split into two implementations - makes it easier. First is where ! * there isn't a full name already, second is where there is. */ if (!has_fullname && !vim_isAbsName(*fnamep)) { if (shortpath_for_partial(fnamep, bufp, fnamelen) == FAIL) *************** *** 23404,23421 **** } else { ! int l; ! /* Simple case, already have the full-name * Nearly always shorter, so try first time. */ - l = *fnamelen; if (get_short_pathname(fnamep, bufp, &l) == FAIL) return -1; if (l == 0) { ! /* Couldn't find the filename.. search the paths. ! */ l = *fnamelen; if (shortpath_for_invalid_fname(fnamep, bufp, &l) == FAIL) return -1; --- 23406,23421 ---- } else { ! int l = *fnamelen; ! /* Simple case, already have the full-name. * Nearly always shorter, so try first time. */ if (get_short_pathname(fnamep, bufp, &l) == FAIL) return -1; if (l == 0) { ! /* Couldn't find the filename, search the paths. */ l = *fnamelen; if (shortpath_for_invalid_fname(fnamep, bufp, &l) == FAIL) return -1; *** ../vim-7.3.280/src/version.c 2011-08-10 18:36:49.000000000 +0200 --- src/version.c 2011-08-17 15:21:41.000000000 +0200 *************** *** 711,712 **** --- 711,714 ---- { /* Add new patch number below this line */ + /**/ + 281, /**/ -- Kisses may last for as much as, but no more than, five minutes. [real standing law in Iowa, United States of America] /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///