summaryrefslogtreecommitdiffstats
path: root/debian/policy/vim-policy.xml
blob: 03e14082f76ee55417b2b400a7c99cce940797e3 (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
<?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 "8.2">
  <!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 2.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="https://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-<replaceable>ADDON</replaceable>/</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-<replaceable>ADDON</replaceable>/plugin/foo.vim</filename>. See <xref
	      linkend="addon-structure" /> for more info on this. </para>
	</listitem>

	<listitem> <para>create a
	  <filename>debian/vim-<replaceable>ADDON</replaceable>.vim-addon</filename>
	    specifying the files and/or directories making up the addon.  If neovim is also supported, create
	    a corresponding <filename>debian/vim-<replaceable>ADDON</replaceable>.neovim-addon</filename>
	    for it, or a symlink if the same set of files are used.

	    See the <command>dh_vim-addon</command> manual page, in the <application>dh-vim-addon</application>
	    package, for more details. </para> </listitem>

	<listitem> <para>add <code>Depends: ${vim-addon:Depends}</code> to the binary package stanzas.</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="https://packages.debian.org/unstable/editors/vim-tiny"><application>vim-tiny</application></ulink>,
      <ulink
	url="https://packages.debian.org/unstable/editors/vim"><application>vim</application></ulink>,
      <ulink
	url="https://packages.debian.org/unstable/editors/vim-nox"><application>vim-nox</application></ulink>,
      <ulink
	url="https://packages.debian.org/unstable/editors/vim-gtk3"><application>vim-gtk3</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="https://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="https://vimhelp.org/options.txt.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>

    <para> &vim; also has a concept of <emphasis>packages</emphasis>.  A package
      must follow a specific directory structure and be located in one of the
      directories defined in the <envar>packpath</envar> option.  Within each
      package, there are two relevant directories: <variablelist>

	<varlistentry><term><emphasis>start</emphasis></term>
	  <listitem><para>All addons in this directory will automatically
	    be added to <envar>runtimepath</envar> and loaded like any other
	    addon that comes with &vim;. These are called
	    <emphasis>automatic</emphasis> addons.</para> </listitem> </varlistentry>

	<varlistentry><term><emphasis>opt</emphasis></term>
	  <listitem><para>Any addons in this directory must explicitly
	    be enabled by executing <command>:packadd! <replaceable>ADDON</replaceable></command>
	    in the user's vimrc. These are called <emphasis>optional</emphasis> addons.
	    </para> </listitem> </varlistentry>
      </variablelist> </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="https://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>doc/tags
doc/vcscommand.txt
plugin/vcsbzr.vim
plugin/vcscommand.vim
plugin/vcscvs.vim
plugin/vcsgit.vim
plugin/vcshg.vim
plugin/vcssvk.vim
plugin/vcssvn.vim
syntax/cvsannotate.vim
syntax/gitannotate.vim
syntax/hgannotate.vim
syntax/svkannotate.vim
syntax/svnannotate.vim
syntax/vcscommit.vim</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 unique directory
	which will be added to &vim;'s pack path. In the example above, if
	<filename>/usr/share/vim-vcscommand/</filename> is the chosen directory,
	then <filename>SVNAnnotate.vim</filename> should be installed as
	<filename>/usr/share/vim-vcscommand/syntax/SVNAnnotate.vim</filename>,
	<filename>vcssvn.vim</filename> as
	<filename>/usr/share/vim-vcscommand/plugin/vcssvn.vim</filename>, and so
	on. </para>

    </section>

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

      <para> Each addon 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. </para>

      <para> Each binary package should contain a single addon installed as an
	<emphasis>automatic</emphasis> addon.  If the addon requires
	heavy customization or is noticeably intrusive, it may be preferable
	to install it as an <emphasis>optional</emphasis> addon.</para>

      <para> In some cases, it may make sense to aggregate multiple &vim; addons in
	a single &debian; package. An example of such a suite is distributed as
	the <ulink url="https://packages.qa.debian.org/vim-scripts">
	<application>vim-scripts</application> package</ulink>.

	In such cases, the addons should be installed as <emphasis>optional</emphasis>
	addons so the user can choose which ones to enable. </para>

    </section>
  </section>

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

    <para> <command>dh_vim-addons</command> is the tool used by maintainers
      to install &vim; addons into the appropriate runtime path. It is shipped in the <ulink
	url="https://packages.qa.debian.org/dh-vim-addon"><application>dh-vim-addon</application></ulink>
	  package. It will ensure that the addons are installed in to the correct
	  <envar>packpath</envar>, based on whether it is an <emphasis>automatic</emphasis>
	  or <emphasis>optional</emphasis> addon, and which editors are supported. </para>

  </section>

</article>