187 lines
5.6 KiB
EmacsLisp
187 lines
5.6 KiB
EmacsLisp
|
|
;;; lsp-typst.el --- lsp-mode Typst integration -*- lexical-binding: t; -*-
|
||
|
|
|
||
|
|
;; Copyright (C) 2026 emacs-lsp maintainers
|
||
|
|
|
||
|
|
;; Author: emacs-lsp maintainers
|
||
|
|
;; Keywords: lsp, languages
|
||
|
|
|
||
|
|
;; 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 the Tinymist language server for Typst.
|
||
|
|
;; https://github.com/Myriad-Dreamin/tinymist
|
||
|
|
|
||
|
|
;;; Code:
|
||
|
|
|
||
|
|
(require 'lsp-mode)
|
||
|
|
|
||
|
|
(defgroup lsp-typst nil
|
||
|
|
"LSP support for Typst, using Tinymist."
|
||
|
|
:group 'lsp-mode
|
||
|
|
:link '(url-link "https://github.com/Myriad-Dreamin/tinymist")
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(defcustom lsp-typst-server-command '("tinymist")
|
||
|
|
"Command to run the Tinymist language server."
|
||
|
|
:type '(repeat string)
|
||
|
|
:group 'lsp-typst
|
||
|
|
:risky t
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
;;; Formatter options
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-formatter-mode "typstyle"
|
||
|
|
"Formatter to use for Typst documents."
|
||
|
|
:type '(choice (const "disable")
|
||
|
|
(const "typstyle")
|
||
|
|
(const "typstfmt"))
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.formatterMode"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-formatter-indent-size 2
|
||
|
|
"Number of spaces for indentation."
|
||
|
|
:type 'number
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.formatterIndentSize"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-formatter-print-width 120
|
||
|
|
"Soft limit on line width for the formatter."
|
||
|
|
:type 'number
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.formatterPrintWidth"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
;;; Export options
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-export-pdf "never"
|
||
|
|
"When to export PDF.
|
||
|
|
Possible values: never, onSave, onType, onDocumentHasTitle."
|
||
|
|
:type '(choice (const "never")
|
||
|
|
(const "onSave")
|
||
|
|
(const "onType")
|
||
|
|
(const "onDocumentHasTitle"))
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.exportPdf"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-export-target "paged"
|
||
|
|
"Export target format."
|
||
|
|
:type '(choice (const "paged")
|
||
|
|
(const "html"))
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.exportTarget"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-output-path ""
|
||
|
|
"Path pattern for output files.
|
||
|
|
Supports $root, $dir, $name variable substitution."
|
||
|
|
:type 'string
|
||
|
|
:group 'lsp-typst
|
||
|
|
:risky t
|
||
|
|
:lsp-path "tinymist.outputPath"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
;;; Lint options
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-lint-enabled nil
|
||
|
|
"Enable or disable lint checks."
|
||
|
|
:type 'boolean
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.lint.enabled"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-lint-when "onSave"
|
||
|
|
"When to perform lint checks."
|
||
|
|
:type '(choice (const "onSave")
|
||
|
|
(const "onType"))
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.lint.when"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
;;; Font and path options
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-font-paths nil
|
||
|
|
"List of file or directory paths to fonts."
|
||
|
|
:type 'lsp-string-vector
|
||
|
|
:group 'lsp-typst
|
||
|
|
:risky t
|
||
|
|
:lsp-path "tinymist.fontPaths"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-system-fonts t
|
||
|
|
"Include system fonts in font search."
|
||
|
|
:type 'boolean
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.systemFonts"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-root-path nil
|
||
|
|
"Root path for absolute paths in Typst.
|
||
|
|
Set to \"-\" to use parent directory of the file."
|
||
|
|
:type '(choice (const nil)
|
||
|
|
string)
|
||
|
|
:group 'lsp-typst
|
||
|
|
:risky t
|
||
|
|
:lsp-path "tinymist.rootPath"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
;;; Miscellaneous options
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-semantic-tokens t
|
||
|
|
"Enable semantic tokens for syntax highlighting."
|
||
|
|
:type 'boolean
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.semanticTokens"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-project-resolution "singleFile"
|
||
|
|
"How to resolve projects.
|
||
|
|
singleFile: Manage documents like Markdown.
|
||
|
|
lockDatabase: Manage documents like Rust with project tracking."
|
||
|
|
:type '(choice (const "singleFile")
|
||
|
|
(const "lockDatabase"))
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.projectResolution"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
(lsp-defcustom lsp-typst-extra-args ""
|
||
|
|
"Extra arguments to pass to the Typst compiler."
|
||
|
|
:type 'string
|
||
|
|
:group 'lsp-typst
|
||
|
|
:lsp-path "tinymist.typstExtraArgs"
|
||
|
|
:package-version '(lsp-mode . "10.0.0"))
|
||
|
|
|
||
|
|
;;; Client registration
|
||
|
|
|
||
|
|
(lsp-dependency 'tinymist
|
||
|
|
'(:system "tinymist"))
|
||
|
|
|
||
|
|
(lsp-register-client
|
||
|
|
(make-lsp-client :server-id 'tinymist
|
||
|
|
:new-connection (lsp-stdio-connection (lambda () lsp-typst-server-command))
|
||
|
|
:activation-fn (lsp-activate-on "typst")
|
||
|
|
:initialized-fn (lambda (workspace)
|
||
|
|
(with-lsp-workspace workspace
|
||
|
|
(lsp--set-configuration
|
||
|
|
(lsp-configuration-section "tinymist"))))
|
||
|
|
:synchronize-sections '("tinymist")))
|
||
|
|
|
||
|
|
(lsp-consistency-check lsp-typst)
|
||
|
|
|
||
|
|
(provide 'lsp-typst)
|
||
|
|
;;; lsp-typst.el ends here
|