### 5.3 Virtual Extensions ¶

When a document is loaded or saved under a different name, `ne` may examine the contents of the document to determine whether to ignore the corresponding file’s actual or missing extension and use instead a virtual extension. This affects which AutoPrefs and Syntax settings `ne` applies to the document.

The document’s contents are matched against the regular expressions (see see Regular Expressions) you include in your `~/.ne/.extensions` file. (There may also be an `extensions` file (no leading ‘`.`’) in the global directory.) If `ne` finds a match it will act as if the document’s name had the corresponding extension.

Note that by default `ne` does not override a file’s given extension. However, you can specify any number of extensions that you would like to allow to be overridden by including lines in your `~/.ne/extensions` containing only a dot followed by a single extension or shell “glob pattern”. In particular, “`.*`” would allow overriding all extensions.

Here’s an example `~/.ne/.extensions` file:

    # The following patterns match some common command interpreters.
    # They must match on the first line.
     sh   1  ^#!\s*/.*\b(bash|sh|ksh|zsh)\s*
     csh  1  ^#!\s*/.*\b(csh|tcsh)\s*
     pl   1  ^#!\s*/.*\bperl\b
     py   1  ^#!\s*/.*\bpython[0-9]*\s*
     rb   1  ^#!\s*/.*\bruby\s*
     xml  1  ^<\?xml
    # These must match in the first 30 and 1000 lines, respectively.
     yaml   30  ^---$
     ini  1000i ^\[\s*(\w|[.-])+\s*\]\s*$
    # You must list the existing extensions you wish to override, one
    # per line. Shell glob patterns are allowed. Note that ".*" would
    # allow overriding any extension. (Think before you do that!)
    .conf
    .tx[0-9]

The only lines which matter consist of a space-delimited set of

      extension   number   regular_expression

or a single ‘`.`’ followed by a glob pattern. Anything else is treated as a comment. The number must be a positive integer indicating the maximum line number of the document in which the corresponding regular expression must match. The exception is zero, which allows a match on any line in the document. (Actually, ne restricts the examined portion of the document to the first 1,000,000 bytes.) If the number has a lower-case ‘`i`’ suffix (see the `ini` example above), the corresponding regular expression is not case sensitive. Trailing spaces are not included as part of the regular_expression.

Only the last instance of any extension specification is considered. This allows you to override any specifications from the global `extensions` file. If you really need two different patterns, join them into one by concatenating them with a ‘`|`’ like so:

      foo  1000i  (pattern_A)|(pattern_B)