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 - Keyword completion and real-time error reporting through the language server
📦 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.9.1
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.9.1.tar.gz | 11.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ssh_config_ls-0.9.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.4 kB
Release files / ssh_config_ls-0.9.1.tar.gz
| Download URL | ssh_config_ls-0.9.1.tar.gz |
|---|---|
| Size | 11.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bc80493def25b5159d0ef9725a899703110abb06c017e110667b9c3bc6953025
|
|
BLAKE2b-256 checksum How to use checksums |
2a69eafeba41ab341739242a011d8bd5c9dd722ad19c9b5b6355564c9ee59202
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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.9.1-py3-none-any.whl
| Download URL | ssh_config_ls-0.9.1-py3-none-any.whl |
|---|---|
| Size | 14.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1c402b91a926c450802d79a4259a8ebf8bf1be5342c8d2b09548f4fb400e3cb5
|
|
BLAKE2b-256 checksum How to use checksums |
d0412b035b19363ab4c37436ec404879a1c52921e6aaebe6cf09b284c5542df6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|