Typographic transforms (---, quote pairs, ~) no longer touch verbatim text: @c/@code/@source_listing content and ^'...'^ spans show exactly the characters written. "^" before any punctuation character quotes it in every target (the apostrophe excepted: ^' opens a literal span), with the new :resolve option on @@@target declaring per-target renderings. The ^UUUU^ code-point form accepts 4-6 hex digits, the full Unicode range. The html output and transform spellings are polyglot (XML-valid), in preparation for an EPUB target. New suites: transform_test, character_test (engine), typography_test (SKS). (from dev 07ce5ea86a0a)
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; onlyvim-tinylacks it. python3onPATH(Klammertext itself already requires Python).- The shared core, found automatically in this order:
g:klammertext_edit_py, if you set it (a full path toklammertext_edit.py);- a
klammertext_edit.pyvendored at this plugin's root (the layout the Klammertext editing zip ships); ../shared/klammertext_edit.pyrelative to the plugin directory (the layout of the Klammertext repository — using the plugin straight from a checkout just works);$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.
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) |
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.