annotate src/session.c @ 30743:8f443f987f47 v9.0.0706

patch 9.0.0706: :help in a narrow window always opens at the top Commit: https://github.com/vim/vim/commit/28f7e701b7857cfc5ab5531ee7ac26e2542ad662 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Oct 9 15:54:53 2022 +0100 patch 9.0.0706: :help in a narrow window always opens at the top Problem: :help in a narrow window always opens at the top. Solution: Respect 'splitbelow'. (closes https://github.com/vim/vim/issues/11319)
author Bram Moolenaar <Bram@vim.org>
date Sun, 09 Oct 2022 17:00:07 +0200
parents 029c59bf78f1
children 543153d582d5
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
25994
e8873138ffbb patch 8.2.3530: ":buf {a}" fails while ":edit {a}" works
Bram Moolenaar <Bram@vim.org>
parents: 25306
diff changeset
46 p = vim_strsave_fnameescape(sname, VSE_NONE);
17536
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 // When 'buftype' is "nofile" can't restore the window contents.
29849
6c7eddcce52c patch 9.0.0263: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents: 28915
diff changeset
152 || bt_nofilename(wp->w_buffer))
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153 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
154 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
155 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
156 return TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 * 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
161 * the Session.
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 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164 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
165 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 frame_T *frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
167
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168 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
169 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
170 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
171 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
172 return TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
173 return FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
176 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 * 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
178 * 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
179 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 static frame_T *
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 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
182 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 frame_T *frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 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
186 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
187 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 return frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 * 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
193 * 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
194 * 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
195 * 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
196 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 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
199 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 frame_T *frc;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 int count = 0;
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 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
204 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 // 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
206 // 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
207 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
208 if (frc != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 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
210 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 // 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
212 // to split.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 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
214 || 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
215 ? "split" : "vsplit") == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 ++count;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220 // 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
221 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
222 ? "%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
223 || 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
224 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 // 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
227 // row.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228 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
229 while (frc != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 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
232 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
233 // 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
234 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
235 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 return OK;
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 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 ses_winsizes(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244 int restore_size,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 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
246 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 int n = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248 win_T *wp;
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 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
251 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 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
253 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 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
255 continue;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 ++n;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258 // 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
259 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
260 && (fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
261 "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
262 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
263 || 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
264 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 // 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
267 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
268 "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
269 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
270 || 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
271 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
272 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274 else
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 // 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
277 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
278 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 }
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 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284 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
285 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 int r;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 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
289 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
290 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
291 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
292 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
293 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
294
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
295 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
296 * 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
297 * 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
298 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 put_view(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 win_T *wp,
22230
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
303 int add_edit, // add ":edit" command to view
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
304 unsigned *flagp, // vop_flags or ssop_flags
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
305 int current_arg_idx, // current argument index of the window,
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
306 // use -1 if unknown
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
307 hashtab_T *terminal_bufs UNUSED) // already encountered terminal buffers,
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
308 // can be NULL
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
309 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
310 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
311 int f;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 int do_cursor;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
313 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
314
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315 // 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
316 // 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
317 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
318
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
319 // Local argument list.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
320 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
321 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 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
323 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 else
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 (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
328 flagp == &vop_flags
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
329 || !(*flagp & SSOP_CURDIR)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330 || 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
331 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
332 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334 // 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
335 // 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
336 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
337 && flagp == &ssop_flags)
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 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
340 || 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
341 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 did_next = TRUE;
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
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
345 // 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
346 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
347 {
26956
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
348 if (bt_help(wp->w_buffer))
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
349 {
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
350 char *curtag = "";
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
351
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
352 // A help buffer needs some options to be set.
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
353 // First, create a new empty buffer with "buftype=help".
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
354 // Then ":help" will re-use both the buffer and the window and set
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
355 // the options, even when "options" is not in 'sessionoptions'.
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
356 if (0 < wp->w_tagstackidx
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
357 && wp->w_tagstackidx <= wp->w_tagstacklen)
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
358 curtag = (char *)wp->w_tagstack[wp->w_tagstackidx - 1].tagname;
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
359
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
360 if (put_line(fd, "enew | setl bt=help") == FAIL
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
361 || fprintf(fd, "help %s", curtag) < 0
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
362 || put_eol(fd) == FAIL)
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
363 return FAIL;
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
364 }
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 # ifdef FEAT_TERMINAL
26956
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
366 else if (bt_terminal(wp->w_buffer))
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 {
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
368 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
369 return FAIL;
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 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 // Load the file.
26956
86f8718c643d patch 8.2.4007: session does not restore help buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
373 else if (wp->w_buffer->b_ffname != NULL
29849
6c7eddcce52c patch 9.0.0263: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents: 28915
diff changeset
374 && !bt_nofilename(wp->w_buffer))
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
376 // 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
377 // 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
378 //
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 // 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
380 // 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
381 // folds in other buffers)
28083
f1c00b8085f6 patch 8.2.4566: check for existing buffer in session file may not work
Bram Moolenaar <Bram@vim.org>
parents: 27122
diff changeset
382 if (fputs("if bufexists(fnamemodify(\"", fd) < 0
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
383 || ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
28083
f1c00b8085f6 patch 8.2.4566: check for existing buffer in session file may not work
Bram Moolenaar <Bram@vim.org>
parents: 27122
diff changeset
384 || fputs("\", \":p\")) | buffer ", fd) < 0
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 || 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
386 || 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
387 || 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
388 || 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
389 || 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
390 return FAIL;
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 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 // 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
395 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
396 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 #ifdef FEAT_QUICKFIX
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 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
399 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 // 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
401 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
402 || 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
403 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 do_cursor = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409
22840
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
410 if (wp->w_alt_fnum)
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
411 {
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
412 buf_T *alt = buflist_findnr(wp->w_alt_fnum);
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
413
24106
3b5d499c2bb5 patch 8.2.2594: alternate buffer added to session file even when it's hidden
Bram Moolenaar <Bram@vim.org>
parents: 23851
diff changeset
414 // Set the alternate file if the buffer is listed.
23851
a2f13e56b0e7 patch 8.2.2467: script generated by :mkview changes alternate file
Bram Moolenaar <Bram@vim.org>
parents: 23023
diff changeset
415 if ((flagp == &ssop_flags)
a2f13e56b0e7 patch 8.2.2467: script generated by :mkview changes alternate file
Bram Moolenaar <Bram@vim.org>
parents: 23023
diff changeset
416 && alt != NULL
22840
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
417 && alt->b_fname != NULL
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
418 && *alt->b_fname != NUL
24106
3b5d499c2bb5 patch 8.2.2594: alternate buffer added to session file even when it's hidden
Bram Moolenaar <Bram@vim.org>
parents: 23851
diff changeset
419 && alt->b_p_bl
22840
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
420 && (fputs("balt ", fd) < 0
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
421 || ses_fname(fd, alt, flagp, TRUE) == FAIL))
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
422 return FAIL;
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
423 }
7c1e2e3f2d8d patch 8.2.1967: the session file does not restore the alternate file
Bram Moolenaar <Bram@vim.org>
parents: 22776
diff changeset
424
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 // 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
426 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
427 && 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
428 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 // 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
431 // 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
432 // 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
433 // 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
434 // 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
435 save_curwin = curwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 curwin = wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 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
438 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
439 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
440 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
441 #ifdef FEAT_FOLDING
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442 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
443 f = makefoldset(fd);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 f = OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 curwin = save_curwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 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
449 if (f == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452 #ifdef FEAT_FOLDING
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 // 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
454 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
455 && 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
456 && (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
457 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 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
459 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 #endif
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 // 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
464 if (do_cursor)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 {
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 // 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
468 // window. Don't use "G", it changes the jumplist.
24561
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
469 if (wp->w_height <= 0)
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
470 {
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
471 if (fprintf(fd, "let s:l = %ld", (long)wp->w_cursor.lnum) < 0)
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
472 return FAIL;
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
473 }
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
474 else if (fprintf(fd,
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
475 "let s:l = %ld - ((%ld * winheight(0) + %ld) / %ld)",
17536
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_cursor.lnum,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 (long)(wp->w_cursor.lnum - wp->w_topline),
24561
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
478 (long)wp->w_height / 2, (long)wp->w_height) < 0)
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
479 return FAIL;
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
480
f6049d3ab81c patch 8.2.2820: session file may divide by zero
Bram Moolenaar <Bram@vim.org>
parents: 24473
diff changeset
481 if (put_eol(fd) == FAIL
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 || put_line(fd, "if s:l < 1 | let s:l = 1 | endif") == FAIL
23023
4384c44c031a patch 8.2.2058: using mkview/loadview changes the jumplist
Bram Moolenaar <Bram@vim.org>
parents: 22840
diff changeset
483 || put_line(fd, "keepjumps exe s:l") == FAIL
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 || put_line(fd, "normal! zt") == FAIL
23023
4384c44c031a patch 8.2.2058: using mkview/loadview changes the jumplist
Bram Moolenaar <Bram@vim.org>
parents: 22840
diff changeset
485 || fprintf(fd, "keepjumps %ld", (long)wp->w_cursor.lnum) < 0
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 || 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
487 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 // 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
489 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
490 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 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
492 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 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
497 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 if (fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499 "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
500 (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
501 (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
502 (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
503 || 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
504 || 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
505 || fprintf(fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 " 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
507 (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
508 || 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
509 || 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
510 || 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
511 || 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
512 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 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
515 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 }
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
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 // 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
520 // option is included.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 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
522 && (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
523 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 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
525 || 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
526 || 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
527 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 did_lcd = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 #ifdef FEAT_EVAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 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
537 {
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17539
diff changeset
538 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
539 hashitem_T *hi;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 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
541 int todo;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542 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
543
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17539
diff changeset
544 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
545 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
546 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 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
548 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 --todo;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 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
551 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
552 || 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
553 && 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
554 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555 // 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
556 // 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
557 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
558 (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
559 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
560 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 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
562 if (*t == '\n')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 *t = 'n';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 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
565 *t = 'r';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 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
567 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
568 (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
569 : ' ',
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 p,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 (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
572 : ' ') < 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 || 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
574 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 vim_free(p);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 vim_free(p);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 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
581 && 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
582 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 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
584 int sign = ' ';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 if (f < 0)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 f = -f;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 sign = '-';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 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
592 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
593 || 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
594 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
597 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 #endif
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 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 * 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
604 * 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
605 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 static int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 makeopens(
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 FILE *fd,
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609 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
610 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 buf_T *buf;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 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
613 int nr;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 int restore_size = TRUE;
28654
8fc86c943863 patch 8.2.4851: compiler warning for uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 28652
diff changeset
615 int restore_height_width = FALSE;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 win_T *wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 char_u *sname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 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
619 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
620 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
621 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
622 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
623 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
624 int ret = FAIL;
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
625 tabpage_T *tp;
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
626 #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
627 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
628
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
629 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
630 #endif
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 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
633 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
634
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 // 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
636 // sessionable variables.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 #ifdef FEAT_EVAL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638 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
639 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 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
641 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
642 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 // 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
646 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
647 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648 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
649 && 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
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 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
653 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
654 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 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
656 == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
657 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 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
660 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 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
662 if (sname == NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 || 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
664 || 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
665 || 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
666 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 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
668 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 vim_free(sname);
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
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 // 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
674 // 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
675 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
676 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 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
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 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
680 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681
28238
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
682 // save 'shortmess' if not storing options
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
683 if ((ssop_flags & SSOP_OPTIONS) == 0
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
684 && put_line(fd, "let s:shortmess_save = &shortmess") == FAIL)
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
685 goto fail;
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
686
28915
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
687 // set 'shortmess' for the following. Add the 'A' flag if it was there
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
688 if (put_line(fd, "if &shortmess =~ 'A'") == FAIL
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
689 || put_line(fd, " set shortmess=aoOA") == FAIL
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
690 || put_line(fd, "else") == FAIL
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
691 || put_line(fd, " set shortmess=aoO") == FAIL
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
692 || 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
693 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694
28915
6c67aeb82b65 patch 8.2.4980: when 'shortmess' contains 'A' loading session may still warn
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
695 // Now save the current files, current buffer first.
27122
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
696 // Put all buffers into the buffer list.
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
697 // Do it very early to preserve buffer order after loading session (which
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
698 // can be disrupted by prior `edit` or `tabedit` calls).
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
699 FOR_ALL_BUFFERS(buf)
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
700 {
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
701 if (!(only_save_windows && buf->b_nwindows == 0)
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
702 && !(buf->b_help && !(ssop_flags & SSOP_HELP))
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
703 // Skip terminal buffers: finished ones are not useful, others
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
704 // will be resurrected and result in a new buffer.
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
705 && !bt_terminal(buf)
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
706 && buf->b_fname != NULL
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
707 && buf->b_p_bl)
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
708 {
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
709 if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
710 : buf->b_wininfo->wi_fpos.lnum) < 0
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
711 || ses_fname(fd, buf, &ssop_flags, TRUE) == FAIL)
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
712 goto fail;
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
713 }
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
714 }
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
715
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 // 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
717 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
718 !(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
719 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 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
722 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 // 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
724 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
725 || 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
726 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 }
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 #ifdef FEAT_GUI
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 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
731 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 int x, y;
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 (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
735 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 // 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
737 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
738 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 #endif
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 // 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
744 // 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
745 // 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
746 // 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
747 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
748 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 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
750 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 restore_stal = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754 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
755 {
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
756 // "tabpages" is in 'sessionoptions': Similar to ses_win_rec() below,
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
757 // populate the tab pages first so later local options won't be copied
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
758 // to the new tabs.
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 FOR_ALL_TABPAGES(tp)
27122
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
760 // Use `bufhidden=wipe` to remove empty "placeholder" buffers once
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
761 // they are not needed. This prevents creating extra buffers (see
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
762 // cause of patch 8.1.0829)
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
763 if (tp->tp_next != NULL
4fd87205ca80 patch 8.2.4090: after restoring a session buffer order can be quite different
Bram Moolenaar <Bram@vim.org>
parents: 26956
diff changeset
764 && put_line(fd, "tabnew +setlocal\\ bufhidden=wipe") == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
765 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 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
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 }
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
769
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
770 // Assume "tabpages" is in 'sessionoptions'. If not then we only do
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
771 // "curtab" and bail out of the loop.
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
772 FOR_ALL_TABPAGES(tp)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 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
775 int cnr = 1;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
777 // May repeat putting Windows for each tab, when "tabpages" is in
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
778 // 'sessionoptions'.
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
779 // Don't use goto_tabpage(), it may change directory and trigger
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
780 // autocommands.
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 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
782 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 if (tp == curtab)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 tab_firstwin = firstwin;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 tab_topframe = topframe;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
788 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 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
791 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
792 }
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
793 if (tp != first_tabpage)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794 need_tabnext = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 }
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
796 else
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
797 {
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
798 tp = curtab;
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
799 tab_firstwin = firstwin;
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
800 tab_topframe = topframe;
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
801 }
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 // 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
804 // 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
805 // 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
806 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
807 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 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
809 && 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
810 && !bt_help(wp->w_buffer)
29849
6c7eddcce52c patch 9.0.0263: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents: 28915
diff changeset
811 && !bt_nofilename(wp->w_buffer))
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 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
814 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 need_tabnext = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 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
818 || 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
819 == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
820 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 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
822 edited_win = wp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 break;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 }
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
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 // 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
828 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
829 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830
24473
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
831 if (tab_topframe->fr_layout != FR_LEAF)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
832 {
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
833 // Save current window layout.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
834 if (put_line(fd, "let s:save_splitbelow = &splitbelow") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
835 || put_line(fd, "let s:save_splitright = &splitright")
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
836 == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
837 goto fail;
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
838 if (put_line(fd, "set splitbelow splitright") == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
839 goto fail;
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
840 if (ses_win_rec(fd, tab_topframe) == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
841 goto fail;
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
842 if (put_line(fd, "let &splitbelow = s:save_splitbelow") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
843 || put_line(fd, "let &splitright = s:save_splitright")
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
844 == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
845 goto fail;
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
846 }
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 // 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
849 // 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
850 nr = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 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
852 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853 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
854 ++nr;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 restore_size = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 if (curwin == wp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 cnr = nr;
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
24473
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
861 if (tab_firstwin->w_next != NULL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
862 {
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
863 // Go to the first window.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
864 if (put_line(fd, "wincmd t") == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
865 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866
24473
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
867 // If more than one window, see if sizes can be restored.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
868 // First set 'winheight' and 'winwidth' to 1 to avoid the windows
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
869 // being resized when moving between windows.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
870 // Do this before restoring the view, so that the topline and the
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
871 // cursor can be set. This is done again below.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
872 // winminheight and winminwidth need to be set to avoid an error if
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
873 // the user has set winheight or winwidth.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
874 if (put_line(fd, "let s:save_winminheight = &winminheight") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
875 || put_line(fd, "let s:save_winminwidth = &winminwidth")
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
876 == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
877 goto fail;
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
878 if (put_line(fd, "set winminheight=0") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
879 || put_line(fd, "set winheight=1") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
880 || put_line(fd, "set winminwidth=0") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
881 || put_line(fd, "set winwidth=1") == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
882 goto fail;
28654
8fc86c943863 patch 8.2.4851: compiler warning for uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 28652
diff changeset
883 restore_height_width = TRUE;
24473
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
884 }
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 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
886 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 // 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
889 // 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
890 // override the tab-local directory.
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
891 if ((ssop_flags & SSOP_CURDIR) && tp->tp_localdir != NULL)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 if (fputs("tcd ", fd) < 0
28652
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
894 || ses_put_fname(fd, tp->tp_localdir, &ssop_flags) == FAIL
27dcbe70e1f0 patch 8.2.4850: mksession mixes up "tabpages" and "curdir" arguments
Bram Moolenaar <Bram@vim.org>
parents: 28238
diff changeset
895 || 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
896 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897 did_lcd = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 // 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
901 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
902 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 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
904 continue;
22230
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
905 if (put_view(fd, wp, wp != edited_win, &ssop_flags, cur_arg_idx,
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
906 #ifdef FEAT_TERMINAL
22230
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
907 &terminal_bufs
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
908 #else
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
909 NULL
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
910 #endif
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
911 ) == FAIL)
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
912 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 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
914 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 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
916 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 // 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
919 // 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
920 // "tabedit".
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921 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
922
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923 // 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
924 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
925 || 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
926 goto fail;
17536
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 // 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
929 // 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
930 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
931 goto fail;
17536
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 // 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
934 // 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
935 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
936 break;
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
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 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
940 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 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
942 || 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
943 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 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
946 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 // 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
949 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
950 == FAIL)
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
951 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952 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
953 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 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
955 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 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
957 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958
28238
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
959 // Re-apply 'winheight' and 'winwidth'.
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
960 if (fprintf(fd, "set winheight=%ld winwidth=%ld",
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
961 p_wh, p_wiw) < 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
962 goto fail;
28238
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
963
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
964 // Restore 'shortmess'.
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
965 if (ssop_flags & SSOP_OPTIONS)
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
966 {
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28654
diff changeset
967 if (fprintf(fd, "set shortmess=%s", p_shm) < 0 || put_eol(fd) == FAIL)
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28654
diff changeset
968 goto fail;
28238
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
969 }
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
970 else
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
971 {
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28654
diff changeset
972 if (put_line(fd, "let &shortmess = s:shortmess_save") == FAIL)
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28654
diff changeset
973 goto fail;
28238
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
974 }
800e7de2f96d patch 8.2.4645: 'shortmess' changed when session does not store options
Bram Moolenaar <Bram@vim.org>
parents: 28083
diff changeset
975
28654
8fc86c943863 patch 8.2.4851: compiler warning for uninitialized variable
Bram Moolenaar <Bram@vim.org>
parents: 28652
diff changeset
976 if (restore_height_width)
24473
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
977 {
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
978 // Restore 'winminheight' and 'winminwidth'.
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
979 if (put_line(fd, "let &winminheight = s:save_winminheight") == FAIL
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
980 || put_line(fd, "let &winminwidth = s:save_winminwidth") == FAIL)
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
981 goto fail;
b2484fa6cb02 patch 8.2.2776: :mksession uses current value of 'splitbelow' and 'splitright'
Bram Moolenaar <Bram@vim.org>
parents: 24464
diff changeset
982 }
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 // 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
985 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
986 || 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
987 || 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
988 || 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
989 goto fail;
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990
22226
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
991 ret = OK;
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
992 fail:
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
993 #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
994 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
995 #endif
4ed106deb772 patch 8.2.1662: :mksession does not restore shared terminal buffer properly
Bram Moolenaar <Bram@vim.org>
parents: 20057
diff changeset
996 return ret;
17536
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
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 * 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
1001 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 static char_u *
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 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
1004 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005 int len = 0;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 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
1007 char_u *retval;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 char_u *sname;
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 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
1011 {
25306
078edc1821bf patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 24561
diff changeset
1012 emsg(_(e_no_file_name));
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 return NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 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
1016 if (sname == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 return NULL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 // 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
1020 // a directory.
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 // "normal" path separator -> "=+"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 // "=" -> "=="
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 // ":" path separator -> "=-"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 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
1025 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
1026 ++len;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 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
1028 if (retval != 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 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
1031 add_pathsep(retval);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 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
1033 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
1034 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 if (*p == '=')
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 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040 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
1041 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 #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
1044 if (*p == ':')
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 *s++ = '-';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 *s++ = '+';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 *s++ = *p;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 *s++ = '=';
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 *s++ = c;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 STRCPY(s, ".vim");
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 vim_free(sname);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 return retval;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 }
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 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 * ":loadview [nr]"
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 void
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 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
1067 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068 char_u *fname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 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
1071 if (fname != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 18215
diff changeset
1073 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
1074 vim_free(fname);
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 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077
18215
86a865a89661 patch 8.1.2102: can't build with GTK and FEAT_GUI_GNOME
Bram Moolenaar <Bram@vim.org>
parents: 18213
diff changeset
1078 # 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
1079 || (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
1080 || defined(PROTO)
17536
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 * 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
1083 * 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
1084 * 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
1085 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086 int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 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
1088 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089 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
1090 char *mksession_cmdline;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 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
1092 int failed;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 // 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
1095 // 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
1096 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
1097 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
1098 return FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 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
1100 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
1101 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 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
1103 return FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 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
1106 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
1107 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
1108
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 // 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
1110 // 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
1111 // 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
1112 // 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
1113 // 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
1114 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
1115 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
1116 |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
1117
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 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
1119 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
1120 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
1121 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
1122
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 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
1124 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
1125
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 // 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
1127 // 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
1128 // 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
1129 // 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
1130 if (!failed)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 FILE *fd;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 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
1135
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 failed = (fd == NULL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 || 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
1138 == FAIL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 || 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
1140
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 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
1142 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 if (failed)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 mch_remove(filename);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 return !failed;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 #endif // FEAT_SESSION
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 #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
1155 # define MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 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
1157 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160 * ":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
1161 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 void
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163 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
1164 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165 FILE *fd;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 int failed = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167 char_u *fname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168 #ifdef FEAT_BROWSE
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 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
1170 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1171 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 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
1173 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
1174 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
1175 unsigned *flagp;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 #endif
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 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
1179 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 view_session = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 #else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 ex_ni(eap);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 return;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 // 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
1190 // 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
1191 did_lcd = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 // ":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
1194 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
1195 && (*eap->arg == NUL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 || (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
1197 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 eap->forceit = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 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
1200 if (fname == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 return;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 viewFile = fname;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 using_vdir = TRUE;
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 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 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
1208 fname = eap->arg;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 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
1210 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
1211 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 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
1213 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
1214 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 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
1217
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 #ifdef FEAT_BROWSE
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 22230
diff changeset
1219 if (cmdmod.cmod_flags & CMOD_BROWSE)
17536
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 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
1222 # ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 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
1224 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
1225 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226 (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
1227 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
1228 (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
1229 if (browseFile == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230 goto theend;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 fname = browseFile;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 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
1233 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 #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
1237 // 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
1238 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
1239 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
1240 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 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
1243 if (fd != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 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
1247 flagp = &vop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 flagp = &ssop_flags;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252 #ifdef MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 // "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
1254 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
1255 mksession_nl = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 // 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
1259 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
1260 (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
1261
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1262 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263 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
1264 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 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
1266 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1267 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 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
1270 #endif
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 // 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
1273 // 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
1274 if (p_cp)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1275 (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
1276 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277 (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
1278 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 if (!view_session
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 || (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
1283 && (*flagp & SSOP_OPTIONS)))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 #endif
24464
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1285 {
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1286 int flags = OPT_GLOBAL;
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1287
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1288 #ifdef FEAT_SESSION
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1289 if (eap->cmdidx == CMD_mksession && (*flagp & SSOP_SKIP_RTP))
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1290 flags |= OPT_SKIPRTP;
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1291 #endif
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 failed |= (makemap(fd, NULL) == FAIL
24464
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1293 || makeset(fd, flags, FALSE) == FAIL);
a56f9c2ba51c patch 8.2.2772: problems when restoring 'runtimepath' from a session file
Bram Moolenaar <Bram@vim.org>
parents: 24106
diff changeset
1294 }
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1296 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1297 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
1298 {
22776
0583f3e2c12e patch 8.2.1936: session sets the local 'scrolloff' value to the global value
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1299 if (put_line(fd, "let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1") == FAIL)
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301 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
1302 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 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
1304
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 dirnow = alloc(MAXPATHL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 if (dirnow == NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 // 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
1311 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
1312 || 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
1313 *dirnow = NUL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1314 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
1315 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1316 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
1317 shorten_fnames(TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1318 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 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
1320 && (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
1321 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1322 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
1323 shorten_fnames(TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 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
1327
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 // restore original dir
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 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
1330 || ((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
1331 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 if (mch_chdir((char *)dirnow) != 0)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26439
diff changeset
1333 emsg(_(e_cannot_go_back_to_previous_directory));
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1334 shorten_fnames(TRUE);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1336 vim_free(dirnow);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1337 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1339 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 {
22230
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
1341 failed |= (put_view(fd, curwin, !using_vdir, flagp, -1, NULL)
0bbc8be90207 patch 8.2.1664: memory leak when using :mkview with a terminal buffer
Bram Moolenaar <Bram@vim.org>
parents: 22226
diff changeset
1342 == FAIL);
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1343 }
22776
0583f3e2c12e patch 8.2.1936: session sets the local 'scrolloff' value to the global value
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1344 if (put_line(fd, "let &g:so = s:so_save | let &g:siso = s:siso_save")
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1345 == FAIL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346 failed = TRUE;
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1347 #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
1348 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
1349 failed = TRUE;
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1350 #endif
17536
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351 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
1352 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353 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
1354 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 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
1356 failed = TRUE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1359 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1360 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
1361 failed = TRUE;
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 failed |= fclose(fd);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1364
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1365 if (failed)
26439
b18f3b0f317c patch 8.2.3750: error messages are everywhere
Bram Moolenaar <Bram@vim.org>
parents: 25994
diff changeset
1366 emsg(_(e_error_while_writing));
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1367 #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
1368 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
1369 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1370 // 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
1371 char_u *tbuf;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1373 tbuf = alloc(MAXPATHL);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1374 if (tbuf != NULL)
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1376 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
1377 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
1378 vim_free(tbuf);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1379 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1380 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1381 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1382 #ifdef MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383 mksession_nl = FALSE;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1385 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1386
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1387 #ifdef FEAT_BROWSE
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1388 theend:
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1389 vim_free(browseFile);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1390 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1391 #ifdef FEAT_SESSION
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1392 vim_free(viewFile);
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1393 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1394 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1395
17539
554240b9574b patch 8.1.1767: FEAT_SESSION defined separately
Bram Moolenaar <Bram@vim.org>
parents: 17536
diff changeset
1396 #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
1397 var_flavour_T
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1398 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
1399 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1400 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
1401
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1402 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
1403 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1404 while (*(++p))
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1405 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
1406 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
1407 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
1408 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1409 else
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1410 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
1411 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1412 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1413
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1414 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1415 * 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
1416 * 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
1417 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1418 int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1419 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
1420 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1421 if (
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1422 #ifdef USE_CRNL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1423 (
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1424 # ifdef MKSESSION_NL
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1425 !mksession_nl &&
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1426 # endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1427 (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
1428 #endif
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1429 (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
1430 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1431 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1432 }
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1433
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1434 /*
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1435 * 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
1436 * 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
1437 */
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1438 int
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1439 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
1440 {
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1441 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
1442 return FAIL;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1443 return OK;
e00d12c085a5 patch 8.1.1766: code for writing session file is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1444 }