diff --git a/src/extension.ts b/src/extension.ts index a60488d..aa1f0d4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -17,6 +17,7 @@ import moreCompletions from './moreCompletions' import { mergeSettingsFromScopes } from './mergeSettings' import codeActionProvider from './codeActionProvider' import nonTsCommands from './nonTsCommands' +import onEnterActions from './onEnterActions' let isActivated = false // let erroredStatusBarItem: vscode.StatusBarItem | undefined @@ -96,6 +97,7 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted figIntegration() vueVolarSupport() + onEnterActions() if (process.env.PLATFORM === 'node' && process.env.NODE_ENV === 'development') { require('./autoPluginReload').default() diff --git a/src/onEnterActions.ts b/src/onEnterActions.ts new file mode 100644 index 0000000..f23f673 --- /dev/null +++ b/src/onEnterActions.ts @@ -0,0 +1,36 @@ +import * as vscode from 'vscode' +import { defaultJsSupersetLangsWithVue } from '@zardoy/vscode-utils/build/langs' + +export default () => { + vscode.workspace.onDidChangeTextDocument(({ contentChanges, document, reason }) => { + if ( + contentChanges.length === 0 || + !vscode.languages.match(defaultJsSupersetLangsWithVue, document) || + vscode.workspace.fs.isWritableFileSystem(document.uri.scheme) === false + ) { + return + } + + if (!contentChanges.some(change => !isEol(change.text))) return + // if (document.languageId === 'vue') return // todo + const importRegex = /^\s*import(.*) from (['"].*['"])/gi + const prevLine = document.lineAt(contentChanges[0]!.range.start.line) + if (importRegex.test(prevLine.text)) { + const lines = document.getText().split('\n') + let lineToInsert = 0 + for (const [i, line] of lines.entries()) { + if (!line.trim() || line.trim().startsWith('import') || line.trim().startsWith('require') || /^(#|\/\/|\/\*)/.test(line)) continue + lineToInsert = i + break + } + + const editor = vscode.window.activeTextEditor! + void editor.edit(b => { + b.delete(prevLine.rangeIncludingLineBreak) + b.insert(new vscode.Position(lineToInsert, 0), `${prevLine.text.trim()}\n`) + }) + } + }) +} + +const isEol = (text: string) => (text.startsWith('/n') || text.startsWith('/r/n')) && text.trim() === '' diff --git a/typescript/src/ipcTypes.ts b/typescript/src/ipcTypes.ts index 2bd55d9..7a3e0bf 100644 --- a/typescript/src/ipcTypes.ts +++ b/typescript/src/ipcTypes.ts @@ -16,6 +16,7 @@ export const triggerCharacterCommands = [ 'getExtendedCodeActionEdits', 'getLastResolvedCompletion', 'getArgumentReferencesFromCurrentParameter', + 'onEnterActions', 'performanceInfo', 'getMigrateToImportsEdits', ] as const diff --git a/typescript/src/specialCommands/handle.ts b/typescript/src/specialCommands/handle.ts index ac35702..053c71d 100644 --- a/typescript/src/specialCommands/handle.ts +++ b/typescript/src/specialCommands/handle.ts @@ -314,6 +314,9 @@ export default ( return combinedCodeFix.changes[0]?.textChanges } + if (specialCommand === 'onEnterActions') { + } + return null }