diff --git a/src/BlackEditProvider.ts b/src/BlackEditProvider.ts index 1a00f93..4dfc580 100644 --- a/src/BlackEditProvider.ts +++ b/src/BlackEditProvider.ts @@ -32,6 +32,11 @@ export class BlackEditProvider implements DocumentRangeFormattingEditProvider, DocumentFormattingEditProvider { channel?: OutputChannel; hasCompatibleBlackVersion?: boolean; + commandPrefix: string; + + constructor(commandPrefix = '') { + this.commandPrefix = commandPrefix; + } debug(msg: string, newLine = true) { const debug: boolean = workspace.getConfiguration('black', null).get('debug') as boolean; @@ -79,7 +84,9 @@ export class BlackEditProvider const pythonPrefix = pythonPath && pythonPath !== 'python' && !hasCustomPath ? `${pythonPath} -m ` : ''; - return `${pythonPrefix}${blackPath} -l ${lineLength}${fast ? ' --fast' : ''} -`; + return `${this.commandPrefix}${pythonPrefix}${blackPath} -l ${lineLength}${ + fast ? ' --fast' : '' + } -`; } async provideEdits( diff --git a/src/extension.ts b/src/extension.ts index 143ff65..b4cb33b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,3 +1,4 @@ +import { exec } from 'child_process'; import { Disposable, ExtensionContext, languages, workspace, window } from 'vscode'; import { BlackEditProvider } from './BlackEditProvider'; import { blackVersionIsIncompatible } from './utils'; @@ -18,6 +19,7 @@ async function registerFormatter(provider: BlackEditProvider) { disposeHandlers(); languages.registerDocumentFormattingEditProvider('python', provider); languages.registerDocumentRangeFormattingEditProvider('python', provider); + // check black version compatibility const versionErrorMessage = await blackVersionIsIncompatible(provider); if (versionErrorMessage) { @@ -27,8 +29,30 @@ async function registerFormatter(provider: BlackEditProvider) { } } -export function activate(context: ExtensionContext) { - const provider = new BlackEditProvider(); +export async function activate(context: ExtensionContext) { + const providerArgs: string[] = []; + + // workaround for vscode issue: https://github.com/Microsoft/vscode/issues/16261 + if (process.platform === 'darwin' && !process.env.LANG) { + await new Promise((resolve, reject) => + exec( + `echo $(defaults read -g AppleLanguages | sed '/"/!d;s/["[:space:]]//g;s/-/_/').UTF-8`, + (error, stdout, stderr) => { + // if there's an unexpected error, skip this + if (!error) { + const langCode = stdout.trim(); + // make sure stdout matches a valid language code pattern + if (langCode.match(/^[a-z]{2}_[A-Z]{2}\.UTF-8$/)) { + providerArgs.push(`LANG=${langCode} `); + } + } + resolve(); + } + ) + ); + } + + const provider = new BlackEditProvider(...providerArgs); // initial formatter registration registerFormatter(provider); diff --git a/src/test/test-project/.vscode/settings.json b/src/test/test-project/.vscode/settings.json index 278d6b2..0cbed33 100644 --- a/src/test/test-project/.vscode/settings.json +++ b/src/test/test-project/.vscode/settings.json @@ -1,11 +1,11 @@ { - "python.pythonPath": "${workspaceFolder}/.venv/bin/python" + "python.pythonPath": "${workspaceFolder}/.venv/bin/python", // "python.linting.pylintEnabled": false, // "python.linting.flake8Enabled": true, // "python.linting.enabled": true, // "python.formatting.provider": "none", // "black.lineLength": 79, - // "black.debug": true, - // "black.path": "/Users/brojoe/.pyenv/versions/3.6.3/bin/black", + "black.debug": true, + "black.path": "/Users/brojoe/.pyenv/versions/3.6.3/bin/black", // "python.pythonPath": "${workspaceFolder}/.venv/bin/python", } \ No newline at end of file