From 834943fda013a336edbb59b08890ca5cce936ca7 Mon Sep 17 00:00:00 2001 From: Siddharth Sharma Date: Sun, 3 Mar 2024 19:12:56 +0100 Subject: [PATCH] Introduce YANG LSP support This addresses emacs-lsp/lsp-mode#4355 Signed-off-by: Siddharth Sharma --- clients/lsp-yang.el | 113 ++++++++++++++++++++++++++ docs/lsp-clients.json | 8 ++ docs/manual-language-docs/lsp-yang.md | 10 +++ lsp-mode.el | 8 +- mkdocs.yml | 1 + 5 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 clients/lsp-yang.el create mode 100644 docs/manual-language-docs/lsp-yang.md diff --git a/clients/lsp-yang.el b/clients/lsp-yang.el new file mode 100644 index 00000000000..7152e9e452d --- /dev/null +++ b/clients/lsp-yang.el @@ -0,0 +1,113 @@ +;;; lsp-yang.el --- YANG Client settings -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Siddharth Sharma + +;; Author: Siddharth Sharma +;; Keywords: languages, yang, lsp + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; LSP support for YANG using using an external language server. Currently +;; the supported server is: +;; +;; yang-lsp (yls). +;; See https://github.com/TypeFox/yang-lsp/blob/master/docs/Settings.md +;; for setting up the project file. + +;;; Code: + +(require 'lsp-mode) + +(defgroup lsp-yang nil + "LSP support for the YANG data modeling language using yang-lsp server." + :group 'lsp-yang + :link '(url-link "https://github.com/TypeFox/yang-lsp")) + +(defcustom lsp-yang-yls-executable "yang-language-server" + "The yang-lsp server executable to use. + +Leave as just the executable name to use the default behavior of finding the +executable with variable `exec-path'." + :group 'lsp-yang + :type 'string) + +(defcustom lsp-yang-yls-version "0.7.5" + "yang-lsp server version to download. +It has to be set before `lsp-yang.el' is loaded and it has to +be available here: https://github.com/TypeFox/yang-lsp/releases/" + :type 'string + :group 'lsp-yang + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-yang-yls-download-url + (format "https://github.com/TypeFox/yang-lsp/releases/download/v%s/yang-language-server_%s.zip" + lsp-yang-yls-version + lsp-yang-yls-version) + "Automatic download url for yang-lsp server" + :type 'string + :group 'lsp-yang + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-yang-yls-store-path + (f-join lsp-server-install-dir "yang-lsp" "yang-lsp") + "The path to the file in which `yang-language-server' will be stored." + :type 'file + :group 'lsp-yang + :package-version '(lsp-mode . "8.0.0")) + +(defcustom lsp-yang-yls-binary-path + (f-join lsp-server-install-dir (format "yang-lsp/yang-language-server-%s/bin" + lsp-yang-yls-version) + (pcase system-type + ('windows-nt "yang-language-server.bat") + (_ "yang-language-server"))) + "The path to `yang-language-server' binary." + :type 'file + :group 'lsp-yang + :package-version '(lsp-mode . "8.0.0")) + +(defun lsp-yang--stored-yls-executable () + "Return the stored yang-lsp server executable." + (executable-find lsp-yang-yls-binary-path)) + +(lsp-dependency + 'yls + '(:system "yls") + `(:download :url lsp-yang-yls-download-url + :decompress :zip + :store-path lsp-yang-yls-store-path + :binary-path lsp-yang-yls-binary-path + :set-exectutable? t)) + +(lsp-register-client + (make-lsp-client + :new-connection (lsp-stdio-connection + (lambda () (or (executable-find lsp-yang-yls-executable) + (lsp-yang--stored-yls-executable))) + (lambda () (or (executable-find lsp-yang-yls-executable) + (file-executable-p (lsp-yang--stored-yls-executable))))) + :activation-fn (lsp-activate-on "yang") + :major-modes '(yang-mode) + :language-id "YANG" + :priority -1 + :server-id 'lsp-yang + :download-server-fn (lambda (_client callback error-callback _update?) + (lsp-package-ensure 'yls callback error-callback)))) + +(lsp-consistency-check lsp-yang) + +(provide 'lsp-yang) +;;; lsp-yang.el ends here diff --git a/docs/lsp-clients.json b/docs/lsp-clients.json index f5be0b03cb4..691c2b9c4a3 100644 --- a/docs/lsp-clients.json +++ b/docs/lsp-clients.json @@ -1194,6 +1194,14 @@ "lsp-install-server": "yamlls", "debugger": "Not available" }, + { + "name": "yang", + "full-name": "YANG", + "server-name": "yang-lsp", + "server-url": "https://github.com/TypeFox/yang-lsp", + "installation-url": "https://github.com/TypeFox/yang-lsp/releases", + "debugger": "Not available" + }, { "name": "zig", "full-name": "Zig", diff --git a/docs/manual-language-docs/lsp-yang.md b/docs/manual-language-docs/lsp-yang.md new file mode 100644 index 00000000000..e50ef9060c4 --- /dev/null +++ b/docs/manual-language-docs/lsp-yang.md @@ -0,0 +1,10 @@ +--- +author: esmasth +root_file: docs/manual-language-docs/lsp-yang.md +--- + +## YANG Language Server (yang-lsp) Client + +### Configuration + +### Known Issues diff --git a/lsp-mode.el b/lsp-mode.el index 1737d7ff3a9..9ad6bd32a60 100644 --- a/lsp-mode.el +++ b/lsp-mode.el @@ -190,7 +190,8 @@ As defined by the Language Server Protocol 3.16." lsp-sonarlint lsp-tailwindcss lsp-tex lsp-terraform lsp-toml lsp-ttcn3 lsp-typeprof lsp-v lsp-vala lsp-verilog lsp-vetur lsp-volar lsp-vhdl lsp-vimscript lsp-wgsl lsp-xml lsp-yaml lsp-ruby-lsp lsp-ruby-syntax-tree - lsp-solidity lsp-sqls lsp-svelte lsp-steep lsp-tilt lsp-trunk lsp-zig lsp-jq) + lsp-solidity lsp-sqls lsp-svelte lsp-steep lsp-tilt lsp-trunk lsp-zig lsp-jq + lsp-yang) "List of the clients to be automatically required." :group 'lsp-mode :type '(repeat symbol)) @@ -795,6 +796,7 @@ Changes take effect only when a new session is started." ("^PKGBUILD$" . "shellscript") ("^go\\.mod\\'" . "go.mod") ("^settings.json$" . "jsonc") + ("^yang\\.settings$" . "jsonc") (ada-mode . "ada") (ada-ts-mode . "ada") (awk-mode . "awk") @@ -956,7 +958,8 @@ Changes take effect only when a new session is started." (jq-ts-mode . "jq") (protobuf-mode . "protobuf") (nushell-mode . "nushell") - (nushell-ts-mode . "nushell")) + (nushell-ts-mode . "nushell") + (yang-mode . "yang")) "Language id configuration.") (defvar lsp--last-active-workspaces nil @@ -6033,6 +6036,7 @@ Request codeAction/resolve for more info if server supports." (typescript-mode . typescript-indent-level) ; Typescript (typescript-ts-mode . typescript-ts-mode-indent-offset) ; Typescript (tree-sitter, Emacs29) (yaml-mode . yaml-indent-offset) ; YAML + (yang-mode . c-basic-offset) ; YANG (yang-mode) (default . standard-indent)) ; default fallback "A mapping from `major-mode' to its indent variable.") diff --git a/mkdocs.yml b/mkdocs.yml index 11861f1e4a3..3a8d35ddd55 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -175,6 +175,7 @@ nav: - wgsl: page/lsp-wgsl.md - XML: page/lsp-xml.md - YAML: page/lsp-yaml.md + - YANG: page/lsp-yang.md - Zig: page/lsp-zig.md - Debugging: - https://emacs-lsp.github.io/dap-mode