A Language Server Protocol (LSP) implementation for the Crystal Description Language (CDL).
Part of the Gemmology Project.
- Diagnostics: Real-time error detection and warnings
- Completion: Context-aware autocomplete for systems, point groups, forms, and modifications
- Hover: Documentation on hover for CDL elements
- Go to Definition: Navigate to symbol definitions
- Formatting: Automatic CDL formatting
- Code Actions: Quick fixes for common errors
- Document Symbols: Outline view of CDL documents
- Signature Help: Parameter hints for modifications
pip install cdl-lspThe package requires:
cdl-parser>=1.0.0- CDL parsing librarypygls>=1.0.0- Python language server frameworklsprotocol>=2023.0.0- LSP type definitions
# Standard I/O mode (default)
cdl-lsp
# TCP mode
cdl-lsp --tcp --host 127.0.0.1 --port 2087
# With logging
cdl-lsp --log-file /tmp/cdl-lsp.log --log-level DEBUGfrom cdl_lsp import create_server
server = create_server()
server.start_io() # or server.start_tcp(host, port)Install the CDL extension from the VS Code marketplace, or configure manually:
{
"cdl.server.path": "cdl-lsp"
}require('lspconfig').cdl_lsp.setup{
cmd = {'cdl-lsp'},
filetypes = {'cdl'},
}Add to LSP settings:
{
"clients": {
"cdl": {
"command": ["cdl-lsp"],
"selector": "source.cdl"
}
}
}The Crystal Description Language describes crystal morphologies:
# Basic forms
cubic[m3m]:{111} # Octahedron
cubic[m3m]:{100} # Cube
# Combined forms
cubic[m3m]:{111}@1.0 + {100}@1.3 # Truncated octahedron
# Named forms
cubic[m3m]:octahedron # Same as {111}
# Modifications
cubic[m3m]:{111}|elongate(c:1.5) # Elongated
cubic[m3m]:{111}|twin(spinel) # Twinned
# Different crystal systems
hexagonal[6/mmm]:{10-10}@1.0 + {0001}@0.5 # Hexagonal prism
trigonal[-3m]:{10-11} # Rhombohedron
from cdl_lsp.constants import (
CRYSTAL_SYSTEMS, # Set of crystal system names
POINT_GROUPS, # Dict mapping system to point groups
ALL_POINT_GROUPS, # Set of all 32 point groups
TWIN_LAWS, # Set of twin law names
NAMED_FORMS, # Dict mapping form names to Miller indices
MODIFICATIONS, # Set of modification names
)The LSP server handles all features internally. Use the server module to start the language server:
from cdl_lsp import create_server, SERVER_NAME, SERVER_VERSION
server = create_server()
print(f"Running {SERVER_NAME} v{SERVER_VERSION}")
server.start_io() # or server.start_tcp(host, port)git clone https://github.com/gemmology-dev/cdl-lsp
cd cdl-lsp
pip install -e ".[dev]"pytest tests/ -vruff check src/
mypy src/MIT License - see LICENSE for details.