172 lines
5.6 KiB
EmacsLisp
172 lines
5.6 KiB
EmacsLisp
|
;;; lsp-toml.el --- lsp-mode TOML integration -*- lexical-binding: t; -*-
|
||
|
|
||
|
;; Copyright (C) 2021 Taiki Sugawara
|
||
|
|
||
|
;; Author: Taiki Sugawara <buzz.taiki@gmail.com>
|
||
|
;; Keywords: lsp, toml
|
||
|
|
||
|
;; 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 <https://www.gnu.org/licenses/>.
|
||
|
|
||
|
;;; Commentary:
|
||
|
|
||
|
;; Client for taplo.
|
||
|
|
||
|
;;; Code:
|
||
|
|
||
|
(require 'lsp-mode)
|
||
|
(require 'ht)
|
||
|
(require 'f)
|
||
|
|
||
|
(defgroup lsp-toml nil
|
||
|
"LSP support for TOML, using Taplo."
|
||
|
:group 'lsp-mode
|
||
|
:link '(url-link "https://github.com/tamasfe/taplo"))
|
||
|
|
||
|
(defcustom lsp-toml-command "taplo"
|
||
|
"Path to taplo command."
|
||
|
:type 'string
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1"))
|
||
|
|
||
|
(defcustom lsp-toml-cache-path (expand-file-name
|
||
|
(locate-user-emacs-file (f-join ".cache" "lsp-toml")))
|
||
|
"Path to cache."
|
||
|
:type 'string
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1"))
|
||
|
|
||
|
(lsp-defcustom lsp-toml-taplo-config-file-path nil
|
||
|
"An absolute, or workspace relative path to the Taplo configuration file."
|
||
|
:type 'string
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.taplo.configFile.path")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-taplo-config-file-enabled t
|
||
|
"Whether to enable the usage of a Taplo configuration file."
|
||
|
:type 'boolean
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.taplo.configFile.enabled")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-semantic-tokens nil
|
||
|
"Enable semantic tokens for inline table and array keys."
|
||
|
:type 'boolean
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.semanticTokens")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-schema-enabled t
|
||
|
"Enable completion and validation based on JSON schemas."
|
||
|
:type 'boolean
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.schema.enabled")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-schema-links nil
|
||
|
"Whether to show clickable links for keys in the editor."
|
||
|
:type 'boolean
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.schema.links")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-schema-catalogs
|
||
|
["https://www.schemastore.org/api/json/catalog.json"]
|
||
|
"A list of URLs to schema catalogs where schemas and associations
|
||
|
can be fetched from"
|
||
|
:type 'lsp-string-vector
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.schema.catalogs")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-schema-associations nil
|
||
|
"Additional document and schema associations.
|
||
|
|
||
|
The key must be a regular expression, this pattern is used to
|
||
|
associate schemas with absolute document URIs.
|
||
|
|
||
|
The value must be an absolute URI to the JSON schema"
|
||
|
:type '(alist :key-type symbol :value-type string)
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.schema.associations")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-schema-cache-memory-expiration 60
|
||
|
"The amount of seconds after which schemas will be invalidated from memory."
|
||
|
:type 'number
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.schema.cache.memoryExpiration")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-schema-cache-disk-expiration 600
|
||
|
"The amount of seconds after which cached catalogs and schemas
|
||
|
expire and will be attempted to be fetched again."
|
||
|
:type 'number
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.schema.cache.diskExpiration")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-completion-max-keys 5
|
||
|
"The maximum amount of keys in a dotted key to display during
|
||
|
completion, 0 effectively disables key completions."
|
||
|
:type 'number
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.completion.maxKeys")
|
||
|
|
||
|
(lsp-defcustom lsp-toml-syntax-semantic-tokens t
|
||
|
"Whether to enable semantic tokens for tables and arrays."
|
||
|
:type 'boolean
|
||
|
:group 'lsp-toml
|
||
|
:package-version '(lsp-mode . "8.0.1")
|
||
|
:lsp-path "evenBetterToml.syntax.semanticTokens")
|
||
|
|
||
|
|
||
|
(defun lsp-toml--initialization-options ()
|
||
|
"Initialization options for taplo."
|
||
|
(list :configurationSection "evenBetterToml"
|
||
|
:cachePath lsp-toml-cache-path))
|
||
|
|
||
|
(defun lsp-toml--handle-message-with-output (_workspace params)
|
||
|
"Handle taplo/messageWithOutput notification with PARAMS."
|
||
|
(funcall (pcase (ht-get params "kind")
|
||
|
("error" 'lsp--error)
|
||
|
("warn" 'lsp--warn)
|
||
|
("info" 'lsp--info)
|
||
|
(_ 'lsp--info))
|
||
|
"lsp-toml: %s"
|
||
|
(ht-get params "message")))
|
||
|
|
||
|
(defun lsp-toml--check-enabled (_file-name _mode)
|
||
|
"Check if the taplo language server should be enabled in this buffer."
|
||
|
(when (string= (lsp-buffer-language) "toml")
|
||
|
(make-directory lsp-toml-cache-path t)
|
||
|
t))
|
||
|
|
||
|
(lsp-register-client
|
||
|
(make-lsp-client
|
||
|
:new-connection (lsp-stdio-connection (lambda () (list lsp-toml-command "lsp" "stdio")))
|
||
|
:activation-fn #'lsp-toml--check-enabled
|
||
|
:initialization-options #'lsp-toml--initialization-options
|
||
|
:notification-handlers (ht ("taplo/messageWithOutput" #'lsp-toml--handle-message-with-output)
|
||
|
("taplo/didChangeSchemaAssociation" #'ignore))
|
||
|
:multi-root t
|
||
|
:server-id 'taplo
|
||
|
:priority -1))
|
||
|
|
||
|
(lsp-consistency-check lsp-toml)
|
||
|
|
||
|
(provide 'lsp-toml)
|
||
|
;;; lsp-toml.el ends here
|