Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
Copyright (c) 2011, M Rawash <mrawash@gmail.com>
Released under the most recent GPL <http://www.gnu.org/licenses/gpl.html>
*/
"use strict";
XML.ignoreWhitespace = false;
XML.prettyPrinting = false;
var INFO =
<plugin name="penta-sessions" version="0.1"
href="https://github.com/gwash/penta-sessions"
summary="Pentadactyl Session Manager"
xmlns={NS}>
<author email="mrawash@gmail.com">M Rawash</author>
<license href="http://www.gnu.org/licenses/gpl.html">GPL</license>
<project name="Pentadactyl" min-version="1.0"/>
<p>
This plugin provides Vim-like session handeling.
</p>
<note>Only operates on current window</note>
<item>
<tags>'sesdir' 'sessiondir'</tags>
<spec>'sessiondir' 'sesdir'</spec>
<type>string</type>
<default>{options.runtimepath}/sessions/</default>
<description>
<p>
The default directory to save/load sessions from.
</p>
</description>
</item>
<item>
<tags>'sesfile' 'sessionfile'</tags>
<spec>'sessionfile' 'sesfile'</spec>
<type>string</type>
<default></default>
<description>
<p>
The session file you are currently working with, this will be set automatically whenever you
save or load a session, but you can set it manually if you want.
</p>
</description>
</item>
<item>
<strut/>
<spec>:sessions<oa>ave</oa><oa>!</oa> <oa>file</oa></spec>
<spec>ss</spec>
<description>
<p>
Saves current session to an ExCommand <oa>file</oa>, which can be restored later
with <ex>:sessionload <oa>file</oa></ex>.
</p>
<p>
If <oa>file</oa> is just a basename (without directory path), it will create a session file
with that name in the <o>sessiondir</o>.
<example><ex>:sessionsave</ex> pythonref</example>
</p>
<p>
If no <oa>file</oa> was specified it will save to a numbered file (based on current date) in <o>sessiondir</o>.
</p>
<p>
Adding ! will overwrite the file if it exists.
<example><ex>:sessionsave!</ex> {options.runtimepath}/sessions/gapi.penta</example>
</p>
</description>
</item>
<item>
<tags>sa :sessiona :sessionappend :sessionadd</tags>
<strut/>
<spec>:sessiona<oa>ppend</oa><oa>!</oa> <oa>file</oa></spec>
<spec>sa</spec>
<description>
<p>
Appends current tab to an existing session file. If a ! was supplied it will append all tabs
in current window instead.
</p>
<p>
If <oa>file</oa> is a basename, it will look for it in <o>sessiondir</o>.
</p>
</description>
</item>
<item>
<tags>sl :sessionl :sessionload</tags>
<strut/>
<spec>:sessionl<oa>oad</oa><oa>!</oa> <oa>file</oa></spec>
<spec>sl</spec>
<description>
<p>
Loads session from <oa>file</oa>, replacing all tabs in current window if no ! was added.
</p>
<p>
If <oa>file</oa> is a basename, it will look for it in <o>sessiondir</o>.
</p>
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
</description>
</item>
</plugin>;
var setsessiondir = function (value) {
let dir = io.File(value);
if (!dir.exists()) {
try { dir.create(1,488) } catch(e) { return dactyl.echoerr(e.message) };
} else if (!dir.isDirectory())
return dactyl.echoerr(value+' is not a directory!');
if (!/\/$/.test(value)) value+='/';
return value
}
group.options.add(['sessiondir', 'sesdir'],
'Default directory for saving sessions',
'string',
options.runtimepath+'/sessions/',
{
setter: setsessiondir,
}
)
group.options.add(['sessionfile', 'sesfile'],
'Current session file',
'string', ''
)
group.commands.add(['sessions[ave]','mkses[sion]'],
'Save current window',
function(args) {
let filename = args[0] ? (/\//.test(args[0]) ? args[0] : options.sessiondir+args[0])
: options.sessiondir+Date.now()+'.penta'
let file = io.File(filename);
dactyl.assert(!file.exists() || args.bang, _("io.exists", file.path.quote()));
let data = '" vim: set ft=pentadactyl:\n';
data+='\ncd '+io.cwd.path;
data+='\nse rtp='+options.runtimepath;
data+='\nse sesdir='+options.sessiondir;
data+='\nt '+tab.linkedBrowser.contentDocument.location.href;
});
try {
} catch(e) {
dactyl.echoerr(_("io.notWriteable", file.path.quote()));
return;
};
options.sessionfile=file.path;
dactyl.echomsg('Saved session to '+file.path.quote());
}, {
argCount: '?',
bang: true,
completer: function (context) {
context.anchored=false;
/^\//.test(context.filter) ? completion.file(context,true)
: completion.file(context,true,options.sessiondir);
}
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
group.commands.add(['sessiona[ppend]', 'sessionadd'],
'Append tab(s) to a session file',
function(args) {
let file = io.File(/\//.test(args[0]) ? args[0] : options.sessiondir+args[0]);
if (!file.exists() || !file.isWritable() || file.isDirectory()) {
dactyl.echoerr(_("io.notWriteable", file.path.quote()));
return;
}
let data = '';
if (args.bang) {
tabs.visibleTabs.forEach(function (tab, i) {
data+='\nt '+tab.linkedBrowser.contentDocument.location.href;
});
} else {
data+='\nt '+gBrowser.mCurrentTab.linkedBrowser.contentDocument.location.href;
}
try {
file.write(data,'>>');
} catch(e) {
dactyl.echoerr(_("io.notWriteable", file.path.quote()));
return;
};
dactyl.echomsg('Appended tab(s) to session file '+file.path.quote());
}, {
argCount: '1',
bang: true,
completer: function (context) {
context.anchored=false;
/^\//.test(context.filter) ? completion.file(context,true)
: completion.file(context,true,options.sessiondir);
}
}
);
group.commands.add(['sessionl[oad]'],
'Load a session file',
function(args) {
let file = io.File(/\//.test(args[0]) ? args[0] : options.sessiondir+args[0]);
if (!file.exists() || !file.isReadable() || file.isDirectory()) {
dactyl.echoerr(_("io.notReadable", file.path.quote()));
return;
}
let curtab = gBrowser.mCurrentTab;
if(!args.bang) tabs.keepOnly(curtab);
let sessionscript = io.source(file.path);
sessionscript.unload();
options.sessionfile=file.path;
if(!args.bang) tabs.remove(curtab);
dactyl.echomsg('Loaded session from '+file.path.quote());
}, {
argCount: "1",
bang: true,
completer: function (context) {
context.anchored=false;
/^\//.test(context.filter) ? completion.file(context,true)
: completion.file(context,true,options.sessiondir);
}
}
);
group.mappings.add([modes.NORMAL], ['ss'],
'Save current window',
function() { CommandExMode().open('sessionsave! ')}
);
group.mappings.add([modes.NORMAL], ['sa'],
'Append tab(s) to a session file',
function() { CommandExMode().open('sessionappend ')}
);