Files
ack ee8bcf5300 Windows: product names, the editors, WSL; the Linux page's image step
Assembled from development commit c3c40f6c8fca. Since 830b193: on Windows the
products carry Windows names (ktext.exe, klammertext.dll, document.dll,
reflect.dll) and the console's output code page is UTF-8 for a run; the
editor tooling works on Windows (VS Code, Sublime Text, Vim, with the
interpreter's name chosen by platform) and Notepad++ joins it
(doc/edit/notepadpp: a User Defined Language and two Run-menu commands);
a sixth install page, doc/install/windows_wsl_install.md, for Linux
inside WSL; the Windows page opens with the three routes and gains its
editor section, the PowerShell quoting and Path notes; the Linux page
installs OpenImageIO from the python3-openimageio package and verifies
with kdiag --machine; the README lists all six install pages. Linux and
macOS behaviour is unchanged.
2026-09-25 18:43:22 +02:00
..

Klammertext support for Vim

Vim support for editing Klammertext files (.kt documents and .k klammer definitions): syntax highlighting, delimiter matching and jumping, structural reindentation, table alignment, and a delimiter checker.

The structure-aware features are thin wrappers around the shared editor core (klammertext_edit.py) — the single Python implementation of Klammertext's structural layer used by the Sublime Text and VS Code integrations and by the Klammertext language server. The Vim plugin runs it through python3; there is no Vim-specific reimplementation to drift out of sync.

Requirements

  • Vim 8+ (or Neovim) with +eval — any normal Vim; only vim-tiny lacks it.
  • python3 on PATH — on Windows python, the name python.org installs (Klammertext itself already requires Python).
  • The shared core, found automatically in this order:
    1. g:klammertext_edit_py, if you set it (a full path to klammertext_edit.py);
    2. a klammertext_edit.py vendored at this plugin's root (the layout the Klammertext editing zip ships);
    3. ../shared/klammertext_edit.py relative to the plugin directory (the layout of the Klammertext repository — using the plugin straight from a checkout just works);
    4. $KLAMMERTEXT_HOME/doc/edit/shared/klammertext_edit.py.

Install

Copy (or symlink) this vim/ directory into a Vim native package path, renaming it as you like:

mkdir -p ~/.vim/pack/klammertext/start
cp -R vim ~/.vim/pack/klammertext/start/klammertext

(Neovim: ~/.local/share/nvim/site/pack/klammertext/start/klammertext.) If you copy the directory out of the Klammertext tree, also copy shared/klammertext_edit.py into the copied folder's root — or set g:klammertext_edit_py. The editing zip from the Klammertext website ships the vendored copy already in place.

.kt and .k files then get the klammertext filetype. Note: .kt is also Kotlin's extension, and stock Vim maps it to Kotlin; this plugin's ftdetect overrides that unconditionally. If you edit both languages, see the comment in ftdetect/klammertext.vim.

What you get

Syntax highlighting — the same token classes and palette as the Emacs and Sublime Text support: text removal (#, ##, nestable #[ ... ]#), the three @-tiers — application (@, blue), definition (@@, green), system (@@@, orange) — each as an opening (@name) or a close (name@, bare @), opens bright and closes the same hue darker; ^-escapes; verbatim @code ... code@ interiors. All groups are hi def — override them with :highlight in your vimrc.

Commands (buffer-local; default mappings below):

Command Does
:[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 list unclosed/mismatched delimiters in the location list

Default mappings (buffer-local; suppress them all with let g:klammertext_no_mappings = 1): <LocalLeader>i reindents the current line (in visual mode, the selection), <LocalLeader>a aligns the enclosing table, <LocalLeader>j jumps to the matching delimiter. LocalLeader defaults to backslash; set maplocalleader to taste.

Reindentation is explicit-only: whitespace is content in Klammertext, so nothing reformats as a side effect of typing (indentkeys is emptied). Alignment follows the shared rules: rows end with ||; a row with a cell over 30 characters or spanning lines is left untouched; beyond 100 columns the command declines; bars inside a nested klammer are not separators; no whitespace is ever inserted inside a bar run.

With +python3 (check :echo has('python3')) the shared core also runs in-process: the = operator reindents through 'indentexpr' (==, gg=G), and the matching delimiter is highlighted live as the cursor sits on one — the show-paren equivalent, with a mismatched or unbalanced delimiter shown in red plus a message. Without +python3 the commands above still work; they shell out to python3 (on Windows python).

Comment toggling — 'commentstring' is set to # %s, so Vim 9.1's built-in commenting and Neovim's gcc/gc (or the commentary plugin) toggle # line removal.

Configuration

Variable Meaning (default)
g:klammertext_edit_py full path to klammertext_edit.py (auto-detected)
g:klammertext_python Python interpreter (python3; on Windows python)
g:klammertext_no_mappings set to define no default mappings

Neovim and the language server

Neovim users can additionally attach Neovim's built-in LSP client to the Klammertext language server (klammertext_ls.py, next to the shared core) for diagnostics as you type, gq/format-document reindentation, and cursor-hold match highlighting:

vim.api.nvim_create_autocmd('FileType', {
  pattern = 'klammertext',
  callback = function()
    vim.lsp.start {
      name = 'klammertext-ls',
      cmd = { 'python3', '/path/to/doc/edit/shared/klammertext_ls.py' },
    }
  end,
})

The plugin's own commands work the same with or without it.