comparison src/ex_cmds.c @ 9414:1003973c99df v7.4.1988

commit https://github.com/vim/vim/commit/ab9c89b68dcbdb3fbda8c5a50dd90caca64f1bfd Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 3 17:47:26 2016 +0200 patch 7.4.1988 Problem: When updating viminfo with file marks there is no time order. Solution: Remember the time when a buffer was last used, store marks for the most recently used buffers.
author Christian Brabandt <cb@256bit.org>
date Sun, 03 Jul 2016 18:00:05 +0200
parents 80333fcbaddf
children 38e2fc4ee4ef
comparison
equal deleted inserted replaced
9413:d72229478e52 9414:1003973c99df
2146 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo(). 2146 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
2147 */ 2147 */
2148 static void 2148 static void
2149 do_viminfo(FILE *fp_in, FILE *fp_out, int flags) 2149 do_viminfo(FILE *fp_in, FILE *fp_out, int flags)
2150 { 2150 {
2151 int count = 0;
2152 int eof = FALSE; 2151 int eof = FALSE;
2153 vir_T vir; 2152 vir_T vir;
2154 int merge = FALSE; 2153 int merge = FALSE;
2154 int do_copy_marks = FALSE;
2155 garray_T buflist;
2155 2156
2156 if ((vir.vir_line = alloc(LSIZE)) == NULL) 2157 if ((vir.vir_line = alloc(LSIZE)) == NULL)
2157 return; 2158 return;
2158 vir.vir_fd = fp_in; 2159 vir.vir_fd = fp_in;
2159 #ifdef FEAT_MBYTE 2160 #ifdef FEAT_MBYTE
2181 else if (flags != 0) 2182 else if (flags != 0)
2182 /* Skip info, find start of marks */ 2183 /* Skip info, find start of marks */
2183 while (!(eof = viminfo_readline(&vir)) 2184 while (!(eof = viminfo_readline(&vir))
2184 && vir.vir_line[0] != '>') 2185 && vir.vir_line[0] != '>')
2185 ; 2186 ;
2186 } 2187
2188 do_copy_marks = (flags &
2189 (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT));
2190 }
2191
2187 if (fp_out != NULL) 2192 if (fp_out != NULL)
2188 { 2193 {
2189 /* Write the info: */ 2194 /* Write the info: */
2190 fprintf(fp_out, _("# This viminfo file was generated by Vim %s.\n"), 2195 fprintf(fp_out, _("# This viminfo file was generated by Vim %s.\n"),
2191 VIM_VERSION_MEDIUM); 2196 VIM_VERSION_MEDIUM);
2207 #endif 2212 #endif
2208 write_viminfo_filemarks(fp_out); 2213 write_viminfo_filemarks(fp_out);
2209 finish_viminfo_marks(); 2214 finish_viminfo_marks();
2210 write_viminfo_bufferlist(fp_out); 2215 write_viminfo_bufferlist(fp_out);
2211 write_viminfo_barlines(&vir, fp_out); 2216 write_viminfo_barlines(&vir, fp_out);
2212 count = write_viminfo_marks(fp_out); 2217
2213 } 2218 if (do_copy_marks)
2214 if (fp_in != NULL 2219 ga_init2(&buflist, sizeof(buf_T *), 50);
2215 && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT))) 2220 write_viminfo_marks(fp_out, do_copy_marks ? &buflist : NULL);
2216 copy_viminfo_marks(&vir, fp_out, count, eof, flags); 2221 }
2222
2223 if (do_copy_marks)
2224 {
2225 copy_viminfo_marks(&vir, fp_out, &buflist, eof, flags);
2226 if (fp_out != NULL)
2227 ga_clear(&buflist);
2228 }
2217 2229
2218 vim_free(vir.vir_line); 2230 vim_free(vir.vir_line);
2219 #ifdef FEAT_MBYTE 2231 #ifdef FEAT_MBYTE
2220 if (vir.vir_conv.vc_type != CONV_NONE) 2232 if (vir.vir_conv.vc_type != CONV_NONE)
2221 convert_setup(&vir.vir_conv, NULL, NULL); 2233 convert_setup(&vir.vir_conv, NULL, NULL);
4284 if (!shortmess(SHM_FILEINFO)) 4296 if (!shortmess(SHM_FILEINFO))
4285 fileinfo(FALSE, TRUE, FALSE); 4297 fileinfo(FALSE, TRUE, FALSE);
4286 4298
4287 msg_scrolled_ign = FALSE; 4299 msg_scrolled_ign = FALSE;
4288 } 4300 }
4301
4302 #ifdef FEAT_VIMINFO
4303 curbuf->b_last_used = vim_time();
4304 #endif
4289 4305
4290 if (command != NULL) 4306 if (command != NULL)
4291 do_cmdline(command, NULL, NULL, DOCMD_VERBOSE); 4307 do_cmdline(command, NULL, NULL, DOCMD_VERBOSE);
4292 4308
4293 #ifdef FEAT_KEYMAP 4309 #ifdef FEAT_KEYMAP