Асинхронный ввод/вывод, каналы
Vim теперь умеет обмениваться сообщениями с другим процессом в фоне (например, с сервером Python). Сообщения принимаются и обрабатываются, когда Vim ожидает ввода символа.
С каналами связана широкая поддержка JSON, его легко использовать для коммуникации между процессами, что позволяет написать сервер на любом языке. Используются функции
|json_encode()|
и |json_decode()|
.Задания (jobs)
Vim может запустить задание, обменяться с ним данными и остановить его. Это очень полезно для запуска процесса завершения, проверки синтаксиса и проч. Коммуникация происходит через каналы. Задания могут читать и писать в буфер или файл.
Таймеры
Таймеры тоже асинхронные. Они могут срабатывать однажды или периодически и запускать функцию для любой работы.
let tempTimer = timer_start(4000, 'CheckTemp')
Через четыре секунды вызов: >
call CheckTemp()
Партиалы (partials)
В Vim уже есть Funcref, отсылка к функции. Партиал тоже относится к функции, и дополнительно связывает аргументы и/или словарь. Это особенно полезно для обратных вызовов на каналах и таймерах. Например, в вышеупомянутом таймере передаём аргумент функции.
let tempTimer = timer_start(4000, function('CheckTemp', ['out']))
Через четыре секунды вызов: >
call CheckTemp('out')
Пакеты
Плагинов становится всё больше. Чтобы лучше управлять коллекцией плагинов, добавлена поддержка пакетов. Это удобный способ получить один или несколько плагинов, поместить их в директорию и, возможно, обновлять до новых версий. Vim будет загружать их автоматически или только по требованию.
Новые тесты
Это для разработчиков Vim. До сих пор писать тесты для Vim было непросто. В Vim 8 появились функции
assert
и фреймворк для запуска тестов. Теперь гораздо проще писать тесты и обновлять их.Добавлены следующие функции:
|assert_equal()|
|assert_notequal()|
|assert_exception()|
|assert_fails()|
|assert_false()|
|assert_match()|
|assert_notmatch()|
|assert_true()|
|alloc_fail()|
|disable_char_avail_for_testing()|
Идентификаторы окон
Раньше доступ к окну проходил только по его номеру. И каждый раз при открытии, закрытии или перемещении этот номер менялся. Теперь у каждого окна уникальный ID, так что окно легко найти.
Добавление отступов к строкам
Появилась опция
'breakindent'
, чтобы вставлять отступы без изменения величины отступа.Поддержка Direct-X (под Windows)
Опция
'renderoptions'
позволяет переключиться в режим Direct-X (DirectWrite) под Windows.Поддержка GTK+ 3
GTK+ 2 уже уходит в прошлое, пришло время GTK+ 3. Поддержка уже интегрирована, и она работает довольно хорошо, почти как GTK+ 2.
Улучшения скриптов
Добавлены следующие типы скриптов.
|Special| |v:false|, |v:true|, |v:none| and |v:null|
|Channel| подключение к другому процессу для асинхронного ввода/вывода
|Job| управление процессом
Добавлено много функций и команд для поддержки этих новых типов.
Из других улучшений упомянуто добавление шифрования blowfish2 вместо blowfish.
Есть одно «несовместимое» изменение в Vim 8.0 — это прекращение поддержки MS-DOS.
Комментарии (26)
merhalak
13.04.2016 17:43-5Оно уже умеет работать с системной переключалкой раскладки?
pythonproof
13.04.2016 21:06Так и скажи что не осилил.
set langmap — гугли.merhalak
15.04.2016 08:01+1Не осилил, не пригорай к стулу, не осилил.
Просто если уж начали повсеместно городить костыли, то можно было за столько лет развития проекта что-нибудь и в апстриме поменять.pythonproof
15.04.2016 09:59Не считаю это костылем.
Но тут в другом дело, ты свой вопрос задал как «утверждение», что вим не работает при смене раскладки. А не поинтересовался как сделать, чтобы она работала.
Delphinum
13.04.2016 18:17Отличные обновки, куча костылей уходит в утиль. Интересны подробности про «фреймворк для запуска тестов», не так давно закончил xUnit под vim со всеми плюшками на нативном VimL. Может кто знает подробности?
acmnu
13.04.2016 21:07Кому любопытно, появился проект написания с нуля редактора цель которого выполнять 80% команд vim, при размере кодовой базы в 1%.
Полная совместимость не планируется, но цель сделать нечто очень похоже. Vim Script, продвинутое управление окнами, GUI реализовываться не будут принципиально. Нормальная подстветка синтаксиса уже сделана. В качестве внутреннего языка используется Lua. Запланирован RPC для внешнего управления (это вместо плагинов).
На данный момент работоспособен в качестве замены vi, но с подсветкой и визуальным режимом.
Проект находится вот здесь: github.com/martanne/vis
Delphinum
13.04.2016 21:10+3появился проект написания с нуля редактора цель которого выполнять 80% команд vim
Оо зачем?acmnu
14.04.2016 11:38Ну я не могу говорить за авторов, но лично я бы не отказался от vim подобного редактора с хорошим RPC, чтоб писать плагины на том языке, который удобен в данном, конкретном случае.
Насколько я понимаю, существенная проблема современного vim, в том, что полностью кодовую базу уже никто не понимает и, как следствие, существенные проблемы (например подсветка синтаксиса) не могут решится уже много лет.
Т.е. грубо говоря цель это проекта редактор и ничего более.Delphinum
14.04.2016 15:29Привести в порядок кодовую базу Vim дело хорошее, возможно даже делать это придется переписыванием редактора с нуля и выкидыванием с него «ненужного», я это понимаю. Проблема в том, что многие не до конца понимают сложность и ответственность этой затеи, особенно когда предлагают писать с нуля. Часто такие затеи кончаются не очень хорошо. Как по мне, лучше постепенный рефакторинг, чем все эти vis и neovim, но время, конечно, покажет.
acmnu
14.04.2016 15:52Ну как бы на данный момент, как я уже говорил, уже есть релиз, который уже работает, в котором есть подсветка синтаксиса, все базовые кнопки, макросы, визуальный мод, множественные курсоры (новшество, относительно вим).
Им уже можно пользоваться как редактором. Что я и делаю последние два дня.Delphinum
14.04.2016 20:19Вопрос не в том, работает vis или не работает. Вопрос в том, что в процессе переноса функциональности vim в vis, всякой кроссплатформиности и т.д. код vis может стать таким же, как код vim (в лучшем случае таким же, как vim после рефакторинга).
thatisme
14.04.2016 19:31+1Ну вот, а говорили, что Neovim ненужен. Благодаря этому проекту Брэм зашевелился в правильном направлении.
mardy_bum
Ох как Брэм Муленар засуетился после форка Neovim.
Async I/O, Jobs и улучшенная система плагинов были одними из основных преимуществ Neovim, но теперь когда эти фичи появятся и в Vim 8.0 привлекательность форка сильно снижается.
Это очень похоже на ситуацию с Node.js и форком io.js.
Talkerbox
Было бы хорошо, если бы эти нововведения помогли подсвечивать синтаксис больших файлов не укладывая при этом вим в тормоза.
Alukardd
Для этого подсветка должна быть по семантике кода, а не по регуляркам.
PerlPower
Как раз наоборот — хватит и подсветки по регулярке, только нужно чтобы парсился не весь файл а только область отображаемая в окне и небольшой кусок вокруг окна.
Delphinum
А если области вокруг окна недостаточно для определения контекста и подсветки? Подсветка будет прыгать при прокрутке.
PerlPower
Ну значит иногда подсветка будет ломаться. А расширение области автоматически нас возвращает к изначальной проблеме слишком большого объема данных которые нужно распарсить, чтобы подсветить. В общем в любом случае придется чем-то жертвовать.
Delphinum
Нет, достаточно подсвечивать на основании семантического разбора, который так же может быть использован не только для подсветки.
PerlPower
Я исхожу из того, что если парсить «окно», а не весь файл, то по скорости будет все равно регулярки там или полноценный парсер. А на больших файлах без «окна» тормозит все — и регулярки и парсер. У парсера качество будет выше, но парсер же более чувствителен к ошибкам чем регулярки. И в случае любого парсинга окна я не знаю как можно например побороть ситуации вида:
Вот например граница окна попадает на пробел слева от if. Можно ли в таком случае определить как подсветить текст до if до кавычки — как код php или как строковую константу?
xaizek
Вообще, в Vim и сделано примерно как описано выше, только это "окно" определяется по строкам, столбцы не обрезаются. Правила отсечения "окна" (как далеко идти наверх от верхней строки, чтобы попасть в начальное состояние) определяются в правилах подсветки синтаксиса. Если где-то тормозит, то стоит править там в первую очередь. И да, оно бывает неправильно срабатывает из-за этого, но довольно редко. Детали в :help syn-sync.
Delphinum
Ну о том, как обходить ошибки парсинга написана не одна статья.
Так парсить проект все равно придется, потому зачем еще что то выдумывать?
Ну если парсер инкрементарный, то не очень.
Парсить окно это решение одной конкретной проблемы, а их там куча.
pythonproof
Сам недавно пересел на neovim из-за пары плагинов.
Или эффект плацебо или он вроде как пошустрее работает, ну и плюс нужный мне плагин deoplete явно быстрее своего аналога от того жа автора.