annotate src/session.c @ 22226:4ed106deb772 v8.2.1662

patch 8.2.1662: :mksession does not restore shared terminal buffer properly Commit: https://github.com/vim/vim/commit/0e655111e9dbdbdf69fee1b199f2b9c355bf4a10 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Sep 11 20:36:36 2020 +0200 patch 8.2.1662: :mksession does not restore shared terminal buffer properly Problem: :mksession does not restore shared terminal buffer properly. Solution: Keep a hashtab with terminal buffers. (Rob Pilling, closes https://github.com/vim/vim/issues/6930)
author Bram Moolenaar <Bram@vim.org>
date Fri, 11 Sep 2020 20:45:04 +0200
parents 407351a89c61
children 0bbc8be90207
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
e00d12c085a5 patch 8.1.1766: code for writing session file 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.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * session.c: session related functions
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 #if defined(FEAT_SESSION) || defined(PROTO)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 static int did_lcd; // whether ":lcd" was produced for a session
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 * Write a file name to the session file.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 * Takes care of the "slash" option in 'sessionoptions' and escapes special
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 * characters.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 * Returns FAIL if writing fails or out of memory.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 ses_put_fname(FILE *fd, char_u *name, unsigned *flagp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29 char_u *sname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 char_u *p;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 int retval = OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 sname = home_replace_save(NULL, name);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 if (sname == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 if (*flagp & SSOP_SLASH)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 // change all backslashes to forward slashes
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 for (p = sname; *p != NUL; MB_PTR_ADV(p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 if (*p == '\\')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 *p = '/';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 // escape special characters
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 p = vim_strsave_fnameescape(sname, FALSE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 vim_free(sname);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48 if (p == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 // write the result
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 if (fputs((char *)p, fd) < 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 retval = FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 vim_free(p);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56 return retval;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60 * Write a buffer name to the session file.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 * Also ends the line, if "add_eol" is TRUE.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 * Returns FAIL if writing fails.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 ses_fname(FILE *fd, buf_T *buf, unsigned *flagp, int add_eol)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 char_u *name;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 // Use the short file name if the current directory is known at the time
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 // the session file will be sourced.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 // Don't do this for ":mkview", we don't know the current directory.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 // Don't do this after ":lcd", we don't keep track of what the current
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 // directory is.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74 if (buf->b_sfname != NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 && flagp == &ssop_flags
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
76 && (ssop_flags & (SSOP_CURDIR | SSOP_SESDIR))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77 #ifdef FEAT_AUTOCHDIR
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 && !p_acd
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 && !did_lcd)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81 name = buf->b_sfname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83 name = buf->b_ffname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84 if (ses_put_fname(fd, name, flagp) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
85 || (add_eol && put_eol(fd) == FAIL))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
86 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
87 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 * Write an argument list to the session file.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
92 * Returns FAIL if writing fails.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
95 ses_arglist(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 char *cmd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98 garray_T *gap,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 int fullname, // TRUE: use full path name
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 unsigned *flagp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
101 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 int i;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 char_u *buf = NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
104 char_u *s;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
105
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106 if (fputs(cmd, fd) < 0 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
108 if (put_line(fd, "%argdel") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
110 for (i = 0; i < gap->ga_len; ++i)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
111 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 // NULL file names are skipped (only happens when out of memory).
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
113 s = alist_name(&((aentry_T *)gap->ga_data)[i]);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
114 if (s != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
115 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
116 if (fullname)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
117 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118 buf = alloc(MAXPATHL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119 if (buf != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
120 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121 (void)vim_FullName(s, buf, MAXPATHL, FALSE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 s = buf;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
123 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
124 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
125 if (fputs("$argadd ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 || ses_put_fname(fd, s, flagp) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129 vim_free(buf);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
130 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
131 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
132 vim_free(buf);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
134 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
135 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
136 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
137
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139 * Return non-zero if window "wp" is to be stored in the Session.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
140 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
141 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
142 ses_do_win(win_T *wp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
143 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
144 #ifdef FEAT_TERMINAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145 if (bt_terminal(wp->w_buffer))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
146 return !term_is_finished(wp->w_buffer)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
147 && (ssop_flags & SSOP_TERMINAL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
148 && term_should_restore(wp->w_buffer);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150 if (wp->w_buffer->b_fname == NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151 #ifdef FEAT_QUICKFIX
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
152 // When 'buftype' is "nofile" can't restore the window contents.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153 || bt_nofilename(wp->w_buffer)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
154 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
155 )
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
156 return (ssop_flags & SSOP_BLANK);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 if (bt_help(wp->w_buffer))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158 return (ssop_flags & SSOP_HELP);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 return TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
161
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
162 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
163 * Return TRUE if frame "fr" has a window somewhere that we want to save in
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164 * the Session.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
167 ses_do_frame(frame_T *fr)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
169 frame_T *frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
170
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
171 if (fr->fr_layout == FR_LEAF)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
172 return ses_do_win(fr->fr_win);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
173 FOR_ALL_FRAMES(frc, fr->fr_child)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 if (ses_do_frame(frc))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 return TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
176 return FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 * Skip frames that don't contain windows we want to save in the Session.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 * Returns NULL when there none.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
182 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 static frame_T *
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 ses_skipframe(frame_T *fr)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 frame_T *frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 FOR_ALL_FRAMES(frc, fr)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 if (ses_do_frame(frc))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 return frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 * Write commands to "fd" to recursively create windows for frame "fr",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 * horizontally and vertically split.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 * After the commands the last window in the frame is the current window.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 * Returns FAIL when writing the commands to "fd" fails.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 ses_win_rec(FILE *fd, frame_T *fr)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 frame_T *frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 int count = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 if (fr->fr_layout != FR_LEAF)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 // Find first frame that's not skipped and then create a window for
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 // each following one (first frame is already there).
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 frc = ses_skipframe(fr->fr_child);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 if (frc != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 while ((frc = ses_skipframe(frc->fr_next)) != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
214 // Make window as big as possible so that we have lots of room
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215 // to split.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 if (put_line(fd, "wincmd _ | wincmd |") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 || put_line(fd, fr->fr_layout == FR_COL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 ? "split" : "vsplit") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220 ++count;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
221 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 // Go back to the first window.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 if (count > 0 && (fprintf(fd, fr->fr_layout == FR_COL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225 ? "%dwincmd k" : "%dwincmd h", count) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 || put_eol(fd) == FAIL))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
229 // Recursively create frames/windows in each window of this column or
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 // row.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 frc = ses_skipframe(fr->fr_child);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232 while (frc != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
233 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
234 ses_win_rec(fd, frc);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
235 frc = ses_skipframe(frc->fr_next);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 // Go to next window.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 if (frc != NULL && put_line(fd, "wincmd w") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
239 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 ses_winsizes(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 int restore_size,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248 win_T *tab_firstwin)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250 int n = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 win_T *wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253 if (restore_size && (ssop_flags & SSOP_WINSIZE))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
255 for (wp = tab_firstwin; wp != NULL; wp = wp->w_next)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 if (!ses_do_win(wp))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258 continue;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259 ++n;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
261 // restore height when not full height
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 if (wp->w_height + wp->w_status_height < topframe->fr_height
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
263 && (fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
264 "exe '%dresize ' . ((&lines * %ld + %ld) / %ld)",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265 n, (long)wp->w_height, Rows / 2, Rows) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 || put_eol(fd) == FAIL))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
267 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
269 // restore width when not full width
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270 if (wp->w_width < Columns && (fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271 "exe 'vert %dresize ' . ((&columns * %ld + %ld) / %ld)",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
272 n, (long)wp->w_width, Columns / 2, Columns) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 || put_eol(fd) == FAIL))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
277 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 // Just equalise window sizes
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 if (put_line(fd, "wincmd =") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
282 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
283 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
285
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287 put_view_curpos(FILE *fd, win_T *wp, char *spaces)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
289 int r;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
290
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
291 if (wp->w_curswant == MAXCOL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
292 r = fprintf(fd, "%snormal! $", spaces);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
293 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
294 r = fprintf(fd, "%snormal! 0%d|", spaces, wp->w_virtcol + 1);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
295 return r < 0 || put_eol(fd) == FAIL ? FALSE : OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
296 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
297
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
298 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299 * Write commands to "fd" to restore the view of a window.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 * Caller must make sure 'scrolloff' is zero.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 put_view(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
304 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305 win_T *wp,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 int add_edit, // add ":edit" command to view
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
307 unsigned *flagp, // vop_flags or ssop_flags
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
308 int current_arg_idx // current argument index of the window, use
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
309 // -1 if unknown
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
310 #ifdef FEAT_TERMINAL
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
311 , hashtab_T *terminal_bufs
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
312 #endif
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
313 )
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
314 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315 win_T *save_curwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316 int f;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317 int do_cursor;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
318 int did_next = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
319
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
320 // Always restore cursor position for ":mksession". For ":mkview" only
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
321 // when 'viewoptions' contains "cursor".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 do_cursor = (flagp == &ssop_flags || *flagp & SSOP_CURSOR);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
323
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 // Local argument list.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 if (wp->w_alist == &global_alist)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
326 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
327 if (put_line(fd, "argglobal") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
328 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
329 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
331 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
332 if (ses_arglist(fd, "arglocal", &wp->w_alist->al_ga,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333 flagp == &vop_flags
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334 || !(*flagp & SSOP_CURDIR)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
335 || wp->w_localdir != NULL, flagp) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
336 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
337 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
338
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
339 // Only when part of a session: restore the argument index. Some
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
340 // arguments may have been deleted, check if the index is valid.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
341 if (wp->w_arg_idx != current_arg_idx && wp->w_arg_idx < WARGCOUNT(wp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 && flagp == &ssop_flags)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
343 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
344 if (fprintf(fd, "%ldargu", (long)wp->w_arg_idx + 1) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
345 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347 did_next = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
348 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
350 // Edit the file. Skip this when ":next" already did it.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 if (add_edit && (!did_next || wp->w_arg_idx_invalid))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
352 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 # ifdef FEAT_TERMINAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 if (bt_terminal(wp->w_buffer))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355 {
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
356 if (term_write_session(fd, wp, terminal_bufs) == FAIL)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
359 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
360 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
361 // Load the file.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
362 if (wp->w_buffer->b_ffname != NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
363 # ifdef FEAT_QUICKFIX
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364 && !bt_nofilename(wp->w_buffer)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366 )
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368 // Editing a file in this buffer: use ":edit file".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369 // This may have side effects! (e.g., compressed or network file).
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
370 //
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 // Note, if a buffer for that file already exists, use :badd to
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 // edit that buffer, to not lose folding information (:edit resets
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 // folds in other buffers)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
374 if (fputs("if bufexists(\"", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
376 || fputs("\") | buffer ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
377 || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 || fputs(" | else | edit ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380 || fputs(" | endif", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
381 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
382 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
383 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
384 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 // No file in this buffer, just make it empty.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 if (put_line(fd, "enew") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
388 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 #ifdef FEAT_QUICKFIX
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390 if (wp->w_buffer->b_ffname != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
391 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
392 // The buffer does have a name, but it's not a file name.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 if (fputs("file ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 || ses_fname(fd, wp->w_buffer, flagp, TRUE) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 do_cursor = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 // Local mappings and abbreviations.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 if ((*flagp & (SSOP_OPTIONS | SSOP_LOCALOPTIONS))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 && makemap(fd, wp->w_buffer) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 // Local options. Need to go to the window temporarily.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408 // Store only local values when using ":mkview" and when ":mksession" is
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409 // used and 'sessionoptions' doesn't include "options".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 // Some folding options are always stored when "folds" is included,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411 // otherwise the folds would not be restored correctly.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 save_curwin = curwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413 curwin = wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414 curbuf = curwin->w_buffer;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 if (*flagp & (SSOP_OPTIONS | SSOP_LOCALOPTIONS))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 f = makeset(fd, OPT_LOCAL,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
417 flagp == &vop_flags || !(*flagp & SSOP_OPTIONS));
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 #ifdef FEAT_FOLDING
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 else if (*flagp & SSOP_FOLDS)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 f = makefoldset(fd);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 f = OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 curwin = save_curwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 curbuf = curwin->w_buffer;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 if (f == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 #ifdef FEAT_FOLDING
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 // Save Folds when 'buftype' is empty and for help files.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 if ((*flagp & SSOP_FOLDS)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
432 && wp->w_buffer->b_ffname != NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 && (bt_normal(wp->w_buffer) || bt_help(wp->w_buffer)))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 if (put_folds(fd, wp) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440 // Set the cursor after creating folds, since that moves the cursor.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 if (do_cursor)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444 // Restore the cursor line in the file and relatively in the
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 // window. Don't use "G", it changes the jumplist.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 if (fprintf(fd, "let s:l = %ld - ((%ld * winheight(0) + %ld) / %ld)",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 (long)wp->w_cursor.lnum,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 (long)(wp->w_cursor.lnum - wp->w_topline),
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 (long)wp->w_height / 2, (long)wp->w_height) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 || put_eol(fd) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 || put_line(fd, "if s:l < 1 | let s:l = 1 | endif") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452 || put_line(fd, "exe s:l") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 || put_line(fd, "normal! zt") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 || fprintf(fd, "%ld", (long)wp->w_cursor.lnum) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457 // Restore the cursor column and left offset when not wrapping.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 if (wp->w_cursor.col == 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 if (put_line(fd, "normal! 0") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
464 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 if (!wp->w_p_wrap && wp->w_leftcol > 0 && wp->w_width > 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 if (fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 "let s:c = %ld - ((%ld * winwidth(0) + %ld) / %ld)",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 (long)wp->w_virtcol + 1,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470 (long)(wp->w_virtcol - wp->w_leftcol),
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 (long)wp->w_width / 2, (long)wp->w_width) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 || put_eol(fd) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 || put_line(fd, "if s:c > 0") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 || fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 " exe 'normal! ' . s:c . '|zs' . %ld . '|'",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 (long)wp->w_virtcol + 1) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 || put_eol(fd) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 || put_line(fd, "else") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 || put_view_curpos(fd, wp, " ") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
480 || put_line(fd, "endif") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
481 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 else if (put_view_curpos(fd, wp, "") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 // Local directory, if the current flag is not view options or the "curdir"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
489 // option is included.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 if (wp->w_localdir != NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 && (flagp != &vop_flags || (*flagp & SSOP_CURDIR)))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 if (fputs("lcd ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 || ses_put_fname(fd, wp->w_localdir, flagp) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 did_lcd = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
501 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 #ifdef FEAT_EVAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
505 store_session_globals(FILE *fd)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 {
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17539
diff changeset
507 hashtab_T *gvht = get_globvar_ht();
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508 hashitem_T *hi;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
509 dictitem_T *this_var;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 int todo;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 char_u *p, *t;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17539
diff changeset
513 todo = (int)gvht->ht_used;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17539
diff changeset
514 for (hi = gvht->ht_array; todo > 0; ++hi)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 if (!HASHITEM_EMPTY(hi))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518 --todo;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 this_var = HI2DI(hi);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 if ((this_var->di_tv.v_type == VAR_NUMBER
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 || this_var->di_tv.v_type == VAR_STRING)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 // Escape special characters with a backslash. Turn a LF and
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 // CR into \n and \r.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526 p = vim_strsave_escaped(tv_get_string(&this_var->di_tv),
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 (char_u *)"\\\"\n\r");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 if (p == NULL) // out of memory
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 for (t = p; *t != NUL; ++t)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 if (*t == '\n')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 *t = 'n';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533 else if (*t == '\r')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 *t = 'r';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 if ((fprintf(fd, "let %s = %c%s%c",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 this_var->di_key,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
537 (this_var->di_tv.v_type == VAR_STRING) ? '"'
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
538 : ' ',
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539 p,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 (this_var->di_tv.v_type == VAR_STRING) ? '"'
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 : ' ') < 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 vim_free(p);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
546 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 vim_free(p);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 #ifdef FEAT_FLOAT
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 else if (this_var->di_tv.v_type == VAR_FLOAT
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 float_T f = this_var->di_tv.vval.v_float;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 int sign = ' ';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
556 if (f < 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
558 f = -f;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
559 sign = '-';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 if ((fprintf(fd, "let %s = %c%f",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
562 this_var->di_key, sign, f) < 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 * Write openfile commands for the current buffers to an .exrc file.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 * Return FAIL on error, OK otherwise.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 makeopens(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 char_u *dirnow) // Current directory name
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 buf_T *buf;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 int only_save_windows = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584 int nr;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 int restore_size = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 win_T *wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 char_u *sname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 win_T *edited_win = NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 int tabnr;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 int restore_stal = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 win_T *tab_firstwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
592 frame_T *tab_topframe;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 int cur_arg_idx = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594 int next_arg_idx = 0;
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
595 int ret = FAIL;
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
596 #ifdef FEAT_TERMINAL
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
597 hashtab_T terminal_bufs;
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
598
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
599 hash_init(&terminal_bufs);
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
600 #endif
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 if (ssop_flags & SSOP_BUFFERS)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 only_save_windows = FALSE; // Save ALL buffers
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 // Begin by setting the this_session variable, and then other
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 // sessionable variables.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 #ifdef FEAT_EVAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 if (put_line(fd, "let v:this_session=expand(\"<sfile>:p\")") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
609 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 if (ssop_flags & SSOP_GLOBALS)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 if (store_session_globals(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
612 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 // Close all windows and tabs but one.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 if (put_line(fd, "silent only") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
617 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 if ((ssop_flags & SSOP_TABPAGES)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619 && put_line(fd, "silent tabonly") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
620 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 // Now a :cd command to the session directory or the current directory
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 if (ssop_flags & SSOP_SESDIR)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625 if (put_line(fd, "exe \"cd \" . escape(expand(\"<sfile>:p:h\"), ' ')")
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
627 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 else if (ssop_flags & SSOP_CURDIR)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 sname = home_replace_save(NULL, globaldir != NULL ? globaldir : dirnow);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 if (sname == NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 || fputs("cd ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 || ses_put_fname(fd, sname, &ssop_flags) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 vim_free(sname);
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
638 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 vim_free(sname);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 // If there is an empty, unnamed buffer we will wipe it out later.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 // Remember the buffer number.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 if (put_line(fd, "if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
646 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 if (put_line(fd, " let s:wipebuf = bufnr('%')") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
648 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 if (put_line(fd, "endif") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
650 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 // Now save the current files, current buffer first.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 if (put_line(fd, "set shortmess=aoO") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
654 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656 // the global argument list
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 if (ses_arglist(fd, "argglobal", &global_alist.al_ga,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 !(ssop_flags & SSOP_CURDIR), &ssop_flags) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
659 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 if (ssop_flags & SSOP_RESIZE)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 // Note: after the restore we still check it worked!
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 if (fprintf(fd, "set lines=%ld columns=%ld" , Rows, Columns) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 || put_eol(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
666 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 #ifdef FEAT_GUI
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 if (gui.in_use && (ssop_flags & SSOP_WINPOS))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 int x, y;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 if (gui_mch_get_winpos(&x, &y) == OK)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 // Note: after the restore we still check it worked!
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 if (fprintf(fd, "winpos %d %d", x, y) < 0 || put_eol(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
678 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 // When there are two or more tabpages and 'showtabline' is 1 the tabline
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 // will be displayed when creating the next tab. That resizes the windows
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 // in the first tab, which may cause problems. Set 'showtabline' to 2
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 // temporarily to avoid that.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 if (p_stal == 1 && first_tabpage->tp_next != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 if (put_line(fd, "set stal=2") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
690 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 restore_stal = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 // May repeat putting Windows for each tab, when "tabpages" is in
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 // 'sessionoptions'.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 // Don't use goto_tabpage(), it may change directory and trigger
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 // autocommands.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 tab_firstwin = firstwin; // first window in tab page "tabnr"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 tab_topframe = topframe;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 if ((ssop_flags & SSOP_TABPAGES))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 tabpage_T *tp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 // Similar to ses_win_rec() below, populate the tab pages first so
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 // later local options won't be copied to the new tabs.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 FOR_ALL_TABPAGES(tp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 if (tp->tp_next != NULL && put_line(fd, "tabnew") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
708 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709 if (first_tabpage->tp_next != NULL && put_line(fd, "tabrewind") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
710 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 for (tabnr = 1; ; ++tabnr)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 tabpage_T *tp = NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 int need_tabnext = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 int cnr = 1;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 if ((ssop_flags & SSOP_TABPAGES))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 tp = find_tabpage(tabnr);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 if (tp == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 break; // done all tab pages
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 if (tp == curtab)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 tab_firstwin = firstwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 tab_topframe = topframe;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 tab_firstwin = tp->tp_firstwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 tab_topframe = tp->tp_topframe;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 if (tabnr > 1)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 need_tabnext = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 // Before creating the window layout, try loading one file. If this
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 // is aborted we don't end up with a number of useless windows.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 // This may have side effects! (e.g., compressed or network file).
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 for (wp = tab_firstwin; wp != NULL; wp = wp->w_next)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743 if (ses_do_win(wp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 && wp->w_buffer->b_ffname != NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 && !bt_help(wp->w_buffer)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 #ifdef FEAT_QUICKFIX
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 && !bt_nofilename(wp->w_buffer)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 )
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 if (need_tabnext && put_line(fd, "tabnext") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
752 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 need_tabnext = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 if (fputs("edit ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756 || ses_fname(fd, wp->w_buffer, &ssop_flags, TRUE)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
758 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 if (!wp->w_arg_idx_invalid)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 edited_win = wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765 // If no file got edited create an empty tab page.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 if (need_tabnext && put_line(fd, "tabnext") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
767 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
769 // Save current window layout.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770 if (put_line(fd, "set splitbelow splitright") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
771 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
772 if (ses_win_rec(fd, tab_topframe) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
773 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 if (!p_sb && put_line(fd, "set nosplitbelow") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
775 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776 if (!p_spr && put_line(fd, "set nosplitright") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
777 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779 // Check if window sizes can be restored (no windows omitted).
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 // Remember the window number of the current window after restoring.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 nr = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 for (wp = tab_firstwin; wp != NULL; wp = W_NEXT(wp))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 if (ses_do_win(wp))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 ++nr;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 restore_size = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
788 if (curwin == wp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 cnr = nr;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 // Go to the first window.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 if (put_line(fd, "wincmd t") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
794 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 // If more than one window, see if sizes can be restored.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 // First set 'winheight' and 'winwidth' to 1 to avoid the windows being
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 // resized when moving between windows.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 // Do this before restoring the view, so that the topline and the
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 // cursor can be set. This is done again below.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 // winminheight and winminwidth need to be set to avoid an error if the
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 // user has set winheight or winwidth.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 if (put_line(fd, "set winminheight=0") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 || put_line(fd, "set winheight=1") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 || put_line(fd, "set winminwidth=0") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 || put_line(fd, "set winwidth=1") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
807 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
809 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 // Restore the tab-local working directory if specified
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 // Do this before the windows, so that the window-local directory can
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 // override the tab-local directory.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 if (tp != NULL && tp->tp_localdir != NULL && ssop_flags & SSOP_CURDIR)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 if (fputs("tcd ", fd) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 || ses_put_fname(fd, tp->tp_localdir, &ssop_flags) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 || put_eol(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
819 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820 did_lcd = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 // Restore the view of the window (options, file, cursor, etc.).
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 for (wp = tab_firstwin; wp != NULL; wp = wp->w_next)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 if (!ses_do_win(wp))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 continue;
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
828 if (put_view(fd, wp, wp != edited_win, &ssop_flags, cur_arg_idx
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
829 #ifdef FEAT_TERMINAL
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
830 , &terminal_bufs
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
831 #endif
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
832 ) == FAIL)
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
833 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 if (nr > 1 && put_line(fd, "wincmd w") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
835 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 next_arg_idx = wp->w_arg_idx;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 // The argument index in the first tab page is zero, need to set it in
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 // each window. For further tab pages it's the window where we do
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 // "tabedit".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 cur_arg_idx = next_arg_idx;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 // Restore cursor to the current window if it's not the first one.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845 if (cnr > 1 && (fprintf(fd, "%dwincmd w", cnr) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 || put_eol(fd) == FAIL))
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
847 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 // Restore window sizes again after jumping around in windows, because
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 // the current window has a minimum size while others may not.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
852 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 // Don't continue in another tab page when doing only the current one
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 // or when at the last tab page.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 if (!(ssop_flags & SSOP_TABPAGES))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860 if (ssop_flags & SSOP_TABPAGES)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862 if (fprintf(fd, "tabnext %d", tabpage_index(curtab)) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 || put_eol(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
864 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 if (restore_stal && put_line(fd, "set stal=1") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
867 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 // Now put the remaining buffers into the buffer list.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 // This is near the end, so that when 'hidden' is set we don't create extra
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 // buffers. If the buffer was already created with another command the
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
872 // ":badd" will have no effect.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
873 FOR_ALL_BUFFERS(buf)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
874 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 if (!(only_save_windows && buf->b_nwindows == 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 && !(buf->b_help && !(ssop_flags & SSOP_HELP))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 #ifdef FEAT_TERMINAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 // Skip terminal buffers: finished ones are not useful, others
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 // will be resurrected and result in a new buffer.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880 && !bt_terminal(buf)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 && buf->b_fname != NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 && buf->b_p_bl)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 : buf->b_wininfo->wi_fpos.lnum) < 0
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 || ses_fname(fd, buf, &ssop_flags, TRUE) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
888 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 // Wipe out an empty unnamed buffer we started in.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 if (put_line(fd, "if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0")
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
895 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896 if (put_line(fd, " silent exe 'bwipe ' . s:wipebuf") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
897 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 if (put_line(fd, "endif") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
899 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 if (put_line(fd, "unlet! s:wipebuf") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
901 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 // Re-apply 'winheight', 'winwidth' and 'shortmess'.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 p_wh, p_wiw, p_shm) < 0 || put_eol(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
906 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 // Re-apply 'winminheight' and 'winminwidth'.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 if (fprintf(fd, "set winminheight=%ld winminwidth=%ld",
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 p_wmh, p_wmw) < 0 || put_eol(fd) == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
910 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 // Lastly, execute the x.vim file if it exists.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
20057
407351a89c61 patch 8.2.0584: viminfo file uses obsolete function file_readable()
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
914 || put_line(fd, "if filereadable(s:sx)") == FAIL
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 || put_line(fd, " exe \"source \" . fnameescape(s:sx)") == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 || put_line(fd, "endif") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
917 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
919 ret = OK;
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
920 fail:
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
921 #ifdef FEAT_TERMINAL
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
922 hash_clear_all(&terminal_bufs, 0);
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
923 #endif
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
924 return ret;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 * Get the name of the view file for the current buffer.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 static char_u *
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 get_view_file(int c)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 int len = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 char_u *p, *s;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935 char_u *retval;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 char_u *sname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 if (curbuf->b_ffname == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 emsg(_(e_noname));
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 return NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943 sname = home_replace_save(NULL, curbuf->b_ffname);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 if (sname == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 return NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947 // We want a file name without separators, because we're not going to make
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 // a directory.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949 // "normal" path separator -> "=+"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 // "=" -> "=="
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951 // ":" path separator -> "=-"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952 for (p = sname; *p; ++p)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 if (*p == '=' || vim_ispathsep(*p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 ++len;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 retval = alloc(STRLEN(sname) + len + STRLEN(p_vdir) + 9);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 if (retval != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 STRCPY(retval, p_vdir);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 add_pathsep(retval);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 s = retval + STRLEN(retval);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 for (p = sname; *p; ++p)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 if (*p == '=')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 else if (vim_ispathsep(*p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 #if defined(BACKSLASH_IN_FILENAME) || defined(AMIGA) || defined(VMS)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 if (*p == ':')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 *s++ = '-';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976 *s++ = '+';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 *s++ = *p;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 *s++ = c;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 STRCPY(s, ".vim");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 vim_free(sname);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 return retval;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991 * ":loadview [nr]"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 void
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 ex_loadview(exarg_T *eap)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 char_u *fname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 fname = get_view_file(*eap->arg);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 if (fname != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 18215
diff changeset
1001 do_source(fname, FALSE, DOSO_NONE, NULL);
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 vim_free(fname);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005
18215
86a865a89661 patch 8.1.2102: can't build with GTK and FEAT_GUI_GNOME
Bram Moolenaar <Bram@vim.org>
parents: 18213
diff changeset
1006 # if defined(FEAT_GUI_GNOME) \
18213
aa0972536d3e patch 8.1.2101: write_session_file() often defined but not used
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
1007 || (defined(GUI_MAY_SPAWN) && defined(EXPERIMENTAL_GUI_CMD)) \
aa0972536d3e patch 8.1.2101: write_session_file() often defined but not used
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
1008 || defined(PROTO)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 * Generate a script that can be used to restore the current editing session.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 * Save the value of v:this_session before running :mksession in order to make
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 * automagic session save fully transparent. Return TRUE on success.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 write_session_file(char_u *filename)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 char_u *escaped_filename;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 char *mksession_cmdline;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 unsigned int save_ssop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 int failed;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 // Build an ex command line to create a script that restores the current
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 // session if executed. Escape the filename to avoid nasty surprises.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 escaped_filename = vim_strsave_escaped(filename, escape_chars);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 if (escaped_filename == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 return FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 mksession_cmdline = alloc(10 + (int)STRLEN(escaped_filename) + 1);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 if (mksession_cmdline == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 vim_free(escaped_filename);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 return FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 strcpy(mksession_cmdline, "mksession ");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 STRCAT(mksession_cmdline, escaped_filename);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 vim_free(escaped_filename);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 // Use a reasonable hardcoded set of 'sessionoptions' flags to avoid
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038 // unpredictable effects when the session is saved automatically. Also,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 // we definitely need SSOP_GLOBALS to be able to restore v:this_session.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040 // Don't use SSOP_BUFFERS to prevent the buffer list from becoming
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 // enormously large if the GNOME session feature is used regularly.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 save_ssop_flags = ssop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 ssop_flags = (SSOP_BLANK|SSOP_CURDIR|SSOP_FOLDS|SSOP_GLOBALS
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 |SSOP_HELP|SSOP_OPTIONS|SSOP_WINSIZE|SSOP_TABPAGES);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 do_cmdline_cmd((char_u *)"let Save_VV_this_session = v:this_session");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 failed = (do_cmdline_cmd((char_u *)mksession_cmdline) == FAIL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 do_cmdline_cmd((char_u *)"let v:this_session = Save_VV_this_session");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 do_unlet((char_u *)"Save_VV_this_session", TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 ssop_flags = save_ssop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 vim_free(mksession_cmdline);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 // Reopen the file and append a command to restore v:this_session,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 // as if this save never happened. This is to avoid conflicts with
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 // the user's own sessions. FIXME: It's probably less hackish to add
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057 // a "stealth" flag to 'sessionoptions' -- gotta ask Bram.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 if (!failed)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 FILE *fd;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1061
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062 fd = open_exfile(filename, TRUE, APPENDBIN);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 failed = (fd == NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 || put_line(fd, "let v:this_session = Save_VV_this_session")
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 || put_line(fd, "unlet Save_VV_this_session") == FAIL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069 if (fd != NULL && fclose(fd) != 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 if (failed)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 mch_remove(filename);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1074 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1075
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 return !failed;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 #endif // FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 #if defined(FEAT_SESSION) && defined(USE_CRNL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 # define MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 static int mksession_nl = FALSE; // use NL only in put_eol()
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 * ":mkexrc", ":mkvimrc", ":mkview" and ":mksession".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 void
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 ex_mkrc(exarg_T *eap)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1092 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 FILE *fd;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 int failed = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095 char_u *fname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 #ifdef FEAT_BROWSE
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097 char_u *browseFile = NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 int view_session = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1101 int using_vdir = FALSE; // using 'viewdir'?
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 char_u *viewFile = NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1103 unsigned *flagp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 #endif
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1105 #ifdef FEAT_TERMINAL
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1106 hashtab_T terminal_bufs;
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1107
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1108 hash_init(&terminal_bufs);
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1109 #endif
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1110
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1111 if (eap->cmdidx == CMD_mksession || eap->cmdidx == CMD_mkview)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1113 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 view_session = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1115 #else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1116 ex_ni(eap);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1117 return;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1119 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122 // Use the short file name until ":lcd" is used. We also don't use the
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 // short file name when 'acd' is set, that is checked later.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1124 did_lcd = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 // ":mkview" or ":mkview 9": generate file name with 'viewdir'
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1127 if (eap->cmdidx == CMD_mkview
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1128 && (*eap->arg == NUL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 || (vim_isdigit(*eap->arg) && eap->arg[1] == NUL)))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 eap->forceit = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 fname = get_view_file(*eap->arg);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 if (fname == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 return;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135 viewFile = fname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 using_vdir = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 if (*eap->arg != NUL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 fname = eap->arg;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 else if (eap->cmdidx == CMD_mkvimrc)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143 fname = (char_u *)VIMRC_FILE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 else if (eap->cmdidx == CMD_mksession)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 fname = (char_u *)SESSION_FILE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 fname = (char_u *)EXRC_FILE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 #ifdef FEAT_BROWSE
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 if (cmdmod.browse)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1153 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 browseFile = do_browse(BROWSE_SAVE,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155 # ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 eap->cmdidx == CMD_mkview ? (char_u *)_("Save View") :
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 eap->cmdidx == CMD_mksession ? (char_u *)_("Save Session") :
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 (char_u *)_("Save Setup"),
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160 fname, (char_u *)"vim", NULL,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 (char_u *)_(BROWSE_FILTER_MACROS), NULL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 if (browseFile == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163 goto theend;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1164 fname = browseFile;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165 eap->forceit = TRUE; // since dialog already asked
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 #if defined(FEAT_SESSION) && defined(vim_mkdir)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1170 // When using 'viewdir' may have to create the directory.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1171 if (using_vdir && !mch_isdir(p_vdir))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 vim_mkdir_emsg(p_vdir, 0755);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 fd = open_exfile(fname, eap->forceit, WRITEBIN);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 if (fd != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 if (eap->cmdidx == CMD_mkview)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 flagp = &vop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 flagp = &ssop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 #ifdef MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 // "unix" in 'sessionoptions': use NL line separator
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 if (view_session && (*flagp & SSOP_UNIX))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 mksession_nl = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 // Write the version command for :mkvimrc
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 if (eap->cmdidx == CMD_mkvimrc)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 (void)put_line(fd, "version 6.0");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 if (eap->cmdidx == CMD_mksession)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 if (put_line(fd, "let SessionLoad = 1") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 if (eap->cmdidx != CMD_mkview)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 // Write setting 'compatible' first, because it has side effects.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 // For that same reason only do it when needed.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 if (p_cp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 (void)put_line(fd, "if !&cp | set cp | endif");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 (void)put_line(fd, "if &cp | set nocp | endif");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 if (!view_session
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 || (eap->cmdidx == CMD_mksession
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 && (*flagp & SSOP_OPTIONS)))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 failed |= (makemap(fd, NULL) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 || makeset(fd, OPT_GLOBAL, FALSE) == FAIL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222 if (!failed && view_session)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224 if (put_line(fd, "let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226 if (eap->cmdidx == CMD_mksession)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 char_u *dirnow; // current directory
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230 dirnow = alloc(MAXPATHL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 if (dirnow == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 // Change to session file's dir.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 if (mch_dirname(dirnow, MAXPATHL) == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237 || mch_chdir((char *)dirnow) != 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 *dirnow = NUL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239 if (*dirnow != NUL && (ssop_flags & SSOP_SESDIR))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241 if (vim_chdirfile(fname, NULL) == OK)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 shorten_fnames(TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 else if (*dirnow != NUL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 && (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 if (mch_chdir((char *)globaldir) == 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248 shorten_fnames(TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 failed |= (makeopens(fd, dirnow) == FAIL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 // restore original dir
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 if (*dirnow != NUL && ((ssop_flags & SSOP_SESDIR)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 || ((ssop_flags & SSOP_CURDIR) && globaldir != NULL)))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 if (mch_chdir((char *)dirnow) != 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 emsg(_(e_prev_dir));
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 shorten_fnames(TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261 vim_free(dirnow);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1262 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 {
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1266 failed |= (put_view(fd, curwin, !using_vdir, flagp, -1
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1267 #ifdef FEAT_TERMINAL
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1268 , &terminal_bufs
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1269 #endif
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
1270 ) == FAIL);
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save")
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274 failed = TRUE;
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1275 #ifdef FEAT_SEARCH_EXTRA
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 if (no_hlsearch && put_line(fd, "nohlsearch") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277 failed = TRUE;
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1278 #endif
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 if (put_line(fd, "doautoall SessionLoadPost") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 if (eap->cmdidx == CMD_mksession)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 if (put_line(fd, "unlet SessionLoad") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 if (put_line(fd, "\" vim: set ft=vim :") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1290
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 failed |= fclose(fd);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 if (failed)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294 emsg(_(e_write));
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1295 #if defined(FEAT_SESSION)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1296 else if (eap->cmdidx == CMD_mksession)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1297 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 // successful session write - set this_session var
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 char_u *tbuf;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301 tbuf = alloc(MAXPATHL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 if (tbuf != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304 if (vim_FullName(fname, tbuf, MAXPATHL, FALSE) == OK)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 set_vim_var_string(VV_THIS_SESSION, tbuf, -1);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 vim_free(tbuf);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 #ifdef MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1311 mksession_nl = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1312 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1313 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1314
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1315 #ifdef FEAT_BROWSE
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1316 theend:
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1317 vim_free(browseFile);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1318 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1320 vim_free(viewFile);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1321 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1322 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1323
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1324 #if (defined(FEAT_VIMINFO) || defined(FEAT_SESSION)) || defined(PROTO)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 var_flavour_T
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 var_flavour(char_u *varname)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1327 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 char_u *p = varname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330 if (ASCII_ISUPPER(*p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 while (*(++p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333 if (ASCII_ISLOWER(*p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1334 return VAR_FLAVOUR_SESSION;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 return VAR_FLAVOUR_VIMINFO;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1336 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1337 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338 return VAR_FLAVOUR_DEFAULT;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1339 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1342 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1343 * Write end-of-line character(s) for ":mkexrc", ":mkvimrc" and ":mksession".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1344 * Return FAIL for a write error.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1345 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346 int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1347 put_eol(FILE *fd)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1348 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1349 if (
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1350 #ifdef USE_CRNL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351 (
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352 # ifdef MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353 !mksession_nl &&
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1354 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 (putc('\r', fd) < 0)) ||
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1356 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357 (putc('\n', fd) < 0))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1359 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1360 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1361
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1362 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1363 * Write a line to "fd".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1364 * Return FAIL for a write error.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1365 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1366 int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1367 put_line(FILE *fd, char *s)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1368 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1369 if (fputs(s, fd) < 0 || put_eol(fd) == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1370 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1371 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372 }