☰
novelWriter 项目组织完全指南:Root Folders、文档结构与状态标签详解
2026/10/5 2:22:31 网站建设 项目流程
  • 桌面应用

【免费下载链接】novelWriter

novelWriter is an open source plain text editor designed for writing novels

项目地址:https://gitcode.com/gh_mirrors/no/novelWriter
点击查看免费下载

本篇指南系统讲解 novelWriter 的项目组织机制:从主窗口左侧的Project Content项目树出发,逐步深入 Root Folders(根文件夹)的十一种类型、普通文件夹、两种文档类型、文档模板、活跃状态以及 Status/Importance 标签体系。读完本文,你将掌握如何为一部小说及其配套笔记搭建清晰的项目结构,并理解这一结构与 novelWriter 标签-引用系统的内在关联,从而为后续的手稿构建、大纲视图与跨文档引用打下基础。

Project Content:项目树的入口

novelWriter 将整个项目组织为一组顶层文件夹(Root Folders),每个根文件夹在项目中都有特定含义。你的正文文档和笔记文档全部存放在这些根文件夹之下,并统一显示在主窗口左侧的Project Content面板中。

项目树的每一行展示如下信息:

  • 名称:条目名称,可随时重命名;
  • 字数(或字符数):从源码看,显示字数还是字符数由全局配置useCharCount决定,见 novelwriter/core/item.py 中mainCount的实现;
  • 活跃状态图标:第三列,标识文档为 Active 或 Inactive;
  • 状态/重要性图标:第四列,展示该条目当前使用的 Status 或 Importance 标签图标。

你可以通过右键点击项目树中的条目来添加、查看和编辑文档;一部分功能也位于Project Content标签右侧的工具栏按钮上。工具栏与树的交互逻辑集中在 novelwriter/gui/projtree.py,其中还内置了若干键盘快捷键:Ctrl+Up/Ctrl+Down上下移动条目,Alt+Up/Alt+Down在同级条目间导航,Alt+Left/Alt+Right跳转到父条目或首个子条目,Ctrl+.打开上下文菜单,Ctrl+N打开 Add Item 菜单,Ctrl+L打开 Quick Links 菜单。

Root Folders 的工作原理

项目被划分为一组顶层根文件夹,它们显示在项目树的最左侧层级,每种类型都有独立的图标(图标映射见 novelwriter/constants.py 的CLASS_ICON表)。分工的基本原则是:

  • 构成故事的文档放入Novel类型根文件夹;
  • 笔记放入其余类型的根文件夹,按笔记内容分类存放。

这种分类不只是为了组织整洁——它直接决定了后续标签(Tags)与引用(References)系统的工作方式。一个标签归属于哪类故事元素,取决于它所在的根文件夹类型,详见 标签与引用系统。

新建项目时,并非所有根文件夹都会预先存在,你可以通过项目树工具栏的Add Item → Root Folder子菜单按需添加。可添加的根类型在 novelwriter/gui/projtree.py 的_buildRootMenu方法中定义,包括 Novel、Plot、Characters、Locations、Timeline、Objects、Entities、Custom、Archive、Templates。

需要特别说明:除Novel文件夹外,novelWriter 对其他根文件夹中放什么内容不做任何限制——你完全可以按自己的习惯使用它们。在 novelwriter/core/item.py 的setClassDefaults方法中可以看到,仅当条目位于允许文档布局(document layout)的类下时才作为小说文档处理,其余一律按笔记处理。

Root Folder Types 根文件夹类型详表

下表完整列出十一种根文件夹的预期用途:

根文件夹类型类别用途说明
NovelStory存放构成故事正文的文档。可以创建多个 Novel 文件夹(例如同一项目容纳一个系列的多部小说),但应用的多处逻辑默认假设每个 Novel 文件夹只属于一部小说。Novel 文件夹是特殊的:它可以包含章节(Chapter)、场景(Scene)与故事分卷(Partition)文档,具体由文档内的标题级别(Heading)指示,详见章节与场景。
PlotNotes存放剧情大纲与情节笔记,尤其适合梳理子情节(sub-plot);场景文档可以引用这些子情节标签,便于跟踪故事进度。
CharactersNotes存放人物笔记。主要角色建议一人一个文档,次要角色可以合并到一个文档中;章节与场景中可以将它们引用为视角(point-of-view)或焦点(focus)人物。
LocationsNotes记录故事发生的地点。与 Plot、Characters 并列为最需要跟踪与引用的三大故事要素。
TimelineNotes当故事有多条时间线,或单条时间线内存在时间跳跃时,用此文件夹跟踪时间线。
ObjectsNotes跟踪故事中的重要物品,例如经常易手的实体物件。
EntitiesNotes组织剧情中的强大组织、公司或其他实体。
CustomNotes跟踪上述类别未覆盖的任何其他内容。
Templates—放入此文件夹的文档会作为新建文档时的模板选项出现,详见下文「Document Templates」。
Archive—不想删除、也不愿放进可能被永久删除的Trash,但又想移出主项目的文档放这里。Archive 中的内容会被标签扫描器忽略,也不会出现在大纲视图(Outline View)和手稿中。
Trash—行为与直觉一致:放入这里的任何内容都可以从项目中永久删除,且其内容不会出现在 novelWriter 的任何其他位置。

提示:根文件夹都有标准名称,但你可以随意重命名它们。名称只是标签,不影响类型语义——类型由内部枚举决定,见 novelwriter/enum.py 的nwItemClass。

根文件夹类型与标签系统的绑定

根文件夹类型与标签/引用系统紧密耦合:每种 Novel 或 Notes 类型根文件夹都对应一类或多类标签,用于引用其中的内容(详见标签与引用系统)。这一绑定关系在源码层面有清晰映射:nwKeyWords.KEY_CLASS表将@pov、@focus、@char映射到nwItemClass.CHARACTER,@plot映射到PLOT,@location映射到WORLD,@time映射到TIMELINE,@object映射到OBJECT,@entity映射到ENTITY,@custom映射到CUSTOM,@story映射到NOVEL,见 novelwriter/constants.py。也就是说,你放在 Characters 根文件夹下的笔记文档中定义的@tag,会自动成为项目中可被@pov等关键词引用的"人物"。

Regular Folders 普通文件夹

除根文件夹外,你可以在项目中的任意位置添加普通文件夹。它们纯粹用于把文档组织进有意义的区块,并在不工作时折叠隐藏。当 novelWriter 处理项目文档(例如生成手稿)时,普通文件夹会被忽略——只有文档自身的顺序起作用。从数据模型看,文件夹与根、文件同属ProjectItem体系,通过nwItemType枚举区分(ROOT / FOLDER / FILE),见 novelwriter/enum.py。

Documents 文档

文档可以添加到项目结构中的任意位置,甚至可以像文件夹一样作为其他文档的子条目存在——例如把一组场景挂在对应章节之下,或在笔记中建立地点层级。注意:项目树中的文档名称与文档正文中的任何标题都没有绑定关系,把文档名当作文件名理解即可,任何项目条目都可随时重命名。

文档分为两种类型:

  • Novel Documents(小说文档):构成故事正文的文档,只能在Novel类型根文件夹下添加;技术上也可以添加到Archive下。其处理方式(标题级别 H1–H4 如何对应分卷/章节/场景/小节)详见章节与场景。
  • Project Notes(项目笔记):存放笔记的文档,可以添加到项目任意位置,包括Novel类型文件夹下——此时默认不会被当作故事的一部分处理。

类型转换:两种文档类型在都允许的位置可以互相转换;文件夹也可以转换为文档,反之亦然,这在某些整理场景下相当方便。从源码看,这一能力由ProjectItem.documentAllowed()与setClassDefaults()配合实现:文档布局(DOCUMENT)仅允许出现在 Novel、Archive、Templates、Trash 类之下,其他类下强制按笔记(NOTE)处理,见 novelwriter/core/item.py 与 novelwriter/core/item.py。

拆分与合并:另一个实用特性是按标题级别把文档拆分为多个子文档,或把多个文档合并为一个。如果你起步时用的是较大的结构文档(例如一个 Act 内含全部章节与场景),开始正式写作后再按标题拆分即可。这两个操作由GuiProjectTree.mergeDocuments()与GuiProjectTree.splitDocument()驱动,底层调用DocMerger/DocSplitter核心工具,见 novelwriter/gui/projtree.py,完整操作说明见拆分与合并文档。

Document Templates 文档模板

如果你想为新建文档准备模板(例如一份人物笔记模板),可以向项目添加一个Templates根文件夹。凡是放入该文件夹的文档都会出现在项目树工具栏的Add Item菜单中;选中后,novelWriter 会创建一份新文档,并将所选模板的内容复制进去(该特性自版本 2.3 起提供)。

一个有用的细节:如果模板文件的第一行是标题行,那么首次创建文档时,该标题文本会被替换为文档标签(label)的文本。例如模板首行是# Character,新建文档标签填Jane,则新文档首行自动变为# Jane。在源码中,模板文档必须处于 Active 状态才会出现在模板菜单里:processTemplateDocuments()只处理isTemplateFile()且isActive的条目,见 novelwriter/gui/projtree.py。

Active 与 Inactive 文档

每个文档都可以被设为Active或Inactive,这会改变项目树第三列中的图标。这一状态主要服务于你的便利,用于指示该文档是否应包含在手稿中——可以把 Inactive 理解为"整文档级的外摘(out-take)":无需移动到Archive即可将其从主线中取出。

默认情况下,Inactive 文档被排除在手稿之外,但如果你愿意,可以在手稿构建的文档选择设置中覆盖这一行为。源码中,ProjectItem.setActive()维护该标志,而_updateDailyTarget()表明:只有Active 且属于 Novel 类且为文档布局的条目才会计入项目写作目标(daily target)统计,见 novelwriter/core/item.py。

Importance 与 Status 标签

项目中的每个文档或文件夹都可以设置一个Status或Importance标签。这些是完全由你自己定义和控制的标签与图标,novelWriter 自身不会用它们做任何自动处理。你可以在Project Settings(项目菜单,或快捷键Ctrl+Shift+,)中修改这些标签:

  • Status 标签:用于标记小说文档的完成阶段,例如"草稿"、"已完稿";
  • Importance 标签:用于标记人物笔记或其他项目笔记的重要程度,例如"主角"、"重要配角"、"次要角色"。

到底用哪个,取决于文档所在的根文件夹:位于Novel类型文件夹中的条目使用 Status 标签,其余条目使用 Importance 标签。从源码看,getImportStatus()依据isNovelLike()判定——Novel、Archive、Templates 三类均视为 novel-like,使用itemStatus存储的 Status 标签,否则使用itemImport存储的 Importance 标签,见 novelwriter/core/item.py 与 novelwriter/core/item.py。

标签的自定义维度:名称、颜色与形状

在项目设置的Status与Importance两个页面中,每个标签条目包含三要素:

  1. 名称:显示在项目树中的文本;
  2. 颜色:可使用主题预设色(default、base、faded、red、orange、yellow、green、cyan、blue、purple),也可选自定义 RGB 颜色;
  3. 形状:从预定义形状列表中选取——包括 Square、Triangle、Nabla、Diamond、Pentagon、Hexagon、Star、Pacman、四档圆(1/4、1/2、3/4、整圆)、四档竖条(1–4 Bars)、四档方块(1–4 Blocks),形状枚举完整定义见 novelwriter/enum.py,形状绘制实现在 novelwriter/core/status.py。

底层实现上,Status 与 Importance 共用同一个ItemStatus类,通过前缀"s"与"i"区分两套存储(ItemStatus.STATUS = "s"、ItemStatus.IMPORT = "i"),见 novelwriter/core/status.py。在项目设置对话框中,两个页面分别调用project.updateStatus("s", ...)与project.updateStatus("i", ...)完成保存,见 novelwriter/dialogs/projectsettings.py。

源码视角:项目树的数据模型

理解项目组织机制的底层,建议顺带了解两个核心类:

  • ProjectItem(novelwriter/core/item.py):单个条目的数据类,保存名称、handle、父/根引用、类型(ROOT/FOLDER/FILE)、类(Novel/Plot/…)、布局(DOCUMENT/NOTE)、Status/Importance 键、Active 标志,以及字数、字符数、段落数、光标位置等文档元数据。文档说明明确要求"只有ProjectTree类负责创建实例并保证 handle 合法"。
  • ProjectTree(novelwriter/core/tree.py):整个项目树的数据类,持有全部ProjectItem实例;每个条目有一个 13 位随机十六进制 handle,同时用作项目内的唯一标识与磁盘文件名。树遍历设有 999 层的递归上限(MAX_DEPTH)以防御环状结构。

GUI 一侧,GuiProjectView(面板容器)、GuiProjectToolBar(工具栏:Quick Links、上下移动、Add Item、More Options)与GuiProjectTree(树控件本身)共同构成了 Project Content 面板,支持拖拽移动、右键菜单、多选(ExtendedSelection)等交互,见 novelwriter/gui/projtree.py。

测试验证与进一步阅读

上述组织机制均有对应的自动化测试覆盖,可以作为行为契约参考:tests/gui/test_projtree.py验证项目树 GUI 行为,tests/core/test_tree.py验证ProjectTree数据模型,tests/core/test_item.py验证ProjectItem的属性与类型约束,tests/core/test_status.py验证 Status/Importance 标签存储与图标生成。

若想继续深入关联主题,推荐按以下顺序阅读:

  • 标签与引用系统:根文件夹类型如何决定标签类别,@tag与@pov等引用关键词的完整语法;
  • 章节与场景:H1–H4 标题级别如何将 Novel 文档组织成分卷、章节、场景与小节;
  • 拆分与合并文档:按标题拆分与合并文档的操作细节;
  • 项目设置:Status/Importance 标签的导入导出、备份等项目管理功能。
  • 桌面应用

【免费下载链接】novelWriter

novelWriter is an open source plain text editor designed for writing novels

项目地址:https://gitcode.com/gh_mirrors/no/novelWriter
点击查看免费下载
上一篇:善用 Rust 类型系统:从编译期不变量到 Typestate 与零成本抽象的工程实践
下一篇:Carbon 语言公开化提案 p001363 全解析:从封闭实验到开放共建的治理实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询