summaryrefslogtreecommitdiffstats
path: root/debian/policy/vim-policy.xml
blob: a28b31769d76063cb69b1beeb1b0157d61c40f10 (plain)
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
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
<?xml version="1.0"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
"/usr/share/sgml/docbook/dtd/xml/4.3/docbookx.dtd" [
  <!ENTITY vim-version "7.3">
  <!ENTITY vim-tag "vim73">
  <!ENTITY vim-compat  "1">
  <!ENTITY vim-pkg "<application>vim</application>">
  <!ENTITY vim "<application>Vim</application>">
  <!ENTITY debian "Debian">

  <!ENTITY authors SYSTEM "authors.xml">
  <!ENTITY legal SYSTEM "legal.xml">
]>

<article>
  <articleinfo>
    <title>Debian Packaging Policy for &vim;</title>
    <releaseinfo>Version 1.0</releaseinfo>
    &authors;
    &legal;
  </articleinfo>

  <section id="nutshell">
    <title>&vim; Addon Packaging in a Nutshell</title>

    <warning> <para> This section contains a brief howto of what to do to
	package a &vim; addon (plugin, syntax definition, ...) in &debian;.
	This section is not the full policy nor the guidelines for doing that;
	have a look at the remainder of this document for such information.
    </para> </warning>

    <para> So you've found on <ulink url="http://www.vim.org">vim.org</ulink> a
      cool extra feature for your beloved editor (&vim;) and you want it to be
      packaged in &debian;. It's as easy as implementing the following 4 steps:

      <orderedlist numeration="arabic">

	<listitem> <para> create an <code>architecture: all</code>
	    <filename>.deb</filename> binary package called
	    <application>vim-<replaceable>ADDON</replaceable></application>,
	    where <replaceable>ADDON</replaceable> is the addon name. See <xref
	      linkend="addon-packages" /> for more info on this. </para>
	</listitem>

	<listitem> <para> make your package ship all the files composing your
	    addon (usually <filename>.vim</filename> and
	    <filename>.txt</filename> files) under
	    <filename>/usr/share/vim/addons/</filename>. The files should be
	    shipped as a file and directory tree isomorphic to what you want to
	    see in a runtime &vim; directory. So if for example the addon
	    documentation says that something should be installed as
	    <filename>plugin/foo.vim</filename> then you should ship it as
	    <filename>/usr/share/vim/addons/plugin/foo.vim</filename>. See <xref
	      linkend="addon-structure" /> for more info on this. </para>
	</listitem>

	<listitem> <para>create a
	    <filename>vim-<replaceable>ADDON</replaceable>.yaml</filename>
	    registry file for your addon and ship it as
	    <filename>/usr/share/vim/registry/vim-<replaceable>ADDON</replaceable>.yaml</filename>.
	    You can find documentation on how to write a registry file in <xref
	      linkend="registry-entry" /> and cut&amp;paste-ready examples in
	    <xref linkend="registry-examples" />.  If the addon you are
	    packaging does not provide a way to disable it consider patching it
	    so that it is possible, put in your registry entry the appropriate
	    <emphasis>disabledby</emphasis> field, and forward the patch
	    upstream. </para> </listitem>

	<listitem> <para> <code>Recommend: vim-addon-manager</code> in your
	    <filename>debian/control</filename> and write into
	    <filename>README.Debian</filename> something like: <blockquote>
	      <para> Dear user, this package provides the vim addon
		<replaceable>ADDON</replaceable>, but it is not enabled per
		default. If you want to enable it for your user account just
		execute <userinput>vim-addons install
		  <replaceable>ADDON</replaceable></userinput>. Similarly, to
		enable it for all users of this system just execute (as root)
		<userinput>vim-addons -w install
		  <replaceable>ADDON</replaceable></userinput>.
		<command>vim-addons</command> is provided by the
		<application>vim-addon-manager</application> package, have a
		look at its manpage for more information. </para> </blockquote>
	    See <xref linkend="tools" /> for more info on this.  </para>
	</listitem>

      </orderedlist>

      That's it! Easy, isn't it?  </para>

  </section>

  <section id="legacy-packaging">
    <title>&vim; Packaging</title>

    <para> Here you can find a brief overview of how the &vim; editor is
      packaged in &debian; and a few concepts useful later; if you are
      just interested in the guidelines for packaging addons skip to
      <xref linkend="addon-packaging" />. </para>

    <para> The &vim; editor is split in &debian; as several binary
      packages. The key splitting is according to variants, a &vim;
      <emphasis>variant</emphasis> is a particular version of the
      <filename>/usr/bin/vim</filename> executable built with a given
      set of (<application>configure</application>) option. Examples of
      variants provided in &debian; are: <ulink
	url="http://packages.debian.org/unstable/editors/vim-tiny"><application>vim-tiny</application></ulink>,
      <ulink
	url="http://packages.debian.org/unstable/editors/vim"><application>vim</application></ulink>,
      <ulink
	url="http://packages.debian.org/unstable/editors/vim-nox"><application>vim-nox</application></ulink>,
      <ulink
	url="http://packages.debian.org/unstable/editors/vim-gtk"><application>vim-gtk</application></ulink>.
      Have a look at their full descriptions for their characteristics.
      The actual <filename>/usr/bin/vim</filename> file is managed via
      the alternative mechanism and point to one of the variants.
    </para>

    <para> Another relevant binary package is <ulink
	url="http://packages.debian.org/unstable/editors/vim-runtime"><application>vim-runtime</application></ulink>
      which ships the &vim; runtime environment distributed upstream together
      with the editor. Almost all third party extensions to &vim; come as
      additional pieces of this runtime environment, how to package them is the
      main topic of this document. </para>

    <para> To be working properly extensions should be located somewhere where
      &vim; can find them. This "somewhere" is expressed in &vim; as a list of
      directories to be looked for in turn when looking for extensions. Such a
      list is the <emphasis>&vim; runtime path</emphasis>, and is kept in the
      &vim; global variable <envar>runtimepath</envar>; you can inspect it
      executing <command>:set runtimepath</command> inside &vim;. See <ulink
	url="http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath'"><command>:help
	  'runtimepath'</command></ulink> in the &vim; online help for more
      information, including the relevant subdirectories which &vim; will look
      for inside <emphasis>each</emphasis> component of the runtime path.
    </para>

  </section>

  <section id="addon-packaging">
    <title>Packaging of &vim; Addons</title>

    <para> With the term (&vim;) <emphasis>addon</emphasis> we refer to an
      extension for the &vim; editor which is not shipped with the editor
      itself. Examples of addons which can be frequently found on the Internet
      are color schemes, syntax and corresponding higlighting definitions for
      new languages, indentation definitions, generic and filetype-specific
      plugins, ... </para>

    <section id="addon-structure">
      <title>Addon Structure</title>

      <para> An addon is usually composed of a set of <filename>.vim</filename>
	files; other kind of files, for example <filename>.txt</filename> files
	for documentation purposes, can be provided as well.

	For instance, the following files compose the <ulink
	  url="http://www.vim.org/scripts/script.php?script_id=90"><application>vcscommand</application></ulink>
	addon, providing plugins, syntax higlighting definitions, and
	documentation:

	<example> <title>Files composing the
	    <application>vcscommand</application> addon</title>
	  <programlisting>syntax/vcscommit.vim
syntax/SVNAnnotate.vim
syntax/CVSAnnotate.vim
plugin/vcssvn.vim
plugin/vcscvs.vim
plugin/vcscommand.vim
doc/vcscommand.txt</programlisting>
	</example>

      </para>

      <para> For an addon to work properly (and its plugins being automatically
	loaded by &vim;) all its files should be installed under a directory
	which is a component of the &vim; runtime path, in the appropriate
	subdirectories. In the example above, if
	<filename>/usr/share/vim/&vim-tag;/</filename> is the chosen component
	and if <application>vcscommand</application> should be installed there,
	then <filename>SVNAnnotate.vim</filename> should be installed as
	<filename>/usr/share/vim/&vim-tag;/syntax/SVNAnnotate.vim</filename>,
	<filename>vcssvn.vim</filename> as
	<filename>/usr/share/vim/&vim-tag;/plugin/vcssvn.vim</filename>, and so
	on. </para>

      <para> Addons should <emphasis>not</emphasis> be installed directly under
	a directory contained in the &vim; runtime path. This is because addons
	can conflict with each other and also because automatically loading
	plugins takes time. Therefore users shall be given the freedom to choose
	which addons they want to have enabled and which they don't. The
	suggested directory where to install addons is
	<filename>/usr/share/vim/addons</filename>, but any other directory not
	in the &vim; runtime path will do, as long as you install there a file
	tree with the appropriate sub-directories in place
	(<filename>syntax/</filename>, <filename>plugin/</filename>, ...).
      </para>

    </section>

    <section id="addon-packages">
      <title>Addon Packages</title>

      <para> Each non-trivial addon<footnote> <para> meaning with
	    "non-trivial" that its size justifies the creation of a
	    &debian; package for that, YMMV </para> </footnote> should
	be packaged and distributed in &debian; as a separate package.
	It is recommended that the package is named according to the
	naming convention
	<application>vim-<replaceable>ADDON</replaceable> </application>
	where <replaceable>ADDON</replaceable> is a name identifying the
	packaged addon. Trivial addons should be collected in suites of
	&vim; addons and packaged as aggregated &debian; packages. An
	example of such a suite is distributed as the <ulink
	  url="http://packages.qa.debian.org/vim-scripts">
	  <application>vim-script</application> package</ulink>. </para>

      <para> To ease management of addons (e.g. enabling and disabling
	them) by both the final users and the local system
	administrators, each packaged addon should be registered in the
	<emphasis>&vim; addon registry</emphasis>. The registry is
	(conceptually) a set of entries, one entry per addon, describing
	the addon from the point of view of who should configure it: its
	name and brief description, where it is located on disk, ... All
	such information should be easily findable in the upstream
	documentation of the addon. </para>

      <para> Practically, each &debian; package shipping &vim; addons
	should provide a single file in <ulink
	  url="http://www.yaml.org">YAML</ulink> format describing
	<emphasis>all</emphasis> addons shipped by the package.  The
	file should be installed by the package in
	<filename>/usr/share/vim/registry/</filename> and should be
	named according to the convention
	<filename><replaceable>PKGNAME</replaceable>.yaml</filename>,
	where <replaceable>PKGNAME</replaceable> is the name of the
	&debian; package shipping it.  There is no need to create the
	file in postinst, you can ship it normally as a file contained
	in your package.<footnote> <para> In the future we might
	    provide a debhelper to installed &vim; registry files in the
	    right place, but it is not available yet.  </para>
      </footnote> </para>

    </section>

    <section id="registry-entry">
      <title>Registry Entries</title>

      <para> The following information should be made available for each
	addon registered in the addon registry: <variablelist>

	  <varlistentry> <term><emphasis>addon</emphasis> (required
	      field)</term> <listitem> <para>short name of the addon,
		will be used to refer to the addon (also in command line
		tools, so beware of spaces, they can be annoying)
	      </para> </listitem> </varlistentry>

	  <varlistentry> <term><emphasis>description</emphasis>
	      (required field)</term> <listitem> <para>brief description
		of the addon, in the same spirit of &debian; package
		short descriptions</para> </listitem> </varlistentry>

	  <varlistentry> <term><emphasis>files</emphasis> (required
	      field)</term> <listitem> <para> list of files which
		compose the addon.  Intuitively all these files should
		be made available in the appropriate components of the
		&vim; runtime path for the addon to be working properly.
		Each file must be specified relative to a component of
		the &vim; runtime path. </para> </listitem>
	  </varlistentry>

	  <varlistentry> <term><emphasis>basedir</emphasis> (optional
	      field, default:
	      <filename>/usr/share/vim/addons</filename>) </term>
	    <listitem> <para> directory where the files composing the
		addon reside on the filesystem. This field is optional.
	  </para> </listitem> </varlistentry>

	  <varlistentry>  <term><emphasis>disabledby</emphasis>
	      (optional field)</term> <listitem> <para> &vim; script
		command that can be used (usually by adding it to
		<filename>~/.vimrc</filename>) to prevent the addon to
		be used even when it is loaded.  The intended usage of
		this field is to "blacklist" an undesired addon which
		files are available, and hence automatically loaded by
		&vim;, in a component of the &vim; runtime path. This
		field is optional, if missing the addon cannot be
		blacklisted.  </para> </listitem> </varlistentry>

      </variablelist> </para>

      <para> Note the relevance of the <emphasis>disabledby</emphasis>
	field: having it is the only way for a user to prevent the
	automatic loading of an addon which has been installed
	system-wide by the local system administrator. If the addon you
	are packaging does not provide a way to be disabled you should
	patch it to support disabling and forward your patch upstream.
	Have a look at the <ulink
	  url="http://git.debian.org/?p=pkg-vim/vim-scripts.git;a=tree;f=debian/patches;hb=HEAD">&debian;-specific
	  patches</ulink> in the <ulink
	  url="http://packages.qa.debian.org/vim-scripts"><application>vim-scripts</application></ulink>
	package for an idea about how to do it. </para>

      <para> A YAML file describing registry entries is a standard YAML
	file with multiple top-level entries (one per registry entry).
	All field mentioned above are singleton string fields with the
	exception of <emphasis>files</emphasis> which contains a list of
	strings (one for each shipped file). See the <ulink
	  url="http://yaml.org/spec/">YAML file format
	  specification</ulink> for reference ... or the examples of
	<xref linkend="registry-examples" /> to learn by example.
      </para>

      <para> You should not attempt to automatically enable the plugin in the
	postinst for the reasons mentioned above. It is recommended that
	enabling of addons should be delegated to the local system administrator
	and users. If you really feel the need to, please consider using <ulink
	  url="http://packages.qa.debian.org/debconf">debconf</ulink> as a way
	to opt-out from the automatic enabling, and do that strictly using
	<application>vim-addon-manager</application> (see <xref linkend="tools"
	  />), so that users can blacklist the automatically loaded addon.
      </para>

    </section>

  </section>

  <section id="tools">
    <title>Tools</title>

    <para> <command>vim-addons</command> is the tool used by users and local
      administrator to manage &vim; addons. It is shipped in the <ulink
	url="http://packages.qa.debian.org/vim-addon-manager"><application>vim-addon-manager</application></ulink>
      package. Using it the <emphasis>state</emphasis> of an addon can be
      changed to one of <emphasis>installed</emphasis>,
      <emphasis>removed</emphasis>, <emphasis>disabled</emphasis> (i.e.
      prevented to be loaded even if available somewhere in the &vim; runtime
      path). The state of each addon can be changed both for a single user
      (playing with symbolic links in <filename>~/.vim</filename>) and for all
      system users (via <filename>/var/lib/vim/addons/</filename>, which is
      contained in the &vim; runtime path).  </para>

    <para> For more information about <command>vim-addons</command> see its
      manpage: <code>vim-addons(1)</code>. </para>

    <para> Since <command>vim-addons</command> is the recommended way of
      managing &vim; addons available in a &debian; system, you should instruct
      your package users about it. You should hence put a <code>Recommend:
	vim-addon-manager</code> to your addon package and provide a suitable
      <filename>README.Debian</filename> with basic instructions about how to
      use it. See <xref linkend="nutshell" /> for a template where to start
      from. </para>

  </section>

  <appendix id="registry-examples">
    <title>&vim; Registry Entry Examples</title>
    
    <para> Here you can find several examples of YAML files containing
      entries for the &vim; addon registry. </para>

    <example>
      <title><filename>vim-runtime.yaml</filename>: entry for the
	matchit plugin</title>

      <para>The <application>vim-runtime</application> package
	itself ships an addon: the matchit plugin. It is rather
	standard as it ships its content under
	<filename>/usr/share/vim/addons</filename> and has no way to
	be prevented from being loaded. The content of
	<filename>/usr/share/vim/registry/vim-runtime.yaml</filename>
	follows.</para>

      <programlisting>addon: matchit
description: extended matching with "%" (e.g. if ... then ... else)
files:
  - plugin/matchit.vim
  - doc/matchit.txt</programlisting>

    </example>

    <example>
      <title><filename>vim-scripts.yaml</filename>: entries for the
	&vim; scripts addon suite</title>

      <para>The <application>vim-scripts</application> package ships a
	suite of several addons, for each shipped addon an entry for the
	addon registry is provided. Since the shipped addons are not
	installed in the default addon directories the
	<emphasis>basedir</emphasis> field should be specified.  Several
	addons provide a way for being blacklisted, for example the
	<application>alternatve</application> addon can be disabled by
	adding the line <command>let loaded_alternateFile = 1</command>
	somewhere in <filename>~/.vimrc</filename>.  (Part of) the
	content of
	<filename>/usr/share/vim/registry/vim-scripts.yaml</filename>
	follows.</para>

      <programlisting>addon: alternate
description: "alternate pairing files (e.g. .c/.h) with short ex-commands"
basedir: /usr/share/vim-scripts/
disabledby: "let loaded_alternateFile = 1"
files:
  - plugin/a.vim
  - doc/alternate.txt
---
addon: gnupg
description: "transparent editing of gpg encrypted files"
basedir: /usr/share/vim-scripts/
disabledby: "let loaded_gnupg = 1"
files:
  - plugin/gnupg.vim
---
addon: align
description: "commands and maps for aligned text, equations, declarations, ..."
basedir: /usr/share/vim-scripts/
disabledby: "let loaded_alignPlugin = 1"
files:
  - plugin/AlignPlugin.vim
  - doc/Align.txt
  - plugin/AlignMaps.vim
  - plugin/cecutil.vim
  - autoload/Align.vim
---
addon: themes
description: "colors sampler pack: all the color schemes on vim.sf.net"
basedir: /usr/share/vim-scripts/
disabledby: "let loaded_themes = 1"
files:
  - plugin/themes.vim
  - colors/adam.vim
  - colors/adaryn.vim
<emphasis># long list snipped here</emphasis></programlisting>

    </example>

    <example> <title><filename>vim-latexsuite.yaml</filename>: entries
	for the &vim; LaTeX suite</title>

      <para>The <application>vim-latexsuite</application> contains
	several advanced features for editing LaTeX documents with
	&vim;. (Part of) the content of
	<filename>/usr/share/vim/registry/vim-latexsuite.yaml</filename>
	follows.</para>

      <programlisting>addon: latex-suite
description: "comprehensive set of tools to view, edit, and compile LaTeX documents"
disabledby: "let did_latexSuite_disabled = 1"
files:
  - compiler/tex.vim
  - doc/imaps.txt.gz
  - doc/latexhelp.txt.gz
  - doc/latex-suite-quickstart.txt.gz
  - doc/latex-suite.txt.gz
  - ftplugin/bib_latexSuite.vim
  - ftplugin/latex-suite/bibtex.vim
  <emphasis># loooong file listing snipped here</emphasis>
  - ftplugin/tex_latexSuite.vim
  - ftplugin/tex/texviewer.vim
  - indent/tex.vim
  - plugin/filebrowser.vim
  - plugin/imaps.vim
  - plugin/libList.vim
  - plugin/remoteOpen.vim
  - plugin/SyntaxFolds.vim</programlisting>

    </example>

  </appendix>

</article>