Skip to content

Commit fefd976

Browse files
authored
add the ability to start and stop the lsp (#210)
1 parent e6ab612 commit fefd976

File tree

4 files changed

+111
-42
lines changed

4 files changed

+111
-42
lines changed

client/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.

client/src/extension.ts

Lines changed: 95 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,63 @@ function findNushellExecutable(): string | null {
4444
}
4545
}
4646

47+
function startLanguageServer(
48+
context: vscode.ExtensionContext,
49+
found_nushell_path: string,
50+
): void {
51+
// Use Nushell's native LSP server
52+
const serverOptions: ServerOptions = {
53+
run: {
54+
command: found_nushell_path,
55+
args: ['--lsp'],
56+
},
57+
debug: {
58+
command: found_nushell_path,
59+
args: ['--lsp'],
60+
},
61+
};
62+
63+
// Options to control the language client
64+
const clientOptions: LanguageClientOptions = {
65+
initializationOptions: {
66+
timeout: 10000, // 10 seconds
67+
},
68+
// Register the server for nushell files
69+
documentSelector: [{ scheme: 'file', language: 'nushell' }],
70+
synchronize: {
71+
// Notify the server about file changes to nushell files
72+
fileEvents: vscode.workspace.createFileSystemWatcher('**/*.nu'),
73+
},
74+
};
75+
76+
// Create the language client and start the client.
77+
client = new LanguageClient(
78+
'nushellLanguageServer',
79+
'Nushell Language Server',
80+
serverOptions,
81+
clientOptions,
82+
);
83+
84+
// Start the language client and register a disposable that stops it when disposed
85+
client.start().catch((error) => {
86+
vscode.window.showErrorMessage(
87+
`Failed to start Nushell language server: ${error.message}`,
88+
);
89+
});
90+
91+
const disposable = new vscode.Disposable(() => {
92+
if (client) {
93+
client.stop().catch((error) => {
94+
console.error(
95+
'Failed to stop Nushell Language Server on dispose:',
96+
error,
97+
);
98+
});
99+
}
100+
});
101+
context.subscriptions.push(disposable);
102+
}
103+
47104
export function activate(context: vscode.ExtensionContext) {
48105
console.log('Terminals: ' + (<any>vscode.window).terminals.length);
49106

@@ -111,45 +168,47 @@ export function activate(context: vscode.ExtensionContext) {
111168
return;
112169
}
113170

114-
// Use Nushell's native LSP server
115-
const serverOptions: ServerOptions = {
116-
run: {
117-
command: found_nushell_path,
118-
args: ['--lsp'],
119-
},
120-
debug: {
121-
command: found_nushell_path,
122-
args: ['--lsp'],
123-
},
124-
};
125-
126-
// Options to control the language client
127-
const clientOptions: LanguageClientOptions = {
128-
initializationOptions: {
129-
timeout: 10000, // 10 seconds
171+
// Start the language server when the extension is activated
172+
startLanguageServer(context, found_nushell_path);
173+
174+
// Register a command to stop the language server
175+
const stopCommand = vscode.commands.registerCommand(
176+
'nushell.stopLanguageServer',
177+
async () => {
178+
if (client) {
179+
try {
180+
await client.stop();
181+
client = undefined;
182+
vscode.window.showInformationMessage(
183+
'Nushell Language Server stopped.',
184+
);
185+
} catch (error) {
186+
vscode.window.showErrorMessage(
187+
`Failed to stop Nushell Language Server: ${error}`,
188+
);
189+
}
190+
} else {
191+
vscode.window.showInformationMessage(
192+
'Nushell Language Server is not running.',
193+
);
194+
}
130195
},
131-
// Register the server for nushell files
132-
documentSelector: [{ scheme: 'file', language: 'nushell' }],
133-
synchronize: {
134-
// Notify the server about file changes to nushell files
135-
fileEvents: vscode.workspace.createFileSystemWatcher('**/*.nu'),
196+
);
197+
context.subscriptions.push(stopCommand);
198+
199+
// Register a command to start the language server
200+
const startCommand = vscode.commands.registerCommand(
201+
'nushell.startLanguageServer',
202+
() => {
203+
startLanguageServer(context, found_nushell_path);
204+
if (client) {
205+
vscode.window.showInformationMessage(
206+
'Nushell Language Server started.',
207+
);
208+
}
136209
},
137-
};
138-
139-
// Create the language client and start the client.
140-
client = new LanguageClient(
141-
'nushellLanguageServer',
142-
'Nushell Language Server',
143-
serverOptions,
144-
clientOptions,
145210
);
146-
147-
// Start the client. This will also launch the server
148-
client.start().catch((error) => {
149-
vscode.window.showErrorMessage(
150-
`Failed to start Nushell language server: ${error.message}`,
151-
);
152-
});
211+
context.subscriptions.push(startCommand);
153212
}
154213

155214
export function deactivate(): Thenable<void> | undefined {

package-lock.json

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

package.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,17 @@
139139
"scope": "window"
140140
}
141141
}
142-
}
142+
},
143+
"commands": [
144+
{
145+
"command": "nushell.stopLanguageServer",
146+
"title": "Nushell: Stop Language Server"
147+
},
148+
{
149+
"command": "nushell.startLanguageServer",
150+
"title": "Nushell: Start Language Server"
151+
}
152+
]
143153
},
144154
"scripts": {
145155
"vscode:prepublish": "npm run lint && npm run compile",

0 commit comments

Comments
 (0)