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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
|
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="dactyl://content/help.xsl"?>
<!DOCTYPE document SYSTEM "dactyl://content/dtd">
<document
name="repeat"
title="&dactyl.appName; Repeating Commands"
xmlns="&xmlns.dactyl;"
xmlns:html="&xmlns.html;">
<h1 tag="repeating">Repeating commands</h1>
<toc start="2"/>
<p>
&dactyl.appName; can repeat commands in a number of ways, from repeating
the last command, to recording and playing macros, to saving its state and
executing scripts.
</p>
<h2 tag="single-repeat">Single repeats</h2>
<item>
<tags><repeat-key> .</tags>
<strut/>
<spec><oa>count</oa>.</spec>
<description>
<p>
Repeat the last keyboard mapping <oa>count</oa> times. Note that,
unlike in Vim, this does not apply solely to editing commands,
mainly because &dactyl.appName; doesn't have them.
</p>
</description>
</item>
<item>
<tags>@:</tags>
<strut/>
<spec><oa>count</oa>@:</spec>
<description>
<p>Repeat the last Ex command <oa>count</oa> times.</p>
</description>
</item>
<h2 tag="macros complex-repeat">Macros</h2>
<item>
<tags><record-macro> q</tags>
<strut/>
<spec>q<a>0-9a-zA-Z</a></spec>
<description>
<p>
Record a key sequence as a macro. Available macros are
<a>0-9a-zA-Z</a>. If the macro is an uppercase letter, the
recorded keys are appended to the lowercase macro of the same
name. Typing <k>q</k> again stops the recording.
</p>
</description>
</item>
<item>
<tags>:macros</tags>
<spec>:mac<oa>ros</oa> <oa>pat</oa></spec>
<description>
<p>
List recorded macros matching the optional regular expression
<oa>pat</oa>. If no regexp is given, list all macros.
</p>
</description>
</item>
<item>
<tags>:delmac :delmacros</tags>
<spec>:delmac<oa>ros</oa> <a>pat</a></spec>
<spec>:delmac<oa>ros</oa>!</spec>
<description>
<p>
Delete recorded macros matching the regular expression
<a>pat</a>. If <em>!</em> is given, all macros are deleted.
</p>
</description>
</item>
<item>
<tags><play-macro> @</tags>
<spec><oa>count</oa>@<a>a-z0-9</a></spec>
<description>
<p>
Plays the contents of macro with name <a>a-z0-9</a> <oa>count</oa>
times.
</p>
</description>
</item>
<item>
<tags>@@</tags>
<spec><oa>count</oa>@@</spec>
<description short="true">
<p>Replay the last executed macro <oa>count</oa> times.</p>
</description>
</item>
<h2 tag="macro-utilities">Macro utilities</h2>
<p>
The following key bindings facilitate the recording of efficient
macros. They have no effect when typed normally, but are
recorded and take effect during macro playback.
</p>
<item>
<tags><sleep> <A-m>s</tags>
<strut/>
<spec><a>count</a><m>s</spec>
<description>
<p>
Sleep for <a>count</a> milliseconds before resuming playback.
</p>
</description>
</item>
<item>
<tags><![CDATA[<wait-for-page-load> <A-m>l]]></tags>
<strut/>
<spec><![CDATA[<A-m>l]]></spec>
<description>
<p>
Wait for the current page to finish loading before resuming
playback.
</p>
</description>
</item>
<h2 tag="using-scripts">Using scripts</h2>
<item>
<tags>:so :source</tags>
<spec>:so<oa>urce</oa><oa>!</oa> <a>file</a></spec>
<description>
<p>
Read Ex commands, JavaScript, or CSS from <a>file</a>. Files are
interpreted based on their extensions. Files which end in
<em>.js</em> are executed as JavaScript, while those ending in
<em>.css</em> are loaded as Cascading Stylesheets, and anything
else is interpreted as Ex commands. In normal cases, any errors
generated by the execution or non-existence of <a>file</a> are
printed to the <t>command-line</t> area. When <oa>!</oa> is
provided, these are suppressed.
</p>
<p>
Environment variables in <a>file</a> are expanded to their current
value, and the prefix <em>~</em> is replaced with the value of
<em>$HOME</em>. See <t>expand-env</t> and <t>initialization</t>
for more information.
</p>
<h3 tag=":source-css">Cascading Stylesheets</h3>
<p>
When a CSS file is sourced, its contents are applied to every web
page and every chrome document, including all browser windows and
dialogs. If the same file is sourced more than once, its previous
rules are cleared before it is applied again. Rules can be
restricted to specific documents by enclosing them in
<link topic="https://developer.mozilla.org/en/CSS/@-moz-document">@-moz-document</link>
blocks.
</p>
<h3 tag=":source-javascript">JavaScript</h3>
<p>
JavaScript files are executed with full chrome privileges in their
own global namespaces. These namespaces are stored as objects in
the <em>plugins</em> object, in the property named after the full
path of the sourced file. This means that any variables or
functions created by your script are stored as properties of that
object. Additionally, all properties of the global <em>window</em>
and <em>modules</em> objects are accessible to your script as
global variables.
</p>
<p>
Files in <em>~/.&dactyl.name;/plugins</em> may additionally be
accessed in <em>plugins.<a>filename</a></em> where <a>filename</a>
is the last component of the file's path stripped of any
extensions, with all hyphens stripped and any letter following a
hyphen capitalized. So, the file
<em>~/.&dactyl.name;/plugins/foo-bar.js</em> may be accessed as
<em>plugins.fooBar</em>. See also <t>writing-plugins</t>.
</p>
<h3 tag=":source-ex">Ex commands</h3>
<p>
Ex command files are executed as if each line were entered into
the &tag.command-line; individually.
Additionally, certain commands support the same ‘here document’
syntax supported by most Unix shells and by the &tag.command-line;.
So, to execute a JavaScript statement which does not comfortably fit
on a single line, you can use:
</p>
<code><ex>:js</ex> <<<em>EOF</em>
<kwd><hl key="Object">var</hl></kwd> hello = <kwd>function</kwd> () {
alert(<str>Hello world</str>);
}
<em>EOF</em></code>
<p>See also <t>ex-scripts</t> below.</p>
</description>
</item>
<item>
<tags>:lpl :loadplugins</tags>
<strut/>
<spec>:loadplugins <oa>pattern</oa> …</spec>
<description>
<p>
Immediately load all plugins which have yet to be loaded. Because
plugins are not automatically loaded until after <tt><t>&dactyl.name;rc</t></tt>
is sourced, this command must be placed early in the
<tt>&dactyl.name;rc</tt> file if <tt>&dactyl.name;rc</tt> uses commands or options
which are defined by plugins. Additionally, this command allows
newly installed plugins to be easily loaded without restarting
&dactyl.appName;. See also <o>loadplugins</o>.
</p>
<p>
If <oa>pattern</oa>s are provided, the given regular expressions are
used as filters rather than those in <o>loadplugins</o>.
</p>
</description>
</item>
<item>
<tags>:ru :runtime</tags>
<spec>:runt<oa>ime</oa><oa>!</oa> <a>file</a> …</spec>
<description>
<p>
Source the specified file from the first directory in
<o>runtimepath</o> in which it exists. When <oa>!</oa> is given,
source the file from all directories in <o>runtimepath</o> in
which it exists.
</p>
<example><ex>:runtime plugins/foobar.js</ex></example>
</description>
</item>
<item>
<tags>:scrip :scriptnames</tags>
<spec>:scrip<oa>tnames</oa></spec>
<description>
<p>List all sourced script names, in the order they were first sourced.</p>
</description>
</item>
<item>
<tags>:fini :finish</tags>
<strut/>
<spec>:fini<oa>sh</oa></spec>
<description>
<p>
Stop sourcing a script file. This can only be called from within a
&dactyl.appName; script file.
</p>
</description>
</item>
<h3 tag="ex-scripts">Ex Command Scripts</h3>
<p>
Ex command scripts are similar to both entering commands on the
&tag.command-line; and to Vim
scripts, but with some notable differences.
</p>
<p tag="multiline-commands">
Commands in Ex command scripts can span multiple lines by
prefixing the second and further lines with a <em>\</em>
character. For instance, the following all define commands whose
definitions span multiple lines.
</p>
<code><ex>:command!</ex> <str delim="">foo</str>
\ <em>-description</em> <str>A command that frobs bars</str>
\ <ex>:javascript</ex> frob(content.bar)</code>
<code><ex>:style</ex> <em>-name</em> <str delim="'">foo</str>
\ <str delim="'">foobar.com</str>
\ p<str delim="">:first-line</str> { <em>font-variant</em>: <str delim="">small-caps</str>; }
\ div<em>#side-bar</em> > <str delim="">:first-child</str> { <em>display</em>: <str delim="">none</str>; }</code>
<code><ex>:command!</ex> <str delim="">do-some-stuff</str>
\ <em>-description</em> <str>A command which does some stuff in JavaScript</str>
\ <ex>:javascript</ex> <<<em>EOF</em>
\ window.do(<str>some</str>);
\ window.do(<str>stuff</str>);
\<em>EOF</em></code>
<code><ex>:command!</ex> <str delim="">do-some-stuff</str>
\ <em>-description</em> <str>A command which does some stuff in JavaScript</str>
\ <ex>:javascript</ex>
\\ window.do(<str>some</str>);
\\ window.do(<str>stuff</str>);</code>
<p tag="comments">
Lines may be commented out by prefixing them with a <em>"</em>
character.
</p>
<code> <hl style="color: #444">" This is a comment</hl>
foo bar <hl style="color: #444">" This is a comment</hl>
<str> This is not a comment</str>
foo bar <str> This is not a comment</str>
</code>
<h2 tag="profile profiling">Profiling</h2>
<item>
<tags>:time</tags>
<spec>:<oa>count</oa>time<oa>!</oa> <a>code|:command</a></spec>
<description>
<p>
Profile a piece of JavaScript code or an Ex command. Run
<a>code</a> <oa>count</oa> times and print the elapsed time.
If <a>code</a> begins with a <ex>:</ex>, it is executed as an Ex
command. Otherwise, it is executed as JavaScript, in which case it
is evaluated only once and stored as a function which is executed
<oa>count</oa> times.
</p>
<p>
When <oa>!</oa> is given, <a>code</a> is executed <oa>count</oa>
times, but no statistics are printed.
</p>
</description>
</item>
</document>
<!-- vim:se sts=4 sw=4 et: -->
|