emacs-lsp / lsp-docker

Scripts and configurations to leverage lsp-mode in docker environment
GNU General Public License v3.0
241 stars 34 forks source link
docker lsp-mode starter-kit

+ATTR_HTML: align="center"; margin-right="auto"; margin-left="auto"

=lsp-mode= uses =lsp-docker= to run language servers using in containers

[[./images/logo.png]]

** Preconfigured language servers =emacslsp/lsp-docker-langservers= has the following content:

** emacslsp/lsp-docker-langservers This container is used by =lsp-docker= to run =Language Servers= for =lsp-mode= over local sources. =You must pull the container before lsp-docker can use it= *** Configuration

** emacslsp/lsp-docker-full The container =emacslsp/lsp-docker-full= contains:

** Custom language server containers You can use manually built language containers or images hosting language server(s), just follow a few simple rules (shown below). The docker images may feature an optional tag, if omitted latest will be assumed.

*** Building a container (or an image) manually: You have 2 constraints:

*** Registering a language server using a persistent configuration file: A configuration file is a yaml file that can be located at:

+begin_src

/.lsp-docker.yml /.lsp-docker.yaml /.lsp-docker/.lsp-docker.yml /.lsp-docker/.lsp-docker.yaml /.lsp-docker/lsp-docker.yml /.lsp-docker/lsp-docker.yaml /.lsp-docker/config.yml /.lsp-docker/config.yaml #+end_src It is structured in the following way: #+begin_src yaml # single server configuration lsp: server: type: docker # subtype: # - "container": attach to an already running container # - "image": when image does not exist, try to build it based on the dockerfile found in the project-scope # (see Automatic image building). An image might feature an optional tag, i.e. ':'. If a # tagless image is indicated 'latest' will be assumed. subtype: container # Image/container name to use for this language server. name: image-container-name # server id of a registered LSP server. You can find the list of registered servers evaluating: # # `(ht-keys lsp-clients)` # # source: # https://stackoverflow.com/questions/17066169/retrieve-keys-from-hash-table-sorted-by-the-values-efficiently server: server-id-of-the-base-server # an (optional) array of parameters (docker or podman) to launch the image with # initially intended to host the '--userns' parameter # NOTE: 'launch_parameters' are not used with 'container' subtype servers # in this case embed all required parameters when creating the server instead launch_parameters: - "--userns=nomap" # command to launch the language server in stdio mode # NOTE: 'launch_command' is not used with 'container' subtype servers as a command is embedded in a # container itself and serves as entrypoint launch_command: "launch command with arguments" mappings: # NOTE: the paths must be within the project this server is being build for - source: "/your/host/source/path" destination: "/your/path/inside/the/container" # multiple server configuration lsp: server: - type: ... subtype: ... ... # keys as in the classic single server case, e.g. type, subtype, etc... - ... # other single server configuration(s) mappings: # shared among all servers - source: destination: ... # other mappings #+end_src *** Registering a language server using a =.dir-locals= file: Just refer to the source code and general conventions of using =.dir-locals=. The variable you need is =lsp-docker-persistent-default-config=, its content is merged with the =lsp= section from a configuration file (if present). *** Automatic image building: You can also build an image automatically (currently supported only for =image= subtype): just drop the corresponding =Dockerfile= into the =.lsp-docker= folder in the project root (=Dockerfile= may be named as =Dockerfile= or =Dockerfile.lsp=). Building process is triggered by the =lsp-docker-register= call (you will be prompted whether you want to build the image). Image building *takes place in the project root* (*not* in the =.lsp-docker= subfolder)! In case of an automatic build the image will be registered automatically (based on the values from the config or =.dir-locals= file). You can also troubleshoot any issues with supplemental docker calls (checking whether the required image already exists, building a new image) using the supplemental logging functionality: there are 2 variables: first you have to set =lsp-docker-log-docker-supplemental-calls= to true-like value (by default it is =nil=) and then specify the log buffer in the =lsp-docker-log-docker-supplemental-calls-buffer-name= variable (by default it is set to =*lsp-docker-supplemental-calls*=) ** Docker over TRAMP (TBD) Docker running the language servers and hosting the sources, Emacs running on the desktop machine and connecting to docker instance over TRAMP. ** See also - [[https://github.com/Silex/docker.el][docker]] - package for managing =docker= images/containers. ** Maintainers - [[https://github.com/yyoncho][yyoncho]] - [[https://github.com/rnikoopour][rnikoopour]]