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
Release files for ssh-config-ls 0.7.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ssh_config_ls-0.7.7.tar.gz | 9.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ssh_config_ls-0.7.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.6 kB
Release files / ssh_config_ls-0.7.7.tar.gz
| Download URL | ssh_config_ls-0.7.7.tar.gz |
|---|---|
| Size | 9.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4e14dba5d29767be8ff99f7ff5a439b407634e2a147b2ac8791a549acce55b9a
|
|
BLAKE2b-256 checksum How to use checksums |
e5b4eaf4fae40c8a9811d4c81dfe52ba5b9d13d39bfd347fe23282b6059be3a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}
|
Release files / ssh_config_ls-0.7.7-py3-none-any.whl
| Download URL | ssh_config_ls-0.7.7-py3-none-any.whl |
|---|---|
| Size | 12.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
235accc71a9526281f5957bc498893720ef81c2969eadcb7e4b9559e97894bb3
|
|
BLAKE2b-256 checksum How to use checksums |
a6f96bd8f65dfdf66da8bd1a2888fa6f427eef40cc20255e43a462b651d85e59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}
|