README.md

September 3, 2026 · View on GitHub

██╗   ██╗██╗███╗   ███╗      ███████╗████████╗██████╗ ██╗   ██╗██╗  ██╗███████╗
██║   ██║██║████╗ ████║      ██╔════╝╚══██╔══╝██╔══██╗╚██╗ ██╔╝██║ ██╔╝██╔════╝
██║   ██║██║██╔████╔██║█████╗███████╗   ██║   ██████╔╝ ╚████╔╝ █████╔╝ █████╗
╚██╗ ██╔╝██║██║╚██╔╝██║╚════╝╚════██║   ██║   ██╔══██╗  ╚██╔╝  ██╔═██╗ ██╔══╝
 ╚████╔╝ ██║██║ ╚═╝ ██║      ███████║   ██║   ██║  ██║   ██║   ██║  ██╗███████╗
  ╚═══╝  ╚═╝╚═╝     ╚═╝      ╚══════╝   ╚═╝   ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝╚══════╝

CI Docs License: MIT

[VIM PLUGIN // NEON SYNTAX // STANDALONE STRYKE GRAMMAR // ALE + LSP]

"Load it with pathogen. Open a .stk. It lights up."

Vim / Neovim support for stryke — a highly parallel Perl 5 superset interpreter written in Rust. Standalone syntax highlighting, filetype detection, brace-aware indentation, ALE linting, and vim-lsp / coc.nvim integration. Zero configuration.

cd ~/.vim/bundle && git clone https://github.com/MenkeTechnologies/vim-stryke   # pathogen

Read the Docs · Engineering Report · strykelang · zshrs


[0x00] OVERVIEW

vim-stryke is Vim / Neovim support for stryke — a highly parallel Perl 5 superset interpreter written in Rust. It ships as a standard Vim runtime tree, so pathogen / vim-plug / native packages add it to runtimepath with zero special handling and zero configuration.

The syntax file is a standalone stryke grammar — not a reskin of Vim's perl syntax. It is generated (scripts/gen_syntax.sh) directly from the stryke binary's own reflection tables, so it carries the complete language surface and never drifts:

  • all 10,451 builtinsstryke -E 'p join "\n", sort keys %b'
  • the 90 keywords — stryke -E 'p join "\n", sort keys %k'
  • the 39 parallel primitives — stryke -E 'p join "\n", sort @{$c{parallel}}'

Regenerate after a stryke upgrade with ./scripts/gen_syntax.sh.

The stryke binary must be on $PATH for linting and LSP. brew install menketechnologies/menketech/stryke, or build strykelang.


[0x01] FEATURE MATRIX

CapabilityStatus
Filetype detection — *.stkImplemented — every *.stk buffer becomes filetype=stryke
Filetype detection — shebangImplemented — extensionless scripts with #!/usr/bin/env stryke are detected
Syntax highlightingImplemented — standalone grammar from stryke's lexer (keywords, builtins, parallel builtins, sigils, strings, here-docs, regex, thread macros)
IndentationImplemented — standalone brace-aware indenter
CommentsImplementedcommentstring=# %s, POD blocks, comment-continuation formatoptions
LintingImplemented — ALE linter running stryke --lint
Language server (vim-lsp)Implementedstryke --lsp, allowlisted for stryke + perl
Language server (coc.nvim)Implemented — ready-to-paste languageserver config
HelpImplemented:help vim-stryke
Config requiredNone — two opt-outs to disable ALE or LSP wiring

[0x02] INSTALL

pathogen

cd ~/.vim/bundle
git clone https://github.com/MenkeTechnologies/vim-stryke
# then inside vim:  :Helptags

vim-plug (add to ~/.vimrc / init.vim)

Plug 'MenkeTechnologies/vim-stryke'

native packages (Vim 8+ / Neovim)

git clone https://github.com/MenkeTechnologies/vim-stryke \
    ~/.vim/pack/plugins/start/vim-stryke

Open any .stk file and it lights up — no further configuration. See :help vim-stryke.


[0x03] SYNTAX // TOKEN CATEGORIES

The grammar classifies tokens into the same categories the official stryke lexer uses:

CategoryTokens (sample)Highlight
Declarationsmy var val our local state const typed use package pub is asStorageClass
Function / type introducersfn sub method class trait struct enum impl extendsKeyword
Control flowif elsif else unless while until loop for foreach match when try catch finally deferStatement
Phase / block hooksBEGIN END INIT CHECK UNITCHECK BUILD DESTROYPreProc
Word operatorsand or not xor cmp eq ne lt le gt ge xOperator
Booleans / undeftrue false undef nullBoolean / Constant
Parallel builtins (39)pmap pgrep pfor ploop pwhile pchannel preduce fan par_walkFunction
Builtins (10,451)p say print map grep reduce json_encode sha256 fetch ai a_law_decodeFunction
Type namesInt Str Float Bool Num Any Array Hash List Map Set VoidType
Thread macros~> ~>> ->> |> (plus streaming ~s>, parallel ~p>, distributed ~d> variants)Operator

Sigil variables ($scalar / @array / %hash, the $_ topic, special punctuation vars), single / double / backtick strings with interpolation and escapes, qw// and q// / qq// quotes, here-docs, and m// / s/// / tr/// / qr// regex are all handled. Everything links to standard highlight groups, so every colorscheme covers it.


[0x04] LINTING (ALE)

When ALE is installed, vim-stryke registers a linter that runs:

stryke --lint %t

Diagnostics of the form <message> at <file> line <n> are surfaced inline. Skipped silently if ALE is absent or g:vim_stryke_no_ale is set.


[0x05] LANGUAGE SERVER

vim-lsp

Registered automatically as stryke --lsp, allowlisted for the stryke and perl filetypes — no extra config when vim-lsp is installed.

coc.nvim

Add to coc-settings.json:

{
  "languageserver": {
    "stryke": {
      "command": "stryke",
      "args": ["--lsp"],
      "filetypes": ["stryke", "perl"]
    }
  }
}

[0x06] OPTIONS

Set before the plugin loads (e.g. in your vimrc):

VariableEffect
let g:vim_stryke_no_ale = 1Skip ALE linter registration
let g:vim_stryke_no_lsp = 1Skip vim-lsp server registration

[0x07] LAYOUT

vim-stryke/
├── ftdetect/stryke.vim   # *.stk + #!/usr/bin/env stryke -> filetype=stryke
├── syntax/stryke.vim     # standalone stryke grammar (generated; all 10,451 builtins)
├── scripts/gen_syntax.sh # regenerates syntax/stryke.vim from the stryke binary
├── ftplugin/stryke.vim   # commentstring '# %s', comments, formatoptions
├── indent/stryke.vim     # standalone brace-aware indenter
├── plugin/stryke.vim     # ALE linter + vim-lsp + coc wiring
└── doc/stryke.txt        # :help vim-stryke

Standard Vim runtime layout — pathogen / vim-plug / native packages add it to runtimepath with no special handling.


[0x08] LICENSE

MIT © MenkeTechnologies