Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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 @@ -887,6 +887,9 @@
[submodule "vendor/grammars/language-typelanguage"]
path = vendor/grammars/language-typelanguage
url = https://github.com/goodmind/language-typelanguage
[submodule "vendor/grammars/language-vim9"]
path = vendor/grammars/language-vim9
url = https://github.com/DanBradbury/language-vim9.git
[submodule "vendor/grammars/language-viml"]
path = vendor/grammars/language-viml
url = https://github.com/Alhadis/language-viml
Expand Down
2 changes: 2 additions & 0 deletions grammars.yml
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,8 @@ vendor/grammars/language-turing:
- source.turing
vendor/grammars/language-typelanguage:
- source.tl
vendor/grammars/language-vim9:
- source.vim
vendor/grammars/language-viml:
- source.vim-snippet
- source.viml
Expand Down
5 changes: 5 additions & 0 deletions lib/linguist/heuristics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1025,6 +1025,11 @@ disambiguations:
pattern: '\A##fileformat=VCF'
- language: vCard
pattern: '\ABEGIN:VCARD'
- extensions: ['.vim']
rules:
- language: Vim9 script
pattern: '^\s*vim9script(?:\s+noclear)?\s*$'
- language: Vim script
- extensions: ['.w']
rules:
- language: OpenEdge ABL
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
185 changes: 185 additions & 0 deletions samples/Vim9 Script/advanced.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
vim9script noclear
# Advanced Vim9 Script Example
# Demonstrates modern Vim9 features for the Linguist repository

# Strict typing and namespace
import autoload 'knack.vim' as knack
import autoload './utils.vim' as utils

# Constants and typed variables
const BUFFER_SIZE: number = 1024
const MAX_RETRIES: number = 3
const CONFIG_DIR: string = $HOME .. '/.config/vim'

# Class definitions (Vim9 feature)
class Cache
var entries: dict<any> = {}
var max_size: number

def new(size: number = 100)
this.max_size = size
enddef

def set(key: string, value: any): void
if len(this.entries) >= this.max_size
var first_key = keys(this.entries)[0]
unlet this.entries[first_key]
endif
this.entries[key] = value
enddef

def get(key: string): any
return get(this.entries, key, null)
enddef

def clear(): void
this.entries = {}
enddef
endclass

# Modern function syntax with type annotations
def ProcessBuffer(buf: number, opts: dict<any>): dict<string>
var result: dict<string> = {}
var lines: list<string> = getbufline(buf, 1, '$')

# Process with early returns
if empty(lines)
result['status'] = 'empty'
result['count'] = '0'
return result
endif

var count: number = 0
for line in lines
if line =~# '^\s*#.*autocmd'
count += 1
endif
endfor

result['status'] = 'success'
result['count'] = string(count)
result['size'] = string(len(lines))

return result
enddef

# Lambda functions with strict typing
var multiply: func(number, number): number = (a, b) => a * b
var filter_nums: func(list<number>): list<number> =
(nums) => nums->filter('v:val > 10')

# Object methods and method chaining
def ApplyFormatting(content: string): string
return content
->substitute(' ', ' ', 'g')
->trim()
->tolower()
enddef

# Enumerate with type safety
def AnalyzeSettings(settings: dict<string>): list<dict<any>>
var results: list<dict<any>> = []

for [key, value] in items(settings)
var item: dict<any> = {
'key': key,
'value': value,
'type': typename(value),
'length': strlen(value)
}
results->add(item)
endfor

return results
enddef

# Recursive function example
def Factorial(n: number): number
if n <= 1
return 1
else
return n * Factorial(n - 1)
endif
enddef

# Error handling with try-catch
def SafeFileRead(filepath: string): list<string>
var lines: list<string> = []

try
lines = readfile(filepath)
catch /E484/
echomsg 'File not found: ' .. filepath
lines = []
catch
echomsg 'Error reading file: ' .. v:exception
lines = []
endtry

return lines
enddef

# Variadic function
def JoinPaths(...parts: list<string>): string
return parts->join('/')
enddef

# Command definitions using new syntax
command! -nargs=? -complete=file MyCommand {
var arg = <q-args>
var result = ProcessBuffer(bufnr(), {'name': arg})
echomsg 'Result: ' .. string(result)
}

# Augroup with modern syntax
augroup MyAutocmds
autocmd!
autocmd BufWritePost *.vim {
var buf = expand('<abuf>')
echomsg 'Wrote buffer ' .. buf
}
autocmd FileType python {
setlocal shiftwidth=4
setlocal tabstop=4
}
augroup END

# Using the cache class
var cache: Cache = Cache.new(50)
cache.set('user_prefs', {'theme': 'dark', 'font_size': 12})

def GetUserPrefs(): any
var prefs = cache.get('user_prefs')
if prefs == null
prefs = {'theme': 'light', 'font_size': 10}
cache.set('user_prefs', prefs)
endif
return prefs
enddef

# Advanced list comprehension patterns
var numbers: list<number> = range(1, 100)
var evens: list<number> = numbers->filter('v:val % 2 == 0')
var squares: list<number> = numbers->map('v:val * v:val')

# String interpolation (Vim9)
def FormatMessage(name: string, count: number): string
return $'Found {count} items for {name}'
enddef

# Abort on first error (Vim9 behavior by default with vim9script)
if !exists('g:loaded_myplugin')
finish
endif

g:loaded_myPlugin = 1

# Export public interface
export def PublicAPI(input: string): string
return 'Processed: ' .. input
enddef

# Internal helper (not exported)
def PrivateHelper(): void
echomsg 'This is internal'
enddef
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}"
Loading