配置总览 主题真正会读的每一个站点参数:类型、默认值、去哪一页改。查参数从这里开始。
站点参数的唯一归属页。主题读取的每个键在下面某张表里有一行,给出类型、默认值与一句说明,并链接到讲它的指南页。指南页只给可粘贴的片段,不重复定义。页面级参数(front matter)见页面参数 。
表格按功能分组,每组一个 ##,锚点可以引用,例如 /zh/docs/customize/config/#sidebar。默认值一栏空着表示主题没有默认值 :不配置该功能就不生效。
hugo.yml 的分层 OINK 站点配置有四类键,改哪一层取决于改动目标:
最小的可用配置只需要前两层:
title : 产品文档
baseURL : https://docs.example.com/
defaultContentLanguage : zh
enableGitInfo : true
module :
imports :
- path : github.com/pgsty/oink
hugoVersion :
extended : true
min : 0.160.1
params :
offline_search : true
github_repo : https://github.com/example/product-docs 配置原则 主题默认保守,只写要改的键 。交互功能(本地搜索、图片缩放、评论、反馈、深浅色菜单)默认关闭,主题不替站点做策略决定。从一份「完整配置」逐条删减,比按需添加更容易留下用不上的键。
没有主题总开关 。不存在 oink.enabled,也没有 params.oink.* 命名空间,更没有在「Docsy 外壳」与「OINK 外壳」之间切换的选项。这一页查不到的开关即不存在。
非法值告警并回退到文档里写明的默认值 。params.ui.typography: solarized 报 invalid params.ui.typography "solarized" (allowed: technical | system) -- using "technical",站点照常构建;footer_style: thin、page_width: huge、section_index: grid 同理。一个笔误因此只降级一个设置,而不是让 hugo server 下每个 URL 都返回 HTTP 500。它也不会因此静悄悄上线:所有发布关卡都带 --panicOnWarning 构建,那条警告在那里仍然是硬失败。
有一条警告保留取值而不是丢弃它 。主题读出的 theme_color 若在它自己的画布上低于 AA 正文对比度(4.5:1),颜色照常生效 —— 自定义画布或品牌强制色是作者的决定 —— 但会说出来,并打印可以让它闭嘴的 ignoreLogs id。把它当建议而不是拒绝:要么换个更深的颜色,要么加一行配置,在你做出选择之前发布关卡会一直卡住构建。只有解析不出来的十六进制才会被真正丢弃,那种情况和其他非法值一样回退到默认配色。
主题自身从不中断构建 。它的模板里没有任何 errorf:每个非法值都走上面的告警并回退。需要外部端点的功能——PlantUML、Draw.io、Algolia——缺少端点时告警并保持关闭,因为主题不会代为连接公共服务;残缺的上游署名告警并略去整条声明,因为半条读起来和完整的一模一样。真正会中断构建的来自 Hugo 而非主题:解析不到目标的内容引用,以及低于 module.hugoVersion.min 的 Hugo 版本。
页面级覆盖优先级 Hugo 的 .Param 查找让大部分参数可以逐页覆盖,优先级从高到低:
页面自己的 front matter; 祖先分区 _index.md 里的 cascade(离页面越近越优先); 站点 params。 写进 front matter 时要去掉 ui. 前缀。
站点上的 params.ui.scroll_spy 在页面里就写成 scroll_spy。front matter 里出现 ui:
块的话,里面的键没有人读,也没有人报错——某个设置看着没生效时,先对照页面参数 核一遍键名。
---
title : 宽版参考
page_width : wide
navbar_enabled : false
footer_style : slim
scroll_spy : true
--- 分区级用 cascade 一次设定整棵子树:
---
title : 文档
cascade :
type : docs
footer_style : slim
feedback : true
--- 覆盖用于真实的内容差异。逐页重建一套视觉系统的配置,会在主题升级后失配。
三项 goldmark 前置 Hugo 不会 把主题模块的 markup 配置合并进站点,这三项必须写在站点自己的 hugo.yml 里,否则属性行、组件 HTML 与数学公式都不工作:
markup :
goldmark :
parser :
# 块级图片可以带属性行({caption=…}、编号图)
wrapStandAloneImageWithinParagraph : false
attribute :
block : true
renderer :
# `{{% … %}}` 型 shortcode 输出的 HTML 必须保留
unsafe : true
extensions :
passthrough :
enable : true
delimiters :
block : [[ '\[' , '\]' ], [ '$$' , '$$' ]]
inline : [[ '\(' , '\)' ]]
highlight :
# 代码高亮用 class 输出,深浅色才能各用一套配色
noClasses : false
tableOfContents :
endLevel : 4 缺 attribute.block 时,{.fields} {.steps} {caption=…} 会原样显示成文字;缺 passthrough 时 \(x\) 不会变成公式;缺 unsafe 时步骤与卡片的结构会被转义。
renderer.unsafe: true 同时允许 Markdown 正文里的原始 HTML 通过,面向的是受信任的作者,不是投稿过滤器。内容来自不可信来源时,审查应放在提交流程里。
站点身份与品牌 Hugo 原生顶层键:
title
, string站名,显示在顶栏、<title> 与页脚 baseURL
, string生产域名;子路径部署时带上路径段 copyright
, string版权行的兜底值,params.copyright 未设时按 HTML 原样渲染 enableGitInfo
, boolean
, default false打开后才有「最后修改」与 commit 信息 enableRobotsTXT
, boolean
, default false生成 robots.txt enableEmoji
, boolean
, default false允许 :smile: 简码 主题参数:
params.logo
, string
, default icons/logo.svg品牌图标,可指向 assets/ 资源或 static/ 路径,见品牌外观 params.wordmark
, string横向字标;设置后顶栏用它替代「图标 + 站名」 params.description
, string站点描述,页面没有 description 时作为 meta 兜底 params.copyright
, string 或 map字符串按 Markdown 渲染;map 接受 authors from_year to_year(present 表示今年) params.author
, string 或 mapRSS 的作者;map 接受 name 与 email params.ui.theme_color
, 字符串#rgb/#rrggbb 十六进制色,为外壳的强调底着色;正文链接与行内代码不受影响 —— 见品牌外观 params.ui.theme_color_dark
, 字符串
, default 派生强调色的暗色一半;省略时从 theme_color 提亮派生,直到在暗色画布上达到 AA favicon 没有参数:主题按约定名扫描 static/(favicon.ico favicon.svg favicon-NxN.png apple-touch-icon.png apple-touch-icon-NxN.png),见品牌外观 。
外壳类型与栏目根 外壳按 页面 type 生效,不看路径。文档可以放在任意目录,再用 cascade 给它 type: docs。
params.ui.shell_types
, list
, default [docs, book, blog, swagger]哪些 type 使用带侧栏的阅读外壳,见布局与页面类型 params.ui.docs_section
, string
, default docs文档栏目的根目录名,只用于导航解析 params.ui.blog_section
, string
, default blog博客栏目的根目录名 params.ui.quick_links
, list
, default [docs_section, blog_section]命令面板空查询时列出的顶层菜单 identifier,见命令面板 params.ui.section_index
, enum
, default list栏目首页子页列表样式:list 或 cards,可按分区覆盖 params.ui.section_index_columns
, integer
, default 2section_index: cards 时的列数博客 七个键决定博客栏目的样子。它们作用于 params.ui.blog_section 指定的栏目,每一个都能通过博客根目录的 front matter 或 cascade 按栏目覆盖。
params.ui.featured_image
, enum
, default none文章正文里怎么渲染自己的题图:none 不渲染,banner 在标题上方框出一张 16:9 的图,wash 把它铺在文章头部背后、只留十分之一的不透明度,hero 把它作为外壳自己的通栏背景铺开并把开头下移——单页与栏目列表页都一样。用的就是这一页在卡片与 og:image 里已经在用的那张图,两处不会打架。没有题图的文章在任何模式下都不渲染任何东西 params.ui.blog_index
, enum
, default list博客栏目列表页的形态:list 是行列表,cards 是内容卡片网格,卡片带 16:9 题图、日期与栏目行,以及三行摘要,table 是每篇一行的紧凑表格——整个栏目一次列全,不按年分组,也不分页。按年分组、分页与 manual_link 在 list 与 cards 下行为一致 params.ui.blog_index_columns
, integer
, default 3blog_index: cards 时的列数;md 到 xl 之间恒为两列,md 以下一列,不受此值影响params.ui.blog_index_size
, integer
, default 12list 与 cards 索引每页的文章数;table 形态总是列全。12 能被 2、3、4 整除,卡片行不会缺角params.ui.blog_index_toggle
, boolean
, default false让读者从索引工具栏在列表、卡片、表格之间切换。默认关闭,因为它会把三种形态都放进文档——隐藏的那些不加载图片,但标记是真实存在的 params.ui.toc_style
, enum
, default fixed右栏的呈现方式:fixed 是钉在视口上的面板,flow 是跟随内容流、从文章开头处开始、滚动后才钉住的宽面板 params.ui.toc_taxonomies
, boolean
, default true右栏的分类词云。既没有目录也没有词云的右栏不会渲染任何东西 作者与系列是 taxonomy 而不是参数,见分类法 与写博客 。
params.ui.navbar_enabled
, boolean
, default true是否渲染站点顶栏,可用页面顶层 navbar_enabled 覆盖,见导航与菜单 params.ui.navbar_autohide
, boolean
, default false顶栏收到视口上方,指针进入唤醒区才出现;小于 768px 或粗指针时不生效 params.ui.dark_mode
, boolean 或 map
, default falsetrue 同时启用深色调色板与主题控件;只要控件写 dark_mode: { show_menu: true }params.ui.breadcrumb
, boolean
, default true面包屑;设为 false 关闭。顶层分区本来就省略只有一级的面包屑 params.ui.github_stars
, string 或 number顶栏 GitHub 徽标上的星数,本地常量,不发请求 params.ui.alt_site
, map单语言站在页脚显示的姊妹站链接,必填 label 与绝对 http(s) 的 url 胖页脚的列数据来自 data/footer/<语言>.yaml,不是参数,见导航与菜单 。
params.ui.taxonomy_icons
, map按分类复数名指定右栏分组图标,例如 tags: fa-solid fa-tags 侧栏怎么用见布局与页面类型 ;目录树本身由 content/ 的结构决定,见组织内容 。
目录 TOC 右栏大纲的层级由 Hugo 原生配置决定,主题只控制跟踪行为:
markup.tableOfContents.startLevel
, integer
, default 2Hugo 原生:收录的最高标题级别 markup.tableOfContents.endLevel
, integer
, default 3Hugo 原生:收录的最低标题级别 单页隐藏大纲用 front matter notoc: true,见页面参数 。
翻页与页尾 页尾组件顺序固定为分享 → 反馈 → 页面信息 → 翻页 → 评论,五者独立开关;反向链接在右栏目录旁。
params.ui.share
, list
, default []页尾分享目标,按给定顺序渲染,取值来自 x bluesky mastodon facebook linkedin reddit hackernews telegram whatsapp line pinterest weibo chatgpt claude email copy。为空则不出现分享栏。每一项都是纯粹的 intent 链接——没有 SDK、没有 iframe、没有第三方脚本、没有分享计数,见写博客 。未知目标告警并丢弃 params.ui.annotation
, boolean
, default true正文末尾的「最后修改」与出处区块;上游署名由页面的 upstream_link 一族键驱动,见页面参数 params.ui.backlinks
, boolean
, default false在右栏目录旁以「反链」组列出链接到本页的页面,构建时从普通链接派生,见导航与菜单 params.ui.translation_notice
, 语言代码或 false
, default false权威版本的语言代码,译文页据此显示一条指回原文的说明;页面写 translation_notice: false 退出 params.ui.reading_time
, boolean
, default false页面标题下显示阅读时长 params.ui.book_draft_banner
, boolean
, default falseBook 草稿页开头额外加一条横幅 搜索与命令面板 本地搜索默认关闭;打开后命令面板才会出现(顶栏放大镜、Cmd/Ctrl + 加 K 、/、\)。
params.offline_search
, boolean
, default false生成每语言一份本地索引并启用命令面板,见全文检索 params.offline_search_on_serve
, boolean
, default truehugo server 预览时也构建索引,预览行为与线上一致;站点极大时设 false 跳过以加快本地重建params.offline_search_index
, enum
, default content索引范围,逐级累加:title heading summary content。非法值告警并使用 content params.offline_search_summary_length
, integer
, default 70summary 档摘录截断的字数params.offline_search_max_results
, integer
, default 10结果条数上限,同时约束 Lunr 与中文子串兜底 params.ui.landing_search
, boolean
, default truelayout: landing 页面是否保留搜索入口params.ui.command_palette.commands
, list
, default []自定义命令,每条二选一:url 或内置 action;见命令面板 params.gcs_engine_id
, stringGoogle 可编程搜索引擎 ID,启用后引入外部服务 params.search.algolia
, mapAlgolia DocSearch,必须显式给出 appId apiKey indexName,缺一则告警并保持 DocSearch 关闭 自定义命令的每条记录只接受 id title description icon keywords url action 七个键;id 必须匹配 ^[a-z][a-z0-9_-]*$,且不能与内置动作 ID 重名。分语言的标题写在 languages.<lang>.params.ui.command_palette.commands。
键盘 params.ui.keyboard_nav
, boolean
, default true单键导航(WASD/方向键走树、j/k 跳标题、q/e 翻页、面板与外壳开关)。设为 false 后运行时不进包,见键盘导航 图片缩放 params.ui.image_zoom
, boolean
, default false允许正文图片点击放大;页面用 front matter image_zoom 覆盖。非布尔告警并回退 哪些图片会成为缩放候选见图片 。
字体排版 params.ui.typography
, enum
, default technicaltechnical 用随主题分发的 Inter / Chakra Petch / IBM Plex Mono;system 只用平台字体栈,不请求品牌字体。非法值告警并回退params.page_width
, enum
, default normal外壳整体宽度:normal wide full,可逐页覆盖 params.reading_width
, enum
, default normalBook 页正文的阅读行宽:slim normal wide,不影响外壳 自定义字体与配色走 SCSS 入口而不是 YAML,见品牌外观 。
params.ui.feedback.enable
, boolean
, default false页尾「这页有帮助吗」两个按钮;无后端,有 gtag 时记录结构化事件 params.ui.feedback.reasons
, boolean
, default true选「否」后展开四个可选原因 四个 giscus 必填项缺任意一个,评论区就不渲染:不报错,也不出现。
仓库链接与页面信息 params.github_repo
, string内容仓库 URL,解析「编辑本页」「查看历史」「新建子页」「提文档 issue」,见仓库与页面信息 params.github_project_repo
, string
, default github_repo产品仓库 URL,用于「提项目 issue」与顶栏 GitHub 入口 params.github_branch
, string
, default main编辑链接指向的分支 params.github_subdir
, string内容站在 monorepo 里的子目录 params.path_base_for_github_subdir
, string 或 map源路径重写;map 形式接受 from 与 to params.github_url
, —
, default —已移除,改写 params.github_repo。那份负责提示替代键名的迁移登记表已经删掉,所以旧键现在只是一个没人读的键 params.ui.lastmod_commit
, enum
, default subject「最后修改」后面附什么:subject commit 标题、hash 短哈希、none 不附。非法值告警并回退 params.images
, string 数组
, default —站点级社交卡片:页面自己没有封面时用它填 og:image;只进元数据,不会渲染成列表缩略图 params.default_featured
, —
, default —已移除,改写 params.images 或栏目 cascade 里的 images。同上,旧键现在只是一个没人读的键 内容运行时 Mermaid、KaTeX、ECharts、Infographic、Asciinema、Swagger UI 与 Redoc 按内容自动检测,只有用到它们的页面、且只在该页的 HTML 输出里加载,没有站点开关。需要开关或外部端点的只有这几个:
params.markmap
, boolean
, default false站点级启用思维导图围栏,见思维导图 params.mermaid
, map透传给 mermaid.initialize() 的配置;键名全小写,深色模式自动覆盖 theme params.plantuml.enable
, boolean
, default false启用 PlantUML 围栏,见 PlantUML params.plantuml.svg_image_url
, stringPlantUML 服务的 SVG 端点,启用时必填,缺失则告警并保持 PlantUML 关闭 params.plantuml.svg
, boolean用内联 SVG 而不是 <img> 渲染 params.drawio.enable
, boolean
, default false启用 .drawio.svg 图片的编辑按钮,见 Draw.io params.drawio.drawio_server
, stringDraw.io 编辑器地址,启用时必填,缺失则告警并保持 Diagrams.net 关闭 params.highlight_classes
, boolean
, default true代码高亮输出 Chroma class;设 false 回到 Hugo 的行内样式 params.ui.code_copy
, boolean
, default true代码块的复制按钮;设为 false 全局去掉,围栏上的 copy= 仍然优先 数学公式不需要参数,只需要 passthrough 前置 。
输出格式 主题声明了两种自定义输出格式,但 不替站点打开 :要哪种就在 outputs 里写哪种。
outputs :
home : [ HTML, markdown, LLMS]
page : [ HTML, markdown]
section : [ HTML, RSS, print, markdown] 打印输出的两个参数:
params.print.toc
, boolean
, default true打印页开头生成目录;设为 false 不生成 params.print.section_break_wordcount
, integer
, default 50打印页中一节多少词以上才另起一页 多语言与版本 语言用 Hugo 原生的 languages 块定义,主题只读它建立的翻译关系:
defaultContentLanguage
, string
, default en不带路径前缀的首要语言 languages.<lang>.label
, string该语言的自称,显示在语言菜单里 languages.<lang>.locale
, string完整 locale,用于 <html lang> 与 SEO languages.<lang>.weight
, integer语言顺序,也是点击语言图标时的循环顺序 languages.<lang>.title
, string该语言的站名 languages.<lang>.languageDirection
, string
, default ltrRTL 语言设为 rtl 写作侧的对等文件、锚点对齐与缺译回退见多语言 。
版本相关参数:
params.version
, string当前站点变体的版本标识(不一定是 Git ref),见多版本 params.versions
, list版本条目:version url kind,name: '---' 是分隔线 params.archived_version
, boolean顶部显示「这是归档版本」横幅 params.url_latest_version
, string归档横幅里指向最新版的链接 params.time_format_blog
, string
, default 2006-01-02博客日期格式,按语言覆盖 其它 taxonomies
, mapHugo 原生:启用 tag: tags / category: categories,见分类体系 services.googleAnalytics.id
, stringHugo 原生:分析脚本只在生产构建注入,见分析与 SEO module.hugoVersion.min
, string
, default 0.160.1主题声明的 Hugo 下限,低于它构建失败 module.hugoVersion.extended
, boolean
, default true必须是 Hugo Extended(要编译 SCSS) 通过生成式 Schema 获得编辑器补全 主题在其 schema/ 目录下携带两个生成的 JSON Schema:校验站点 hugo.yaml 的
site-params.schema.json 与校验页面 front matter 的
front-matter.schema.json。它们是主题自身 hugo.yaml 默认值(注释即悬浮文档)
与参数扫描注册表的投影;主题 CI 会重新生成并在漂移时失败,因此它们永远不会与你
pin 的主题版本相左。
配合 VS Code YAML 扩展,在设置中映射站点 Schema:
{
"yaml.schemas" : {
"https://raw.githubusercontent.com/pgsty/oink/main/schema/site-params.schema.json" : "hugo.yaml"
}
} 把 URL 里的 main 换成你的发布 tag,与 go.mod 的 pin 保持一致。front matter
补全取决于你的 Markdown 工具链,用同样方式指向 front-matter.schema.json 即可。
front-matter Schema 刻意不带类型约束,因为 share、theme_color 这类键在常规
类型之外还接受裸布尔退出。
验证配置变更 改完配置跑一次严格构建:
hugo --printPathWarnings --panicOnWarning 输出 Total in … 且没有 ERROR / WARN 才算通过。常见报错与原因:
配置改动还要至少验证三件事:每种语言各一页、缺译页的回退、生产 baseURL 下的链接(子路径部署容易漏)。
主题声明的 Hugo 下限是 0.160.1,当前验证版本是 0.164.0。改动配置后按这两个版本各构建一次,可以及早发现只在新版本可用的特性:
# 下限版本的二进制
/path/to/hugo-0.160.1 --printPathWarnings --panicOnWarning
# 当前验证版本
hugo --printPathWarnings --panicOnWarning 下限版本写在主题的 hugo.yaml 与 theme.toml 里,站点自己的 module.hugoVersion.min 应与它一致。