Vim9script

8 юни 2023

Преговор

Преговор

Преговор

Преговор

Vim9script

Vim9script

Защо? Документацията дава две причини:

The main goal of Vim9 script is to drastically improve performance. This is accomplished by compiling commands into instructions that can be efficiently executed. An increase in execution speed of 10 to 100 times can be expected.

Vim9script

Защо? Документацията дава две причини:

The main goal of Vim9 script is to drastically improve performance. This is accomplished by compiling commands into instructions that can be efficiently executed. An increase in execution speed of 10 to 100 times can be expected.

Това не е толкова важно, колкото звучи -- bottleneck-а откъм performance много рядко е Vimscript, или поне аз не съм виждал много такива ситуации.

Vim9script

Защо? Документацията дава две причини:

The main goal of Vim9 script is to drastically improve performance. This is accomplished by compiling commands into instructions that can be efficiently executed. An increase in execution speed of 10 to 100 times can be expected.

Това не е толкова важно, колкото звучи -- bottleneck-а откъм performance много рядко е Vimscript, или поне аз не съм виждал много такива ситуации.

Пример: https://github.com/vim-ruby/vim-ruby/pull/443. Има подобрение, но е в много специфичен случай, и проблема е предимно алгоритмичен.

Vim9script

Причина две:

A secondary goal is to avoid Vim-specific constructs and get closer to commonly used programming languages, such as JavaScript, TypeScript and Java.

Vim9script

Причина две:

A secondary goal is to avoid Vim-specific constructs and get closer to commonly used programming languages, such as JavaScript, TypeScript and Java.

Това actually е доста по-важното. Vimscript просто има разни досадни проблеми, повечето от които сигурно съм споменавал. Vim9script ги премахва (и въвежда нови, разбира се. Всичко е tradeoff)

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.
    • Иначе казано, всички мразят vimscript еднакво много

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.
    • Иначе казано, всички мразят vimscript еднакво много
  2. Vimscript е прост и лесен за научаване "на части"

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.
    • Иначе казано, всички мразят vimscript еднакво много
  2. Vimscript е прост и лесен за научаване "на части"
    • Показах ви vimscript функция в лекция 3, но дори преди това имаше :set, :map, :command

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.
    • Иначе казано, всички мразят vimscript еднакво много
  2. Vimscript е прост и лесен за научаване "на части"
    • Показах ви vimscript функция в лекция 3, но дори преди това имаше :set, :map, :command
    • Чак в лекция 6 минахме през (почти) целия синтаксис на Vimscript, и отне… половин лекция

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.
    • Иначе казано, всички мразят vimscript еднакво много
  2. Vimscript е прост и лесен за научаване "на части"
    • Показах ви vimscript функция в лекция 3, но дори преди това имаше :set, :map, :command
    • Чак в лекция 6 минахме през (почти) целия синтаксис на Vimscript, и отне… половин лекция
    • Vimscript няма тредове, корутини, класове, монади, ownership semantics, version manager-и… Това е ограничаващо, но освен това го опростява

Vim9script

Странична бележка: Защо не python/ruby/javascript/lua/lisp?

По ред на важност:

  1. Vimscript е неутрален
    • Програмистките общности си имат собствени идиоми, история, естетика. Познавам ruby програмисти, които мразят python и питонисти, които доста се дразнят на рубистката философия.
    • Иначе казано, всички мразят vimscript еднакво много
  2. Vimscript е прост и лесен за научаване "на части"
    • Показах ви vimscript функция в лекция 3, но дори преди това имаше :set, :map, :command
    • Чак в лекция 6 минахме през (почти) целия синтаксис на Vimscript, и отне… половин лекция
    • Vimscript няма тредове, корутини, класове, монади, ownership semantics, version manager-и… Това е ограничаващо, но освен това го опростява
  3. Най-важното: Vimscript се използва само за Vim и е под контрола на Брам и/или core contributor-ите.

Vim9script

Ако Vim се програмираше на python:

Vim9script

Ако Vim се програмираше на python:

Vim9script

Ако Vim се програмираше на python:

Vim9script

Брам може да промени Vimscript когато и както си иска. Когато се пенсионира, наследниците му ще имат същата сила. Няма нужда да правят промени заради web програмисти (като ruby) или за ML програмисти (като python). Единствения приоритет е Vim и удобства за text editing. През годините, vimscript се сдобива с ламбди, "ООП", а сега и с типове.

Vim9script

Брам може да промени Vimscript когато и както си иска. Когато се пенсионира, наследниците му ще имат същата сила. Няма нужда да правят промени заради web програмисти (като ruby) или за ML програмисти (като python). Единствения приоритет е Vim и удобства за text editing. През годините, vimscript се сдобива с ламбди, "ООП", а сега и с типове.

Javascript-а на VSCode е възможно да се окаже изключение, защото javascript също трябва да бъде fully backwards-compatible… Но той също идва с много тежест, transpilers, node.js, typescript отгоре…

Vim9script

Брам може да промени Vimscript когато и както си иска. Когато се пенсионира, наследниците му ще имат същата сила. Няма нужда да правят промени заради web програмисти (като ruby) или за ML програмисти (като python). Единствения приоритет е Vim и удобства за text editing. През годините, vimscript се сдобива с ламбди, "ООП", а сега и с типове.

Javascript-а на VSCode е възможно да се окаже изключение, защото javascript също трябва да бъде fully backwards-compatible… Но той също идва с много тежест, transpilers, node.js, typescript отгоре…

Lua-та на Neovim е възможно да се окаже изключение -- тя също е сравнително проста. Но не може да се промени изобщо (фиксирана е на 5.1, всяка нова версия чупи backwards compatibility by design), или може би може да се мигрира с много усилия, или transpiler, fork… Кой знае.

Vim9script

Кратко обобщение: :help vim9-differences

Vim9script

1 2 3 4 5 6 7 8 9 10 11 12
" vimscript

function! Global(one, two) abort
  let sum = s:Local(a:one, a:two)
  let sum += 1

  return sum > 0
endfunction

function! s:Local(one, two) abort
  return a:one + a:two
endfunction

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
vim9script

def g:Global(one: number, two: number): bool
  var sum = Local(one, two)
  sum += 1

  return sum > 0
enddef

def Local(one: number, two: number): number
  return one + two
enddef

# Опционално, прави typechecking etc веднага:
defcompile

Vim9script

Простите неща:

Vim9script

Простите неща:

Vim9script

Простите неща:

Vim9script

Простите неща:

Vim9script

Простите неща:

1 2 3 4 5 6 7 8 9
vim9script

var result: bool

if rand() % 2 == 0
  result = 0
else
  result = 1
endif

Vim9script: типове

:help vim9-types

Vim9script: типове

:help vim9-types

Vim9script: типове

:help vim9-types

Vim9script: функции

Vim9script: функции

Vim9script: функции

1 2 3
" vimscript

var Sum = { x, y -> x + y }

1 2 3
vim9script

var Sum = (x, y) => x + y

Vim9script: функции

1 2 3
" vimscript

var Sum = { x, y -> x + y }

1 2 3
vim9script

var Sum = (x, y) => x + y

Може и така:

1 2 3 4 5 6
vim9script

var SumPlus1 = (x, y) => {
  var z = x + y
  return z + 1
}

Vim9script: речници

1 2 3 4 5 6 7 8 9 10
" vimscript

let baz = 'quux'
let example = {
      \ 'foo': 'bar',
      \ 'bar': 'baz',
      \ baz: 'quux',
      \ }
echomsg string(example)
" => {'foo': 'bar', 'bar': 'baz', 'quux': 'quux'}

1 2 3 4 5 6 7 8 9 10
vim9script

var baz = 'quux'
var example = {
  foo: 'bar',
  bar: 'baz',
  [baz]: 'quux',
}
echomsg string(example)
# => {'foo': 'bar', 'bar': 'baz', 'quux': 'quux'}

Vim9script: речници

1 2 3 4 5 6 7 8 9 10
" vimscript

let baz = 'quux'
let example = {
      \ 'foo': 'bar',
      \ 'bar': 'baz',
      \ baz: 'quux',
      \ }
echomsg string(example)
" => {'foo': 'bar', 'bar': 'baz', 'quux': 'quux'}

1 2 3 4 5 6 7 8 9 10
vim9script

var baz = 'quux'
var example = {
  foo: 'bar',
  bar: 'baz',
  [baz]: 'quux',
}
echomsg string(example)
# => {'foo': 'bar', 'bar': 'baz', 'quux': 'quux'}

Vim9script: команди

Vim9script: команди

Vim9script: команди

Vim9script: команди

1 2 3 4 5
autocmd BufWritePre *.go {
  var save = winsaveview()
  silent! exe ':%! some formatting command'
  winrestview(save)
}

Vim9script: import/export

:help import

Обикновена употреба на autoload -- глобална функция:

1
inoremap <buffer><expr> <c-x><c-r> rustbucket#complete#Mapping()

Vim9script: import/export

:help import

Обикновена употреба на autoload -- глобална функция:

1
inoremap <buffer><expr> <c-x><c-r> rustbucket#complete#Mapping()

Импорт-ване като script-local променлива:

1 2
import autoload "rustbucket/complete9.vim" as rustComplete
inoremap <buffer> <c-x><c-r> <ScriptCmd>call s:rustComplete.Mapping()<cr>

:help <Cmd>, :help <ScriptCmd>

Vim9script: import/export

Без alias, без autoload (търси в "import" директории в runtimepath):

1 2
import "rustbucket/complete9.vim"
inoremap <buffer> <c-x><c-r> <ScriptCmd>call s:complete9.Mapping()<cr>

Vim9script: import/export

Без alias, без autoload (търси в "import" директории в runtimepath):

1 2
import "rustbucket/complete9.vim"
inoremap <buffer> <c-x><c-r> <ScriptCmd>call s:complete9.Mapping()<cr>

Във vim9script (всичко досега беше стандартен vimscript). Разликата е, че няма s:

1 2 3
vim9script
import "rustbucket/complete9.vim"
inoremap <buffer> <c-x><c-r> <ScriptCmd>call complete9.Mapping()<cr>

Vim9script: import/export

Експортвани функции:

1 2 3 4 5
vim9script

export def FunctionName()
  # ...
enddef

Vim9script: Demo

Vim9script: Demo

Vim9script: Заслужава ли си?

Vim9script: Заслужава ли си?

Програмистките подобрения не са лоши, а типовете хващат някои проблеми. Поне според мен, обаче, липсва част от простотата на "legacy" vimscript и си има своите нови странности.

Vim9script: Заслужава ли си?

Програмистките подобрения не са лоши, а типовете хващат някои проблеми. Поне според мен, обаче, липсва част от простотата на "legacy" vimscript и си има своите нови странности.

Времето ще покаже 🤷. Както съм казвал и преди, не е нужно една технология да "спечели" или да "загуби". It's just sort of there, който иска да го ползва. Включително за проектите ви.

Асорти

Асорти

Въпроси