-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path17.html
More file actions
276 lines (276 loc) · 22.2 KB
/
Copy path17.html
File metadata and controls
276 lines (276 loc) · 22.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="CodeClub - OpenCode 格式化工具" />
<meta name="author" content="Jackson" />
<title>OpenCode 格式化工具 - CodeClub</title>
<link rel="icon" type="image/x-icon" href="../../img/logo.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
<link rel="stylesheet" href="../../css/main.css" />
<link rel="stylesheet" href="../../css/dark-mode.css" />
<link rel="stylesheet" href="../../css/mobile-optimizations.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.0/marked.min.js"></script>
<style>
.tutorial-page {
max-width: 1200px;
margin: 70px auto 40px;
padding: 0 20px;
display: flex;
gap: 20px;
}
.tutorial-sidebar {
width: 240px;
flex-shrink: 0;
position: sticky;
top: 70px;
max-height: calc(100vh - 90px);
overflow-y: auto;
background: var(--bg-secondary, #fff);
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.tutorial-sidebar h3 {
font-size: 15px;
margin: 0 0 12px;
color: var(--text-primary, #1a1a2e);
padding-bottom: 8px;
border-bottom: 2px solid var(--primary, #3b82f6);
}
.tutorial-sidebar a {
display: block;
padding: 5px 8px;
color: var(--text-secondary, #666);
text-decoration: none;
font-size: 13px;
border-radius: 4px;
line-height: 1.4;
}
.tutorial-sidebar a:hover {
background: var(--primary, #3b82f6);
color: #fff;
}
.tutorial-sidebar a.active {
background: var(--primary, #3b82f6);
color: #fff;
font-weight: 600;
}
.tutorial-main {
flex: 1;
min-width: 0;
}
.tutorial-article {
background: var(--bg-secondary, #fff);
border-radius: 8px;
padding: 32px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.tutorial-article h1 {
font-size: 26px;
margin-bottom: 16px;
color: var(--text-primary, #1a1a2e);
border-bottom: 2px solid var(--primary, #3b82f6);
padding-bottom: 12px;
}
.markdown-body {
font-size: 15px;
line-height: 1.8;
color: var(--text-secondary, #333);
}
.markdown-body h1 {
font-size: 24px;
border-bottom: 1px solid var(--border, #e5e7eb);
padding-bottom: 8px;
}
.markdown-body h2 {
font-size: 20px;
border-bottom: 1px solid var(--border, #e5e7eb);
padding-bottom: 6px;
}
.markdown-body h3 {
font-size: 17px;
}
.markdown-body pre {
background: #1e1e2e;
color: #cdd6f4;
padding: 16px;
border-radius: 8px;
overflow-x: auto;
}
.markdown-body code {
font-family: 'Fira Code', 'Cascadia Code', monospace;
font-size: 14px;
}
.markdown-body p code {
background: #f1f5f9;
padding: 2px 6px;
border-radius: 4px;
color: #e83e8c;
}
.markdown-body blockquote {
border-left: 4px solid var(--primary, #3b82f6);
padding: 12px 20px;
margin: 16px 0;
background: #f8fafc;
border-radius: 0 8px 8px 0;
}
.markdown-body img {
max-width: 100%;
border-radius: 8px;
}
.markdown-body table {
border-collapse: collapse;
width: 100%;
margin: 16px 0;
}
.markdown-body table th,
.markdown-body table td {
border: 1px solid var(--border, #e5e7eb);
padding: 8px 12px;
text-align: left;
}
.markdown-body table th {
background: var(--bg-primary, #f8fafc);
font-weight: 600;
}
.markdown-body table tr:nth-child(2n) {
background: var(--bg-primary, #f8fafc);
}
.markdown-body ul,
.markdown-body ol {
padding-left: 24px;
margin: 12px 0;
}
.markdown-body li {
margin: 4px 0;
}
.markdown-body hr {
border: none;
border-top: 1px solid var(--border, #e5e7eb);
margin: 24px 0;
}
.markdown-body a {
color: var(--primary, #3b82f6);
text-decoration: none;
}
.markdown-body a:hover {
text-decoration: underline;
}
.page-navigation {
display: flex;
justify-content: space-between;
margin-top: 24px;
padding-top: 16px;
border-top: 1px solid var(--border, #e5e7eb);
}
.page-nav-link {
color: var(--primary, #3b82f6);
text-decoration: none;
font-weight: 500;
font-size: 14px;
}
.page-nav-link:hover {
text-decoration: underline;
}
.source-link {
margin-top: 16px;
font-size: 13px;
color: var(--text-secondary, #999);
}
.source-link a {
color: var(--primary, #3b82f6);
}
@media (max-width: 768px) {
.tutorial-page {
flex-direction: column;
}
.tutorial-sidebar {
width: 100%;
position: static;
max-height: 200px;
}
}
</style>
</head>
<body>
<nav class="navbar">
<div class="navbar-container">
<a class="navbar-brand" href="../../index.html">
<img src="../../img/logo.png" alt="CodeClub" width="32" height="32" />
<span>CodeClub</span>
</a>
<button class="mobile-menu-toggle" aria-label="切换导航菜单"><span></span><span></span><span></span></button>
<ul class="navbar-nav">
<li><a class="nav-link" href="../../index.html">首页</a></li>
<li><a class="nav-link" href="../../nav.html">网址导航</a></li>
<li><a class="nav-link" href="../../blog/">博客</a></li>
<li><a class="nav-link" href="../../wiki/index.html" target="_blank">WiKi</a></li>
<li><a class="nav-link active" href="../index.html">教程</a></li>
<li><a class="nav-link" href="../../book.html">图书</a></li>
<li><a class="nav-link" href="../../contact.html">联系我</a></li>
<li><a class="nav-link" href="../../about.html">关于我</a></li>
</ul>
</div>
</nav>
<div class="tutorial-page">
<div class="tutorial-sidebar">
<h3>📖 OpenCode</h3>
<a href="0.html">OpenCode 教程</a>
<a href="1.html">OpenCode 简介</a>
<a href="2.html">OpenCode 安装</a>
<a href="3.html">OpenCode 配置</a>
<a href="4.html">OpenCode 第一次使用</a>
<a href="5.html">OpenCode VSCode</a>
<a href="6.html">OpenCode 终端界面</a>
<a href="7.html">OpenCode CLI 使用</a>
<a href="8.html">OpenCode Web 使用</a>
<a href="9.html">OpenCode GitHub</a>
<a href="10.html">OpenCode GitLab</a>
<a href="11.html">OpenCode 工具</a>
<a href="12.html">OpenCode 规则</a>
<a href="13.html">OpenCode 代理</a>
<a href="14.html">OpenCode 主题</a>
<a href="15.html">OpenCode 快捷键</a>
<a href="16.html">OpenCode 自定义命令</a>
<a href="17.html" class="active">OpenCode 格式化工具</a>
<a href="18.html">OpenCode 权限配置</a>
<a href="19.html">OpenCode LSP 服务器配置</a>
<a href="20.html">OpenCode MCP 服务器配置</a>
<a href="21.html">OpenCode Skills</a>
<a href="22.html">OpenCode 自定义工具</a>
</div>
<div class="tutorial-main">
<div class="tutorial-article">
<div class="markdown-body" id="md-content"></div>
<div class="page-navigation">
<a href="16.html" class="page-nav-link">← OpenCode 自定义命令</a>
<a href="18.html" class="page-nav-link">OpenCode 权限配置 →</a>
</div>
<div class="source-link">原文来源:<a href="https://www.runoob.com" target="_blank">菜鸟教程</a></div>
</div>
</div>
</div>
<footer class="footer">
<div class="footer-content"><p>© 2024 CodeClub. All rights reserved.</p></div>
</footer>
<script src="../../js/dark-mode.js"></script>
<script src="../../js/mobile-menu.js"></script>
<script>
const md = `# OpenCode 格式化工具\n\n\nOpenCode 会在每次写入或编辑文件后,**自动**使用对应语言的格式化工具对其进行格式化,确保生成的代码始终符合你项目的代码风格。整个过程在后台静默完成,无需任何手动操作。\n\n\n\n\n---\n\n\n## 工作原理\n\n\n当 OpenCode 写入或编辑文件时,会按以下步骤自动执行格式化:\n\n\n\n\n\n\n- 检测被写入或编辑的文件扩展名(如 \`.ts\`、\`.py\`、\`.go\` 等)\n\n- 将扩展名与所有已启用的格式化工具进行匹配\n\n- 对该文件运行匹配到的格式化命令\n\n- 自动将格式化结果写回文件\n\n\n\n例如,如果你的项目 \`package.json\` 中包含 \`prettier\` 依赖,OpenCode 就会自动检测到并在每次编辑 \`.js\`、\`.ts\`、\`.css\` 等文件后调用 prettier 进行格式化,无需任何额外配置。\n\n\n\n\n---\n\n\n## 内置格式化工具\n\n\nOpenCode 内置了覆盖主流语言和框架的格式化工具支持,分为两类:\n\n\n\n\n\n\n- **命令可用即启用**:只需在系统中安装对应命令,OpenCode 会自动检测并使用\n\n- **需要项目配置文件或依赖**:需要在项目中包含特定的配置文件或依赖包\n\n\n\n\n \n \n 格式化工具\n 支持的文件扩展名\n 启用要求\n \n \n \n \n \`air\`\n \`.R\`\n \`air\` 命令可用\n \n \n \`biome\`\n \`.js\` \`.jsx\` \`.ts\` \`.tsx\` \`.html\` \`.css\` \`.md\` \`.json\` \`.yaml\` 及更多\n 项目中存在 \`biome.json\` 或 \`biome.jsonc\` 配置文件\n \n \n \`cargofmt\`\n \`.rs\`\n \`cargo fmt\` 命令可用\n \n \n \`clang-format\`\n \`.c\` \`.cpp\` \`.h\` \`.hpp\` \`.ino\` 及更多\n 项目中存在 \`.clang-format\` 配置文件\n \n \n \`cljfmt\`\n \`.clj\` \`.cljs\` \`.cljc\` \`.edn\`\n \`cljfmt\` 命令可用\n \n \n \`dart\`\n \`.dart\`\n \`dart\` 命令可用\n \n \n \`dfmt\`\n \`.d\`\n \`dfmt\` 命令可用\n \n \n \`gleam\`\n \`.gleam\`\n \`gleam\` 命令可用\n \n \n \`gofmt\`\n \`.go\`\n \`gofmt\` 命令可用\n \n \n \`htmlbeautifier\`\n \`.erb\` \`.html.erb\`\n \`htmlbeautifier\` 命令可用\n \n \n \`ktlint\`\n \`.kt\` \`.kts\`\n \`ktlint\` 命令可用\n \n \n \`mix\`\n \`.ex\` \`.exs\` \`.eex\` \`.heex\` \`.leex\` \`.neex\` \`.sface\`\n \`mix\` 命令可用\n \n \n \`nixfmt\`\n \`.nix\`\n \`nixfmt\` 命令可用\n \n \n \`ocamlformat\`\n \`.ml\` \`.mli\`\n \`ocamlformat\` 命令可用,且项目中存在 \`.ocamlformat\` 配置文件\n \n \n \`ormolu\`\n \`.hs\`\n \`ormolu\` 命令可用\n \n \n \`oxfmt\`(实验性)\n \`.js\` \`.jsx\` \`.ts\` \`.tsx\`\n \`package.json\` 中有 \`oxfmt\` 依赖,且设置了对应的实验性环境变量标志\n \n \n \`pint\`\n \`.php\`\n \`composer.json\` 中有 \`laravel/pint\` 依赖\n \n \n \`prettier\`\n \`.js\` \`.jsx\` \`.ts\` \`.tsx\` \`.html\` \`.css\` \`.md\` \`.json\` \`.yaml\` 及更多\n \`package.json\` 中有 \`prettier\` 依赖\n \n \n \`rubocop\`\n \`.rb\` \`.rake\` \`.gemspec\` \`.ru\`\n \`rubocop\` 命令可用\n \n \n \`ruff\`\n \`.py\` \`.pyi\`\n \`ruff\` 命令可用且存在相应配置\n \n \n \`rustfmt\`\n \`.rs\`\n \`rustfmt\` 命令可用\n \n \n \`shfmt\`\n \`.sh\` \`.bash\`\n \`shfmt\` 命令可用\n \n \n \`standardrb\`\n \`.rb\` \`.rake\` \`.gemspec\` \`.ru\`\n \`standardrb\` 命令可用\n \n \n \`terraform\`\n \`.tf\` \`.tfvars\`\n \`terraform\` 命令可用\n \n \n \`uv\`\n \`.py\` \`.pyi\`\n \`uv\` 命令可用\n \n \n \`zig\`\n \`.zig\` \`.zon\`\n \`zig\` 命令可用\n \n \n\n\n当多个格式化工具支持同一扩展名时(例如 \`.rs\` 同时被 \`cargofmt\` 和 \`rustfmt\` 支持,\`.rb\` 同时被 \`rubocop\` 和 \`standardrb\` 支持),OpenCode 会根据项目中已安装的工具自动选择。如需明确指定,可通过下方配置禁用不需要的格式化工具。\n\n\n\n\n---\n\n\n## 配置文件结构\n\n\n格式化工具的自定义配置写在 \`opencode.json\` 的 \`formatter\` 字段下,键名为格式化工具名称(与内置表格中的名称一致),值为该工具的配置对象:\n\n\n\n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "formatter": {\n\n // 格式化工具名称: 配置对象\n\n "prettier": {\n\n // 在此填写 prettier 的配置项\n\n }\n\n }\n\n}\n\n\n\n每个格式化工具支持以下配置项:\n\n\n\n\n \n \n 配置项\n 类型\n 说明\n \n \n \n \n \`disabled\`\n \`boolean\`\n 设为 \`true\` 可禁用该格式化工具,其余配置项将被忽略\n \n \n \`command\`\n \`string[]\`\n 执行格式化的命令数组。命令中可使用 \`$FILE\` 占位符,运行时会被替换为待格式化文件的完整路径\n \n \n \`environment\`\n \`object\`\n 运行格式化工具时注入的环境变量,键值对形式\n \n \n \`extensions\`\n \`string[]\`\n 该格式化工具处理的文件扩展名列表(包含 \`.\`,如 \`".ts"\`)\n \n \n\n\n\n---\n\n\n## 禁用格式化工具\n\n\n\n### 1、禁用所有格式化工具\n\n\n如果你不希望 OpenCode 对任何文件进行自动格式化,可以将 \`formatter\` 直接设为 \`false\`:\n\n\n\n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "formatter": false // 全局禁用所有格式化工具,文件写入后不会进行任何格式化\n\n}\n\n\n\n\n### 2、禁用特定格式化工具\n\n\n如果只需要禁用某一个格式化工具,在对应工具的配置对象中将 \`disabled\` 设为 \`true\`,其他格式化工具不受影响:\n\n\n\n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "formatter": {\n\n "prettier": {\n\n "disabled": true // 仅禁用 prettier,其他格式化工具(如 ruff、gofmt)仍正常工作\n\n }\n\n }\n\n}\n\n\n\n\n---\n\n\n## 自定义格式化工具\n\n\n通过 \`command\`、\`environment\` 和 \`extensions\` 配置项,可以覆盖内置格式化工具的默认行为,或添加 OpenCode 尚未内置的格式化工具。\n\n\n\n\n### 1、覆盖内置格式化工具的命令\n\n\n例如,为 prettier 指定特定的参数,并限制它只处理特定扩展名:\n\n\n\n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "formatter": {\n\n "prettier": {\n\n "command": ["npx", "prettier", "--write", "$FILE"],\n\n // command 数组中的 $FILE 是占位符,运行时会被替换为待格式化文件的完整路径\n\n // 例如实际执行:npx prettier --write /your/project/src/index.ts\n\n "environment": {\n\n "NODE_ENV": "development" // 运行 prettier 时注入的环境变量\n\n },\n\n "extensions": [".js", ".ts", ".jsx", ".tsx"]\n\n // 覆盖默认扩展名:只对这四种文件运行 prettier,不处理 .html、.css 等\n\n }\n\n }\n\n}\n\n\n\n\n### 2、添加自定义格式化工具\n\n\n如果你使用的格式化工具不在内置列表中,可以通过指定任意名称来添加。只需提供启动命令和需要处理的文件扩展名即可:\n\n\n\n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "formatter": {\n\n "custom-markdown-formatter": { // 自定义名称(任意命名,不与内置工具冲突即可)\n\n "command": ["deno", "fmt", "$FILE"],\n\n // 使用 deno fmt 格式化文件,$FILE 会被替换为实际文件路径\n\n "extensions": [".md"] // 只对 .md 文件运行此格式化工具\n\n }\n\n }\n\n}\n\n\n\n\n### 3、同时配置多个格式化工具\n\n\n\n## 实例\n\n{\n\n "$schema": "https://opencode.ai/config.json",\n\n "formatter": {\n\n "prettier": {\n\n "command": ["npx", "prettier", "--write", "$FILE"],\n\n "environment": {\n\n "NODE_ENV": "development"\n\n },\n\n "extensions": [".js", ".ts", ".jsx", ".tsx"]\n\n },\n\n "ruff": {\n\n "disabled": true // 项目中不使用 ruff,将其禁用\n\n },\n\n "custom-markdown-formatter": {\n\n "command": ["deno", "fmt", "$FILE"],\n\n "extensions": [".md"]\n\n }\n\n }\n\n}\n\n \n \n \n \n \n\n \n \n [ OpenCode 权限配置](http://www.runoob.com/opencode/opencode-permissions.html)\n \n\n \n \n \n \n \n\n\n\n\n \n \n \n### 点我分享笔记\n\n \n \n \n \n \n \n [取消](https://www.runoob.comjavascript:;)\n\n\n \n \n \n \n \n \n\n\n 分享笔记\n \n \n \n \n \n \n\n 昵称昵称 (必填)\n 邮箱邮箱 (必填)\n 引用地址引用地址\n \n\n \n \n \n \n\n \n \n\n\n\n\n\n\n\n\n\n \n\n \n\n\n\n\n\n\n \n \n \n \n \n \n\n\n \n \n \n \n \n \n \n \n \n\n\n\n\n\n 在线实例\n\n\n ·[HTML 实例](https://www.runoob.com/html/html-examples.html)\n\n\n ·[CSS 实例](https://www.runoob.com/css/css-examples.html)\n\n\n ·[JavaScript 实例](https://www.runoob.com/js/js-examples.html)\n\n\n ·[Ajax 实例](https://www.runoob.com/ajx/ajax-examples.html)\n\n\n ·[jQuery 实例](https://www.runoob.com/jquery/jquery-examples.html)\n\n\n ·[XML 实例](https://www.runoob.com/xml/xml-examples.html)\n\n\n ·[Java 实例](https://www.runoob.com/java/java-examples.html)\n\n\n\n\n\n 字符集&工具\n\n\n · [HTML 字符集设置](https://www.runoob.com/charsets/html-charsets.html)\n\n\n · [HTML ASCII 字符集](https://www.runoob.com/tags/html-ascii.html)\n\n\n · [JS 混淆/加密](https://www.jyshare.com/front-end/6939/)\n\n\n · [PNG/JPEG 图片压缩](https://www.jyshare.com/front-end/6232/)\n\n\n · [HTML 拾色器](https://www.runoob.com/tags/html-colorpicker.html)\n\n\n · [JSON 格式化工具](https://www.jyshare.com/front-end/53)\n\n\n · [随机数生成器](https://www.jyshare.com/front-end/6680/)\n\n\n\n\n 最新更新\n\n\n ·\n [\n OpenCode 自定义... ](http://www.runoob.com/opencode/opencode-custom-tools.html)\n\n\n ·\n [\n OpenCode Skills ](http://www.runoob.com/opencode/opencode-skills.html)\n\n\n ·\n [\n OpenCode MCP 服... ](http://www.runoob.com/opencode/opencode-mcp.html)\n\n\n ·\n [\n OpenCode LSP 服... ](http://www.runoob.com/opencode/opencode-lsp.html)\n\n\n ·\n [\n OpenCode 权限配置 ](http://www.runoob.com/opencode/opencode-permissions.html)\n\n\n ·\n [\n OpenCode 格式化... ](http://www.runoob.com/opencode/opencode-formatter.html)\n\n\n ·\n [\n OpenCode 自定义... ](http://www.runoob.com/opencode/opencode-commands.html)\n\n\n\n\n 站点信息\n\n\n ·\n [意见反馈](https://www.runoob.commailto:admin@runoob.com)\n\n\n ·\n [免责声明](https://www.runoob.com/disclaimer)\n\n\n ·\n [关于我们](https://www.runoob.com/aboutus)\n\n\n ·\n [文章归档](https://www.runoob.com/archives)\n\n\n\n\n\n\n\n **关注微信**\n\n\n\n \n\n\n\n\n\n\n Copyright © 2013-2026 **[菜鸟教程](https://www.runoob.com//www.runoob.com/)** \n **[runoob.com](https://www.runoob.com//www.runoob.com/)** All Rights Reserved. 备案号:[闽ICP备15012807号-1](https://beian.miit.gov.cn/)\n\n\n\n [ ](https://www.runoob.comjavascript:void(0))\n [](https://www.runoob.comjavascript:void(0))\n [](https://www.runoob.comjavascript:void(0))\n\n\n\n#### 微信关注\n\n `;
document.getElementById('md-content').innerHTML = marked.parse(md);
</script>
</body>
</html>