Editor support generalized: shared core, language server, Vim and VS Code (from dev eb5baf9cbe59)

doc/edit/ now holds a shared Python implementation of the language's
structural layer (klammertext_edit.py) and a dependency-free language
server (klammertext_ls.py), with integrations for Emacs, Sublime Text,
Vim, and Visual Studio Code.  The editor test suite in tst/ covers the
core's API and CLI, the language server protocol, the VS Code
extension, headless Vim, and Emacs byte-equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-27 15:01:49 +02:00
parent 73ed7f3d5d
commit f855c5ccae
27 changed files with 3918 additions and 1170 deletions

View File

@@ -0,0 +1,63 @@
" Klammertext filetype plugin: comment format, the structural commands, and
" (when Vim has +python3) fast in-process indentation and live delimiter
" match highlighting. The implementations are in autoload/klammertext.vim;
" the algorithms themselves are the shared Python core
" (klammertext_edit.py — see doc/edit/README.md for how it is located).
"
" Commands (buffer-local):
" :[range]KlammertextReindent reindent the range (default: whole buffer)
" :KlammertextAlign align the @table enclosing the cursor
" :KlammertextJumpToMatch jump between a klammer application's
" opening and closing delimiter
" :KlammertextCheck unbalanced/mismatched delimiters -> the
" location list
"
" Default mappings (set g:klammertext_no_mappings to define none):
" <LocalLeader>i reindent the current line (visual: the selection)
" <LocalLeader>a align the enclosing table
" <LocalLeader>j jump to the matching delimiter
"
" Reindentation is EXPLICIT-ONLY: whitespace is content in Klammertext, so
" indentkeys is emptied and nothing reformats as a side effect of typing.
" With +python3 the ftplugin also sets 'indentexpr', so the = operator
" (e.g. ==, gg=G) reindents through the same shared implementation.
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
setlocal commentstring=#\ %s
setlocal comments=b:#
setlocal indentkeys=
command! -buffer -range=% KlammertextReindent
\ call klammertext#Reindent(<line1>, <line2>)
command! -buffer KlammertextAlign call klammertext#AlignTable()
command! -buffer KlammertextJumpToMatch call klammertext#JumpToMatch()
command! -buffer KlammertextCheck call klammertext#Check()
if !exists("g:klammertext_no_mappings")
nnoremap <buffer> <silent> <LocalLeader>i :.KlammertextReindent<CR>
xnoremap <buffer> <silent> <LocalLeader>i :KlammertextReindent<CR>
nnoremap <buffer> <silent> <LocalLeader>a :KlammertextAlign<CR>
nnoremap <buffer> <silent> <LocalLeader>j :KlammertextJumpToMatch<CR>
endif
let b:undo_ftplugin = "setlocal commentstring< comments< indentkeys<"
\ . " | delcommand KlammertextReindent"
\ . " | delcommand KlammertextAlign"
\ . " | delcommand KlammertextJumpToMatch"
\ . " | delcommand KlammertextCheck"
" With +python3 the shared core runs in-process: 'indentexpr' makes the =
" operator work, and the matching delimiter is highlighted live as the
" cursor sits on one (the show-paren equivalent; a mismatch shows in red
" with a message). Without +python3 the commands above still work — they
" shell out to python3 — and Neovim users can get live matching from the
" language server instead (see doc/edit/README.md).
if has('python3')
setlocal indentexpr=klammertext#IndentExpr()
let b:undo_ftplugin .= " | setlocal indentexpr<"
call klammertext#SetupMatchHighlight()
endif