Skip to content

Commit 09f61c5

Browse files
Copilotntotten
andauthored
Document language-overridable scope for Prettier settings in README (#3862)
* Initial plan * Add language-specific formatting documentation to README Co-authored-by: ntotten <282782+ntotten@users.noreply.github.com> * formatting --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Nathan Totten <nate@zuplo.com> Co-authored-by: ntotten <282782+ntotten@users.noreply.github.com>
1 parent 9eb5d9f commit 09f61c5

File tree

8 files changed

+186
-32
lines changed

8 files changed

+186
-32
lines changed

.prettierignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ out/
33
dist/
44
test-fixtures/
55
node_modules/
6-
package-lock.json
6+
package-lock.json
7+
.vscode-test/
8+
.vscode-test-web/

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,31 @@ prettier.objectWrap
249249
prettier.experimentalOperatorPosition
250250
```
251251

252+
#### Language-Specific Formatting
253+
254+
All Prettier options above support language-specific overrides. This allows you to set different formatting rules for different file types directly in your VS Code settings, which are easily synchronized across machines and environments.
255+
256+
To configure language-specific settings, use the `[language]` syntax in your VS Code `settings.json`:
257+
258+
```json
259+
{
260+
"[html]": {
261+
"prettier.printWidth": 180
262+
},
263+
"[typescript]": {
264+
"prettier.printWidth": 120,
265+
"prettier.tabWidth": 4,
266+
"prettier.semi": false
267+
},
268+
"[json]": {
269+
"prettier.printWidth": 80,
270+
"prettier.tabWidth": 2
271+
}
272+
}
273+
```
274+
275+
This feature is particularly useful when working in multi-language projects or when different languages have different formatting conventions. Language-specific settings will override the global Prettier settings when formatting files of that language type.
276+
252277
### Extension Settings
253278

254279
These settings are specific to VS Code and need to be set in the VS Code settings file. See the [documentation](https://code.visualstudio.com/docs/getstarted/settings) for how to do that.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/update-browser-languages.mjs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ async function main() {
135135
console.log("\nLanguages included:");
136136
languages.forEach((lang) => {
137137
console.log(
138-
` - ${lang.name}: ${lang.vscodeLanguageIds.join(", ")} [${lang.parsers.join(", ")}]`,
138+
` - ${lang.name}: ${lang.vscodeLanguageIds.join(
139+
", ",
140+
)} [${lang.parsers.join(", ")}]`,
139141
);
140142
});
141143
} else {

src/ModuleResolverWeb.ts

Lines changed: 138 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ export class ModuleResolver implements ModuleResolverInterface {
8989
{
9090
name: "CSS",
9191
vscodeLanguageIds: ["css"],
92-
extensions: [".css",".wxss"],
92+
extensions: [".css", ".wxss"],
9393
parsers: ["css"],
9494
},
9595
{
9696
name: "PostCSS",
9797
vscodeLanguageIds: ["postcss"],
98-
extensions: [".pcss",".postcss"],
98+
extensions: [".pcss", ".postcss"],
9999
parsers: ["css"],
100100
},
101101
{
@@ -113,13 +113,13 @@ export class ModuleResolver implements ModuleResolverInterface {
113113
{
114114
name: "GraphQL",
115115
vscodeLanguageIds: ["graphql"],
116-
extensions: [".graphql",".gql",".graphqls"],
116+
extensions: [".graphql", ".gql", ".graphqls"],
117117
parsers: ["graphql"],
118118
},
119119
{
120120
name: "Handlebars",
121121
vscodeLanguageIds: ["handlebars"],
122-
extensions: [".handlebars",".hbs"],
122+
extensions: [".handlebars", ".hbs"],
123123
parsers: ["glimmer"],
124124
},
125125
{
@@ -131,7 +131,15 @@ export class ModuleResolver implements ModuleResolverInterface {
131131
{
132132
name: "HTML",
133133
vscodeLanguageIds: ["html"],
134-
extensions: [".html",".hta",".htm",".html.hl",".inc",".xht",".xhtml"],
134+
extensions: [
135+
".html",
136+
".hta",
137+
".htm",
138+
".html.hl",
139+
".inc",
140+
".xht",
141+
".xhtml",
142+
],
135143
parsers: ["html"],
136144
},
137145
{
@@ -154,33 +162,82 @@ export class ModuleResolver implements ModuleResolverInterface {
154162
},
155163
{
156164
name: "JavaScript",
157-
vscodeLanguageIds: ["javascript","javascriptreact","mongo","mongodb"],
158-
extensions: [".js","._js",".bones",".cjs",".es",".es6",".gs",".jake",".javascript",".jsb",".jscad",".jsfl",".jslib",".jsm",".jspre",".jss",".mjs",".njs",".pac",".sjs",".ssjs",".xsjs",".xsjslib",".start.frag",".end.frag",".wxs"],
159-
parsers: ["babel","acorn","espree","meriyah","babel-flow","babel-ts","flow","typescript"],
165+
vscodeLanguageIds: [
166+
"javascript",
167+
"javascriptreact",
168+
"mongo",
169+
"mongodb",
170+
],
171+
extensions: [
172+
".js",
173+
"._js",
174+
".bones",
175+
".cjs",
176+
".es",
177+
".es6",
178+
".gs",
179+
".jake",
180+
".javascript",
181+
".jsb",
182+
".jscad",
183+
".jsfl",
184+
".jslib",
185+
".jsm",
186+
".jspre",
187+
".jss",
188+
".mjs",
189+
".njs",
190+
".pac",
191+
".sjs",
192+
".ssjs",
193+
".xsjs",
194+
".xsjslib",
195+
".start.frag",
196+
".end.frag",
197+
".wxs",
198+
],
199+
parsers: [
200+
"babel",
201+
"acorn",
202+
"espree",
203+
"meriyah",
204+
"babel-flow",
205+
"babel-ts",
206+
"flow",
207+
"typescript",
208+
],
160209
},
161210
{
162211
name: "Flow",
163212
vscodeLanguageIds: ["javascript"],
164213
extensions: [".js.flow"],
165-
parsers: ["flow","babel-flow"],
214+
parsers: ["flow", "babel-flow"],
166215
},
167216
{
168217
name: "JSX",
169218
vscodeLanguageIds: ["javascriptreact"],
170219
extensions: [".jsx"],
171-
parsers: ["babel","babel-flow","babel-ts","flow","typescript","espree","meriyah"],
220+
parsers: [
221+
"babel",
222+
"babel-flow",
223+
"babel-ts",
224+
"flow",
225+
"typescript",
226+
"espree",
227+
"meriyah",
228+
],
172229
},
173230
{
174231
name: "TypeScript",
175232
vscodeLanguageIds: ["typescript"],
176-
extensions: [".ts",".cts",".mts"],
177-
parsers: ["typescript","babel-ts"],
233+
extensions: [".ts", ".cts", ".mts"],
234+
parsers: ["typescript", "babel-ts"],
178235
},
179236
{
180237
name: "TSX",
181238
vscodeLanguageIds: ["typescriptreact"],
182239
extensions: [".tsx"],
183-
parsers: ["typescript","babel-ts"],
240+
parsers: ["typescript", "babel-ts"],
184241
},
185242
{
186243
name: "JSON.stringify",
@@ -191,13 +248,52 @@ export class ModuleResolver implements ModuleResolverInterface {
191248
{
192249
name: "JSON",
193250
vscodeLanguageIds: ["json"],
194-
extensions: [".json",".4DForm",".4DProject",".avsc",".geojson",".gltf",".har",".ice",".JSON-tmLanguage",".json.example",".mcmeta",".sarif",".tact",".tfstate",".tfstate.backup",".topojson",".webapp",".webmanifest",".yy",".yyp"],
251+
extensions: [
252+
".json",
253+
".4DForm",
254+
".4DProject",
255+
".avsc",
256+
".geojson",
257+
".gltf",
258+
".har",
259+
".ice",
260+
".JSON-tmLanguage",
261+
".json.example",
262+
".mcmeta",
263+
".sarif",
264+
".tact",
265+
".tfstate",
266+
".tfstate.backup",
267+
".topojson",
268+
".webapp",
269+
".webmanifest",
270+
".yy",
271+
".yyp",
272+
],
195273
parsers: ["json"],
196274
},
197275
{
198276
name: "JSON with Comments",
199277
vscodeLanguageIds: ["jsonc"],
200-
extensions: [".jsonc",".code-snippets",".code-workspace",".sublime-build",".sublime-color-scheme",".sublime-commands",".sublime-completions",".sublime-keymap",".sublime-macro",".sublime-menu",".sublime-mousemap",".sublime-project",".sublime-settings",".sublime-theme",".sublime-workspace",".sublime_metrics",".sublime_session"],
278+
extensions: [
279+
".jsonc",
280+
".code-snippets",
281+
".code-workspace",
282+
".sublime-build",
283+
".sublime-color-scheme",
284+
".sublime-commands",
285+
".sublime-completions",
286+
".sublime-keymap",
287+
".sublime-macro",
288+
".sublime-menu",
289+
".sublime-mousemap",
290+
".sublime-project",
291+
".sublime-settings",
292+
".sublime-theme",
293+
".sublime-workspace",
294+
".sublime_metrics",
295+
".sublime_session",
296+
],
201297
parsers: ["jsonc"],
202298
},
203299
{
@@ -209,7 +305,19 @@ export class ModuleResolver implements ModuleResolverInterface {
209305
{
210306
name: "Markdown",
211307
vscodeLanguageIds: ["markdown"],
212-
extensions: [".md",".livemd",".markdown",".mdown",".mdwn",".mkd",".mkdn",".mkdown",".ronn",".scd",".workbook"],
308+
extensions: [
309+
".md",
310+
".livemd",
311+
".markdown",
312+
".mdown",
313+
".mdwn",
314+
".mkd",
315+
".mkdn",
316+
".mkdown",
317+
".ronn",
318+
".scd",
319+
".workbook",
320+
],
213321
parsers: ["markdown"],
214322
},
215323
{
@@ -220,11 +328,21 @@ export class ModuleResolver implements ModuleResolverInterface {
220328
},
221329
{
222330
name: "YAML",
223-
vscodeLanguageIds: ["yaml","ansible","home-assistant"],
224-
extensions: [".yml",".mir",".reek",".rviz",".sublime-syntax",".syntax",".yaml",".yaml-tmlanguage",".yaml.sed",".yml.mysql"],
331+
vscodeLanguageIds: ["yaml", "ansible", "home-assistant"],
332+
extensions: [
333+
".yml",
334+
".mir",
335+
".reek",
336+
".rviz",
337+
".sublime-syntax",
338+
".syntax",
339+
".yaml",
340+
".yaml-tmlanguage",
341+
".yaml.sed",
342+
".yml.mysql",
343+
],
225344
parsers: ["yaml"],
226-
}
227-
345+
},
228346
],
229347
};
230348
},
@@ -266,4 +384,3 @@ export class ModuleResolver implements ModuleResolverInterface {
266384
// nothing to do
267385
}
268386
}
269-

src/PrettierDynamicInstance.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ export const PrettierDynamicInstance: PrettierInstanceConstructor = class Pretti
2424
public async import(): Promise</* version of imported prettier */ string> {
2525
// Resolve to actual entry file since ESM doesn't support directory imports
2626
// modulePath is like /path/to/node_modules/prettier, resolve "prettier" from there
27-
const entryPath = resolveModuleEntry(this.modulePath, path.basename(this.modulePath));
27+
const entryPath = resolveModuleEntry(
28+
this.modulePath,
29+
path.basename(this.modulePath),
30+
);
2831
const moduleUrl = pathToFileURL(entryPath).href;
2932
const imported = await import(moduleUrl);
3033
// Handle both ESM (Prettier v3+) and CJS (Prettier v2) modules

src/PrettierEditService.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,23 +70,25 @@ async function resolvePluginPaths(
7070

7171
// Absolute paths
7272
if (path.isAbsolute(plugin)) {
73-
resolvedPlugins.push(
74-
useFileUrls ? pathToFileURL(plugin).href : plugin,
75-
);
73+
resolvedPlugins.push(useFileUrls ? pathToFileURL(plugin).href : plugin);
7674
continue;
7775
}
7876

7977
// Relative paths (./foo or ../foo) → resolve relative to file
8078
if (plugin.startsWith(".")) {
8179
const resolved = path.resolve(dir, plugin);
82-
resolvedPlugins.push(useFileUrls ? pathToFileURL(resolved).href : resolved);
80+
resolvedPlugins.push(
81+
useFileUrls ? pathToFileURL(resolved).href : resolved,
82+
);
8383
continue;
8484
}
8585

8686
// Package names → resolve from file's directory using createRequire
8787
try {
8888
const resolved = resolveModuleEntry(dir, plugin);
89-
resolvedPlugins.push(useFileUrls ? pathToFileURL(resolved).href : resolved);
89+
resolvedPlugins.push(
90+
useFileUrls ? pathToFileURL(resolved).href : resolved,
91+
);
9092
} catch {
9193
// If resolution fails, pass through and let Prettier handle/report the error
9294
resolvedPlugins.push(plugin);

src/test/suite/ModuleResolverNode.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import * as path from "path";
33
import * as prettier from "prettier";
44

55
import { getWorkspaceFolderUri } from "./formatTestUtils.js";
6-
import { ModuleResolver, PrettierNodeModule } from "../../ModuleResolverNode.js";
6+
import {
7+
ModuleResolver,
8+
PrettierNodeModule,
9+
} from "../../ModuleResolverNode.js";
710
import { LoggingService } from "../../LoggingService.js";
811
import {
912
OUTDATED_PRETTIER_VERSION_MESSAGE,

0 commit comments

Comments
 (0)