在没有文件扩展名的情况下指定文件中的编程语言

10

在编写可执行脚本和声明性配置文件时,我经常发现不想添加文件名扩展名(例如Python)。许多语法高亮的文本编辑器(例如Geany)随后无法自动确定文件类型。

是否有任何标准方法来指示编辑器文件中源代码的类型?


1
为什么您认为在文件名中添加扩展名是不可取的呢?只是好奇... - Tarydon
2
@Tarydon:我也是这样,我的所有shell脚本都没有扩展名,这只是多余的打字而已。通常情况下,它们被视为可执行文件,所以在命令行界面上只是额外的打字。 - prodigitalson
2
我认为这就是Tab键自动补全的作用。 :) - user240438
3
在Unix系统上,可执行文件的属性是透明的,并且不要求文件是二进制文件。例如,如果我想用一个包装了已有二进制可执行文件的shell脚本替换它,这是完全可行的。 - Matt Joiner
1
@amphetamachine:Windoze 不够强大。 - Matt Joiner
显示剩余2条评论
3个回答

21

Vim

Vim有一个叫做modeline的概念。模型行是指在文本文件的前5行或后5行之内的特殊格式化行,它允许您设置:setlocal局部变量。例如,对于C语言:

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

或 Ruby:

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

更多文档

Emacs

Emacs有一个类似的概念,叫做文件变量

文件变量可以在文件开头指定(在第一行或者如果有shebang行,则在第二行)以以下形式:

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

或者在结尾处:

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

jEdit

jEdit将其称为缓冲区本地属性。它们必须位于前10行或后10行内,并且格式如下:

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

jEdit还使用shebang行作为模式检测的备选方案。

Komodo Edit

有一个名为Komode(双关语)的插件可将模式行支持添加到Komodo Edit中:

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

它还可以理解有限的Vim模型行。

其他

许多其他编辑器也有自己的变体,或支持上述其中之一(通常是Vim)。

Python / Ruby编码

Ruby 1.9和Python都要求明确指定非ASCII源文件的编码。幸运的是,它们以与Emacs和Vim模型线兼容的方式进行。 (基本上,它们寻找字符串coding,后跟非单词字符,后跟空格,后跟有效的编码名称。 Vim的fileencoding=和Emacs的coding:都满足这些要求。)

模型线生成器

这里有一个简单的模型线生成器,它可以为Vim、Emacs和jEdit生成模型线。


8

通常,shebang行被用作备选方案。

例如,没有扩展名的Ruby脚本将以以下方式开头:

#!/usr/bin/env ruby

值得注意的是,这通常是file(1)和vim的filetype.vim确定脚本语言的方式。 - amphetamachine
我选择了这个答案,因为它是最明显的备选方案,也是最容易实现的。 - Matt Joiner

0

如果您使用非标准的 shebang,这适用于许多编辑器:

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

实际上它不起作用。我认为执行此操作的编辑器实际上是在 env 的第一个参数上执行复杂的正则表达式。 - Matt Joiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接