fish-lsp
Version:
LSP implementation for fish/fish-shell
192 lines (180 loc) • 7.11 kB
text/typescript
import { readFileSync } from 'fs';
import { resolve } from 'path';
import PackageJSON from '../../package.json';
import { logToStdout } from '../logger';
/**
* Accumulate the arguments into two arrays, '--enable' and '--disable'
* More than one enable/disable flag can be used, but the output will be
* the stored across two resulting arrays (if both flags have values as input).
* Handles some of the default commands, such as '--help', and '-s, --show'
* from the command line args.
*/
export function accumulateStartupOptions(args: string[]): {
enabled: string[];
disabled: string[];
dumpCmd: boolean;
} {
const [_subcmd, ...options] = args;
const [enabled, disabled]: [ string[], string[] ] = [[], []];
let dumpCmd = false;
let current: string[];
options?.forEach(arg => {
if (['--enable', '--disable'].includes(arg)) {
if (arg === '--enable') {
current = enabled;
}
if (arg === '--disable') {
current = disabled;
}
return;
}
if (['-h', '--help', 'help'].includes(arg)) {
// commandBin.commands.find(command => command.name() === subcmd)!.outputHelp();
// process.exit(0);
return;
}
if (['--dump'].includes(arg)) {
logToStdout('SEEN SHOW COMMAND! dumping...');
dumpCmd = true;
return;
}
if (current) {
current?.push(arg);
}
});
return { enabled, disabled, dumpCmd };
}
/// HELPERS
export const smallFishLogo = () => '><(((°> FISH LSP';
export const RepoUrl = PackageJSON.repository?.url.slice(0, -4);
export const PackageVersion = PackageJSON.version;
export const PathObj: { [ K in 'bin' | 'root' | 'repo' | 'manFile' ]: string } = {
['bin']: resolve(__dirname.toString(), '..', '..', 'bin', 'fish-lsp'),
['root']: resolve(__dirname, '..', '..'),
['repo']: resolve(__dirname, '..', '..'),
['manFile']: resolve(__dirname, '..', '..', 'docs', 'man', 'fish-lsp.1'),
};
export const PackageLspVersion = PackageJSON.dependencies['vscode-languageserver-protocol']!.toString();
/**
* shows last compile bundle time in server cli executable
*/
const getOutTime = () => {
// @ts-ignore
const buildFile = resolve(__dirname, '..', '..', 'out', 'build-time.txt');
let buildTime = 'unknown';
try {
buildTime = readFileSync(buildFile, 'utf8');
} catch (e) {
logToStdout('Error reading ./out/build-time.txt');
}
return buildTime.trim();
};
export const getBuildTimeString = () => {
return getOutTime();
};
export const isPkgBinary = () => {
return resolve(__dirname).startsWith('/snapshot/');
};
export const FishLspHelp = {
beforeAll: `
fish-lsp [-h | --help] [-v | --version] [--help-man] [--help-all] [--help-short]
fish-lsp start [--enable | --disable] [--dump]
fish-lsp logger [-s | --show] [-d | --date] [-c | --clear] [-q | --quiet] [--config]
fish-lsp info [--bare] [--repo] [--time] [--env]
fish-lsp url [--repo] [--discussions] [--homepage] [--npm] [--contributions]
[--wiki] [--issues] [--client-repo] [--sources]
fish-lsp env [-c | --create] [-s | --show] [--no-comments]
fish-lsp complete`,
usage: `fish-lsp [OPTION]
fish-lsp [COMMAND [OPTION...]]`,
// fish-lsp [start | logger | info | url | complete] [options]
// fish-lsp [-h | --help] [-v | --version] [--help-man] [--help-all] [--help-short]
description: [
' A language server for the `fish-shell`, written in typescript. Currently supports',
` the following feature set from '${PackageLspVersion}' of the language server protocol.`,
' More documentation is available for any command or subcommand via \'-h/--help\'.',
'',
' The current language server protocol, reserves stdin/stdout for communication between the ',
' client and server. This means that when the server is started, it will listen for messages on',
' stdin/stdout. Command communication will be visible in `logs.txt`.',
'',
' For more information, see the github repository:',
` ${RepoUrl}`,
].join('\n'),
after: [
'',
'Examples:',
' # Default setup, with all options enabled',
' > fish-lsp start ',
'',
' # Generate and store completions file:',
' > fish-lsp complete > ~/.config/fish/completions/fish-lsp.fish',
].join('\n'),
};
export function FishLspManPage() {
const manFile = PathObj.manFile;
const content = readFileSync(manFile, 'utf8');
return {
path: resolve(PathObj.root, PathObj.manFile),
content: content.split('\n'),
};
}
export const SourcesDict: { [ key: string ]: string; } = {
repo: 'https://github.com/ndonfris/fish-lsp',
git: 'https://github.com/ndonfris/fish-lsp',
npm: 'https://npmjs.io/ndonfris/fish-lsp',
homepage: 'https://fish-lsp.dev',
contributions: 'https://github.com/ndonfris/fish-lsp/issues?q=',
issues: 'https://github.com/ndonfris/fish-lsp/issues?q=',
report: 'https://github.com/ndonfris/fish-lsp/issues?q=',
wiki: 'https://github.com/ndonfris/fish-lsp/wiki',
discussions: 'https://github.com/ndonfris/fish-lsp/discussions',
clientsRepos: 'https://github.com/ndonfris/fish-lsp-language-clients/',
sources: [
'https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#headerPart',
'https://github.com/microsoft/vscode-extension-samples/tree/main',
'https://tree-sitter.github.io/tree-sitter/',
'https://github.com/ram02z/tree-sitter-fish',
'https://github.com/microsoft/vscode-languageserver-node/tree/main/testbed',
'https://github.com/Beaglefoot/awk-language-server/tree/master/server',
'https://github.com/bash-lsp/bash-language-server/tree/main/server/src',
'https://github.com/oncomouse/coc-fish',
'https://github.com/typescript-language-server/typescript-language-server#running-the-language-server',
'https://github.com/neoclide/coc-tsserver',
'https://www.npmjs.com/package/vscode-jsonrpc',
'https://github.com/Microsoft/vscode-languageserver-node',
'https://github.com/Microsoft/vscode-languageserver-node',
'https://github.com/microsoft/vscode-languageserver-node/blob/main/client/src/common',
'https://github.com/microsoft/vscode-languageserver-node/tree/main/server/src/common',
].join('\n'),
};
export function BuildCapabilityString() {
const done = '✔️ '; // const done: string = '✅'
const todo = '❌'; // const todo: string = '❌'
const statusString = [
`${done} complete`,
`${done} hover`,
`${done} rename`,
`${done} definition`,
`${done} references`,
`${done} diagnostics`,
`${done} signatureHelp`,
`${done} codeAction`,
`${todo} codeLens`,
`${done} documentLink`,
`${done} formatting`,
`${done} rangeFormatting`,
`${done} refactoring`,
`${done} executeCommand`,
`${done} workspaceSymbol`,
`${done} documentSymbol`,
`${done} foldingRange`,
`${done} fold`,
`${done} onType`,
`${done} onDocumentSaveFormat`,
`${done} onDocumentSave`,
`${done} onDocumentOpen`,
`${done} onDocumentChange`,
].join('\n');
return statusString;
}