在编写可执行脚本和使用通用语言(例如 Python)的声明性配置文件时,我经常发现在文件名中添加扩展名是不可取的。许多语法高亮文本编辑器(例如 Geany)随后无法自动确定文件类型。
是否有任何标准方法可以向编辑人员指示文件中源的类型?
在编写可执行脚本和使用通用语言(例如 Python)的声明性配置文件时,我经常发现在文件名中添加扩展名是不可取的。许多语法高亮文本编辑器(例如 Geany)随后无法自动确定文件类型。
是否有任何标准方法可以向编辑人员指示文件中源的类型?
Vim 有一个叫做模式行的概念。模式行是文本文件的前 5 行或后 5 行中的特殊格式行,它允许您使用:setlocal
局部变量。例如,对于 C:
/* vi: set filetype=c fileencoding=UTF-8 shiftwidth=4 tabstop=4 expandtab */
或红宝石:
# vi: set filetype=ruby fileencoding=UTF-8 shiftwidth=2 tabstop=2 expandtab
更多文档。
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 调用此缓冲区本地属性。必须位于前 10 行或最后 10 行内,如下所示:
# :mode=ruby:indentSize=2:tabSize=2:noTabs=true:
jEdit 还使用 shebang 行作为模式检测的后备。
有一个名为Komode(双关语)的插件,它为 Komodo Edit 添加了模式行支持:
# komode: le=unix language=ruby codepage=utf8 tab=2 notabs indent=2
它还理解有限的 Vim 模型子集。
许多其他编辑器也有自己的变体,或者支持上述之一(通常是 Vim)。
Ruby 1.9 和 Python 都要求明确指定非 ASCII 源文件的编码。幸运的是,他们这样做的方式与 Emacs 和 Vim 模型兼容。(基本上,他们查找coding
后跟非单词字符的字符串,后跟空格,后跟有效的编码名称。Vimfileencoding=
和 Emacs都coding:
满足这些要求。)
这是一个简单的模式行生成器,它为 Vim、Emacs 和 jEdit 生成模式行。
通常,shebang 线用作后备线。
例如,一个没有扩展的 Ruby 脚本会以:
#!/usr/bin/env ruby
如果您使用非标准的 shebang,这适用于许多编辑:
#!/usr/bin/env python3
# filetype=python