Skip to content

Commit 57823f0

Browse files
authored
Add Kakoune lexer (#1150)
This lexer is based on Pygments' BashLexer. The visual results are nearly identical to how Kakoune does its own syntax highlighting.
1 parent 1c5b8cb commit 57823f0

File tree

3 files changed

+221
-0
lines changed

3 files changed

+221
-0
lines changed

lexers/embedded/kakoune.xml

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
2+
<lexer>
3+
<config>
4+
<name>Kakoune</name>
5+
<alias>kak</alias>
6+
<alias>kakoune</alias>
7+
<alias>kakrc</alias>
8+
<alias>kakscript</alias>
9+
<filename>*.kak</filename>
10+
<filename>kakrc</filename>
11+
<mime_type>application/x-sh</mime_type>
12+
<mime_type>application/x-shellscript</mime_type>
13+
<mime_type>text/x-shellscript</mime_type>
14+
</config>
15+
<rules>
16+
<state name="root">
17+
<rule pattern="\b(add\-highlighter|alias|arrange\-buffers|buffer|buffer\-next|buffer\-previous|catch|change\-directory|colorscheme|debug|declare\-option|declare\-user\-mode|define\-command|complete\-command|delete\-buffer|delete\-buffer!|echo|edit|edit!|enter\-user\-mode|evaluate\-commands|execute\-keys|fail|hook|info|kill|kill!|map|nop|on\-key|prompt|provide\-module|quit|quit!|remove\-highlighter|remove\-hooks|rename\-buffer|rename\-client|rename\-session|require\-module|select|set\-face|set\-option|set\-register|source|trigger\-user\-hook|try|unalias|unmap|unset\-face|unset\-option|update\-option|write|write!|write\-all|write\-all\-quit|write\-quit|write\-quit!)\b"><token type="Keyword"/></rule>
18+
<rule pattern="\b(global|buffer|window|current|normal|insert|prompt|goto|view|user|object|number\-lines|show\-matching|show\-whitespaces|fill|regex|dynregex|group|flag\-lines|ranges|line|column|wrap|ref|regions|region|default\-region|replace\-ranges)\b"><token type="NameAttribute"/></rule>
19+
<rule pattern="\b(int|bool|str|regex|int\-list|str\-list|completions|line\-specs|range\-specs|str\-to\-str\-map)\b"><token type="NameClass"/></rule>
20+
<rule pattern="\b(default|black|red|green|yellow|blue|magenta|cyan|white|yes|no|false|true)\b"><token type="Literal"/></rule>
21+
<rule pattern="\brgba?:[0-9a-fA-F]{6,8}\b"><token type="LiteralNumberHex"/></rule>
22+
<rule pattern="(-params )(\b\d+)(\.\.)(\d+\b)"><bygroups><token type="Text"/><token type="LiteralNumber"/><token type="Text"/><token type="LiteralNumber"/></bygroups></rule>
23+
<rule pattern="&quot;(&quot;&quot;|[^&quot;])*&quot;"><token type="LiteralString"/></rule>
24+
<rule pattern="&#x27;(&#x27;&#x27;|[^&#x27;])*&#x27;"><token type="LiteralString"/></rule>
25+
<rule><include state="basic"/></rule>
26+
<rule pattern="`"><token type="LiteralStringBacktick"/><push state="backticks"/></rule>
27+
<rule><include state="data"/></rule>
28+
<rule><include state="interp"/></rule>
29+
</state>
30+
<state name="interp">
31+
<rule pattern="\$\(\("><token type="Keyword"/><push state="math"/></rule>
32+
<rule pattern="\$\("><token type="Keyword"/><push state="paren"/></rule>
33+
<rule pattern="\$\{#?"><token type="LiteralStringInterpol"/><push state="curly"/></rule>
34+
<rule pattern="\$[a-zA-Z_]\w*"><token type="NameVariable"/></rule>
35+
<rule pattern="\$(?:\d+|[#$?!_*@-])"><token type="NameVariable"/></rule>
36+
<rule pattern="\$"><token type="Text"/></rule>
37+
</state>
38+
<state name="basic">
39+
<rule pattern="\b(if|fi|else|while|in|do|done|for|then|return|function|case|select|break|continue|until|esac|elif)(\s*)\b"><bygroups><token type="Keyword"/><token type="TextWhitespace"/></bygroups></rule>
40+
<rule pattern="\b(alias|bg|bind|builtin|caller|cd|command|compgen|complete|declare|dirs|disown|echo|enable|eval|exec|exit|export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|time|times|trap|true|type|typeset|ulimit|umask|unalias|unset|wait)(?=[\s)`])"><token type="NameBuiltin"/></rule>
41+
<rule pattern="\A#!.+\n"><token type="CommentHashbang"/></rule>
42+
<rule pattern="#.*\n"><token type="CommentSingle"/></rule>
43+
<rule pattern="\\[\w\W]"><token type="LiteralStringEscape"/></rule>
44+
<rule pattern="(\b\w+)(\s*)(\+?=)"><bygroups><token type="NameVariable"/><token type="TextWhitespace"/><token type="Operator"/></bygroups></rule>
45+
<rule pattern="[\[\]{}()=]"><token type="Operator"/></rule>
46+
<rule pattern="&lt;&lt;&lt;"><token type="Operator"/></rule>
47+
<rule pattern="&lt;&lt;-?\s*(\&#x27;?)\\?(\w+)[\w\W]+?\2"><token type="LiteralString"/></rule>
48+
<rule pattern="&amp;&amp;|\|\|"><token type="Operator"/></rule>
49+
</state>
50+
<state name="data">
51+
<rule pattern="(?s)\$?&quot;(\\.|[^&quot;\\$])*&quot;"><token type="LiteralStringDouble"/></rule>
52+
<rule pattern="&quot;"><token type="LiteralStringDouble"/><push state="string"/></rule>
53+
<rule pattern="(?s)\$&#x27;(\\\\|\\[0-7]+|\\.|[^&#x27;\\])*&#x27;"><token type="LiteralStringSingle"/></rule>
54+
<rule pattern="(?s)&#x27;.*?&#x27;"><token type="LiteralStringSingle"/></rule>
55+
<rule pattern=";"><token type="Punctuation"/></rule>
56+
<rule pattern="&amp;"><token type="Punctuation"/></rule>
57+
<rule pattern="\|"><token type="Punctuation"/></rule>
58+
<rule pattern="\s+"><token type="TextWhitespace"/></rule>
59+
<rule pattern="\d+\b"><token type="LiteralNumber"/></rule>
60+
<rule pattern="[^=\s\[\]{}()$&quot;\&#x27;`\\&lt;&amp;|;]+"><token type="Text"/></rule>
61+
<rule pattern="&lt;"><token type="Text"/></rule>
62+
</state>
63+
<state name="string">
64+
<rule pattern="&quot;"><token type="LiteralStringDouble"/><pop depth="1"/></rule>
65+
<rule pattern="(?s)(\\\\|\\[0-7]+|\\.|[^&quot;\\$])+"><token type="LiteralStringDouble"/></rule>
66+
<rule><include state="interp"/></rule>
67+
</state>
68+
<state name="curly">
69+
<rule pattern="\}"><token type="LiteralStringInterpol"/><pop depth="1"/></rule>
70+
<rule pattern=":-"><token type="Keyword"/></rule>
71+
<rule pattern="\w+"><token type="NameVariable"/></rule>
72+
<rule pattern="[^}:&quot;\&#x27;`$\\]+"><token type="Punctuation"/></rule>
73+
<rule pattern=":"><token type="Punctuation"/></rule>
74+
<rule><include state="root"/></rule>
75+
</state>
76+
<state name="paren">
77+
<rule pattern="\)"><token type="Keyword"/><pop depth="1"/></rule>
78+
<rule><include state="root"/></rule>
79+
</state>
80+
<state name="math">
81+
<rule pattern="\)\)"><token type="Keyword"/><pop depth="1"/></rule>
82+
<rule pattern="\*\*|\|\||&lt;&lt;|&gt;&gt;|[-+*/%^|&amp;&lt;&gt;]"><token type="Operator"/></rule>
83+
<rule pattern="\d+#[\da-zA-Z]+"><token type="LiteralNumber"/></rule>
84+
<rule pattern="\d+#(?! )"><token type="LiteralNumber"/></rule>
85+
<rule pattern="0[xX][\da-fA-F]+"><token type="LiteralNumber"/></rule>
86+
<rule pattern="\d+"><token type="LiteralNumber"/></rule>
87+
<rule pattern="[a-zA-Z_]\w*"><token type="NameVariable"/></rule>
88+
<rule><include state="root"/></rule>
89+
</state>
90+
<state name="backticks">
91+
<rule pattern="`"><token type="LiteralStringBacktick"/><pop depth="1"/></rule>
92+
<rule><include state="root"/></rule>
93+
</state>
94+
</rules>
95+
</lexer>
96+

lexers/testdata/kakoune.actual

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
define-command -hidden -params 4 doc-render-regex %{
2+
evaluate-commands -draft %{ try %{
3+
execute-keys <percent> s %arg{1} <ret>
4+
execute-keys -draft s %arg{2} <ret> d
5+
execute-keys "%arg{3}"
6+
evaluate-commands %sh{
7+
face="$4"
8+
eval "set -- $kak_quoted_selections_desc"
9+
ranges=""
10+
for desc in "$@"; do ranges="$ranges '$desc|$face'"; done
11+
echo "update-option buffer doc_render_ranges"
12+
echo "set-option -add buffer doc_render_ranges $ranges"
13+
}
14+
} }
15+
}

lexers/testdata/kakoune.expected

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
[
2+
{"type":"Keyword","value":"define-command"},
3+
{"type":"TextWhitespace","value":" "},
4+
{"type":"Text","value":"-hidden"},
5+
{"type":"TextWhitespace","value":" "},
6+
{"type":"Text","value":"-params"},
7+
{"type":"TextWhitespace","value":" "},
8+
{"type":"LiteralNumber","value":"4"},
9+
{"type":"TextWhitespace","value":" "},
10+
{"type":"Text","value":"doc-render-regex"},
11+
{"type":"TextWhitespace","value":" "},
12+
{"type":"Text","value":"%"},
13+
{"type":"Operator","value":"{"},
14+
{"type":"TextWhitespace","value":"\n "},
15+
{"type":"Keyword","value":"evaluate-commands"},
16+
{"type":"TextWhitespace","value":" "},
17+
{"type":"Text","value":"-draft"},
18+
{"type":"TextWhitespace","value":" "},
19+
{"type":"Text","value":"%"},
20+
{"type":"Operator","value":"{"},
21+
{"type":"TextWhitespace","value":" "},
22+
{"type":"Keyword","value":"try"},
23+
{"type":"TextWhitespace","value":" "},
24+
{"type":"Text","value":"%"},
25+
{"type":"Operator","value":"{"},
26+
{"type":"TextWhitespace","value":"\n "},
27+
{"type":"Keyword","value":"execute-keys"},
28+
{"type":"TextWhitespace","value":" "},
29+
{"type":"Text","value":"\u003cpercent\u003e"},
30+
{"type":"TextWhitespace","value":" "},
31+
{"type":"Text","value":"s"},
32+
{"type":"TextWhitespace","value":" "},
33+
{"type":"Text","value":"%arg"},
34+
{"type":"Operator","value":"{"},
35+
{"type":"LiteralNumber","value":"1"},
36+
{"type":"Operator","value":"}"},
37+
{"type":"TextWhitespace","value":" "},
38+
{"type":"Text","value":"\u003cret\u003e"},
39+
{"type":"TextWhitespace","value":"\n "},
40+
{"type":"Keyword","value":"execute-keys"},
41+
{"type":"TextWhitespace","value":" "},
42+
{"type":"Text","value":"-draft"},
43+
{"type":"TextWhitespace","value":" "},
44+
{"type":"Text","value":"s"},
45+
{"type":"TextWhitespace","value":" "},
46+
{"type":"Text","value":"%arg"},
47+
{"type":"Operator","value":"{"},
48+
{"type":"LiteralNumber","value":"2"},
49+
{"type":"Operator","value":"}"},
50+
{"type":"TextWhitespace","value":" "},
51+
{"type":"Text","value":"\u003cret\u003e"},
52+
{"type":"TextWhitespace","value":" "},
53+
{"type":"Text","value":"d"},
54+
{"type":"TextWhitespace","value":"\n "},
55+
{"type":"Keyword","value":"execute-keys"},
56+
{"type":"TextWhitespace","value":" "},
57+
{"type":"LiteralString","value":"\"%arg{3}\""},
58+
{"type":"TextWhitespace","value":"\n "},
59+
{"type":"Keyword","value":"evaluate-commands"},
60+
{"type":"TextWhitespace","value":" "},
61+
{"type":"Text","value":"%sh"},
62+
{"type":"Operator","value":"{"},
63+
{"type":"TextWhitespace","value":"\n "},
64+
{"type":"NameVariable","value":"face"},
65+
{"type":"Operator","value":"="},
66+
{"type":"LiteralString","value":"\"$4\""},
67+
{"type":"TextWhitespace","value":"\n "},
68+
{"type":"NameBuiltin","value":"eval"},
69+
{"type":"TextWhitespace","value":" "},
70+
{"type":"LiteralString","value":"\"set -- $kak_quoted_selections_desc\""},
71+
{"type":"TextWhitespace","value":"\n "},
72+
{"type":"NameAttribute","value":"ranges"},
73+
{"type":"Operator","value":"="},
74+
{"type":"LiteralString","value":"\"\""},
75+
{"type":"TextWhitespace","value":"\n "},
76+
{"type":"Keyword","value":"for"},
77+
{"type":"TextWhitespace","value":" "},
78+
{"type":"Text","value":"desc"},
79+
{"type":"TextWhitespace","value":" "},
80+
{"type":"Keyword","value":"in"},
81+
{"type":"TextWhitespace","value":" "},
82+
{"type":"LiteralString","value":"\"$@\""},
83+
{"type":"Punctuation","value":";"},
84+
{"type":"TextWhitespace","value":" "},
85+
{"type":"Keyword","value":"do"},
86+
{"type":"TextWhitespace","value":" "},
87+
{"type":"NameAttribute","value":"ranges"},
88+
{"type":"Operator","value":"="},
89+
{"type":"LiteralString","value":"\"$ranges '$desc|$face'\""},
90+
{"type":"Punctuation","value":";"},
91+
{"type":"TextWhitespace","value":" "},
92+
{"type":"Keyword","value":"done"},
93+
{"type":"TextWhitespace","value":"\n "},
94+
{"type":"Keyword","value":"echo"},
95+
{"type":"TextWhitespace","value":" "},
96+
{"type":"LiteralString","value":"\"update-option buffer doc_render_ranges\""},
97+
{"type":"TextWhitespace","value":"\n "},
98+
{"type":"Keyword","value":"echo"},
99+
{"type":"TextWhitespace","value":" "},
100+
{"type":"LiteralString","value":"\"set-option -add buffer doc_render_ranges $ranges\""},
101+
{"type":"TextWhitespace","value":"\n "},
102+
{"type":"Operator","value":"}"},
103+
{"type":"TextWhitespace","value":"\n "},
104+
{"type":"Operator","value":"}"},
105+
{"type":"TextWhitespace","value":" "},
106+
{"type":"Operator","value":"}"},
107+
{"type":"TextWhitespace","value":"\n"},
108+
{"type":"Operator","value":"}"},
109+
{"type":"TextWhitespace","value":"\n"}
110+
]

0 commit comments

Comments
 (0)