-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathchat.vim
More file actions
94 lines (80 loc) · 6 KB
/
chat.vim
File metadata and controls
94 lines (80 loc) · 6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
if exists("b:current_syntax")
finish
endif
" Define the role marker matches (e.g., @System:)
syntax match FlemmaRoleSystem '^@System:\s*$' contained
syntax match FlemmaRoleUser '^@You:\s*$' contained
syntax match FlemmaRoleAssistant '^@Assistant:\s*$' contained
" Template expression blocks: {{ ... }} with optional trim markers
" skip= makes Vim skip over quoted strings when searching for the end delimiter
syntax region FlemmaLuaExpression matchgroup=FlemmaLuaDelimiter start="{{-\?" skip=+\("[^"]*"\|'[^']*'\)+ end="-\?}}" containedin=FlemmaUser,FlemmaSystem contained keepend
" Template code blocks: {% ... %} with optional trim markers
syntax region FlemmaLuaCodeBlock matchgroup=FlemmaLuaDelimiter start="{%-\?" skip=+\("[^"]*"\|'[^']*'\)+ end="-\?%}" containedin=FlemmaUser,FlemmaSystem contained keepend
" Define Thinking Tags (for highlighting the tags themselves)
" Matches: <thinking>, <thinking provider:signature="...">, <thinking provider:signature="..."/>
" Pattern [^/>] excludes both / and > so the final > can match
syntax match FlemmaThinkingTag "^<thinking\(\s.*[^/>]\)\?>$" contained
syntax match FlemmaThinkingTag "^<thinking\s.*/>$" contained
syntax match FlemmaThinkingTag "^</thinking>$" contained
" Define Tool Use/Result syntax (for tool calling)
" Tool Use title: **Tool Use:**
syntax match FlemmaToolUseTitle "\*\*Tool Use:\*\*" contained
" Tool Result title: **Tool Result:**
syntax match FlemmaToolResultTitle "\*\*Tool Result:\*\*" contained
" Concise-form status suffixes on the tool_result header. The explicit
" modeline form "(status=approved sandbox=false)" intentionally stays plain —
" only bare-word suffixes are decorated.
syntax match FlemmaToolResultError "(error)" contained
syntax match FlemmaToolResultPending "(pending)" contained
syntax match FlemmaToolResultApproved "(approved)" contained
syntax match FlemmaToolResultRejected "(rejected)" contained
syntax match FlemmaToolResultDenied "(denied)" contained
syntax match FlemmaToolResultAborted "(aborted)" contained
" Job Result title: **Job Result:**
syntax match FlemmaJobResultTitle "\*\*Job Result:\*\*" contained
" Job Result status suffixes (same set as Tool Result)
syntax match FlemmaJobResultError "(error)" contained
syntax match FlemmaJobResultPending "(pending)" contained
syntax match FlemmaJobResultApproved "(approved)" contained
syntax match FlemmaJobResultRejected "(rejected)" contained
syntax match FlemmaJobResultDenied "(denied)" contained
syntax match FlemmaJobResultAborted "(aborted)" contained
" Tool Use region (in assistant messages): **Tool Use:** `name` (`id`)
" Note: Tool names and IDs in backticks are handled by treesitter markdown_inline as inline code
syntax region FlemmaToolUse start="\*\*Tool Use:\*\*" end="$" oneline contained containedin=FlemmaAssistant contains=FlemmaToolUseTitle
" Tool Result region (in user messages): **Tool Result:** `id` (optional concise status)
syntax region FlemmaToolResult start="\*\*Tool Result:\*\*" end="$" oneline contained containedin=FlemmaUser contains=FlemmaToolResultTitle,FlemmaToolResultError,FlemmaToolResultPending,FlemmaToolResultApproved,FlemmaToolResultRejected,FlemmaToolResultDenied,FlemmaToolResultAborted
" Job Result region (in user messages): **Job Result:** `job_id` (optional concise status)
syntax region FlemmaJobResult start="\*\*Job Result:\*\*" end="$" oneline contained containedin=FlemmaUser contains=FlemmaJobResultTitle,FlemmaJobResultError,FlemmaJobResultPending,FlemmaJobResultApproved,FlemmaJobResultRejected,FlemmaJobResultDenied,FlemmaJobResultAborted
" Note: Signature concealment is now handled via extmarks in ui.lua highlight_thinking_tags()
" This avoids needing conceallevel which affects the whole buffer (including frontmatter)
" Define Frontmatter Tags (for highlighting the delimiters themselves)
" Only match supported languages: lua, json
syntax match FlemmaFrontmatterTag "^```\(lua\|json\)$" contained
syntax match FlemmaFrontmatterTag "^```$" contained
" Define regions
" Frontmatter Block Regions (top-level)
" These regions start with ```<language> on the first line of the file and end with ```.
" Each contains the tags themselves (FlemmaFrontmatterTag) and language-specific syntax.
syntax region FlemmaFrontmatterBlockLua start="\%1l^```lua$" end="^```$" keepend contains=FlemmaFrontmatterTag,@Lua
syntax region FlemmaFrontmatterBlockJson start="\%1l^```json$" end="^```$" keepend contains=FlemmaFrontmatterTag,@JSON
" System region
syntax region FlemmaSystem start='^@System:\s*$' end='\(^@\(You\|Assistant\):\s*$\)\@=\|\%$' contains=FlemmaRoleSystem,@Markdown
" User region (contains tool results)
syntax region FlemmaUser start='^@You:\s*$' end='\(^@\(System\|Assistant\):\s*$\)\@=\|\%$' contains=FlemmaRoleUser,@Markdown
" Thinking Block Region (nested inside Assistant)
" This region starts with <thinking> or <thinking provider:signature="..."> and ends with </thinking>.
" Self-closing tags like <thinking provider:signature="..."/> are handled by match, not region.
" It contains the tags themselves (FlemmaThinkingTag) and markdown for the content.
syntax region FlemmaThinkingBlock start="^<thinking\(\s.*[^/>]\)\?>$" end="^</thinking>$" keepend contained containedin=FlemmaAssistant contains=FlemmaThinkingTag,@Markdown
" Assistant region contains role markers, markdown, thinking blocks, and tool use
syntax region FlemmaAssistant start='^@Assistant:\s*$' end='\(^@\(System\|You\):\s*$\)\@=\|\%$' contains=FlemmaRoleAssistant,@Markdown
" Anchor sync on role markers so regions are found correctly when Vim parses any
" window. Without these, default sync (maxlines=60) can leave the outer role
" region unmatched after a contained fenced code block terminates, so
" **Tool Use:** / **Tool Result:** headers past the first one lose their
" FlemmaToolUseTitle / FlemmaToolResultTitle match.
syntax sync match FlemmaSyncSystem grouphere FlemmaSystem "^@System:\s*$"
syntax sync match FlemmaSyncUser grouphere FlemmaUser "^@You:\s*$"
syntax sync match FlemmaSyncAssistant grouphere FlemmaAssistant "^@Assistant:\s*$"
let b:current_syntax = "chat"