编辑器SciTE介绍

Editor
虽然已经2020年了,我还是和二十多年前一样,用着老式的文本编辑器撰写程序和文档,然后在命令行下运行调试。对我来说,一个顺手的通用文本编辑器至少应该满足下面几个条件:

  1. 使用能区分O和0,I和l的等宽字体;在这一点上,最常用的中文字体宋体和黑体都不够友好
  2. 支持主流编程语言的语法高亮,可自行增加对小众语言的支持;
  3. 能够显示空格,制表符,换行符等空白字符;
  4. 查找替换支持正则表达式(Regular Expression);
  5. 占用资源小,支持操作GB级大文件;
  6. 支持调用自定义脚本;

在Windows下,我用了很多年的Emeditor,后来工作环境迁移到Linux系统下,用不惯vim和emacs,就一直用SciTE将就。时间一长,也逐渐适应了这个轻巧的工具。它是作为开源编辑器框架Scintilla的示例软件开发的,完成度不高,配置和扩展都不够友好。不过这个框架本身自由度很高。许多著名的轻量编辑器都是基于它开发的,例如Notepad++Geany等。后来随着计算机硬件性能的升级,拥有更多时髦功能的Sublime Text, Atom或者VSCode等编辑器得到了更多的关注。也许SciTE看上去有些过时。但作为一款仅有2M大小的跨平台开源软件,它有着更少的资源占用和更快的响应速度。除了对字符集的识别不那么智能,以及不支持跨行搜索之外,我还真找不到更换它的理由。这里整理了一些使用和配置的经验,方便有一定编程基础的中文用户参考。

SciTE在Ubuntu下可以直接用apt安装。不过仓库中通常不是最新版。如果想要安装最新版就要自行编译。编译过程并不复杂,装好gtk2.0库之后,只需要按照说明文件先后编译scintilla框架和scite程序即可。ubuntu下的参考命令如下(Windoes用户可直接跳过):

sudo apt-get install gtk2.0 # 安装gtk库
cd scintilla/gtk # 进入框架目录
make prefix="~/scite" # 编译框架,用prefix指定安装目录,若安装至系统默认路径可省略此部分
cd ../../scite/gtk # 进入编辑器目录
make prefix="~/scite" # 编译SciTE编辑器,并指定安装目录,波浪线~代表用户主目录
make install prefix="~/scite" # 安装至用户目录,所以无需根用户权限

刚安装好的SciTE就像个记事本,没有什么功能和特点,所有配置都需要用户自行设定。而且它没有设计图形化的交互界面,绝大部分设置都是以配置文件中的命令参数来控制的。这是SciTE上手最困难的地方。但只要克服了这一点,就能够感受它的轻巧灵便了。
在Option面板中,有4级配置文件可选,分别是Local(仅对当前文件生效),Directory(对当前目录生效),User(对当前用户生效),Global(全局有效)。可以实现非常灵活的配置设定。各类参数开关在文档页面中有详细说明,从头来写无疑是冗长琐碎的。对于轻度用户来说,只要找到合适的配置文件粘贴为User配置就好,范例如下:


# 基础设定
check.if.already.open=0 # 检查软件是否已经运行
title.full.path=1 # 标题显示完整路径
toolbar.visible=0 # 图形工具栏是否可见
position.width=800 # 编辑窗口默认宽度
line.margin.visible=1 # 是否显示行号栏
line.margin.width=3+ # 行号栏宽度
code.page=65001 # UTF8编码编辑
output.code.page=65001 # 以UTF8编码保存
use.tabs=0 # 是否使用制表符
tabsize=4 # 制表符长度
indent.size=4 # 缩进长度
view.whitespace=1 # 显示空白字符
autocompleteword.automatic=1 # 文本自动完成

# 字体及显示
font.default=DejaVuSansCondensed # 默认字体
font.base=font:DejaVu Sans Mono,size:12 # 基础字体
font.small=font:DejaVu Sans Mono,size:11 # 小号字体
font.comment=font:DejaVu Sans Mono,size:12 # 注释字体

# 高亮搜索结果
selection.fore=#FF0000 # 选中内容字体颜色
selection.back=#000000 # 选中内容背景颜色
selection.alpha=64 # 选中内容背景透明值
highlight.current.word=1 # 高亮当前选中词
highlight.current.word.colour=#FFFF00 # 高亮内容颜色

# 状态栏设定
statusbar.visible=1 # 是否显示底部状态栏
statusbar.number=1 # 状态栏行数
statusbar.text.1=\
Line: [$(LineNumber)/$(NbOfLines)] - Col: [$(ColumnNumber)] - [$(EOLMode)] - [$(OverType)]
# 包含 当前行数/总行数, 当前列数,换行模式,改写/插入,


保存这个配置之后,SciTE的表现已经好过各个平台自带的编辑器了。上手之后,可以根据需要进行更多的调整。例如可以在右键菜单中添加各类内部命令

user.context.menu=\
||\ # 分割线
View White Space|IDM_VIEWSPACE|\ # 显示空白字符
View End of Line|IDM_VIEWEOL|\ # 显示换行符
Tab Switch|IDM_TABSIZE|\ # 切换制表符
||\
Copy Path of This File|IDM_COPYPATH|\ # 复制文件路径

可以从Global配置文件中复制出不需要的语法高亮配置加以隐藏

menu.language=\
#FreeBasic|bas||\ # 注释不需要的语言
Txt|txt||\ # 保留需要的语言
……

不过,SciTE最强大的地方是它对Lua脚本的支持。而这恰恰也是网上资料最少的部分。Lua是一个轻量的脚本语言,非常适合嵌入到其他程序当中。原生SciTE中缺失的文本排序,字符统计,批量替换,空行删除等功能都可以通过Lua脚本实现。可以说,只有加载了Lua脚本的SciTE才是这个编辑器的完整形态。详细的设置步骤可以参考Lua用户社区中的相关页面。我这里以一个统计字数的简单函数为例进行说明。

首先要写一个Lua统计函数,需要调用SciTE的内部接口来进内容交互,使用Lua 的函数命令进行处理,这里是utf8.len

# lua脚本文件代码
function PrintUTF8Length() # UTF8 字符数统计
local sel = editor:GetSelText() # 捕获所选文本
print(utf8.len(sel)..' chars selected') # 输出字符统计结果
end

将上面的函数保存成后缀为lua的文本文件(最好删除中文字符)就得到Lua脚本。然后在配置文件中以下面的参数加入脚本路径并设置好菜单,重启SciTE之后就可以在Tools菜单中看到新命令了,这时只要点击一下就可以在右侧的输出面板看到结果。

ext.lua.startup.script=./scitelib.lua # 指定lua脚本路径
command.name.10.*=Length(UTF8) # 菜单命令名称
command.10.*=PrintUTF8Length # 调用函数名称
command.shortcut.10.*=Ctrl+M # 绑定快捷键
command.mode.10.*=subsystem:lua,savebefore:no # 是否保存

SciTE

因此,借助Lua语言和SciTE的内置API,可以对这个编辑器进行深度的定制。一度有不少软件都将SciTE改造成专用的IDE,比如Scite4AutoIt3。其他常用的Lua函数还包括

function replacetext() # 全局替换
local text = editor:GetText()
text = text:gsub("。", ".") # 全角句号改半角
editor:SetText(text)
end

function InsertDate() #插入当前日期
local date_string = os.date("%Y.%m.%d %H:%M")
editor:AddText(date_string)
end

function del_empty_lines() # 删除空行
local txt = editor:GetText()
if #txt == 0 then return end
local chg, n = false
while true do
txt, n = string.gsub(txt, "(\r?\n)%s*\r?\n", "%1")
if n == 0 then break end
chg = true
end
if chg then
editor:SetText(txt)
editor:GotoPos(0)
end
end

function pytemplate() # 片段模板插入
local py_temp = [[#! /usr/bin/python
# coding = utf-8
# By XXX @ ]] ..os.date("%Y.%m.%d").. [[
# Function:
# Usage:

def main():
print()

if __name__ == "__main__":
main()
]]
editor:AddText(py_temp)
end

你还可以在Lua用户社区中可以找到更多现成的脚本。需要注意的是,SciTE只会载入一个脚本,所以这些函数都要放到同一个文件当中。我知道的就是这些,祝玩得愉快!

订阅评论
提醒

0 评论
内联反馈
查看所有评论