48
README.md
48
README.md
@@ -1,3 +1,47 @@
|
|||||||
# Newtan-LSP
|
# Newton LSP Server Bridge
|
||||||
|
|
||||||
Newtan LSP service
|
## Overview
|
||||||
|
This script provides a WebSocket bridge to interface with multiple Language Servers through clients via a single WebSocket connection.
|
||||||
|
It supports various language servers concurrently and handles language-specific file extensions and initialization parameters.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- Utilizes `vscode-jsonrpc` for LSP message handling.
|
||||||
|
- Supports multiple language servers concurrently.
|
||||||
|
- Support for IPC and stdio communication with language servers.
|
||||||
|
- Easy language server configuration and initialization parameter modification.
|
||||||
|
- Error handling and logging for language server processes.
|
||||||
|
- Automatic file URI translation between server and client paths.
|
||||||
|
- Temporary file creation for `textDocument/didOpen` events.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Install Node.js.
|
||||||
|
2. Run 'npm install'.
|
||||||
|
3. Configure the desired language servers in `defaultServers.js`.
|
||||||
|
4. Run the script: `npm run start || start-verbose`.
|
||||||
|
5. Connect to the WebSocket server on `ws://localhost:9999/<language_endpoint>`.
|
||||||
|
6. Transmit LSP messages via the WebSocket connection.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Add or modify language server configurations in `languageServers.js`:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
exports.servers = [
|
||||||
|
{
|
||||||
|
endpointName: "language_endpoint", // WebSocket endpoint name
|
||||||
|
args: ['executable_path', ['arg1', 'arg2', ...]],
|
||||||
|
connectionType: "ipc" | "stdio", // Communication type
|
||||||
|
relativePath: true | false, // Whether to use relative paths
|
||||||
|
serverFileNameReplacePattern: { // Server file name regex replacements
|
||||||
|
from: /pattern/,
|
||||||
|
to: "replacement"
|
||||||
|
},
|
||||||
|
clientFileNameReplacePattern: { // Client file name regex replacements
|
||||||
|
from: /pattern/,
|
||||||
|
to: "replacement"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
...
|
||||||
|
];
|
||||||
|
```
|
||||||
1
index.js.REMOVED.git-id
Normal file
1
index.js.REMOVED.git-id
Normal file
@@ -0,0 +1 @@
|
|||||||
|
22bea36d0b01ddf2f56d5f5d84da8c155ce7d177
|
||||||
48
languageServers.js
Normal file
48
languageServers.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
exports.servers = [
|
||||||
|
{
|
||||||
|
endpointName: "python",
|
||||||
|
args: ["pylsp"],
|
||||||
|
nameEndsWith: ".python",
|
||||||
|
connectionType: "stdio",
|
||||||
|
relativePath: false
|
||||||
|
}, {
|
||||||
|
endpointName: "go",
|
||||||
|
args: [
|
||||||
|
'gopls', ['-mode=stdio', '-remote=auto']
|
||||||
|
],
|
||||||
|
nameEndsWith: ".golang",
|
||||||
|
connectionType: "stdio",
|
||||||
|
relativePath: false,
|
||||||
|
serverFileNameReplacePattern: {
|
||||||
|
from: /.golang$/,
|
||||||
|
to: ".go"
|
||||||
|
},
|
||||||
|
clientFileNameReplacePattern: {
|
||||||
|
from: /.go$/,
|
||||||
|
to: ".golang"
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
endpointName: "c",
|
||||||
|
args: [
|
||||||
|
'clangd', ['--log=error']
|
||||||
|
],
|
||||||
|
nameEndsWith: ".c",
|
||||||
|
connectionType: "stdio"
|
||||||
|
}, {
|
||||||
|
endpointName: "r",
|
||||||
|
args: [
|
||||||
|
'r', ['--slave', '-e', 'languageserver::run()']
|
||||||
|
],
|
||||||
|
nameEndsWith: ".r",
|
||||||
|
connectionType: "stdio",
|
||||||
|
relativePath: false
|
||||||
|
}, {
|
||||||
|
endpointName: "typescript",
|
||||||
|
args: [
|
||||||
|
'typescript-language-server', ['--stdio']
|
||||||
|
],
|
||||||
|
nameEndsWith: ".ts",
|
||||||
|
connectionType: "stdio",
|
||||||
|
relativePath: false
|
||||||
|
},
|
||||||
|
];
|
||||||
17
package.json
Normal file
17
package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "Newton LSP Server Bridge",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js",
|
||||||
|
"start-verbose": "node index.js --verbose"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"typescript": "^5.7.2",
|
||||||
|
"yargs": "^17.7.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vscode-jsonrpc": "^8.1.0",
|
||||||
|
"vscode-uri": "^3.0.8",
|
||||||
|
"ws": "^8.13.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
46
paths-utility.js
Normal file
46
paths-utility.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
const path = require("path");
|
||||||
|
const {URI} = require("vscode-uri");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function makeServerPath(fileName, replacement) {
|
||||||
|
if (fileName.startsWith("file:")) {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
const serverPath = formatPath(__dirname + path.sep + "temp" + path.sep + fileName);
|
||||||
|
if (replacement) {
|
||||||
|
return serverPath.replace(
|
||||||
|
replacement.from,
|
||||||
|
replacement.to
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return serverPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeClientPath(filePath, replacement) {
|
||||||
|
if (/^(file|https?):/.test(filePath)) {
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
const clientPath = filePath.split(/[/\\]/).pop();
|
||||||
|
if (replacement) {
|
||||||
|
return clientPath.replace(
|
||||||
|
replacement.from,
|
||||||
|
replacement.to
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return clientPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatPath(filePath) {
|
||||||
|
return URI.file(filePath).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
exports.formatPath = formatPath;
|
||||||
|
exports.makeClientPath = makeClientPath;
|
||||||
|
exports.makeServerPath = makeServerPath;
|
||||||
Reference in New Issue
Block a user