Skip to content
Open
Show file tree
Hide file tree
Changes from 7 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 @@ -8310,6 +8310,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
Loading