Mercurial > vim
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 |