Pull to refresh

Вышла бета‐версия Vim 7.4

Reading time6 min
Views14K
Вчера, 6 июля 2013, Брам Мооленаар объявил о выходе первой бета‐версии Vim 7.4: одного из лучших текстовых редакторов мира *nix.
Наиболее значимым изменением в новой версии является новый движок регулярных выражений. Также была сильно улучшена поддержка Python.

Изменения:

Новый движок регулярных выражений


Движок, называемый теперь старым, использует алгоритм, основанный на возвратах. Он пытается найти соответствие текста регулярному выражению одним способом, а при неудаче возвращается назад и пытается использовать другой способ (перевод :h new-regexp-engine). Данный алгоритм хорошо работает с простыми регулярными выражениями, но более сложные могут отрабатывать слишком долго на длинных текстах.
Новый движок использует конечный автомат. Он проверяет все возможные альтернативы для данного символа и сохраняет возможные состояния регулярного выражения. Данный подход работает несколько медленнее на простых регулярных выражениях, но при этом весьма быстр при работе со сложными выражениями и длинными текстами.
Данное изменение наиболее заметно при просмотре Javascript и XML файлов, содержащих длинные строки: сейчас Vim работает с нормальной скоростью в этих случаях, тогда как ранее вы могли видеть сильные тормоза.

В настоящий момент движок достаточно стабилен, однако и сейчас иногда находят сложные регулярные выражения, которые изменяют своё поведение при использовании нового движка. Удаление старого движка из исходного кода Vim не планируется: наоборот, Брам говорил, что хотел бы сделать некий эвристический анализатор, который выберет тот движок, который быстрее отработает регулярное выражение.
Также надо отметить, что новый движок на основе недетерменированного конечного автомата — единственный популярный движок, поддерживающий lookbehind неограниченной длины. Правда для улучшения производительности рекомендуется прямо указывать, какое максимальное количество символов может соответствовать lookbehind подвыражению.
Для выбора конкретного движка можно использовать настройку 'regexpengine' (изменяет используемый движок для всех новых регулярных выражений) или /\%#= в начале выражения (изменяет движок для данного выражения).

Больше возможностей взаимодействия между Vim и встроенным интерпретатором Python


  • Добавлена функция vim.bindeval. В отличие от vim.eval, данная функция возвращает объекты типа vim.Dictionary и vim.List, изменение которых также изменяет соответствующую переменную VimL, и vim.Function, вызов которых вызывает встроенную функцию Vim, либо пользовательскую функцию, написанную на VimL.
    Для простых типов новая функция возвращает соответствующие типы Python, но, в отличие от vim.eval, числа возвращаются как числа, а не как их строковые представления. Для строк в Python 3 есть существенное отличие между vim.bindeval и vim.eval: новая функция возвращает байтовые строки (bytes()), а старая — юникодные (str()) и может вызвать UnicodeDecodeError.
    Интерфейс данных объектов до определённой степени соответствует интерфейсу встроенных типов Python. Соответствие в дальнейшем будет улучшаться.
  • Добавлены специальные объекты vim.vars, buffer.vars и window.vars, облегчающие доступ к переменным.
  • Добавлены специальные объекты vim.options, buffer.options и window.options, облегчающие доступ к настройкам.
  • Теперь для импорта модулей из каталогов {runtimepath}/python2, {runtimepath}/python3 и {runtimepath}/pythonx не нужно добавлять что‐либо в sys.path: импорт происходит автоматически (если только вы не удалили '_vim_path_' из sys.path или соответствующую функцию из sys.path_hooks).
  • Добавлена возможность работы с вкладками.
  • Теперь исключения и ошибки VimL автоматически превращаются в исключения Python.
  • Изменено поведение vim.buffers: ранее ключами были порядковые номера буферов во внутренних структурах Vim, узнать которые можно было только проходом по данному объекту, теперь же ключами служат номера буферов.
  • Добавлена команда :pydo.
  • Добавлена функция pyeval().
  • Теперь везде, где ранее использовались строки, можно использовать как юникодные, так и байтовые строки в обеих версиях Python. Там, где использовались числа, теперь можно использовать любой объект, поддерживающий конвертацию в число (точнее, «числовой протокол»). В некоторых местах вместо списков теперь можно использовать итераторы.
  • Использование vim.window.col и vim.window.row — на текущий момент единственный способ узнать месторасположение окна.
  • Исправлена или добавлена поддержка dir(vim.*).
  • Старые версии Python (2.2* и ранее) более не поддерживаются. Впрочем, они и ранее не собирались из‐за множества несовместимостей.

Прочие изменения


(указаны измения с версии 7.3.000)
  • Добавлена поддержка сохранения списков и словарей в viminfo.
  • Добавлено автодополнение аргументов команды :language.
  • Добавлена возможность влиять на отступ внутри пространства имён C++.
  • Добавлена возможность влиять на выравнивание условия if/while/for отдельно от выравнивания аргументов функций.
  • Добавлена возможность использовать словарные функции для сортировки: третий аргумент sort().
  • Добавлены битовые операции: функции and(), or(), invert() и xor().
  • Улучшена поддержка cmd.exe в качестве оболочки.
  • Добавлено событие InsertCharPre, возникающее перед набором символа.
  • Добавлено событие CompleteDone, возникающее после завершения автодополнения в режиме ввода.
  • Добавлено событие GUIFailed, возникающее, если не удалось запустить графический интерфейс.
  • Добавлено событие QuitPre, возникающее при попытке закрыть Vim с помощью команд, которые могут вместо закрытия Vim закрыть окно.
  • Добавлено события TextChanged и TextChangedI, возникающие при изменении текста.
  • Добавлена возможность автоматического удаления символа начала комментария при использовании J: флаг j настройки 'formatoptions'.
  • Добавлена возможность удалить все значки для данного буфера или файла.
  • Добавлена возможность автоматически сохранять выделение в системный буфер обмена при использовании командной строки (опция autoselectplus настройки 'clipboard'). Также добавлена возможность сделать системный буфер обмена буфером обмена по‐умолчанию (ранее можно было таким сделать только «мышиный» буфер, который, впрочем, называется основным).
  • Добавлена возможность выделения найденной строки в два нажатия и различных манипуляций (копирование, удаление, замена) с ним: команда gn.
  • Добавлена специальное значение 'shiftwidth', имеющее такой же эффект, как и значение 'shiftwidth', равное 'tabstop'. В связи с возникшими затруднениями добавлена функция shiftwidth(). Также аналогичное специальное значение было добавлено у настройки 'softtabstop'.
  • Добавлен специальный аргумент expand(), раскрывающийся в номер текущей строки: <slnum>.
  • Команда :diffoff теперь сохраняет значения настроек, а не возвращает значения по‐умолчанию.
  • Добавлена переменная, содержащая уникальный номер текущего окна (только для графического интерфейса): v:windowid.
  • Добавлена возможность вернуть номер символа в юникоде независимо от текущей кодировки: второй аргумент char2nr().
  • Функции, генерирующие список файлов, теперь могут создавать именно список, а не строковое значение, разделённое на имена файлов символами новой строки.
  • Функции, получающие значения переменной в данных окне/вкладке/буфере, теперь могут возвращать указанное значение, если искомая переменная не существует, а не только пустую строку.
  • Добавлена функция luaeval().
  • В интерфейсе lua также появились типы, привязанные к переменным VimL (список, словарь, ссылка на функцию).
  • В интерфейсе lua функции vim.isbuffer() и vim.iswindow() были заменены на vim.type().
  • Добавлена функция sha256().
  • Добавлена функция wildmenumode(), позволяющая узнать, активно ли в данный момент автодополнение командной строки.
  • Добавлена возможность указать, что левая часть данной привязки не должна являться началом левой части другой привязки (т.е. map <buffer><nowait> , <Nop> делает затруднительным запуск привязок map ,a A и map ,b B для данного буфера): при использовании аргумента <nowait> Vim перестаёт ожидать следующего символа как только пользователь напечатает все символы, необходимые для запуска привязки с данной настройкой.
  • Добавлено несколько дополнительных типов автодополнения: аргументы :behave, цветовые схемы, компиляторы, аргументы :cscope, файлы в каталогах, указанных в 'path', аргументы :history, имена локалей, аргументы :sign, аргументы :syntime, имена пользователей.
  • Добавлена возможность использовать VimL функции для включения/выключения и получения состояния внешних методов ввода.
  • Добавлена возможность видеть номер текущей строки в колонке с номерами строк при включённой настройке 'relativenumber': включается при одновременном включении 'relativenumber' и 'number'.
  • Добавлена поддержка мыши в rxvt-unicode и >xterm-277.
  • Добавлена возможность игнорировать регистр при автодополнении.
  • Добавлены отладочные функции screen*(), позволяющие получить информацию о том, что отображается на экране.
  • Добавлена отладочная команда :syntime, позволяющая узнать скорость работы регулярных выражений, используемых подсветкой.
  • Исправлено множество ошибок.
Tags:
Hubs:
+32
Comments15

Articles