В репозитории Vim на Github появился первый черновик документации для версии Vim 8.0. В нём указано, что исправлено большое количество багов и добавлено несколько новых фич.

Асинхронный ввод/вывод, каналы


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)


  1. mardy_bum
    13.04.2016 14:26
    +8

    Ох как Брэм Муленар засуетился после форка Neovim.
    Async I/O, Jobs и улучшенная система плагинов были одними из основных преимуществ Neovim, но теперь когда эти фичи появятся и в Vim 8.0 привлекательность форка сильно снижается.
    Это очень похоже на ситуацию с Node.js и форком io.js.


    1. Talkerbox
      13.04.2016 15:08
      +4

      Было бы хорошо, если бы эти нововведения помогли подсвечивать синтаксис больших файлов не укладывая при этом вим в тормоза.


      1. Alukardd
        13.04.2016 15:26
        +2

        Для этого подсветка должна быть по семантике кода, а не по регуляркам.


        1. PerlPower
          13.04.2016 20:21

          Как раз наоборот — хватит и подсветки по регулярке, только нужно чтобы парсился не весь файл а только область отображаемая в окне и небольшой кусок вокруг окна.


          1. Delphinum
            13.04.2016 20:49
            +3

            А если области вокруг окна недостаточно для определения контекста и подсветки? Подсветка будет прыгать при прокрутке.


            1. PerlPower
              13.04.2016 20:55

              Ну значит иногда подсветка будет ломаться. А расширение области автоматически нас возвращает к изначальной проблеме слишком большого объема данных которые нужно распарсить, чтобы подсветить. В общем в любом случае придется чем-то жертвовать.


              1. Delphinum
                13.04.2016 20:58

                Нет, достаточно подсвечивать на основании семантического разбора, который так же может быть использован не только для подсветки.


                1. PerlPower
                  13.04.2016 21:18

                  Я исхожу из того, что если парсить «окно», а не весь файл, то по скорости будет все равно регулярки там или полноценный парсер. А на больших файлах без «окна» тормозит все — и регулярки и парсер. У парсера качество будет выше, но парсер же более чувствителен к ошибкам чем регулярки. И в случае любого парсинга окна я не знаю как можно например побороть ситуации вида:

                  $var1 = "some template  <?php if (true) { ?>some value <?php } ?>";
                  
                  $var2 = 5;
                  
                  ...
                  


                  Вот например граница окна попадает на пробел слева от if. Можно ли в таком случае определить как подсветить текст до if до кавычки — как код php или как строковую константу?


                  1. xaizek
                    13.04.2016 21:35
                    +1

                    Вообще, в Vim и сделано примерно как описано выше, только это "окно" определяется по строкам, столбцы не обрезаются. Правила отсечения "окна" (как далеко идти наверх от верхней строки, чтобы попасть в начальное состояние) определяются в правилах подсветки синтаксиса. Если где-то тормозит, то стоит править там в первую очередь. И да, оно бывает неправильно срабатывает из-за этого, но довольно редко. Детали в :help syn-sync.


                  1. Delphinum
                    13.04.2016 22:02

                    парсера качество будет выше, но парсер же более чувствителен к ошибкам чем регулярки

                    Ну о том, как обходить ошибки парсинга написана не одна статья.

                    Я исхожу из того, что если парсить «окно», а не весь файл, то по скорости будет все равно регулярки там или полноценный парсер

                    Так парсить проект все равно придется, потому зачем еще что то выдумывать?

                    А на больших файлах без «окна» тормозит все — и регулярки и парсер

                    Ну если парсер инкрементарный, то не очень.

                    Парсить окно это решение одной конкретной проблемы, а их там куча.


    1. pythonproof
      13.04.2016 21:12

      Сам недавно пересел на neovim из-за пары плагинов.
      Или эффект плацебо или он вроде как пошустрее работает, ну и плюс нужный мне плагин deoplete явно быстрее своего аналога от того жа автора.


  1. merhalak
    13.04.2016 17:43
    -5

    Оно уже умеет работать с системной переключалкой раскладки?


    1. pythonproof
      13.04.2016 21:06

      Так и скажи что не осилил.

      set langmap — гугли.


      1. merhalak
        15.04.2016 08:01
        +1

        Не осилил, не пригорай к стулу, не осилил.

        Просто если уж начали повсеместно городить костыли, то можно было за столько лет развития проекта что-нибудь и в апстриме поменять.


        1. pythonproof
          15.04.2016 09:59

          Не считаю это костылем.
          Но тут в другом дело, ты свой вопрос задал как «утверждение», что вим не работает при смене раскладки. А не поинтересовался как сделать, чтобы она работала.


          1. merhalak
            15.04.2016 14:43
            +1

            Мне уже приходилось узнавать, как это чинить.

            Странно, что из поставки, vim работает не с keycode'ами в command и visual режимах, а с символами. Неужели это так сложно было в реализации?


            1. Delphinum
              15.04.2016 18:44

              Обратная совместимость же.


  1. Delphinum
    13.04.2016 18:17

    Отличные обновки, куча костылей уходит в утиль. Интересны подробности про «фреймворк для запуска тестов», не так давно закончил xUnit под vim со всеми плюшками на нативном VimL. Может кто знает подробности?


  1. acmnu
    13.04.2016 21:07

    Кому любопытно, появился проект написания с нуля редактора цель которого выполнять 80% команд vim, при размере кодовой базы в 1%.

    Полная совместимость не планируется, но цель сделать нечто очень похоже. Vim Script, продвинутое управление окнами, GUI реализовываться не будут принципиально. Нормальная подстветка синтаксиса уже сделана. В качестве внутреннего языка используется Lua. Запланирован RPC для внешнего управления (это вместо плагинов).

    На данный момент работоспособен в качестве замены vi, но с подсветкой и визуальным режимом.

    Проект находится вот здесь: github.com/martanne/vis


    1. Delphinum
      13.04.2016 21:10
      +3

      появился проект написания с нуля редактора цель которого выполнять 80% команд vim

      Оо зачем?


      1. acmnu
        14.04.2016 11:38

        Ну я не могу говорить за авторов, но лично я бы не отказался от vim подобного редактора с хорошим RPC, чтоб писать плагины на том языке, который удобен в данном, конкретном случае.

        Насколько я понимаю, существенная проблема современного vim, в том, что полностью кодовую базу уже никто не понимает и, как следствие, существенные проблемы (например подсветка синтаксиса) не могут решится уже много лет.

        Т.е. грубо говоря цель это проекта редактор и ничего более.


        1. Delphinum
          14.04.2016 15:29

          Привести в порядок кодовую базу Vim дело хорошее, возможно даже делать это придется переписыванием редактора с нуля и выкидыванием с него «ненужного», я это понимаю. Проблема в том, что многие не до конца понимают сложность и ответственность этой затеи, особенно когда предлагают писать с нуля. Часто такие затеи кончаются не очень хорошо. Как по мне, лучше постепенный рефакторинг, чем все эти vis и neovim, но время, конечно, покажет.


          1. acmnu
            14.04.2016 15:52

            Ну как бы на данный момент, как я уже говорил, уже есть релиз, который уже работает, в котором есть подсветка синтаксиса, все базовые кнопки, макросы, визуальный мод, множественные курсоры (новшество, относительно вим).

            Им уже можно пользоваться как редактором. Что я и делаю последние два дня.


            1. Delphinum
              14.04.2016 20:19

              Вопрос не в том, работает vis или не работает. Вопрос в том, что в процессе переноса функциональности vim в vis, всякой кроссплатформиности и т.д. код vis может стать таким же, как код vim (в лучшем случае таким же, как vim после рефакторинга).


  1. thatisme
    14.04.2016 19:31
    +1

    Ну вот, а говорили, что Neovim ненужен. Благодаря этому проекту Брэм зашевелился в правильном направлении.


  1. akw
    16.04.2016 13:35

    Вроде neovim ещё код чистили от старого и не поддерживаемого