jEdit:一个文本编辑器及更多
jEdit 是一个用 Java 编写的跨平台文本编辑器。撰写本文时,当前的稳定版本是 4.3.2,可在 http://jedit.org 获取。除了跨平台功能外,jEdit 还提供其他功能,例如复杂的插件系统、130 种语言的语法高亮、内置的宏语言和广泛的编码支持。我使用 jEdit 编写了这篇文章,并在此演示了它的一些功能,特别是其中一些我发现有用的插件。
在开始之前,jEdit 是一个功能强大的 GUI 文本编辑器。它不能替代在命令行上使用 vi 编辑远程服务器上的配置文件。它在同时处理多个文件时表现良好,具有可视化反馈和 GUI 界面的优势。换句话说,我根据需要使用 vi 或 jEdit。
安装非常简单;只需转到下载页面并获取安装程序 jar 文件。如果您使用的是非 Sun (Oracle) 或 Apple 版本的 Java,请务必查看兼容性链接。根据个人经验,我没有成功在 gcj 上运行 jEdit。假设您有一个兼容版本的 Java,请使用以下命令安装
java -jar jedit4.3.2install.jar
这将启动一个安装程序,引导您完成整个过程。为了方便参考,jEdit 将其配置文件(在 Linux 上)保存在 ~/.jedit/ 中。我提到这一点是因为我在笔记本电脑和台式机之间同步了该目录。因此,我在两者之间拥有一致的工作环境。
从本质上讲,jEdit 只是一个文本编辑器,尽管它是一个有很多选项的文本编辑器。您可以将这些选项设置为全局的,也可以在每个缓冲区的基础上应用它们。您可以通过“Utilities”菜单项访问这些选项。全局选项在编辑会话之间保持不变,但缓冲区选项则不会,除非您使用缓冲区本地方法。这包括在文件中嵌入以冒号分隔的 jEdit 提示。jEdit 会检查前十行或后十行是否有这些提示。例如,要指定缩进为 2,使用空格代替制表符并进行“硬”换行,嵌入的提示将是
:identSize=2:noTabs=True:wrap=hard:
jEdit 会检查这些行中的任何位置,因此您可以将提示放在注释符号后面。
另请注意,jEdit 支持模式特定的设置,其中模式是一种文件类型,例如 Python (*.py)、C (*.c)、HTML (*.html) 等等。各种模式都带有默认设置,但可以被覆盖。关键优势之一是模式系统会引入特定于文件类型的语法高亮。编辑器布局还有其他选项可用。正如您可以在本文的屏幕截图中看到的那样,我倾向于运行 jEdit,其中打开两个缓冲区,垂直拆分并启用行号。同时查看文件的开头和结尾(尤其是源代码)的能力是无价的。
您可以通过多种方式使用 jEdit。观看我输入文本,虽然偶尔会有亮点,但并不是非常鼓舞人心。因此,为了保持趣味性,我在这里演示一些我发现有用的插件。插件是解决特定需求的程序代码。基本的 jEdit 程序已经功能强大,但它并没有涵盖文本编辑的全部领域,或者其他方面的杂务。
jEdit 具有宏系统(本文未涵盖),因此您可以快速开发自己的问题解决方案,或者查看可用的插件,而无需重新发明轮子。因此,在深入研究插件本身之前,先概览一下插件系统本身。可以在 http://plugins.jedit.org 或通过菜单栏上的“Plugins”项找到它们。单击“Plugin Manager”项,然后单击“Install”选项卡以查看可用插件列表。单击某个项目会在页面底部显示描述。选中您要安装的任何插件的复选框,然后单击“Install”。如果插件有依赖项,它们也将被安装。
那么,从哪里开始介绍插件呢?让我们从简单到复杂,首先介绍 Bellingham Linux 用户组的一位成员向我推荐的插件:WhiteSpace。顾名思义,它跟踪空白字符。我将其设置为显示尾随空白字符,并在保存时消除任何此类空白字符。我还让它显示制表符,并根据我的 jEdit 软制表符设置修改它们。启用此设置后,它会将制表符转换为定义的空格数。WhiteSpace 使用此设置将预先存在的制表符转换为空格,反之亦然。当我在 Python 代码中工作时,所有这些都有助于保持那些讨厌的空白字符井然有序。这对于为 Linux Journal 写作也很有价值,Linux Journal 要求作者使用空格而不是制表符。有关 WhiteSpace 在 Python 文件中的实际应用,请参见图 1。从屏幕截图中,您可以看到一种设置方法。另一种方法是转到“Plugins”→“Plugin Options”→“WhiteSpace”。大多数插件都是这样工作的,尽管您会发现这两个位置之间可用的选项通常存在差异。

图 1. WhiteSpace 插件设置和工作状态
我经常使用的另一个插件是 JDiff。顾名思义,它显示文件之间的差异。当然,您可以使用命令行来做同样的事情。该插件的优点是它提供的图形化呈现。图 2 显示了使用本文作为文件的双差异模式。从这里,您可以创建差异输出。您还可以遍历差异并将它们从一侧应用到另一侧。

图 2. 双差异模式下的 JDiff 插件
JDiff 插件有一个可停靠的组件,允许您深入查看文件的行以查找差异(图 3)。在双差异屏幕截图(图 2)中,您可以看到另一个插件在工作:VoxSpell。下划线是拼写检查器在工作。如果您查看该文件,您可以看到 plugin/plugins 从带下划线变为不带下划线。我右键单击这些单词并将它们添加到字典中,使其成为可接受的单词,至少对于本文而言是这样。请注意,VoxSpell 依赖于 Spell Check 插件。它也使用相当多的内存,因此这可能是一个问题。

图 3. JDiff 可停靠组件显示行差异
接下来是一个先有鸡还是先有蛋的问题。我偶然看到了对 jEdit 的 SQL 插件的引用。在安装它的过程中,我发现它依赖于 Project Viewer 插件,这意味着我必须学习如何使用 Project Viewer 才能使用 SQL 插件。事实证明这是一件好事。实际上,本文是使用 Project Viewer 编写的。首先,我将介绍 SQL 插件,稍后将详细介绍 Project Viewer 插件。
SQL 允许您从编辑器内部使用 SQL 数据库。设置插件以供使用是一个两步过程。首先,您需要在 SQL 选项对话框中进行常规设置。转到菜单,然后依次选择“Plugins”→“Plugin Options”→“SQL”。转到“JDBC”页面,然后使用“Add Element”按钮指示您要程序识别的 JDBC 驱动程序的路径。在撰写本文时,SQL 可以与 Oracle、MySQL、PostgreSQL、Firebird、DB2、Progress、MS SQL Server 2000、Sybase 和 Teradata 一起使用,前提是您拥有必要的 JDBC 驱动程序。之前的步骤“注册”了数据库,以便在下一步中使用。
下一步是将特定数据库(或多个数据库)与项目一起配置。这就是 Project Viewer 的用武之地。您可以使用它来创建项目(稍后会详细介绍)。现在,我将使用本文的项目。从项目窗格中,右键单击项目名称,然后选择“属性”。这将引导您进入一系列对话框,您可以在其中填写所需的信息(图 4)。在本例中,我使用的是 Postgres 的 Pagila 演示数据库。从 jEdit 缓冲区中,您现在可以访问数据库(图 5)。那里有很多内容,让我们一步一步来。

图 4. 将 SQL Server 添加到项目

图 5. SQL 插件返回结果集
缓冲区上方是 SQL 工具栏。首先,在左侧缓冲区上方是一个“Database:”下拉列表,其中选择了先前配置的数据库。在其右侧是四个按钮:第一个是“Execute selection”,第二个是“Execute buffer”,第三个是“Load object”,最后一个是“Repeat last query”。最后一个按钮的右侧是“Preprocessors”下拉列表。在本例中,我使用的是“Variable substitution”预处理器。这可以在右侧缓冲区中 SQL 语句中的“actor_id > ?”表达式中看到。(作为旁注,请注意使用 *.sql 扩展名触发的 SQL 语法高亮。)继续,我选择了要运行的语句,然后单击了“Execute selection”按钮。因为我强制使用了变量替换,所以出现了一个输入框(未显示),供我输入 actor_id 的值,在本例中为 35。结果显示在一个单独的窗口中。从结果集中,可以将数据保存为 CSV 或制表符格式,或保存为 INSERT 语句。您还可以显示/隐藏列。此外,还可以一次运行多个语句(图 6)。这是一个有点牵强的例子,但它确实展示了可能性。之前的特性允许我创建数据库 DDL 文件并从编辑器内部运行它们。
最后一个功能是 SqlVFS(Sql 虚拟文件系统)。这允许您将选定的数据库作为文件系统进行浏览。要访问它,请转到“File”→“Open”→“Commands”→“Plugins”→“Show databases”。图 7 显示了您得到的内容。请注意,尽管“Data”显示为 0 字节,但双击它会显示来自表的结果集。

图 6. SQL 插件运行多个语句

图 7. SqlVFS,作为文件系统的数据库
Project Viewer 是一个插件,旨在使处理一组相关文件(一个项目)更容易。为了演示目的,我使用了构成本文的文件。Project Viewer 在菜单栏下方创建一个停靠按钮。单击它,将出现一个下拉列表,其中列出了“All Projects”。单击此项,将打开一个窗口。右键单击“All Projects”,然后选择“Add project”,您将看到另一个窗口(图 8),您可以在其中输入所需的信息。单击“OK”创建项目。然后,Project Viewer 会将您带到该项目,并提示您将文件导入到项目中。默认情况下,它会导入根目录下的所有内容。

图 8. 使用 Project Viewer 设置项目
至此,这组文件已绑定在一起作为一个项目。

图 9. Project Viewer 中的文件
一个非常方便的功能是项目的紧凑视图。这在 Project Viewer 插件选项的“General Options”中启用。它呈现目录结构的扁平化视图。本文实际上没有足够的目录深度来展示其优点,因此请查看另一个项目的屏幕截图(图 10)。每一行都将您直接带到一个目录。同样值得注意的是项目窗口中的“Working Files”选项卡。它将您当前所有打开的文件组合在一起,这在大型项目中非常方便。

图 10. Project Viewer 紧凑视图
其他一些功能包括将项目文件存档在 JAR 文件中,以及在项目或项目子目录文件中搜索字符串。在一个界面中整合与项目相关的所有文件的能力,是我随着时间的推移越来越欣赏的功能。在查看实际文件的同时,遍历 Project Viewer 目录树重命名/移动/删除文件是无价的。
上面我介绍的内容仅仅触及了 jEdit 功能的冰山一角。它具有宏功能,我甚至还没有开始探索。对我来说,jEdit 最重要的部分是它可以让我完成工作而不会妨碍我。此外,它使工作变得更容易,我希望您也觉得它有用。