Mercurial > vim
annotate src/viminfo.c @ 17464:3e708b5c0509 v8.1.1730
patch 8.1.1730: wrong place for mark viminfo support
commit https://github.com/vim/vim/commit/1e78e69680a5f52970d9b1ef60710e556b09b8c2
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Jul 22 20:18:27 2019 +0200
patch 8.1.1730: wrong place for mark viminfo support
Problem: Wrong place for mark viminfo support.
Solution: Move it to viminfo.c. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/4716)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 22 Jul 2019 20:30:05 +0200 |
parents | e43f0c0c491c |
children | 15de78cb9f39 |
rev | line source |
---|---|
17458
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2 * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
4 * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
8 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
9 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
10 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
11 * viminfo.c: viminfo related functions |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
12 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
13 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
14 #include "vim.h" |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
15 #include "version.h" |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
16 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
17 #if defined(FEAT_VIMINFO) || defined(PROTO) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
18 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
19 static int viminfo_errcnt; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
20 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
21 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
22 * Get the viminfo file name to use. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
23 * If "file" is given and not empty, use it (has already been expanded by |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
24 * cmdline functions). |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
25 * Otherwise use "-i file_name", value from 'viminfo' or the default, and |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
26 * expand environment variables. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
27 * Returns an allocated string. NULL when out of memory. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
28 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
29 static char_u * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
30 viminfo_filename(char_u *file) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
31 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
32 if (file == NULL || *file == NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
33 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
34 if (*p_viminfofile != NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
35 file = p_viminfofile; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
36 else if ((file = find_viminfo_parameter('n')) == NULL || *file == NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
37 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
38 #ifdef VIMINFO_FILE2 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
39 # ifdef VMS |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
40 if (mch_getenv((char_u *)"SYS$LOGIN") == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
41 # else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
42 # ifdef MSWIN |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
43 // Use $VIM only if $HOME is the default "C:/". |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
44 if (STRCMP(vim_getenv((char_u *)"HOME", NULL), "C:/") == 0 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
45 && mch_getenv((char_u *)"HOME") == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
46 # else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
47 if (mch_getenv((char_u *)"HOME") == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
48 # endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
49 # endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
50 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
51 // don't use $VIM when not available. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
52 expand_env((char_u *)"$VIM", NameBuff, MAXPATHL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
53 if (STRCMP("$VIM", NameBuff) != 0) // $VIM was expanded |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
54 file = (char_u *)VIMINFO_FILE2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
55 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
56 file = (char_u *)VIMINFO_FILE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
57 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
58 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
59 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
60 file = (char_u *)VIMINFO_FILE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
61 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
62 expand_env(file, NameBuff, MAXPATHL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
63 file = NameBuff; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
64 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
65 return vim_strsave(file); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
66 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
67 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
68 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
69 read_viminfo_bufferlist( |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
70 vir_T *virp, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
71 int writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
72 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
73 char_u *tab; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
74 linenr_T lnum; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
75 colnr_T col; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
76 buf_T *buf; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
77 char_u *sfname; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
78 char_u *xline; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
79 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
80 // Handle long line and escaped characters. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
81 xline = viminfo_readstring(virp, 1, FALSE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
82 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
83 // don't read in if there are files on the command-line or if writing: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
84 if (xline != NULL && !writing && ARGCOUNT == 0 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
85 && find_viminfo_parameter('%') != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
86 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
87 // Format is: <fname> Tab <lnum> Tab <col>. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
88 // Watch out for a Tab in the file name, work from the end. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
89 lnum = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
90 col = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
91 tab = vim_strrchr(xline, '\t'); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
92 if (tab != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
93 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
94 *tab++ = '\0'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
95 col = (colnr_T)atoi((char *)tab); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
96 tab = vim_strrchr(xline, '\t'); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
97 if (tab != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
98 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
99 *tab++ = '\0'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
100 lnum = atol((char *)tab); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
101 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
102 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
103 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
104 // Expand "~/" in the file name at "line + 1" to a full path. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
105 // Then try shortening it by comparing with the current directory |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
106 expand_env(xline, NameBuff, MAXPATHL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
107 sfname = shorten_fname1(NameBuff); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
108 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
109 buf = buflist_new(NameBuff, sfname, (linenr_T)0, BLN_LISTED); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
110 if (buf != NULL) // just in case... |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
111 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
112 buf->b_last_cursor.lnum = lnum; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
113 buf->b_last_cursor.col = col; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
114 buflist_setfpos(buf, curwin, lnum, col, FALSE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
115 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
116 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
117 vim_free(xline); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
118 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
119 return viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
120 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
121 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
122 static void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
123 write_viminfo_bufferlist(FILE *fp) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
124 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
125 buf_T *buf; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
126 win_T *win; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
127 tabpage_T *tp; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
128 char_u *line; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
129 int max_buffers; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
130 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
131 if (find_viminfo_parameter('%') == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
132 return; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
133 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
134 // Without a number -1 is returned: do all buffers. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
135 max_buffers = get_viminfo_parameter('%'); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
136 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
137 // Allocate room for the file name, lnum and col. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
138 #define LINE_BUF_LEN (MAXPATHL + 40) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
139 line = alloc(LINE_BUF_LEN); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
140 if (line == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
141 return; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
142 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
143 FOR_ALL_TAB_WINDOWS(tp, win) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
144 set_last_cursor(win); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
145 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
146 fputs(_("\n# Buffer list:\n"), fp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
147 FOR_ALL_BUFFERS(buf) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
148 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
149 if (buf->b_fname == NULL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
150 || !buf->b_p_bl |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
151 #ifdef FEAT_QUICKFIX |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
152 || bt_quickfix(buf) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
153 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
154 #ifdef FEAT_TERMINAL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
155 || bt_terminal(buf) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
156 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
157 || removable(buf->b_ffname)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
158 continue; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
159 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
160 if (max_buffers-- == 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
161 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
162 putc('%', fp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
163 home_replace(NULL, buf->b_ffname, line, MAXPATHL, TRUE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
164 vim_snprintf_add((char *)line, LINE_BUF_LEN, "\t%ld\t%d", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
165 (long)buf->b_last_cursor.lnum, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
166 buf->b_last_cursor.col); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
167 viminfo_writestring(fp, line); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
168 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
169 vim_free(line); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
170 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
171 |
17460
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
172 #if defined(FEAT_CMDHIST) || defined(PROTO) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
173 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
174 * Buffers for history read from a viminfo file. Only valid while reading. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
175 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
176 static histentry_T *viminfo_history[HIST_COUNT] = |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
177 {NULL, NULL, NULL, NULL, NULL}; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
178 static int viminfo_hisidx[HIST_COUNT] = {0, 0, 0, 0, 0}; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
179 static int viminfo_hislen[HIST_COUNT] = {0, 0, 0, 0, 0}; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
180 static int viminfo_add_at_front = FALSE; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
181 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
182 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
183 * Translate a history type number to the associated character. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
184 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
185 static int |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
186 hist_type2char( |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
187 int type, |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
188 int use_question) // use '?' instead of '/' |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
189 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
190 if (type == HIST_CMD) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
191 return ':'; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
192 if (type == HIST_SEARCH) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
193 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
194 if (use_question) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
195 return '?'; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
196 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
197 return '/'; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
198 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
199 if (type == HIST_EXPR) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
200 return '='; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
201 return '@'; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
202 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
203 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
204 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
205 * Prepare for reading the history from the viminfo file. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
206 * This allocates history arrays to store the read history lines. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
207 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
208 static void |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
209 prepare_viminfo_history(int asklen, int writing) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
210 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
211 int i; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
212 int num; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
213 int type; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
214 int len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
215 int hislen = get_hislen(); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
216 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
217 init_history(); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
218 viminfo_add_at_front = (asklen != 0 && !writing); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
219 if (asklen > hislen) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
220 asklen = hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
221 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
222 for (type = 0; type < HIST_COUNT; ++type) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
223 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
224 histentry_T *histentry = get_histentry(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
225 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
226 // Count the number of empty spaces in the history list. Entries read |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
227 // from viminfo previously are also considered empty. If there are |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
228 // more spaces available than we request, then fill them up. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
229 for (i = 0, num = 0; i < hislen; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
230 if (histentry[i].hisstr == NULL || histentry[i].viminfo) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
231 num++; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
232 len = asklen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
233 if (num > len) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
234 len = num; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
235 if (len <= 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
236 viminfo_history[type] = NULL; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
237 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
238 viminfo_history[type] = LALLOC_MULT(histentry_T, len); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
239 if (viminfo_history[type] == NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
240 len = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
241 viminfo_hislen[type] = len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
242 viminfo_hisidx[type] = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
243 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
244 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
245 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
246 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
247 * Accept a line from the viminfo, store it in the history array when it's |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
248 * new. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
249 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
250 static int |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
251 read_viminfo_history(vir_T *virp, int writing) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
252 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
253 int type; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
254 long_u len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
255 char_u *val; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
256 char_u *p; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
257 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
258 type = hist_char2type(virp->vir_line[0]); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
259 if (viminfo_hisidx[type] < viminfo_hislen[type]) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
260 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
261 val = viminfo_readstring(virp, 1, TRUE); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
262 if (val != NULL && *val != NUL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
263 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
264 int sep = (*val == ' ' ? NUL : *val); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
265 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
266 if (!in_history(type, val + (type == HIST_SEARCH), |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
267 viminfo_add_at_front, sep, writing)) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
268 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
269 // Need to re-allocate to append the separator byte. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
270 len = STRLEN(val); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
271 p = alloc(len + 2); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
272 if (p != NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
273 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
274 if (type == HIST_SEARCH) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
275 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
276 // Search entry: Move the separator from the first |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
277 // column to after the NUL. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
278 mch_memmove(p, val + 1, (size_t)len); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
279 p[len] = sep; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
280 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
281 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
282 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
283 // Not a search entry: No separator in the viminfo |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
284 // file, add a NUL separator. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
285 mch_memmove(p, val, (size_t)len + 1); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
286 p[len + 1] = NUL; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
287 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
288 viminfo_history[type][viminfo_hisidx[type]].hisstr = p; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
289 viminfo_history[type][viminfo_hisidx[type]].time_set = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
290 viminfo_history[type][viminfo_hisidx[type]].viminfo = TRUE; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
291 viminfo_history[type][viminfo_hisidx[type]].hisnum = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
292 viminfo_hisidx[type]++; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
293 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
294 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
295 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
296 vim_free(val); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
297 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
298 return viminfo_readline(virp); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
299 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
300 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
301 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
302 * Accept a new style history line from the viminfo, store it in the history |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
303 * array when it's new. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
304 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
305 static void |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
306 handle_viminfo_history( |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
307 garray_T *values, |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
308 int writing) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
309 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
310 int type; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
311 long_u len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
312 char_u *val; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
313 char_u *p; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
314 bval_T *vp = (bval_T *)values->ga_data; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
315 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
316 // Check the format: |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
317 // |{bartype},{histtype},{timestamp},{separator},"text" |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
318 if (values->ga_len < 4 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
319 || vp[0].bv_type != BVAL_NR |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
320 || vp[1].bv_type != BVAL_NR |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
321 || (vp[2].bv_type != BVAL_NR && vp[2].bv_type != BVAL_EMPTY) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
322 || vp[3].bv_type != BVAL_STRING) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
323 return; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
324 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
325 type = vp[0].bv_nr; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
326 if (type >= HIST_COUNT) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
327 return; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
328 if (viminfo_hisidx[type] < viminfo_hislen[type]) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
329 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
330 val = vp[3].bv_string; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
331 if (val != NULL && *val != NUL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
332 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
333 int sep = type == HIST_SEARCH && vp[2].bv_type == BVAL_NR |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
334 ? vp[2].bv_nr : NUL; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
335 int idx; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
336 int overwrite = FALSE; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
337 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
338 if (!in_history(type, val, viminfo_add_at_front, sep, writing)) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
339 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
340 // If lines were written by an older Vim we need to avoid |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
341 // getting duplicates. See if the entry already exists. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
342 for (idx = 0; idx < viminfo_hisidx[type]; ++idx) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
343 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
344 p = viminfo_history[type][idx].hisstr; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
345 if (STRCMP(val, p) == 0 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
346 && (type != HIST_SEARCH || sep == p[STRLEN(p) + 1])) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
347 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
348 overwrite = TRUE; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
349 break; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
350 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
351 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
352 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
353 if (!overwrite) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
354 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
355 // Need to re-allocate to append the separator byte. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
356 len = vp[3].bv_len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
357 p = alloc(len + 2); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
358 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
359 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
360 len = 0; // for picky compilers |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
361 if (p != NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
362 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
363 viminfo_history[type][idx].time_set = vp[1].bv_nr; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
364 if (!overwrite) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
365 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
366 mch_memmove(p, val, (size_t)len + 1); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
367 // Put the separator after the NUL. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
368 p[len + 1] = sep; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
369 viminfo_history[type][idx].hisstr = p; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
370 viminfo_history[type][idx].hisnum = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
371 viminfo_history[type][idx].viminfo = TRUE; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
372 viminfo_hisidx[type]++; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
373 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
374 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
375 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
376 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
377 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
378 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
379 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
380 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
381 * Concatenate history lines from viminfo after the lines typed in this Vim. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
382 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
383 static void |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
384 concat_history(int type) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
385 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
386 int idx; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
387 int i; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
388 int hislen = get_hislen(); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
389 histentry_T *histentry = get_histentry(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
390 int *hisidx = get_hisidx(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
391 int *hisnum = get_hisnum(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
392 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
393 idx = *hisidx + viminfo_hisidx[type]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
394 if (idx >= hislen) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
395 idx -= hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
396 else if (idx < 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
397 idx = hislen - 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
398 if (viminfo_add_at_front) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
399 *hisidx = idx; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
400 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
401 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
402 if (*hisidx == -1) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
403 *hisidx = hislen - 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
404 do |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
405 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
406 if (histentry[idx].hisstr != NULL || histentry[idx].viminfo) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
407 break; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
408 if (++idx == hislen) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
409 idx = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
410 } while (idx != *hisidx); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
411 if (idx != *hisidx && --idx < 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
412 idx = hislen - 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
413 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
414 for (i = 0; i < viminfo_hisidx[type]; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
415 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
416 vim_free(histentry[idx].hisstr); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
417 histentry[idx].hisstr = viminfo_history[type][i].hisstr; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
418 histentry[idx].viminfo = TRUE; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
419 histentry[idx].time_set = viminfo_history[type][i].time_set; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
420 if (--idx < 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
421 idx = hislen - 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
422 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
423 idx += 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
424 idx %= hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
425 for (i = 0; i < viminfo_hisidx[type]; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
426 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
427 histentry[idx++].hisnum = ++*hisnum; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
428 idx %= hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
429 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
430 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
431 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
432 static int |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
433 sort_hist(const void *s1, const void *s2) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
434 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
435 histentry_T *p1 = *(histentry_T **)s1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
436 histentry_T *p2 = *(histentry_T **)s2; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
437 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
438 if (p1->time_set < p2->time_set) return -1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
439 if (p1->time_set > p2->time_set) return 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
440 return 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
441 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
442 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
443 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
444 * Merge history lines from viminfo and lines typed in this Vim based on the |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
445 * timestamp; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
446 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
447 static void |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
448 merge_history(int type) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
449 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
450 int max_len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
451 histentry_T **tot_hist; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
452 histentry_T *new_hist; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
453 int i; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
454 int len; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
455 int hislen = get_hislen(); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
456 histentry_T *histentry = get_histentry(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
457 int *hisidx = get_hisidx(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
458 int *hisnum = get_hisnum(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
459 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
460 // Make one long list with all entries. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
461 max_len = hislen + viminfo_hisidx[type]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
462 tot_hist = ALLOC_MULT(histentry_T *, max_len); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
463 new_hist = ALLOC_MULT(histentry_T, hislen ); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
464 if (tot_hist == NULL || new_hist == NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
465 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
466 vim_free(tot_hist); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
467 vim_free(new_hist); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
468 return; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
469 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
470 for (i = 0; i < viminfo_hisidx[type]; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
471 tot_hist[i] = &viminfo_history[type][i]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
472 len = i; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
473 for (i = 0; i < hislen; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
474 if (histentry[i].hisstr != NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
475 tot_hist[len++] = &histentry[i]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
476 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
477 // Sort the list on timestamp. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
478 qsort((void *)tot_hist, (size_t)len, sizeof(histentry_T *), sort_hist); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
479 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
480 // Keep the newest ones. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
481 for (i = 0; i < hislen; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
482 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
483 if (i < len) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
484 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
485 new_hist[i] = *tot_hist[i]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
486 tot_hist[i]->hisstr = NULL; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
487 if (new_hist[i].hisnum == 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
488 new_hist[i].hisnum = ++*hisnum; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
489 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
490 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
491 clear_hist_entry(&new_hist[i]); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
492 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
493 *hisidx = (i < len ? i : len) - 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
494 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
495 // Free what is not kept. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
496 for (i = 0; i < viminfo_hisidx[type]; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
497 vim_free(viminfo_history[type][i].hisstr); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
498 for (i = 0; i < hislen; i++) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
499 vim_free(histentry[i].hisstr); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
500 vim_free(histentry); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
501 set_histentry(type, new_hist); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
502 vim_free(tot_hist); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
503 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
504 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
505 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
506 * Finish reading history lines from viminfo. Not used when writing viminfo. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
507 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
508 static void |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
509 finish_viminfo_history(vir_T *virp) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
510 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
511 int type; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
512 int merge = virp->vir_version >= VIMINFO_VERSION_WITH_HISTORY; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
513 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
514 for (type = 0; type < HIST_COUNT; ++type) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
515 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
516 if (get_histentry(type) == NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
517 continue; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
518 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
519 if (merge) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
520 merge_history(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
521 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
522 concat_history(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
523 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
524 VIM_CLEAR(viminfo_history[type]); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
525 viminfo_hisidx[type] = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
526 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
527 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
528 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
529 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
530 * Write history to viminfo file in "fp". |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
531 * When "merge" is TRUE merge history lines with a previously read viminfo |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
532 * file, data is in viminfo_history[]. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
533 * When "merge" is FALSE just write all history lines. Used for ":wviminfo!". |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
534 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
535 static void |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
536 write_viminfo_history(FILE *fp, int merge) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
537 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
538 int i; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
539 int type; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
540 int num_saved; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
541 int round; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
542 int hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
543 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
544 init_history(); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
545 hislen = get_hislen(); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
546 if (hislen == 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
547 return; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
548 for (type = 0; type < HIST_COUNT; ++type) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
549 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
550 histentry_T *histentry = get_histentry(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
551 int *hisidx = get_hisidx(type); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
552 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
553 num_saved = get_viminfo_parameter(hist_type2char(type, FALSE)); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
554 if (num_saved == 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
555 continue; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
556 if (num_saved < 0) // Use default |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
557 num_saved = hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
558 fprintf(fp, _("\n# %s History (newest to oldest):\n"), |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
559 type == HIST_CMD ? _("Command Line") : |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
560 type == HIST_SEARCH ? _("Search String") : |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
561 type == HIST_EXPR ? _("Expression") : |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
562 type == HIST_INPUT ? _("Input Line") : |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
563 _("Debug Line")); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
564 if (num_saved > hislen) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
565 num_saved = hislen; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
566 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
567 /* |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
568 * Merge typed and viminfo history: |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
569 * round 1: history of typed commands. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
570 * round 2: history from recently read viminfo. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
571 */ |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
572 for (round = 1; round <= 2; ++round) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
573 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
574 if (round == 1) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
575 // start at newest entry, somewhere in the list |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
576 i = *hisidx; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
577 else if (viminfo_hisidx[type] > 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
578 // start at newest entry, first in the list |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
579 i = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
580 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
581 // empty list |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
582 i = -1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
583 if (i >= 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
584 while (num_saved > 0 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
585 && !(round == 2 && i >= viminfo_hisidx[type])) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
586 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
587 char_u *p; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
588 time_t timestamp; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
589 int c = NUL; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
590 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
591 if (round == 1) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
592 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
593 p = histentry[i].hisstr; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
594 timestamp = histentry[i].time_set; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
595 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
596 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
597 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
598 p = viminfo_history[type] == NULL ? NULL |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
599 : viminfo_history[type][i].hisstr; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
600 timestamp = viminfo_history[type] == NULL ? 0 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
601 : viminfo_history[type][i].time_set; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
602 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
603 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
604 if (p != NULL && (round == 2 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
605 || !merge |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
606 || !histentry[i].viminfo)) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
607 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
608 --num_saved; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
609 fputc(hist_type2char(type, TRUE), fp); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
610 // For the search history: put the separator in the |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
611 // second column; use a space if there isn't one. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
612 if (type == HIST_SEARCH) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
613 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
614 c = p[STRLEN(p) + 1]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
615 putc(c == NUL ? ' ' : c, fp); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
616 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
617 viminfo_writestring(fp, p); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
618 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
619 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
620 char cbuf[NUMBUFLEN]; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
621 |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
622 // New style history with a bar line. Format: |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
623 // |{bartype},{histtype},{timestamp},{separator},"text" |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
624 if (c == NUL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
625 cbuf[0] = NUL; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
626 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
627 sprintf(cbuf, "%d", c); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
628 fprintf(fp, "|%d,%d,%ld,%s,", BARTYPE_HISTORY, |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
629 type, (long)timestamp, cbuf); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
630 barline_writestring(fp, p, LSIZE - 20); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
631 putc('\n', fp); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
632 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
633 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
634 if (round == 1) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
635 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
636 // Decrement index, loop around and stop when back at |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
637 // the start. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
638 if (--i < 0) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
639 i = hislen - 1; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
640 if (i == *hisidx) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
641 break; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
642 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
643 else |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
644 { |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
645 // Increment index. Stop at the end in the while. |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
646 ++i; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
647 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
648 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
649 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
650 for (i = 0; i < viminfo_hisidx[type]; ++i) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
651 if (viminfo_history[type] != NULL) |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
652 vim_free(viminfo_history[type][i].hisstr); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
653 VIM_CLEAR(viminfo_history[type]); |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
654 viminfo_hisidx[type] = 0; |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
655 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
656 } |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
657 #endif // FEAT_VIMINFO |
e43f0c0c491c
patch 8.1.1728: wrong place for command line history viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17458
diff
changeset
|
658 |
17458
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
659 static void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
660 write_viminfo_barlines(vir_T *virp, FILE *fp_out) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
661 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
662 int i; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
663 garray_T *gap = &virp->vir_barlines; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
664 int seen_useful = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
665 char *line; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
666 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
667 if (gap->ga_len > 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
668 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
669 fputs(_("\n# Bar lines, copied verbatim:\n"), fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
670 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
671 // Skip over continuation lines until seeing a useful line. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
672 for (i = 0; i < gap->ga_len; ++i) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
673 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
674 line = ((char **)(gap->ga_data))[i]; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
675 if (seen_useful || line[1] != '<') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
676 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
677 fputs(line, fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
678 seen_useful = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
679 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
680 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
681 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
682 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
683 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
684 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
685 * Parse a viminfo line starting with '|'. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
686 * Add each decoded value to "values". |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
687 * Returns TRUE if the next line is to be read after using the parsed values. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
688 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
689 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
690 barline_parse(vir_T *virp, char_u *text, garray_T *values) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
691 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
692 char_u *p = text; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
693 char_u *nextp = NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
694 char_u *buf = NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
695 bval_T *value; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
696 int i; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
697 int allocated = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
698 int eof; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
699 char_u *sconv; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
700 int converted; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
701 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
702 while (*p == ',') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
703 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
704 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
705 if (ga_grow(values, 1) == FAIL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
706 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
707 value = (bval_T *)(values->ga_data) + values->ga_len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
708 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
709 if (*p == '>') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
710 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
711 // Need to read a continuation line. Put strings in allocated |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
712 // memory, because virp->vir_line is overwritten. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
713 if (!allocated) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
714 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
715 for (i = 0; i < values->ga_len; ++i) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
716 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
717 bval_T *vp = (bval_T *)(values->ga_data) + i; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
718 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
719 if (vp->bv_type == BVAL_STRING && !vp->bv_allocated) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
720 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
721 vp->bv_string = vim_strnsave(vp->bv_string, vp->bv_len); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
722 vp->bv_allocated = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
723 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
724 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
725 allocated = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
726 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
727 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
728 if (vim_isdigit(p[1])) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
729 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
730 size_t len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
731 size_t todo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
732 size_t n; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
733 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
734 // String value was split into lines that are each shorter |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
735 // than LSIZE: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
736 // |{bartype},>{length of "{text}{text2}"} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
737 // |<"{text1} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
738 // |<{text2}",{value} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
739 // Length includes the quotes. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
740 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
741 len = getdigits(&p); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
742 buf = alloc((int)(len + 1)); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
743 if (buf == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
744 return TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
745 p = buf; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
746 for (todo = len; todo > 0; todo -= n) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
747 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
748 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
749 if (eof || virp->vir_line[0] != '|' |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
750 || virp->vir_line[1] != '<') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
751 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
752 // File was truncated or garbled. Read another line if |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
753 // this one starts with '|'. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
754 vim_free(buf); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
755 return eof || virp->vir_line[0] == '|'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
756 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
757 // Get length of text, excluding |< and NL chars. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
758 n = STRLEN(virp->vir_line); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
759 while (n > 0 && (virp->vir_line[n - 1] == NL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
760 || virp->vir_line[n - 1] == CAR)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
761 --n; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
762 n -= 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
763 if (n > todo) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
764 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
765 // more values follow after the string |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
766 nextp = virp->vir_line + 2 + todo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
767 n = todo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
768 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
769 mch_memmove(p, virp->vir_line + 2, n); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
770 p += n; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
771 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
772 *p = NUL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
773 p = buf; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
774 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
775 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
776 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
777 // Line ending in ">" continues in the next line: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
778 // |{bartype},{lots of values},> |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
779 // |<{value},{value} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
780 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
781 if (eof || virp->vir_line[0] != '|' |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
782 || virp->vir_line[1] != '<') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
783 // File was truncated or garbled. Read another line if |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
784 // this one starts with '|'. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
785 return eof || virp->vir_line[0] == '|'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
786 p = virp->vir_line + 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
787 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
788 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
789 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
790 if (isdigit(*p)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
791 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
792 value->bv_type = BVAL_NR; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
793 value->bv_nr = getdigits(&p); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
794 ++values->ga_len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
795 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
796 else if (*p == '"') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
797 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
798 int len = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
799 char_u *s = p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
800 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
801 // Unescape special characters in-place. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
802 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
803 while (*p != '"') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
804 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
805 if (*p == NL || *p == NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
806 return TRUE; // syntax error, drop the value |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
807 if (*p == '\\') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
808 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
809 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
810 if (*p == 'n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
811 s[len++] = '\n'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
812 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
813 s[len++] = *p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
814 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
815 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
816 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
817 s[len++] = *p++; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
818 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
819 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
820 s[len] = NUL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
821 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
822 converted = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
823 if (virp->vir_conv.vc_type != CONV_NONE && *s != NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
824 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
825 sconv = string_convert(&virp->vir_conv, s, NULL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
826 if (sconv != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
827 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
828 if (s == buf) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
829 vim_free(s); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
830 s = sconv; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
831 buf = s; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
832 converted = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
833 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
834 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
835 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
836 // Need to copy in allocated memory if the string wasn't allocated |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
837 // above and we did allocate before, thus vir_line may change. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
838 if (s != buf && allocated) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
839 s = vim_strsave(s); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
840 value->bv_string = s; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
841 value->bv_type = BVAL_STRING; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
842 value->bv_len = len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
843 value->bv_allocated = allocated || converted; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
844 ++values->ga_len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
845 if (nextp != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
846 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
847 // values following a long string |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
848 p = nextp; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
849 nextp = NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
850 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
851 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
852 else if (*p == ',') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
853 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
854 value->bv_type = BVAL_EMPTY; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
855 ++values->ga_len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
856 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
857 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
858 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
859 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
860 return TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
861 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
862 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
863 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
864 read_viminfo_barline(vir_T *virp, int got_encoding, int force, int writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
865 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
866 char_u *p = virp->vir_line + 1; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
867 int bartype; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
868 garray_T values; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
869 bval_T *vp; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
870 int i; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
871 int read_next = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
872 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
873 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
874 * The format is: |{bartype},{value},... |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
875 * For a very long string: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
876 * |{bartype},>{length of "{text}{text2}"} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
877 * |<{text1} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
878 * |<{text2},{value} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
879 * For a long line not using a string |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
880 * |{bartype},{lots of values},> |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
881 * |<{value},{value} |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
882 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
883 if (*p == '<') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
884 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
885 // Continuation line of an unrecognized item. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
886 if (writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
887 ga_add_string(&virp->vir_barlines, virp->vir_line); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
888 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
889 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
890 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
891 ga_init2(&values, sizeof(bval_T), 20); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
892 bartype = getdigits(&p); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
893 switch (bartype) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
894 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
895 case BARTYPE_VERSION: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
896 // Only use the version when it comes before the encoding. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
897 // If it comes later it was copied by a Vim version that |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
898 // doesn't understand the version. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
899 if (!got_encoding) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
900 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
901 read_next = barline_parse(virp, p, &values); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
902 vp = (bval_T *)values.ga_data; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
903 if (values.ga_len > 0 && vp->bv_type == BVAL_NR) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
904 virp->vir_version = vp->bv_nr; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
905 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
906 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
907 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
908 case BARTYPE_HISTORY: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
909 read_next = barline_parse(virp, p, &values); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
910 handle_viminfo_history(&values, writing); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
911 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
912 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
913 case BARTYPE_REGISTER: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
914 read_next = barline_parse(virp, p, &values); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
915 handle_viminfo_register(&values, force); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
916 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
917 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
918 case BARTYPE_MARK: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
919 read_next = barline_parse(virp, p, &values); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
920 handle_viminfo_mark(&values, force); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
921 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
922 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
923 default: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
924 // copy unrecognized line (for future use) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
925 if (writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
926 ga_add_string(&virp->vir_barlines, virp->vir_line); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
927 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
928 for (i = 0; i < values.ga_len; ++i) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
929 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
930 vp = (bval_T *)values.ga_data + i; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
931 if (vp->bv_type == BVAL_STRING && vp->bv_allocated) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
932 vim_free(vp->bv_string); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
933 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
934 ga_clear(&values); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
935 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
936 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
937 if (read_next) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
938 return viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
939 return FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
940 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
941 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
942 static void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
943 write_viminfo_version(FILE *fp_out) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
944 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
945 fprintf(fp_out, "# Viminfo version\n|%d,%d\n\n", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
946 BARTYPE_VERSION, VIMINFO_VERSION); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
947 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
948 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
949 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
950 no_viminfo(void) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
951 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
952 // "vim -i NONE" does not read or write a viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
953 return STRCMP(p_viminfofile, "NONE") == 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
954 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
955 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
956 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
957 * Report an error for reading a viminfo file. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
958 * Count the number of errors. When there are more than 10, return TRUE. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
959 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
960 int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
961 viminfo_error(char *errnum, char *message, char_u *line) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
962 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
963 vim_snprintf((char *)IObuff, IOSIZE, _("%sviminfo: %s in line: "), |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
964 errnum, message); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
965 STRNCAT(IObuff, line, IOSIZE - STRLEN(IObuff) - 1); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
966 if (IObuff[STRLEN(IObuff) - 1] == '\n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
967 IObuff[STRLEN(IObuff) - 1] = NUL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
968 emsg((char *)IObuff); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
969 if (++viminfo_errcnt >= 10) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
970 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
971 emsg(_("E136: viminfo: Too many errors, skipping rest of file")); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
972 return TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
973 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
974 return FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
975 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
976 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
977 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
978 * Compare the 'encoding' value in the viminfo file with the current value of |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
979 * 'encoding'. If different and the 'c' flag is in 'viminfo', setup for |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
980 * conversion of text with iconv() in viminfo_readstring(). |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
981 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
982 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
983 viminfo_encoding(vir_T *virp) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
984 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
985 char_u *p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
986 int i; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
987 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
988 if (get_viminfo_parameter('c') != 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
989 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
990 p = vim_strchr(virp->vir_line, '='); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
991 if (p != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
992 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
993 // remove trailing newline |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
994 ++p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
995 for (i = 0; vim_isprintc(p[i]); ++i) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
996 ; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
997 p[i] = NUL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
998 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
999 convert_setup(&virp->vir_conv, p, p_enc); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1000 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1001 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1002 return viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1003 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1004 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1005 #if defined(FEAT_EVAL) || defined(PROTO) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1006 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1007 * Restore global vars that start with a capital from the viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1008 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1009 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1010 read_viminfo_varlist(vir_T *virp, int writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1011 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1012 char_u *tab; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1013 int type = VAR_NUMBER; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1014 typval_T tv; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1015 funccal_entry_T funccal_entry; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1016 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1017 if (!writing && (find_viminfo_parameter('!') != NULL)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1018 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1019 tab = vim_strchr(virp->vir_line + 1, '\t'); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1020 if (tab != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1021 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1022 *tab++ = '\0'; // isolate the variable name |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1023 switch (*tab) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1024 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1025 case 'S': type = VAR_STRING; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1026 #ifdef FEAT_FLOAT |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1027 case 'F': type = VAR_FLOAT; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1028 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1029 case 'D': type = VAR_DICT; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1030 case 'L': type = VAR_LIST; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1031 case 'B': type = VAR_BLOB; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1032 case 'X': type = VAR_SPECIAL; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1033 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1034 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1035 tab = vim_strchr(tab, '\t'); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1036 if (tab != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1037 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1038 tv.v_type = type; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1039 if (type == VAR_STRING || type == VAR_DICT |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1040 || type == VAR_LIST || type == VAR_BLOB) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1041 tv.vval.v_string = viminfo_readstring(virp, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1042 (int)(tab - virp->vir_line + 1), TRUE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1043 #ifdef FEAT_FLOAT |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1044 else if (type == VAR_FLOAT) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1045 (void)string2float(tab + 1, &tv.vval.v_float); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1046 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1047 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1048 tv.vval.v_number = atol((char *)tab + 1); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1049 if (type == VAR_DICT || type == VAR_LIST) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1050 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1051 typval_T *etv = eval_expr(tv.vval.v_string, NULL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1052 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1053 if (etv == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1054 // Failed to parse back the dict or list, use it as a |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1055 // string. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1056 tv.v_type = VAR_STRING; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1057 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1058 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1059 vim_free(tv.vval.v_string); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1060 tv = *etv; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1061 vim_free(etv); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1062 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1063 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1064 else if (type == VAR_BLOB) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1065 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1066 blob_T *blob = string2blob(tv.vval.v_string); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1067 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1068 if (blob == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1069 // Failed to parse back the blob, use it as a string. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1070 tv.v_type = VAR_STRING; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1071 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1072 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1073 vim_free(tv.vval.v_string); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1074 tv.v_type = VAR_BLOB; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1075 tv.vval.v_blob = blob; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1076 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1077 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1078 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1079 // when in a function use global variables |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1080 save_funccal(&funccal_entry); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1081 set_var(virp->vir_line + 1, &tv, FALSE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1082 restore_funccal(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1083 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1084 if (tv.v_type == VAR_STRING) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1085 vim_free(tv.vval.v_string); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1086 else if (tv.v_type == VAR_DICT || tv.v_type == VAR_LIST || |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1087 tv.v_type == VAR_BLOB) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1088 clear_tv(&tv); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1089 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1090 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1091 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1092 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1093 return viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1094 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1095 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1096 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1097 * Write global vars that start with a capital to the viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1098 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1099 static void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1100 write_viminfo_varlist(FILE *fp) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1101 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1102 hashitem_T *hi; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1103 dictitem_T *this_var; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1104 int todo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1105 char *s = ""; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1106 char_u *p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1107 char_u *tofree; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1108 char_u numbuf[NUMBUFLEN]; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1109 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1110 if (find_viminfo_parameter('!') == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1111 return; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1112 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1113 fputs(_("\n# global variables:\n"), fp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1114 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1115 todo = (int)globvarht.ht_used; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1116 for (hi = globvarht.ht_array; todo > 0; ++hi) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1117 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1118 if (!HASHITEM_EMPTY(hi)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1119 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1120 --todo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1121 this_var = HI2DI(hi); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1122 if (var_flavour(this_var->di_key) == VAR_FLAVOUR_VIMINFO) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1123 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1124 switch (this_var->di_tv.v_type) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1125 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1126 case VAR_STRING: s = "STR"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1127 case VAR_NUMBER: s = "NUM"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1128 case VAR_FLOAT: s = "FLO"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1129 case VAR_DICT: s = "DIC"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1130 case VAR_LIST: s = "LIS"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1131 case VAR_BLOB: s = "BLO"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1132 case VAR_SPECIAL: s = "XPL"; break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1133 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1134 case VAR_UNKNOWN: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1135 case VAR_FUNC: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1136 case VAR_PARTIAL: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1137 case VAR_JOB: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1138 case VAR_CHANNEL: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1139 continue; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1140 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1141 fprintf(fp, "!%s\t%s\t", this_var->di_key, s); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1142 if (this_var->di_tv.v_type == VAR_SPECIAL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1143 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1144 sprintf((char *)numbuf, "%ld", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1145 (long)this_var->di_tv.vval.v_number); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1146 p = numbuf; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1147 tofree = NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1148 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1149 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1150 p = echo_string(&this_var->di_tv, &tofree, numbuf, 0); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1151 if (p != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1152 viminfo_writestring(fp, p); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1153 vim_free(tofree); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1154 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1155 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1156 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1157 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1158 #endif // FEAT_EVAL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1159 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1160 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1161 * read_viminfo_up_to_marks() -- Only called from do_viminfo(). Reads in the |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1162 * first part of the viminfo file which contains everything but the marks that |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1163 * are local to a file. Returns TRUE when end-of-file is reached. -- webb |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1164 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1165 static int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1166 read_viminfo_up_to_marks( |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1167 vir_T *virp, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1168 int forceit, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1169 int writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1170 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1171 int eof; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1172 buf_T *buf; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1173 int got_encoding = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1174 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1175 #ifdef FEAT_CMDHIST |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1176 prepare_viminfo_history(forceit ? 9999 : 0, writing); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1177 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1178 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1179 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1180 while (!eof && virp->vir_line[0] != '>') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1181 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1182 switch (virp->vir_line[0]) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1183 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1184 // Characters reserved for future expansion, ignored now |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1185 case '+': // "+40 /path/dir file", for running vim without args |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1186 case '^': // to be defined |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1187 case '<': // long line - ignored |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1188 // A comment or empty line. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1189 case NUL: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1190 case '\r': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1191 case '\n': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1192 case '#': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1193 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1194 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1195 case '|': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1196 eof = read_viminfo_barline(virp, got_encoding, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1197 forceit, writing); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1198 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1199 case '*': // "*encoding=value" |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1200 got_encoding = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1201 eof = viminfo_encoding(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1202 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1203 case '!': // global variable |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1204 #ifdef FEAT_EVAL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1205 eof = read_viminfo_varlist(virp, writing); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1206 #else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1207 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1208 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1209 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1210 case '%': // entry for buffer list |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1211 eof = read_viminfo_bufferlist(virp, writing); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1212 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1213 case '"': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1214 // When registers are in bar lines skip the old style register |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1215 // lines. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1216 if (virp->vir_version < VIMINFO_VERSION_WITH_REGISTERS) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1217 eof = read_viminfo_register(virp, forceit); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1218 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1219 do { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1220 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1221 } while (!eof && (virp->vir_line[0] == TAB |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1222 || virp->vir_line[0] == '<')); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1223 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1224 case '/': // Search string |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1225 case '&': // Substitute search string |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1226 case '~': // Last search string, followed by '/' or '&' |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1227 eof = read_viminfo_search_pattern(virp, forceit); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1228 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1229 case '$': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1230 eof = read_viminfo_sub_string(virp, forceit); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1231 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1232 case ':': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1233 case '?': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1234 case '=': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1235 case '@': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1236 #ifdef FEAT_CMDHIST |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1237 // When history is in bar lines skip the old style history |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1238 // lines. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1239 if (virp->vir_version < VIMINFO_VERSION_WITH_HISTORY) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1240 eof = read_viminfo_history(virp, writing); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1241 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1242 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1243 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1244 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1245 case '-': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1246 case '\'': |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1247 // When file marks are in bar lines skip the old style lines. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1248 if (virp->vir_version < VIMINFO_VERSION_WITH_MARKS) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1249 eof = read_viminfo_filemark(virp, forceit); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1250 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1251 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1252 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1253 default: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1254 if (viminfo_error("E575: ", _("Illegal starting char"), |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1255 virp->vir_line)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1256 eof = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1257 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1258 eof = viminfo_readline(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1259 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1260 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1261 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1262 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1263 #ifdef FEAT_CMDHIST |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1264 // Finish reading history items. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1265 if (!writing) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1266 finish_viminfo_history(virp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1267 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1268 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1269 // Change file names to buffer numbers for fmarks. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1270 FOR_ALL_BUFFERS(buf) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1271 fmarks_check_names(buf); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1272 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1273 return eof; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1274 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1275 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1276 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1277 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo(). |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1278 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1279 static void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1280 do_viminfo(FILE *fp_in, FILE *fp_out, int flags) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1281 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1282 int eof = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1283 vir_T vir; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1284 int merge = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1285 int do_copy_marks = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1286 garray_T buflist; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1287 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1288 if ((vir.vir_line = alloc(LSIZE)) == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1289 return; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1290 vir.vir_fd = fp_in; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1291 vir.vir_conv.vc_type = CONV_NONE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1292 ga_init2(&vir.vir_barlines, (int)sizeof(char_u *), 100); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1293 vir.vir_version = -1; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1294 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1295 if (fp_in != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1296 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1297 if (flags & VIF_WANT_INFO) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1298 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1299 if (fp_out != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1300 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1301 // Registers and marks are read and kept separate from what |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1302 // this Vim is using. They are merged when writing. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1303 prepare_viminfo_registers(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1304 prepare_viminfo_marks(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1305 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1306 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1307 eof = read_viminfo_up_to_marks(&vir, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1308 flags & VIF_FORCEIT, fp_out != NULL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1309 merge = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1310 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1311 else if (flags != 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1312 // Skip info, find start of marks |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1313 while (!(eof = viminfo_readline(&vir)) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1314 && vir.vir_line[0] != '>') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1315 ; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1316 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1317 do_copy_marks = (flags & |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1318 (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT)); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1319 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1320 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1321 if (fp_out != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1322 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1323 // Write the info: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1324 fprintf(fp_out, _("# This viminfo file was generated by Vim %s.\n"), |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1325 VIM_VERSION_MEDIUM); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1326 fputs(_("# You may edit it if you're careful!\n\n"), fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1327 write_viminfo_version(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1328 fputs(_("# Value of 'encoding' when this file was written\n"), fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1329 fprintf(fp_out, "*encoding=%s\n\n", p_enc); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1330 write_viminfo_search_pattern(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1331 write_viminfo_sub_string(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1332 #ifdef FEAT_CMDHIST |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1333 write_viminfo_history(fp_out, merge); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1334 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1335 write_viminfo_registers(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1336 finish_viminfo_registers(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1337 #ifdef FEAT_EVAL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1338 write_viminfo_varlist(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1339 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1340 write_viminfo_filemarks(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1341 finish_viminfo_marks(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1342 write_viminfo_bufferlist(fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1343 write_viminfo_barlines(&vir, fp_out); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1344 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1345 if (do_copy_marks) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1346 ga_init2(&buflist, sizeof(buf_T *), 50); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1347 write_viminfo_marks(fp_out, do_copy_marks ? &buflist : NULL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1348 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1349 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1350 if (do_copy_marks) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1351 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1352 copy_viminfo_marks(&vir, fp_out, &buflist, eof, flags); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1353 if (fp_out != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1354 ga_clear(&buflist); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1355 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1356 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1357 vim_free(vir.vir_line); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1358 if (vir.vir_conv.vc_type != CONV_NONE) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1359 convert_setup(&vir.vir_conv, NULL, NULL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1360 ga_clear_strings(&vir.vir_barlines); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1361 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1362 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1363 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1364 * read_viminfo() -- Read the viminfo file. Registers etc. which are already |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1365 * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1366 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1367 int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1368 read_viminfo( |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1369 char_u *file, // file name or NULL to use default name |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1370 int flags) // VIF_WANT_INFO et al. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1371 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1372 FILE *fp; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1373 char_u *fname; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1374 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1375 if (no_viminfo()) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1376 return FAIL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1377 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1378 fname = viminfo_filename(file); // get file name in allocated buffer |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1379 if (fname == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1380 return FAIL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1381 fp = mch_fopen((char *)fname, READBIN); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1382 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1383 if (p_verbose > 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1384 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1385 verbose_enter(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1386 smsg(_("Reading viminfo file \"%s\"%s%s%s"), |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1387 fname, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1388 (flags & VIF_WANT_INFO) ? _(" info") : "", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1389 (flags & VIF_WANT_MARKS) ? _(" marks") : "", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1390 (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1391 fp == NULL ? _(" FAILED") : ""); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1392 verbose_leave(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1393 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1394 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1395 vim_free(fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1396 if (fp == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1397 return FAIL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1398 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1399 viminfo_errcnt = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1400 do_viminfo(fp, NULL, flags); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1401 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1402 fclose(fp); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1403 return OK; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1404 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1405 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1406 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1407 * Write the viminfo file. The old one is read in first so that effectively a |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1408 * merge of current info and old info is done. This allows multiple vims to |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1409 * run simultaneously, without losing any marks etc. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1410 * If "forceit" is TRUE, then the old file is not read in, and only internal |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1411 * info is written to the file. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1412 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1413 void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1414 write_viminfo(char_u *file, int forceit) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1415 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1416 char_u *fname; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1417 FILE *fp_in = NULL; // input viminfo file, if any |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1418 FILE *fp_out = NULL; // output viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1419 char_u *tempname = NULL; // name of temp viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1420 stat_T st_new; // mch_stat() of potential new file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1421 #if defined(UNIX) || defined(VMS) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1422 mode_t umask_save; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1423 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1424 #ifdef UNIX |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1425 int shortname = FALSE; // use 8.3 file name |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1426 stat_T st_old; // mch_stat() of existing viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1427 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1428 #ifdef MSWIN |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1429 int hidden = FALSE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1430 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1431 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1432 if (no_viminfo()) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1433 return; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1434 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1435 fname = viminfo_filename(file); // may set to default if NULL |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1436 if (fname == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1437 return; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1438 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1439 fp_in = mch_fopen((char *)fname, READBIN); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1440 if (fp_in == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1441 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1442 int fd; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1443 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1444 // if it does exist, but we can't read it, don't try writing |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1445 if (mch_stat((char *)fname, &st_new) == 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1446 goto end; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1447 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1448 // Create the new .viminfo non-accessible for others, because it may |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1449 // contain text from non-accessible documents. It is up to the user to |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1450 // widen access (e.g. to a group). This may also fail if there is a |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1451 // race condition, then just give up. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1452 fd = mch_open((char *)fname, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1453 O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, 0600); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1454 if (fd < 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1455 goto end; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1456 fp_out = fdopen(fd, WRITEBIN); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1457 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1458 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1459 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1460 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1461 * There is an existing viminfo file. Create a temporary file to |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1462 * write the new viminfo into, in the same directory as the |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1463 * existing viminfo file, which will be renamed once all writing is |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1464 * successful. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1465 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1466 #ifdef UNIX |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1467 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1468 * For Unix we check the owner of the file. It's not very nice to |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1469 * overwrite a user's viminfo file after a "su root", with a |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1470 * viminfo file that the user can't read. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1471 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1472 st_old.st_dev = (dev_t)0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1473 st_old.st_ino = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1474 st_old.st_mode = 0600; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1475 if (mch_stat((char *)fname, &st_old) == 0 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1476 && getuid() != ROOT_UID |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1477 && !(st_old.st_uid == getuid() |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1478 ? (st_old.st_mode & 0200) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1479 : (st_old.st_gid == getgid() |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1480 ? (st_old.st_mode & 0020) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1481 : (st_old.st_mode & 0002)))) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1482 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1483 int tt = msg_didany; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1484 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1485 // avoid a wait_return for this message, it's annoying |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1486 semsg(_("E137: Viminfo file is not writable: %s"), fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1487 msg_didany = tt; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1488 fclose(fp_in); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1489 goto end; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1490 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1491 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1492 #ifdef MSWIN |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1493 // Get the file attributes of the existing viminfo file. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1494 hidden = mch_ishidden(fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1495 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1496 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1497 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1498 * Make tempname, find one that does not exist yet. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1499 * Beware of a race condition: If someone logs out and all Vim |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1500 * instances exit at the same time a temp file might be created between |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1501 * stat() and open(). Use mch_open() with O_EXCL to avoid that. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1502 * May try twice: Once normal and once with shortname set, just in |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1503 * case somebody puts his viminfo file in an 8.3 filesystem. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1504 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1505 for (;;) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1506 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1507 int next_char = 'z'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1508 char_u *wp; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1509 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1510 tempname = buf_modname( |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1511 #ifdef UNIX |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1512 shortname, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1513 #else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1514 FALSE, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1515 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1516 fname, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1517 #ifdef VMS |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1518 (char_u *)"-tmp", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1519 #else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1520 (char_u *)".tmp", |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1521 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1522 FALSE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1523 if (tempname == NULL) // out of memory |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1524 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1525 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1526 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1527 * Try a series of names. Change one character, just before |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1528 * the extension. This should also work for an 8.3 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1529 * file name, when after adding the extension it still is |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1530 * the same file as the original. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1531 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1532 wp = tempname + STRLEN(tempname) - 5; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1533 if (wp < gettail(tempname)) // empty file name? |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1534 wp = gettail(tempname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1535 for (;;) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1536 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1537 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1538 * Check if tempfile already exists. Never overwrite an |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1539 * existing file! |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1540 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1541 if (mch_stat((char *)tempname, &st_new) == 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1542 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1543 #ifdef UNIX |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1544 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1545 * Check if tempfile is same as original file. May happen |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1546 * when modname() gave the same file back. E.g. silly |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1547 * link, or file name-length reached. Try again with |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1548 * shortname set. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1549 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1550 if (!shortname && st_new.st_dev == st_old.st_dev |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1551 && st_new.st_ino == st_old.st_ino) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1552 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1553 VIM_CLEAR(tempname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1554 shortname = TRUE; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1555 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1556 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1557 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1558 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1559 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1560 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1561 // Try creating the file exclusively. This may fail if |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1562 // another Vim tries to do it at the same time. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1563 #ifdef VMS |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1564 // fdopen() fails for some reason |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1565 umask_save = umask(077); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1566 fp_out = mch_fopen((char *)tempname, WRITEBIN); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1567 (void)umask(umask_save); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1568 #else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1569 int fd; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1570 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1571 // Use mch_open() to be able to use O_NOFOLLOW and set file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1572 // protection: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1573 // Unix: same as original file, but strip s-bit. Reset |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1574 // umask to avoid it getting in the way. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1575 // Others: r&w for user only. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1576 # ifdef UNIX |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1577 umask_save = umask(0); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1578 fd = mch_open((char *)tempname, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1579 O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1580 (int)((st_old.st_mode & 0777) | 0600)); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1581 (void)umask(umask_save); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1582 # else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1583 fd = mch_open((char *)tempname, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1584 O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, 0600); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1585 # endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1586 if (fd < 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1587 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1588 fp_out = NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1589 # ifdef EEXIST |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1590 // Avoid trying lots of names while the problem is lack |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1591 // of permission, only retry if the file already |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1592 // exists. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1593 if (errno != EEXIST) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1594 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1595 # endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1596 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1597 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1598 fp_out = fdopen(fd, WRITEBIN); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1599 #endif // VMS |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1600 if (fp_out != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1601 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1602 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1603 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1604 // Assume file exists, try again with another name. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1605 if (next_char == 'a' - 1) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1606 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1607 // They all exist? Must be something wrong! Don't write |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1608 // the viminfo file then. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1609 semsg(_("E929: Too many viminfo temp files, like %s!"), |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1610 tempname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1611 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1612 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1613 *wp = next_char; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1614 --next_char; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1615 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1616 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1617 if (tempname != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1618 break; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1619 // continue if shortname was set |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1620 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1621 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1622 #if defined(UNIX) && defined(HAVE_FCHOWN) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1623 if (tempname != NULL && fp_out != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1624 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1625 stat_T tmp_st; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1626 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1627 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1628 * Make sure the original owner can read/write the tempfile and |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1629 * otherwise preserve permissions, making sure the group matches. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1630 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1631 if (mch_stat((char *)tempname, &tmp_st) >= 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1632 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1633 if (st_old.st_uid != tmp_st.st_uid) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1634 // Changing the owner might fail, in which case the |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1635 // file will now owned by the current user, oh well. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1636 vim_ignored = fchown(fileno(fp_out), st_old.st_uid, -1); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1637 if (st_old.st_gid != tmp_st.st_gid |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1638 && fchown(fileno(fp_out), -1, st_old.st_gid) == -1) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1639 // can't set the group to what it should be, remove |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1640 // group permissions |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1641 (void)mch_setperm(tempname, 0600); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1642 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1643 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1644 // can't stat the file, set conservative permissions |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1645 (void)mch_setperm(tempname, 0600); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1646 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1647 #endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1648 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1649 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1650 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1651 * Check if the new viminfo file can be written to. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1652 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1653 if (fp_out == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1654 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1655 semsg(_("E138: Can't write viminfo file %s!"), |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1656 (fp_in == NULL || tempname == NULL) ? fname : tempname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1657 if (fp_in != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1658 fclose(fp_in); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1659 goto end; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1660 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1661 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1662 if (p_verbose > 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1663 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1664 verbose_enter(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1665 smsg(_("Writing viminfo file \"%s\""), fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1666 verbose_leave(); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1667 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1668 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1669 viminfo_errcnt = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1670 do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS)); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1671 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1672 if (fclose(fp_out) == EOF) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1673 ++viminfo_errcnt; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1674 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1675 if (fp_in != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1676 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1677 fclose(fp_in); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1678 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1679 // In case of an error keep the original viminfo file. Otherwise |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1680 // rename the newly written file. Give an error if that fails. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1681 if (viminfo_errcnt == 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1682 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1683 if (vim_rename(tempname, fname) == -1) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1684 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1685 ++viminfo_errcnt; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1686 semsg(_("E886: Can't rename viminfo file to %s!"), fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1687 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1688 # ifdef MSWIN |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1689 // If the viminfo file was hidden then also hide the new file. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1690 else if (hidden) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1691 mch_hide(fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1692 # endif |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1693 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1694 if (viminfo_errcnt > 0) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1695 mch_remove(tempname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1696 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1697 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1698 end: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1699 vim_free(fname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1700 vim_free(tempname); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1701 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1702 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1703 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1704 * Read a line from the viminfo file. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1705 * Returns TRUE for end-of-file; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1706 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1707 int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1708 viminfo_readline(vir_T *virp) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1709 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1710 return vim_fgets(virp->vir_line, LSIZE, virp->vir_fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1711 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1712 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1713 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1714 * Check string read from viminfo file. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1715 * Remove '\n' at the end of the line. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1716 * - replace CTRL-V CTRL-V with CTRL-V |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1717 * - replace CTRL-V 'n' with '\n' |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1718 * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1719 * Check for a long line as written by viminfo_writestring(). |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1720 * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1721 * Return the string in allocated memory (NULL when out of memory). |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1722 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1723 char_u * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1724 viminfo_readstring( |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1725 vir_T *virp, |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1726 int off, // offset for virp->vir_line |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1727 int convert UNUSED) // convert the string |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1728 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1729 char_u *retval; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1730 char_u *s, *d; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1731 long len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1732 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1733 if (virp->vir_line[off] == Ctrl_V && vim_isdigit(virp->vir_line[off + 1])) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1734 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1735 len = atol((char *)virp->vir_line + off + 1); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1736 retval = lalloc(len, TRUE); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1737 if (retval == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1738 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1739 // Line too long? File messed up? Skip next line. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1740 (void)vim_fgets(virp->vir_line, 10, virp->vir_fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1741 return NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1742 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1743 (void)vim_fgets(retval, (int)len, virp->vir_fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1744 s = retval + 1; // Skip the leading '<' |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1745 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1746 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1747 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1748 retval = vim_strsave(virp->vir_line + off); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1749 if (retval == NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1750 return NULL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1751 s = retval; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1752 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1753 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1754 // Change CTRL-V CTRL-V to CTRL-V and CTRL-V n to \n in-place. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1755 d = retval; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1756 while (*s != NUL && *s != '\n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1757 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1758 if (s[0] == Ctrl_V && s[1] != NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1759 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1760 if (s[1] == 'n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1761 *d++ = '\n'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1762 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1763 *d++ = Ctrl_V; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1764 s += 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1765 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1766 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1767 *d++ = *s++; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1768 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1769 *d = NUL; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1770 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1771 if (convert && virp->vir_conv.vc_type != CONV_NONE && *retval != NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1772 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1773 d = string_convert(&virp->vir_conv, retval, NULL); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1774 if (d != NULL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1775 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1776 vim_free(retval); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1777 retval = d; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1778 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1779 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1780 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1781 return retval; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1782 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1783 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1784 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1785 * write string to viminfo file |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1786 * - replace CTRL-V with CTRL-V CTRL-V |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1787 * - replace '\n' with CTRL-V 'n' |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1788 * - add a '\n' at the end |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1789 * |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1790 * For a long line: |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1791 * - write " CTRL-V <length> \n " in first line |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1792 * - write " < <string> \n " in second line |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1793 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1794 void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1795 viminfo_writestring(FILE *fd, char_u *p) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1796 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1797 int c; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1798 char_u *s; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1799 int len = 0; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1800 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1801 for (s = p; *s != NUL; ++s) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1802 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1803 if (*s == Ctrl_V || *s == '\n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1804 ++len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1805 ++len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1806 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1807 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1808 // If the string will be too long, write its length and put it in the next |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1809 // line. Take into account that some room is needed for what comes before |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1810 // the string (e.g., variable name). Add something to the length for the |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1811 // '<', NL and trailing NUL. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1812 if (len > LSIZE / 2) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1813 fprintf(fd, IF_EB("\026%d\n<", CTRL_V_STR "%d\n<"), len + 3); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1814 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1815 while ((c = *p++) != NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1816 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1817 if (c == Ctrl_V || c == '\n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1818 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1819 putc(Ctrl_V, fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1820 if (c == '\n') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1821 c = 'n'; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1822 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1823 putc(c, fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1824 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1825 putc('\n', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1826 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1827 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1828 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1829 * Write a string in quotes that barline_parse() can read back. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1830 * Breaks the line in less than LSIZE pieces when needed. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1831 * Returns remaining characters in the line. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1832 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1833 int |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1834 barline_writestring(FILE *fd, char_u *s, int remaining_start) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1835 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1836 char_u *p; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1837 int remaining = remaining_start; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1838 int len = 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1839 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1840 // Count the number of characters produced, including quotes. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1841 for (p = s; *p != NUL; ++p) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1842 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1843 if (*p == NL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1844 len += 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1845 else if (*p == '"' || *p == '\\') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1846 len += 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1847 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1848 ++len; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1849 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1850 if (len > remaining - 2) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1851 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1852 fprintf(fd, ">%d\n|<", len); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1853 remaining = LSIZE - 20; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1854 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1855 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1856 putc('"', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1857 for (p = s; *p != NUL; ++p) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1858 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1859 if (*p == NL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1860 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1861 putc('\\', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1862 putc('n', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1863 --remaining; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1864 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1865 else if (*p == '"' || *p == '\\') |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1866 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1867 putc('\\', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1868 putc(*p, fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1869 --remaining; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1870 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1871 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1872 putc(*p, fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1873 --remaining; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1874 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1875 if (remaining < 3) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1876 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1877 putc('\n', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1878 putc('|', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1879 putc('<', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1880 // Leave enough space for another continuation. |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1881 remaining = LSIZE - 20; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1882 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1883 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1884 putc('"', fd); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1885 return remaining - 2; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1886 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1887 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1888 /* |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1889 * ":rviminfo" and ":wviminfo". |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1890 */ |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1891 void |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1892 ex_viminfo( |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1893 exarg_T *eap) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1894 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1895 char_u *save_viminfo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1896 |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1897 save_viminfo = p_viminfo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1898 if (*p_viminfo == NUL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1899 p_viminfo = (char_u *)"'100"; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1900 if (eap->cmdidx == CMD_rviminfo) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1901 { |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1902 if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1903 | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL) |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1904 emsg(_("E195: Cannot open viminfo file for reading")); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1905 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1906 else |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1907 write_viminfo(eap->arg, eap->forceit); |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1908 p_viminfo = save_viminfo; |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1909 } |
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1910 |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1911 int |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1912 read_viminfo_filemark(vir_T *virp, int force) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1913 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1914 char_u *str; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1915 xfmark_T *namedfm_p = get_namedfm(); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1916 xfmark_T *fm; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1917 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1918 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1919 // We only get here if line[0] == '\'' or '-'. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1920 // Illegal mark names are ignored (for future expansion). |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1921 str = virp->vir_line + 1; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1922 if ( |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1923 #ifndef EBCDIC |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1924 *str <= 127 && |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1925 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1926 ((*virp->vir_line == '\'' && (VIM_ISDIGIT(*str) || isupper(*str))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1927 || (*virp->vir_line == '-' && *str == '\''))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1928 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1929 if (*str == '\'') |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1930 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1931 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1932 // If the jumplist isn't full insert fmark as oldest entry |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1933 if (curwin->w_jumplistlen == JUMPLISTSIZE) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1934 fm = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1935 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1936 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1937 for (i = curwin->w_jumplistlen; i > 0; --i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1938 curwin->w_jumplist[i] = curwin->w_jumplist[i - 1]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1939 ++curwin->w_jumplistidx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1940 ++curwin->w_jumplistlen; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1941 fm = &curwin->w_jumplist[0]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1942 fm->fmark.mark.lnum = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1943 fm->fname = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1944 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1945 #else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1946 fm = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1947 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1948 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1949 else if (VIM_ISDIGIT(*str)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1950 fm = &namedfm_p[*str - '0' + NMARKS]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1951 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1952 fm = &namedfm_p[*str - 'A']; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1953 if (fm != NULL && (fm->fmark.mark.lnum == 0 || force)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1954 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1955 str = skipwhite(str + 1); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1956 fm->fmark.mark.lnum = getdigits(&str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1957 str = skipwhite(str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1958 fm->fmark.mark.col = getdigits(&str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1959 fm->fmark.mark.coladd = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1960 fm->fmark.fnum = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1961 str = skipwhite(str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1962 vim_free(fm->fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1963 fm->fname = viminfo_readstring(virp, (int)(str - virp->vir_line), |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1964 FALSE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1965 fm->time_set = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1966 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1967 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1968 return vim_fgets(virp->vir_line, LSIZE, virp->vir_fd); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1969 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1970 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1971 static xfmark_T *vi_namedfm = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1972 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1973 static xfmark_T *vi_jumplist = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1974 static int vi_jumplist_len = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1975 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1976 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1977 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1978 * Prepare for reading viminfo marks when writing viminfo later. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1979 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1980 void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1981 prepare_viminfo_marks(void) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1982 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1983 vi_namedfm = ALLOC_CLEAR_MULT(xfmark_T, NMARKS + EXTRA_MARKS); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1984 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1985 vi_jumplist = ALLOC_CLEAR_MULT(xfmark_T, JUMPLISTSIZE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1986 vi_jumplist_len = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1987 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1988 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1989 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1990 void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1991 finish_viminfo_marks(void) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1992 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1993 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1994 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1995 if (vi_namedfm != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1996 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1997 for (i = 0; i < NMARKS + EXTRA_MARKS; ++i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1998 vim_free(vi_namedfm[i].fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
1999 VIM_CLEAR(vi_namedfm); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2000 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2001 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2002 if (vi_jumplist != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2003 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2004 for (i = 0; i < vi_jumplist_len; ++i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2005 vim_free(vi_jumplist[i].fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2006 VIM_CLEAR(vi_jumplist); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2007 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2008 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2009 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2010 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2011 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2012 * Accept a new style mark line from the viminfo, store it when it's new. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2013 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2014 void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2015 handle_viminfo_mark(garray_T *values, int force) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2016 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2017 bval_T *vp = (bval_T *)values->ga_data; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2018 int name; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2019 linenr_T lnum; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2020 colnr_T col; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2021 time_t timestamp; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2022 xfmark_T *fm = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2023 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2024 // Check the format: |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2025 // |{bartype},{name},{lnum},{col},{timestamp},{filename} |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2026 if (values->ga_len < 5 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2027 || vp[0].bv_type != BVAL_NR |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2028 || vp[1].bv_type != BVAL_NR |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2029 || vp[2].bv_type != BVAL_NR |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2030 || vp[3].bv_type != BVAL_NR |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2031 || vp[4].bv_type != BVAL_STRING) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2032 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2033 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2034 name = vp[0].bv_nr; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2035 if (name != '\'' && !VIM_ISDIGIT(name) && !ASCII_ISUPPER(name)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2036 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2037 lnum = vp[1].bv_nr; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2038 col = vp[2].bv_nr; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2039 if (lnum <= 0 || col < 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2040 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2041 timestamp = (time_t)vp[3].bv_nr; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2042 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2043 if (name == '\'') |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2044 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2045 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2046 if (vi_jumplist != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2047 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2048 if (vi_jumplist_len < JUMPLISTSIZE) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2049 fm = &vi_jumplist[vi_jumplist_len++]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2050 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2051 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2052 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2053 int idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2054 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2055 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2056 // If we have a timestamp insert it in the right place. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2057 if (timestamp != 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2058 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2059 for (idx = curwin->w_jumplistlen - 1; idx >= 0; --idx) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2060 if (curwin->w_jumplist[idx].time_set < timestamp) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2061 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2062 ++idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2063 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2064 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2065 // idx cannot be zero now |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2066 if (idx < 0 && curwin->w_jumplistlen < JUMPLISTSIZE) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2067 // insert as the oldest entry |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2068 idx = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2069 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2070 else if (curwin->w_jumplistlen < JUMPLISTSIZE) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2071 // insert as oldest entry |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2072 idx = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2073 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2074 idx = -1; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2075 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2076 if (idx >= 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2077 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2078 if (curwin->w_jumplistlen == JUMPLISTSIZE) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2079 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2080 // Drop the oldest entry. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2081 --idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2082 vim_free(curwin->w_jumplist[0].fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2083 for (i = 0; i < idx; ++i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2084 curwin->w_jumplist[i] = curwin->w_jumplist[i + 1]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2085 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2086 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2087 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2088 // Move newer entries forward. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2089 for (i = curwin->w_jumplistlen; i > idx; --i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2090 curwin->w_jumplist[i] = curwin->w_jumplist[i - 1]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2091 ++curwin->w_jumplistidx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2092 ++curwin->w_jumplistlen; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2093 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2094 fm = &curwin->w_jumplist[idx]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2095 fm->fmark.mark.lnum = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2096 fm->fname = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2097 fm->time_set = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2098 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2099 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2100 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2101 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2102 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2103 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2104 int idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2105 xfmark_T *namedfm_p = get_namedfm(); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2106 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2107 if (VIM_ISDIGIT(name)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2108 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2109 if (vi_namedfm != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2110 idx = name - '0' + NMARKS; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2111 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2112 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2113 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2114 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2115 // Do not use the name from the viminfo file, insert in time |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2116 // order. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2117 for (idx = NMARKS; idx < NMARKS + EXTRA_MARKS; ++idx) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2118 if (namedfm_p[idx].time_set < timestamp) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2119 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2120 if (idx == NMARKS + EXTRA_MARKS) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2121 // All existing entries are newer. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2122 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2123 i = NMARKS + EXTRA_MARKS - 1; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2124 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2125 vim_free(namedfm_p[i].fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2126 for ( ; i > idx; --i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2127 namedfm_p[i] = namedfm_p[i - 1]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2128 namedfm_p[idx].fname = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2129 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2130 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2131 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2132 idx = name - 'A'; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2133 if (vi_namedfm != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2134 fm = &vi_namedfm[idx]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2135 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2136 fm = &namedfm_p[idx]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2137 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2138 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2139 if (fm != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2140 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2141 if (vi_namedfm != NULL || fm->fmark.mark.lnum == 0 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2142 || fm->time_set < timestamp || force) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2143 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2144 fm->fmark.mark.lnum = lnum; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2145 fm->fmark.mark.col = col; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2146 fm->fmark.mark.coladd = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2147 fm->fmark.fnum = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2148 vim_free(fm->fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2149 if (vp[4].bv_allocated) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2150 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2151 fm->fname = vp[4].bv_string; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2152 vp[4].bv_string = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2153 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2154 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2155 fm->fname = vim_strsave(vp[4].bv_string); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2156 fm->time_set = timestamp; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2157 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2158 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2159 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2160 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2161 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2162 * Return TRUE if marks for "buf" should not be written. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2163 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2164 static int |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2165 skip_for_viminfo(buf_T *buf) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2166 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2167 return |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2168 #ifdef FEAT_TERMINAL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2169 bt_terminal(buf) || |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2170 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2171 removable(buf->b_ffname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2172 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2173 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2174 static void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2175 write_one_filemark( |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2176 FILE *fp, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2177 xfmark_T *fm, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2178 int c1, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2179 int c2) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2180 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2181 char_u *name; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2182 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2183 if (fm->fmark.mark.lnum == 0) // not set |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2184 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2185 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2186 if (fm->fmark.fnum != 0) // there is a buffer |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2187 name = buflist_nr2name(fm->fmark.fnum, TRUE, FALSE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2188 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2189 name = fm->fname; // use name from .viminfo |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2190 if (name != NULL && *name != NUL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2191 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2192 fprintf(fp, "%c%c %ld %ld ", c1, c2, (long)fm->fmark.mark.lnum, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2193 (long)fm->fmark.mark.col); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2194 viminfo_writestring(fp, name); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2195 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2196 // Barline: |{bartype},{name},{lnum},{col},{timestamp},{filename} |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2197 // size up to filename: 8 + 3 * 20 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2198 fprintf(fp, "|%d,%d,%ld,%ld,%ld,", BARTYPE_MARK, c2, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2199 (long)fm->fmark.mark.lnum, (long)fm->fmark.mark.col, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2200 (long)fm->time_set); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2201 barline_writestring(fp, name, LSIZE - 70); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2202 putc('\n', fp); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2203 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2204 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2205 if (fm->fmark.fnum != 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2206 vim_free(name); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2207 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2208 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2209 void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2210 write_viminfo_filemarks(FILE *fp) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2211 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2212 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2213 char_u *name; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2214 buf_T *buf; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2215 xfmark_T *namedfm_p = get_namedfm(); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2216 xfmark_T *fm; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2217 int vi_idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2218 int idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2219 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2220 if (get_viminfo_parameter('f') == 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2221 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2222 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2223 fputs(_("\n# File marks:\n"), fp); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2224 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2225 // Write the filemarks 'A - 'Z |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2226 for (i = 0; i < NMARKS; i++) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2227 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2228 if (vi_namedfm != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2229 && (vi_namedfm[i].time_set > namedfm_p[i].time_set |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2230 || namedfm_p[i].fmark.mark.lnum == 0)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2231 fm = &vi_namedfm[i]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2232 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2233 fm = &namedfm_p[i]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2234 write_one_filemark(fp, fm, '\'', i + 'A'); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2235 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2236 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2237 // Find a mark that is the same file and position as the cursor. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2238 // That one, or else the last one is deleted. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2239 // Move '0 to '1, '1 to '2, etc. until the matching one or '9 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2240 // Set the '0 mark to current cursor position. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2241 if (curbuf->b_ffname != NULL && !skip_for_viminfo(curbuf)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2242 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2243 name = buflist_nr2name(curbuf->b_fnum, TRUE, FALSE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2244 for (i = NMARKS; i < NMARKS + EXTRA_MARKS - 1; ++i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2245 if (namedfm_p[i].fmark.mark.lnum == curwin->w_cursor.lnum |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2246 && (namedfm_p[i].fname == NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2247 ? namedfm_p[i].fmark.fnum == curbuf->b_fnum |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2248 : (name != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2249 && STRCMP(name, namedfm_p[i].fname) == 0))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2250 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2251 vim_free(name); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2252 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2253 vim_free(namedfm_p[i].fname); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2254 for ( ; i > NMARKS; --i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2255 namedfm_p[i] = namedfm_p[i - 1]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2256 namedfm_p[NMARKS].fmark.mark = curwin->w_cursor; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2257 namedfm_p[NMARKS].fmark.fnum = curbuf->b_fnum; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2258 namedfm_p[NMARKS].fname = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2259 namedfm_p[NMARKS].time_set = vim_time(); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2260 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2261 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2262 // Write the filemarks '0 - '9. Newest (highest timestamp) first. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2263 vi_idx = NMARKS; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2264 idx = NMARKS; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2265 for (i = NMARKS; i < NMARKS + EXTRA_MARKS; i++) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2266 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2267 xfmark_T *vi_fm = vi_namedfm != NULL ? &vi_namedfm[vi_idx] : NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2268 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2269 if (vi_fm != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2270 && vi_fm->fmark.mark.lnum != 0 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2271 && (vi_fm->time_set > namedfm_p[idx].time_set |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2272 || namedfm_p[idx].fmark.mark.lnum == 0)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2273 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2274 fm = vi_fm; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2275 ++vi_idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2276 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2277 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2278 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2279 fm = &namedfm_p[idx++]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2280 if (vi_fm != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2281 && vi_fm->fmark.mark.lnum == fm->fmark.mark.lnum |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2282 && vi_fm->time_set == fm->time_set |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2283 && ((vi_fm->fmark.fnum != 0 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2284 && vi_fm->fmark.fnum == fm->fmark.fnum) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2285 || (vi_fm->fname != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2286 && fm->fname != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2287 && STRCMP(vi_fm->fname, fm->fname) == 0))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2288 ++vi_idx; // skip duplicate |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2289 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2290 write_one_filemark(fp, fm, '\'', i - NMARKS + '0'); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2291 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2292 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2293 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2294 // Write the jumplist with -' |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2295 fputs(_("\n# Jumplist (newest first):\n"), fp); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2296 setpcmark(); // add current cursor position |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2297 cleanup_jumplist(curwin, FALSE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2298 vi_idx = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2299 idx = curwin->w_jumplistlen - 1; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2300 for (i = 0; i < JUMPLISTSIZE; ++i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2301 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2302 xfmark_T *vi_fm; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2303 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2304 fm = idx >= 0 ? &curwin->w_jumplist[idx] : NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2305 vi_fm = vi_idx < vi_jumplist_len ? &vi_jumplist[vi_idx] : NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2306 if (fm == NULL && vi_fm == NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2307 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2308 if (fm == NULL || (vi_fm != NULL && fm->time_set < vi_fm->time_set)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2309 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2310 fm = vi_fm; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2311 ++vi_idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2312 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2313 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2314 --idx; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2315 if (fm->fmark.fnum == 0 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2316 || ((buf = buflist_findnr(fm->fmark.fnum)) != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2317 && !skip_for_viminfo(buf))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2318 write_one_filemark(fp, fm, '-', '\''); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2319 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2320 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2321 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2322 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2323 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2324 * Return TRUE if "name" is on removable media (depending on 'viminfo'). |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2325 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2326 int |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2327 removable(char_u *name) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2328 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2329 char_u *p; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2330 char_u part[51]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2331 int retval = FALSE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2332 size_t n; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2333 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2334 name = home_replace_save(NULL, name); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2335 if (name != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2336 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2337 for (p = p_viminfo; *p; ) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2338 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2339 copy_option_part(&p, part, 51, ", "); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2340 if (part[0] == 'r') |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2341 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2342 n = STRLEN(part + 1); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2343 if (MB_STRNICMP(part + 1, name, n) == 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2344 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2345 retval = TRUE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2346 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2347 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2348 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2349 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2350 vim_free(name); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2351 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2352 return retval; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2353 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2354 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2355 static void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2356 write_one_mark(FILE *fp_out, int c, pos_T *pos) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2357 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2358 if (pos->lnum != 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2359 fprintf(fp_out, "\t%c\t%ld\t%d\n", c, (long)pos->lnum, (int)pos->col); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2360 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2361 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2362 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2363 static void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2364 write_buffer_marks(buf_T *buf, FILE *fp_out) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2365 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2366 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2367 pos_T pos; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2368 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2369 home_replace(NULL, buf->b_ffname, IObuff, IOSIZE, TRUE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2370 fprintf(fp_out, "\n> "); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2371 viminfo_writestring(fp_out, IObuff); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2372 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2373 // Write the last used timestamp as the lnum of the non-existing mark '*'. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2374 // Older Vims will ignore it and/or copy it. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2375 pos.lnum = (linenr_T)buf->b_last_used; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2376 pos.col = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2377 write_one_mark(fp_out, '*', &pos); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2378 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2379 write_one_mark(fp_out, '"', &buf->b_last_cursor); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2380 write_one_mark(fp_out, '^', &buf->b_last_insert); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2381 write_one_mark(fp_out, '.', &buf->b_last_change); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2382 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2383 // changelist positions are stored oldest first |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2384 for (i = 0; i < buf->b_changelistlen; ++i) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2385 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2386 // skip duplicates |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2387 if (i == 0 || !EQUAL_POS(buf->b_changelist[i - 1], |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2388 buf->b_changelist[i])) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2389 write_one_mark(fp_out, '+', &buf->b_changelist[i]); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2390 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2391 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2392 for (i = 0; i < NMARKS; i++) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2393 write_one_mark(fp_out, 'a' + i, &buf->b_namedm[i]); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2394 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2395 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2396 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2397 * Write all the named marks for all buffers. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2398 * When "buflist" is not NULL fill it with the buffers for which marks are to |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2399 * be written. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2400 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2401 void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2402 write_viminfo_marks(FILE *fp_out, garray_T *buflist) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2403 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2404 buf_T *buf; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2405 int is_mark_set; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2406 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2407 win_T *win; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2408 tabpage_T *tp; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2409 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2410 // Set b_last_cursor for the all buffers that have a window. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2411 FOR_ALL_TAB_WINDOWS(tp, win) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2412 set_last_cursor(win); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2413 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2414 fputs(_("\n# History of marks within files (newest to oldest):\n"), fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2415 FOR_ALL_BUFFERS(buf) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2416 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2417 // Only write something if buffer has been loaded and at least one |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2418 // mark is set. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2419 if (buf->b_marks_read) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2420 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2421 if (buf->b_last_cursor.lnum != 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2422 is_mark_set = TRUE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2423 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2424 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2425 is_mark_set = FALSE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2426 for (i = 0; i < NMARKS; i++) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2427 if (buf->b_namedm[i].lnum != 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2428 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2429 is_mark_set = TRUE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2430 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2431 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2432 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2433 if (is_mark_set && buf->b_ffname != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2434 && buf->b_ffname[0] != NUL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2435 && !skip_for_viminfo(buf)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2436 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2437 if (buflist == NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2438 write_buffer_marks(buf, fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2439 else if (ga_grow(buflist, 1) == OK) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2440 ((buf_T **)buflist->ga_data)[buflist->ga_len++] = buf; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2441 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2442 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2443 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2444 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2445 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2446 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2447 * Compare functions for qsort() below, that compares b_last_used. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2448 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2449 static int |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2450 buf_compare(const void *s1, const void *s2) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2451 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2452 buf_T *buf1 = *(buf_T **)s1; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2453 buf_T *buf2 = *(buf_T **)s2; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2454 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2455 if (buf1->b_last_used == buf2->b_last_used) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2456 return 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2457 return buf1->b_last_used > buf2->b_last_used ? -1 : 1; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2458 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2459 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2460 /* |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2461 * Handle marks in the viminfo file: |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2462 * fp_out != NULL: copy marks, in time order with buffers in "buflist". |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2463 * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2464 * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2465 */ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2466 void |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2467 copy_viminfo_marks( |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2468 vir_T *virp, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2469 FILE *fp_out, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2470 garray_T *buflist, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2471 int eof, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2472 int flags) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2473 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2474 char_u *line = virp->vir_line; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2475 buf_T *buf; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2476 int num_marked_files; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2477 int load_marks; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2478 int copy_marks_out; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2479 char_u *str; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2480 int i; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2481 char_u *p; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2482 char_u *name_buf; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2483 pos_T pos; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2484 #ifdef FEAT_EVAL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2485 list_T *list = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2486 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2487 int count = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2488 int buflist_used = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2489 buf_T *buflist_buf = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2490 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2491 if ((name_buf = alloc(LSIZE)) == NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2492 return; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2493 *name_buf = NUL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2494 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2495 if (fp_out != NULL && buflist->ga_len > 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2496 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2497 // Sort the list of buffers on b_last_used. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2498 qsort(buflist->ga_data, (size_t)buflist->ga_len, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2499 sizeof(buf_T *), buf_compare); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2500 buflist_buf = ((buf_T **)buflist->ga_data)[0]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2501 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2502 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2503 #ifdef FEAT_EVAL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2504 if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2505 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2506 list = list_alloc(); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2507 if (list != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2508 set_vim_var_list(VV_OLDFILES, list); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2509 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2510 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2511 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2512 num_marked_files = get_viminfo_parameter('\''); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2513 while (!eof && (count < num_marked_files || fp_out == NULL)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2514 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2515 if (line[0] != '>') |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2516 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2517 if (line[0] != '\n' && line[0] != '\r' && line[0] != '#') |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2518 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2519 if (viminfo_error("E576: ", _("Missing '>'"), line)) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2520 break; // too many errors, return now |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2521 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2522 eof = vim_fgets(line, LSIZE, virp->vir_fd); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2523 continue; // Skip this dud line |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2524 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2525 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2526 // Handle long line and translate escaped characters. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2527 // Find file name, set str to start. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2528 // Ignore leading and trailing white space. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2529 str = skipwhite(line + 1); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2530 str = viminfo_readstring(virp, (int)(str - virp->vir_line), FALSE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2531 if (str == NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2532 continue; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2533 p = str + STRLEN(str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2534 while (p != str && (*p == NUL || vim_isspace(*p))) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2535 p--; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2536 if (*p) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2537 p++; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2538 *p = NUL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2539 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2540 #ifdef FEAT_EVAL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2541 if (list != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2542 list_append_string(list, str, -1); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2543 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2544 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2545 // If fp_out == NULL, load marks for current buffer. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2546 // If fp_out != NULL, copy marks for buffers not in buflist. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2547 load_marks = copy_marks_out = FALSE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2548 if (fp_out == NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2549 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2550 if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2551 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2552 if (*name_buf == NUL) // only need to do this once |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2553 home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2554 if (fnamecmp(str, name_buf) == 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2555 load_marks = TRUE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2556 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2557 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2558 else // fp_out != NULL |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2559 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2560 // This is slow if there are many buffers!! |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2561 FOR_ALL_BUFFERS(buf) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2562 if (buf->b_ffname != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2563 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2564 home_replace(NULL, buf->b_ffname, name_buf, LSIZE, TRUE); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2565 if (fnamecmp(str, name_buf) == 0) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2566 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2567 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2568 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2569 // Copy marks if the buffer has not been loaded. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2570 if (buf == NULL || !buf->b_marks_read) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2571 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2572 int did_read_line = FALSE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2573 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2574 if (buflist_buf != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2575 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2576 // Read the next line. If it has the "*" mark compare the |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2577 // time stamps. Write entries from "buflist" that are |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2578 // newer. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2579 if (!(eof = viminfo_readline(virp)) && line[0] == TAB) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2580 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2581 did_read_line = TRUE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2582 if (line[1] == '*') |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2583 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2584 long ltime; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2585 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2586 sscanf((char *)line + 2, "%ld ", <ime); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2587 while ((time_T)ltime < buflist_buf->b_last_used) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2588 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2589 write_buffer_marks(buflist_buf, fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2590 if (++count >= num_marked_files) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2591 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2592 if (++buflist_used == buflist->ga_len) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2593 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2594 buflist_buf = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2595 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2596 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2597 buflist_buf = |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2598 ((buf_T **)buflist->ga_data)[buflist_used]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2599 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2600 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2601 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2602 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2603 // No timestamp, must be written by an older Vim. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2604 // Assume all remaining buffers are older then |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2605 // ours. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2606 while (count < num_marked_files |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2607 && buflist_used < buflist->ga_len) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2608 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2609 buflist_buf = ((buf_T **)buflist->ga_data) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2610 [buflist_used++]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2611 write_buffer_marks(buflist_buf, fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2612 ++count; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2613 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2614 buflist_buf = NULL; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2615 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2616 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2617 if (count >= num_marked_files) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2618 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2619 vim_free(str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2620 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2621 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2622 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2623 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2624 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2625 fputs("\n> ", fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2626 viminfo_writestring(fp_out, str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2627 if (did_read_line) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2628 fputs((char *)line, fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2629 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2630 count++; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2631 copy_marks_out = TRUE; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2632 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2633 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2634 vim_free(str); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2635 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2636 pos.coladd = 0; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2637 while (!(eof = viminfo_readline(virp)) && line[0] == TAB) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2638 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2639 if (load_marks) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2640 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2641 if (line[1] != NUL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2642 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2643 unsigned u; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2644 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2645 sscanf((char *)line + 2, "%ld %u", &pos.lnum, &u); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2646 pos.col = u; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2647 switch (line[1]) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2648 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2649 case '"': curbuf->b_last_cursor = pos; break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2650 case '^': curbuf->b_last_insert = pos; break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2651 case '.': curbuf->b_last_change = pos; break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2652 case '+': |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2653 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2654 // changelist positions are stored oldest |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2655 // first |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2656 if (curbuf->b_changelistlen == JUMPLISTSIZE) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2657 // list is full, remove oldest entry |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2658 mch_memmove(curbuf->b_changelist, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2659 curbuf->b_changelist + 1, |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2660 sizeof(pos_T) * (JUMPLISTSIZE - 1)); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2661 else |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2662 ++curbuf->b_changelistlen; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2663 curbuf->b_changelist[ |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2664 curbuf->b_changelistlen - 1] = pos; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2665 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2666 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2667 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2668 // Using the line number for the last-used |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2669 // timestamp. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2670 case '*': curbuf->b_last_used = pos.lnum; break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2671 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2672 default: if ((i = line[1] - 'a') >= 0 && i < NMARKS) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2673 curbuf->b_namedm[i] = pos; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2674 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2675 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2676 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2677 else if (copy_marks_out) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2678 fputs((char *)line, fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2679 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2680 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2681 if (load_marks) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2682 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2683 #ifdef FEAT_JUMPLIST |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2684 win_T *wp; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2685 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2686 FOR_ALL_WINDOWS(wp) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2687 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2688 if (wp->w_buffer == curbuf) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2689 wp->w_changelistidx = curbuf->b_changelistlen; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2690 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2691 #endif |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2692 break; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2693 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2694 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2695 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2696 if (fp_out != NULL) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2697 // Write any remaining entries from buflist. |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2698 while (count < num_marked_files && buflist_used < buflist->ga_len) |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2699 { |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2700 buflist_buf = ((buf_T **)buflist->ga_data)[buflist_used++]; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2701 write_buffer_marks(buflist_buf, fp_out); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2702 ++count; |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2703 } |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2704 |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2705 vim_free(name_buf); |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
17460
diff
changeset
|
2706 } |
17458
cfdef48743ed
patch 8.1.1727: code for viminfo support is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2707 #endif // FEAT_VIMINFO |