开发者

Indicate programming language in a file without extension

When writing executable scripts, and declarative configuration files that use a common language (eg. Python), I often find it undesirable to add an extension to the file name. Many syntax-highlighting text editor (eg. Geany) are subsequently unable to automatically determine the filetype.

Is there any standard 开发者_StackOverflow中文版method for indicating to editors the type of source in the file?


Vim

Vim has a concept called a modeline. A modeline is a specially formatted line either withinin the first or last 5 lines of the textfile, which allows you to :setlocal local variables. For example, for C:

 /* vi: set filetype=c fileencoding=UTF-8 shiftwidth=4 tabstop=4 expandtab */

or Ruby:

 # vi: set filetype=ruby fileencoding=UTF-8 shiftwidth=2 tabstop=2 expandtab

Some more documentation.

Emacs

Emacs has a similar concept, called File Variables.

File Variables are either specified at the beginning of the file (in the first line, or if there is a shebang line, then in the second) in this form:

/* *-* mode: cc c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil *-* */

or at the end:

# Local Variables:
# mode: ruby
# coding: utf-8
# c-basic-offset: 2
# tab-width: 2
# indent-tabs-mode: nil
# End:

jEdit

jEdit calls this buffer-local properties. The have to sit within the first or last 10 lines and look like this:

# :mode=ruby:indentSize=2:tabSize=2:noTabs=true:

jEdit also uses the shebang line as a fallback for mode detection.

Komodo Edit

There is a plugin called Komode (pun intended) which adds modeline support to Komodo Edit:

# komode: le=unix language=ruby codepage=utf8 tab=2 notabs indent=2

It also understands a limited subset of Vim modelines.

Others

A lot of other editors also have either their own variants of this, or support one of the above (usually Vim).

Python / Ruby encoding

Both Ruby 1.9 and Python require that the encoding for non-ASCII source files be explicitly specified. Fortunately, they do this in a way that is compatible with both Emacs and Vim modelines. (Basically, they look for the string coding followed by a non-word character followed by whitespace followed by a valid encoding name. Both Vim's fileencoding= and Emacs' coding: satisfy these requirements.)

Modeline Generator

Here is a simple modeline generator, which generates modelines for Vim, Emacs and jEdit.


Typically the shebang line is used as a fall-back.

For example, a Ruby script without an extension would begin with:

#!/usr/bin/env ruby


This works for many editors if you're using non-standard shebangs:

#!/usr/bin/env python3
# filetype=python
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜