Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -1581,3 +1581,6 @@
[submodule "vendor/grammars/zephir-sublime"]
path = vendor/grammars/zephir-sublime
url = https://github.com/phalcon/zephir-sublime
[submodule "vendor/grammars/language-vim9"]
path = vendor/grammars/language-vim9
url = https://github.com/DanBradbury/language-vim9.git
5 changes: 5 additions & 0 deletions lib/linguist/heuristics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1056,6 +1056,11 @@ disambiguations:
- language: JSON
named_pattern: json
- language: Yacc
- extensions: ['.vim']
rules:
- language: Vim9 script
pattern: '^\s*vim9script\s*$'
Comment thread
DanBradbury marked this conversation as resolved.
Outdated
- language: Vim script
named_patterns:
cpp:
- '^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>'
Expand Down
12 changes: 12 additions & 0 deletions lib/linguist/languages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8277,6 +8277,18 @@ Vim Snippet:
tm_scope: source.vim-snippet
ace_mode: text
language_id: 81265970
Vim9 Script:
type: programming
color: "#007030"
tm_scope: source.vim
aliases:
- vim9
- vim9script
extensions:
- ".vim"
- ".vim9"
ace_mode: text
language_id: 534204182
Visual Basic .NET:
type: programming
color: "#945db7"
Expand Down
57 changes: 57 additions & 0 deletions samples/Vim9 Script/basic.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
vim9script

var myNumber: number = 42
const PI: number = 3.14159
final myList: list<string> = ['vim', 'neovim', 'vim9']

def HelloWorld(): void
echo "Hello, Vim9!"
enddef

def Add(a: number, b: number): number
return a + b
enddef

def ProcessList(items: list<string>): dict<number>
var result: dict<number> = {}
for item in items
result[item] = len(item)
endfor
return result
enddef

var double = (n: number): number => n * 2
var squared = (n: number): number => n * n

def CheckValue(val: number): string
if val > 0
return "positive"
elseif val < 0
return "negative"
else
return "zero"
endif
enddef

var name = "Vim9"
echo $"Welcome to {name}!"

export def PublicFunction(): void
echo "This function is exported"
enddef

def SafeDivide(a: number, b: number): number
try
return a / b
catch
echoerr "Division error"
return 0
endtry
enddef

var isEnabled: bool = true
var isDisabled: bool = false

HelloWorld()
var sum = Add(10, 20)
echo $"Sum: {sum}"
115 changes: 115 additions & 0 deletions samples/Vim9 Script/copilot-chat.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
vim9script
scriptencoding utf-8

import autoload 'copilot_chat/auth.vim' as auth
import autoload 'copilot_chat/buffer.vim' as _buffer
import autoload 'copilot_chat/api.vim' as api

export def OpenChat(): void
if _buffer.HasActiveChat() && g:copilot_reuse_active_chat == 1
_buffer.FocusActiveChat()
else
_buffer.Create()
endif
timer_start(10, (_) => auth.VerifySignin())
enddef

export def StartChat(message: string): void
OpenChat()
_buffer.AppendMessage(message)
api.AsyncRequest([{'content': message, 'role': 'user'}], [])
enddef

export def ResetChat(): void
if g:copilot_chat_active_buffer == -1 || !bufexists(g:copilot_chat_active_buffer)
echom 'No active chat window to reset'
return
endif

var current_buf = bufnr('%')

# Switch to the active chat buffer if not already there
if current_buf != g:copilot_chat_active_buffer
execute 'buffer ' .. g:copilot_chat_active_buffer
endif

deletebufline('%', 1, '$')

_buffer.WelcomeMessage()

if current_buf != g:copilot_chat_active_buffer && bufexists(current_buf)
execute 'buffer ' .. current_buf
endif
enddef

export def SubmitMessage(): void
auth.GetTokens()
var messages = []
var pattern = ' ━\+$'
var all_file_lists = []
cursor(1, 1)

while search(pattern, 'W') > 0
var header_line = getline('.')
var role = 'user'
# Check separator icon to determine message role
# Separator with  icon indicates assistant response, otherwise user message
if stridx(header_line, ' ') != -1
role = 'assistant'
endif
var start_line: number = line('.') + 1
var end_line: number = search(pattern, 'W')
if end_line == 0
end_line = line('$')
else
end_line -= 1
cursor(line('.') - 1, col('.'))
endif

var lines: list<string> = getline(start_line, end_line)
var file_list: list<string> = []

for i in range(len(lines))
var line: string = lines[i]
if line =~? '^> \(\w\+\)'
var text: string = matchstr(line, '^> \(\w\+\)')
text = substitute(text, '^> ', '', '')
if has_key(g:copilot_chat_prompts, text)
lines[i] = g:copilot_chat_prompts[text]
endif
elseif line =~? '^#file: '
var filename: string = matchstr(line, '^#file: \s*\zs.*\ze$')
add(file_list, filename)
endif
endfor
var message: string = join(lines, "\n")

add(messages, {'content': message, 'role': role})
add(all_file_lists, file_list)
cursor(line('.'), col('.') + 1)
endwhile

# Limit message history to improve performance
# Only send the most recent messages based on configuration
var limit: number = g:copilot_chat_message_history_limit
if len(messages) > limit && limit > 0
var start_idx: number = len(messages) - limit
messages = messages[start_idx : ]
all_file_lists = all_file_lists[start_idx : ]
endif

# Consolidate file lists from recent messages
# O(n) consolidation using dictionary for O(1) duplicate detection (improved from O(n²))
var consolidated_files: list<string> = []
var seen: dict<any> = {}
for files in all_file_lists
for file in files
if !has_key(seen, file)
seen[file] = 1
add(consolidated_files, file)
endif
endfor
endfor

api.AsyncRequest(messages, consolidated_files)
enddef
1 change: 1 addition & 0 deletions vendor/grammars/language-vim9
Submodule language-vim9 added at 28d320
Loading