mirror of
https://github.com/oxalica/nil.git
synced 2024-11-25 18:41:40 +03:00
Init coc.nvim extension
This commit is contained in:
parent
d4e6677846
commit
128a699e5f
@ -4,7 +4,9 @@ let
|
|||||||
customRC = ''
|
customRC = ''
|
||||||
source ${./vimrc.vim}
|
source ${./vimrc.vim}
|
||||||
|
|
||||||
let $COC_NO_PLUGINS = 1
|
if !empty($COC_NIL_PATH)
|
||||||
|
execute 'set rtp^=' . $COC_NIL_PATH
|
||||||
|
endif
|
||||||
|
|
||||||
autocmd BufRead,BufNewFile *.nix setf nix
|
autocmd BufRead,BufNewFile *.nix setf nix
|
||||||
|
|
||||||
@ -83,21 +85,15 @@ let
|
|||||||
'';
|
'';
|
||||||
|
|
||||||
cocSetting = {
|
cocSetting = {
|
||||||
"coc.preferences.formatOnSaveFiletypes" = [ "nix" ];
|
coc.preferences.formatOnSaveFiletypes = [ "nix" ];
|
||||||
"links.tooltip" = true;
|
links.tooltip = true;
|
||||||
semanticTokens.filetypes = [ "nix" ];
|
semanticTokens.filetypes = [ "nix" ];
|
||||||
languageserver.nix = {
|
|
||||||
command = pkgs.writeShellScript "nil" ''
|
nil.server.path = pkgs.writeShellScript "nil" ''
|
||||||
exec "$NIL_PATH" "$@"
|
exec "$NIL_PATH" "$@"
|
||||||
'';
|
'';
|
||||||
filetypes = [ "nix" ];
|
nil.formatting.command = [ "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt" ];
|
||||||
rootPatterns = [ "flake.nix" ];
|
nil.diagnostics.excludedFiles = [ "generated.nix" ];
|
||||||
settings.nil = {
|
|
||||||
testSetting = 42;
|
|
||||||
formatting.command = [ "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt" ];
|
|
||||||
diagnostics.excludedFiles = [ "generated.nix" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -115,6 +111,7 @@ pkgs.vim_configurable.customize {
|
|||||||
packages.myPlugins.start = with pkgs.vimPlugins; [
|
packages.myPlugins.start = with pkgs.vimPlugins; [
|
||||||
vim-nix # File type and syntax highlighting.
|
vim-nix # File type and syntax highlighting.
|
||||||
coc-nvim
|
coc-nvim
|
||||||
|
coc-json
|
||||||
# FIXME
|
# FIXME
|
||||||
(nightfox-nvim.overrideAttrs (old: {
|
(nightfox-nvim.overrideAttrs (old: {
|
||||||
src = pkgs.fetchFromGitHub {
|
src = pkgs.fetchFromGitHub {
|
||||||
|
16
editors/coc-nil/.eslintrc.js
Normal file
16
editors/coc-nil/.eslintrc.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
extends: ['plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'],
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
|
'@typescript-eslint/no-namespace': 'off',
|
||||||
|
'@typescript-eslint/no-empty-function': 'off',
|
||||||
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||||
|
},
|
||||||
|
};
|
2
editors/coc-nil/.gitignore
vendored
Normal file
2
editors/coc-nil/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/node_modules
|
||||||
|
/lib
|
11
editors/coc-nil/.npmignore
Normal file
11
editors/coc-nil/.npmignore
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
src
|
||||||
|
node_modules
|
||||||
|
tsconfig.json
|
||||||
|
*.map
|
||||||
|
.tags
|
||||||
|
.DS_Store
|
||||||
|
webpack.config.js
|
||||||
|
esbuild.js
|
||||||
|
.github
|
||||||
|
.eslintrc.js
|
||||||
|
.prettierrc
|
1
editors/coc-nil/LICENSE-APACHE
Symbolic link
1
editors/coc-nil/LICENSE-APACHE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../LICENSE-APACHE
|
1
editors/coc-nil/LICENSE-MIT
Symbolic link
1
editors/coc-nil/LICENSE-MIT
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../LICENSE-MIT
|
37
editors/coc-nil/README.md
Normal file
37
editors/coc-nil/README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# coc-nil
|
||||||
|
|
||||||
|
**WIP**
|
||||||
|
|
||||||
|
[nil] language server glue for Vim/Neovim, works as an extension with [coc.nvim].
|
||||||
|
|
||||||
|
[nil]: https://github.com/oxalica/nil
|
||||||
|
[coc.nvim]: https://github.com/neoclide/coc.nvim
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
`:CocInstall coc-nil`
|
||||||
|
|
||||||
|
## Configurations
|
||||||
|
|
||||||
|
This extension is configured using a jsonc file. You can open this configuration file using the command `:CocConfig`,
|
||||||
|
and it is typically located at `$HOME/.config/nvim/coc-settings.json`.
|
||||||
|
|
||||||
|
Configurations to the LSP is documentated in
|
||||||
|
[`docs/configuration.md` of the LSP repository](https://github.com/oxalica/nil/blob/main/docs/configuration.md#reference),
|
||||||
|
with the exception that configuration keys can **ALSO** be written as flattened dot-separated string key.
|
||||||
|
That is, `coc-nvim` supports `"nil.nix.binary": "nix"`, `"nil": { "nix": { "binary": "nix" } }"`,
|
||||||
|
and even `"nil": { "nix.binary": "nix" }`.
|
||||||
|
|
||||||
|
The table below shows all extra configurations for the extension itself.
|
||||||
|
|
||||||
|
| Configuration | Description | Default |
|
||||||
|
|---|---|---|
|
||||||
|
| `nil.enable` | Enable `coc-nil` | `true` |
|
||||||
|
| `nil.server.path` | Path to the `nil` LSP server | `"nil"` |
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
"coc-nil" is primarily distributed under the terms of both the MIT
|
||||||
|
license and the Apache License (Version 2.0).
|
||||||
|
|
||||||
|
See LICENSE-APACHE and LICENSE-MIT for details.
|
3465
editors/coc-nil/package-lock.json
generated
Normal file
3465
editors/coc-nil/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
100
editors/coc-nil/package.json
Normal file
100
editors/coc-nil/package.json
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"name": "coc-nil",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "Nix extension using nil LSP for coc.nvim",
|
||||||
|
"author": "oxalica <oxalicc@pm.me>",
|
||||||
|
"license": "MIT OR Apache-2.0",
|
||||||
|
"main": "lib/main.js",
|
||||||
|
"keywords": [
|
||||||
|
"coc.nvim"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"coc": "^0.0.80"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rimraf lib",
|
||||||
|
"lint": "eslint src --ext ts",
|
||||||
|
"build": "esbuild src/main.ts --bundle --platform=node --target=node14 --external:coc.nvim --outdir=lib --color=false",
|
||||||
|
"watch": "esbuild src/main.ts --bundle --platform=node --target=node14 --external:coc.nvim --outdir=lib --color=false --watch",
|
||||||
|
"prepare": "npm run clean && npm run build"
|
||||||
|
},
|
||||||
|
"prettier": {
|
||||||
|
"singleQuote": true,
|
||||||
|
"printWidth": 120,
|
||||||
|
"semi": true
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.53.0",
|
||||||
|
"@typescript-eslint/parser": "^5.53.0",
|
||||||
|
"coc.nvim": "^0.0.82",
|
||||||
|
"esbuild": "^0.17.10",
|
||||||
|
"eslint": "^8.34.0",
|
||||||
|
"eslint-config-prettier": "^8.6.0",
|
||||||
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
|
"prettier": "^2.8.4",
|
||||||
|
"rimraf": "^4.1.2",
|
||||||
|
"typescript": "^4.9.5"
|
||||||
|
},
|
||||||
|
"activationEvents": [
|
||||||
|
"onLanguage:nix"
|
||||||
|
],
|
||||||
|
"contributes": {
|
||||||
|
"rootPatterns": [
|
||||||
|
{
|
||||||
|
"filetype": "nix",
|
||||||
|
"patterns": [
|
||||||
|
"flake.nix"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration": {
|
||||||
|
"type": "object",
|
||||||
|
"title": "coc-nil configuration",
|
||||||
|
"properties": {
|
||||||
|
"nil.enable": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true,
|
||||||
|
"description": "Enable `coc-nil` extension"
|
||||||
|
},
|
||||||
|
"nil.server.path": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "nil",
|
||||||
|
"description": "Path to the `nil` LSP server"
|
||||||
|
},
|
||||||
|
"nil.formatting.command": {
|
||||||
|
"type": [
|
||||||
|
"null",
|
||||||
|
"array"
|
||||||
|
],
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": "null",
|
||||||
|
"description": "External formatter command with arguments"
|
||||||
|
},
|
||||||
|
"nil.diagnostics.ignored": {
|
||||||
|
"type": "string",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": [],
|
||||||
|
"description": "Ignored diagnostic kinds"
|
||||||
|
},
|
||||||
|
"nil.diagnostics.excludedFiles": {
|
||||||
|
"type": "string",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"default": [],
|
||||||
|
"description": "File globs to exclude from showing diagnostics"
|
||||||
|
},
|
||||||
|
"nil.nix.binary": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "nix",
|
||||||
|
"description": "The path to the `nix` binary"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands": []
|
||||||
|
}
|
||||||
|
}
|
19
editors/coc-nil/src/main.ts
Normal file
19
editors/coc-nil/src/main.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { ExtensionContext, services, LanguageClient, workspace } from 'coc.nvim';
|
||||||
|
|
||||||
|
const ROOT_SECTION = 'nil';
|
||||||
|
|
||||||
|
export async function activate(context: ExtensionContext): Promise<void> {
|
||||||
|
const cfg = workspace.getConfiguration(ROOT_SECTION);
|
||||||
|
if (!cfg.get('enable', true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const serverOptions = {
|
||||||
|
command: cfg.get<string>('server.path', 'nil'),
|
||||||
|
};
|
||||||
|
const clientOptions = {
|
||||||
|
documentSelector: [{ language: 'nix' }],
|
||||||
|
};
|
||||||
|
const client = new LanguageClient('nil', 'nil Language Server', serverOptions, clientOptions);
|
||||||
|
context.subscriptions.push(services.registLanguageClient(client));
|
||||||
|
}
|
15
editors/coc-nil/tsconfig.json
Normal file
15
editors/coc-nil/tsconfig.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"noEmit": true,
|
||||||
|
"target": "ES2018",
|
||||||
|
"module": "commonjs",
|
||||||
|
"declaration": false,
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "lib",
|
||||||
|
"strict": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"esModuleInterop": true
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
48
flake.nix
48
flake.nix
@ -11,13 +11,14 @@
|
|||||||
|
|
||||||
outputs = { self, flake-utils, nixpkgs, rust-overlay }:
|
outputs = { self, flake-utils, nixpkgs, rust-overlay }:
|
||||||
let
|
let
|
||||||
|
inherit (builtins) substring;
|
||||||
|
inherit (nixpkgs) lib;
|
||||||
|
|
||||||
|
mtime = self.lastModifiedDate;
|
||||||
|
date = "${substring 0 4 mtime}-${substring 4 2 mtime}-${substring 6 2 mtime}";
|
||||||
|
rev = self.rev or (throw "Git changes are not committed");
|
||||||
|
|
||||||
mkNil = { rustPlatform, nix, ... }:
|
mkNil = { rustPlatform, nix, ... }:
|
||||||
let
|
|
||||||
inherit (builtins) substring;
|
|
||||||
mtime = self.lastModifiedDate;
|
|
||||||
date = "${substring 0 4 mtime}-${substring 4 2 mtime}-${substring 6 2 mtime}";
|
|
||||||
rev = self.rev or (throw "Git changes are not committed");
|
|
||||||
in
|
|
||||||
rustPlatform.buildRustPackage {
|
rustPlatform.buildRustPackage {
|
||||||
pname = "nil";
|
pname = "nil";
|
||||||
version = "unstable-${date}";
|
version = "unstable-${date}";
|
||||||
@ -28,12 +29,23 @@
|
|||||||
|
|
||||||
CFG_RELEASE = "git-${rev}";
|
CFG_RELEASE = "git-${rev}";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mkCocNil = { runCommand, nodejs, esbuild }:
|
||||||
|
runCommand "coc-nil-unstable-${date}" {
|
||||||
|
nativeBuildInputs = [ nodejs esbuild ];
|
||||||
|
src = ./editors/coc-nil;
|
||||||
|
} ''
|
||||||
|
cp -r --no-preserve=all $src ./source
|
||||||
|
cd source
|
||||||
|
npm run build --offline
|
||||||
|
mkdir -p $out
|
||||||
|
cp -rt $out lib package{,-lock}.json
|
||||||
|
'';
|
||||||
|
|
||||||
in
|
in
|
||||||
flake-utils.lib.eachDefaultSystem
|
flake-utils.lib.eachDefaultSystem
|
||||||
(system:
|
(system:
|
||||||
let
|
let
|
||||||
inherit (nixpkgs) lib;
|
|
||||||
|
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
rustPkgs = rust-overlay.packages.${system};
|
rustPkgs = rust-overlay.packages.${system};
|
||||||
|
|
||||||
@ -55,14 +67,16 @@
|
|||||||
|| die 'Format failed'
|
|| die 'Format failed'
|
||||||
cargo clippy --all --all-targets -- ${clippyFlags} \
|
cargo clippy --all --all-targets -- ${clippyFlags} \
|
||||||
|| die 'Clippy failed'
|
|| die 'Clippy failed'
|
||||||
|
|
||||||
|
( cd editors/coc-nil; npm run lint )
|
||||||
'';
|
'';
|
||||||
|
|
||||||
nil = pkgs.callPackage mkNil { };
|
|
||||||
in
|
in
|
||||||
rec {
|
rec {
|
||||||
packages = {
|
packages = rec {
|
||||||
inherit nil;
|
|
||||||
default = nil;
|
default = nil;
|
||||||
|
nil = pkgs.callPackage mkNil { };
|
||||||
|
coc-nil = pkgs.callPackage mkCocNil { };
|
||||||
};
|
};
|
||||||
|
|
||||||
devShells.default = pkgs.mkShell {
|
devShells.default = pkgs.mkShell {
|
||||||
@ -79,6 +93,8 @@
|
|||||||
# If you do want a locked one, use `devShells.full` below.
|
# If you do want a locked one, use `devShells.full` below.
|
||||||
# nix.out
|
# nix.out
|
||||||
|
|
||||||
|
nodejs
|
||||||
|
|
||||||
jq
|
jq
|
||||||
pre-commit
|
pre-commit
|
||||||
nixpkgs-fmt
|
nixpkgs-fmt
|
||||||
@ -98,6 +114,7 @@
|
|||||||
# bash
|
# bash
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
export NIL_PATH="$(cargo metadata --format-version=1 | jq -r .target_directory)/debug/nil"
|
export NIL_PATH="$(cargo metadata --format-version=1 | jq -r .target_directory)/debug/nil"
|
||||||
|
export COC_NIL_PATH="$(realpath ./editors/coc-nil)"
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -124,12 +141,17 @@
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
// rec {
|
// {
|
||||||
overlays = {
|
overlays = {
|
||||||
|
default = lib.composeExtension self.overlays.nil self.overlays.coc-nil;
|
||||||
nil = final: prev: {
|
nil = final: prev: {
|
||||||
nil = final.callPackage mkNil { };
|
nil = final.callPackage mkNil { };
|
||||||
};
|
};
|
||||||
default = overlays.nil;
|
coc-nil = final: prev: {
|
||||||
|
vimPlugins = prev.vimPlugins or { } // {
|
||||||
|
coc-nil = final.callPackage mkCocNil { };
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user