An SSH config formatter, usable as a Language Server Protocol (LSP) plugin.
Project description
SSH config formatter
Little side project to start learning Rust and explore LSP.
✨ Features
- Formatting of SSH config files via the
sshls formatcommand - Language server started with
sshls server, following the LSP protocol
📦 Installation
You can install the tool easily with pipx or uv:
uv tool install ssh-config-ls
🔧 Configuration
The language server accepts the following options from the client (e.g. Neovim):
{
formatter = {
indent = " ", -- Indentation for directives inside Host and Match blocks
separator = " ", -- Separator between a keyword and its arguments
sort_directives = true, -- Sort directives within blocks
}
}
Formateur de config SSH — Plan de projet
Étape 1 — Prototype Python
Objectif : valider la logique de parsing et de formatage sans se battre contre un nouveau langage.
Note : Couvrir les cas limites (commentaires inline, blocs Host/Match, lignes vides multiples) et garder les tests sur le comportement observable (entrée/sortie texte) — ils serviront de spec pour la réécriture Rust.
Fonctionnalités à implémenter :
Lexer :
- Ajouter des tests sur le tokenizer
- Implémenter un tokenizer pour le cœur de la config
- Ajouter les commentaires dans le tokenizer
- Écrire tous les tests vicieux imaginables
Parser :
- Ajouter des tests sur le parser
- Implémenter un parser
- Parser les blocs
HostetMatch - Écrire tous les tests vicieux imaginables
Formatage :
- Préserver les commentaires et automatises les lignes vides
- Normaliser l'indentation (4 espaces)
- Canonicaliser la casse des clés (
hostname→Hostname) - Écrire tous les tests vicieux imaginables
CLI :
-
sshls format <file>— formate en place -
sshls format --check <file>— exit code non-zéro si non formaté (CI) -
sshls format --diff <file>— affiche le diff
LSP :
- Lib : pygls
- Créer le serveur
- Ajouter textDocument/formatting
Hors scope pour l'instant :
- Gérer les directives
Include - Trier les blocs (
*en dernier)
Étape 2 — Apprentissage Rust
Avant de réécrire, poser les bases du langage.
- Lire les chapitres fondamentaux de The Book, en particulier sur l'ownership et les enums
- Faire quelques exercices Rustlings pour la syntaxe
- Libs à connaître pour ce projet :
pestouwinnow(parsing),clap(CLI)
Étape 3 — Réécriture en Rust
Réécrire le formateur en Rust en s'appuyant sur les tests Python comme spec.
- Reprendre exactement les mêmes fonctionnalités et la même interface CLI
- Les tests Python guident l'implémentation et valident la parité de comportement
Étape 4 — Serveur LSP
Transformer le formateur en serveur LSP avec uniquement la capacité de formatage (textDocument/formatting).
- Lib :
tower-lsppour abstraire le protocole JSON-RPC - Intégration Neovim via
vim.lsp.start()ounvim-lspconfig— pas de plugin dédié nécessaire
Références
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ssh_config_ls-0.7.6.tar.gz.
File metadata
- Download URL: ssh_config_ls-0.7.6.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Alpine Linux","version":"3.23.5","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9ba3a9b5854e7d2b4aa7b66e8fd1c2d6cfb57eb4148380f29e7ff1c10bf9585
|
|
| MD5 |
be1b94318e1d3fc31651e56eb2a0a884
|
|
| BLAKE2b-256 |
70a47d1ae8fd092f73dfdad45beb3a6334badec1d4a1e29b8e397b1bd6e37862
|
File details
Details for the file ssh_config_ls-0.7.6-py3-none-any.whl.
File metadata
- Download URL: ssh_config_ls-0.7.6-py3-none-any.whl
- Upload date:
- Size: 12.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Alpine Linux","version":"3.23.5","id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
041cd3c37277d7ea1941a9e6468cae08a498e31982b4e2e333d656bee65a2fd3
|
|
| MD5 |
e4e7364534e5f0bbadac6db3e35a2ee9
|
|
| BLAKE2b-256 |
ae59138cda609a018fd870e16b553d8763c5efa4793ffebd6941488bd5a6ad04
|