Scite 文本折叠

lua-users home
wiki

文本文档的大纲模式

这是一个简单的扩展,它允许通过使折叠可用,以大纲形式查看结构化文本文档。它是一个基本的基于行的词法样式器的示例。它目前需要 SciteExtMan;要安装,请将 Files:wiki_insecure/editors/SciTE/fold.lua 放入您的 scite_lua 目录中。

文本文档当然有很多形式;此扩展会获取一些用于折叠信息的常见模式。默认情况下,使用 Wiki 约定,其中以一定数量的“=”字符开头的行表示标题

  =Main Heading
  ==Subheading 1
  ==Subheading 2
  ===Sub 2 1
  ===Sub 2 2
当然,您可以更改使用的字符。对于 Emacs 风格的大纲文件,请将此内容放入您的属性文件中
 text.outline.char=*
您可以指定哪些文件将被视为文本,以及使用哪些字体,以及以下属性。例如,我喜欢在固定系统字体中编辑文本(多年使用记事本对一个人来说就是这样!)
text.ext=*.txt;*.doc
text.font.name=Fixedsys
另一种常见风格是使用编号部分,例如 1.2.1。(也许是一种官僚主义的诅咒,但有些人喜欢它)。以下是如何设置文件夹以识别这种风格
text.outline.number=1

显示大纲

标准的 View|Toggle All Folds 命令现在将在您的文档上工作,您当然也可以以通常的方式手动折叠和展开。Wiki 风格的文档通常从“==”开始,并且没有顶级标题。在这种情况下,您可以指定起始级别是什么
 text.outline.start=1
这将允许您正确查看此页面标记的大纲。

Tools|Show Outline 显示所有折叠线

限制、实现和进一步的可能性

基于行的词法分析器并不总是能正常工作,因为它们期望按下回车键。我已经提供了一个 Tools|Rescan 命令来整理文档,如果它变得混乱;请注意,这会在缓冲区切换时自动发生。

这些函数允许您设置 Scintilla 控件的折叠级别,然后提取它。基本级别必须从 SC_FOLDLEVELBASE 开始,并且任何折叠线都必须另外具有 SC_FOLDLEVELHEADERFLAG。请注意,由真实词法分析器生成的折叠信息更复杂,并且必须伪造位运算。

local function set_level(i,lev,fold)
  local foldlevel = lev + SC_FOLDLEVELBASE
  if fold then 
     foldlevel = foldlevel + SC_FOLDLEVELHEADERFLAG
     editor.FoldExpanded[i] = true
  end
  editor.FoldLevel[i] = foldlevel
end

local function get_level(i)
  local fold = false
  local level_flags = editor.FoldLevel[i] - SC_FOLDLEVELBASE
  if level_flags - SC_FOLDLEVELHEADERFLAG >= 0 then
    fold = true
    level_flags = level_flags - SC_FOLDLEVELHEADERFLAG 
  end
  return level_flags, fold  
end
我已经将其制作成一个 SciteExtMan 脚本,以处理设置命令处理程序(最重要的是)OnEditorLine 事件的繁琐工作。这可能会与 OnOutputLine 事件混淆,因此如果您使用 Lua 控制台扩展,则预计在输出窗格中会收到偶尔的奇怪错误消息。

我一直在考虑进行自动级别编号生成,但这并不容易正确完成;当插入新项目时,必须重新编号项目,等等。(MS Word 会对此感到困惑)。这是一个定义文本文档的“主要”模式的开始(使用 Emacs 术语),显然还会有“次要”模式,例如 Wiki 标记。例如,如果它自动检测到诸如 editor.FoldLevel[i] 之类的表达式并将其放入等宽字体标记中,那就太酷了。

SteveDonovan


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2006 年 8 月 31 日下午 8:48 格林威治标准时间 (差异)