- PVSM.RU - https://www.pvsm.ru -

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

Вчера, 6 июля 2013, Брам Мооленаар объявил [1] о выходе первой бета‐версии Vim 7.4: одного из лучших текстовых редакторов мира *nix.

Основные изменения:

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

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

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

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

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

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

(указаны измения с версии 7.3.000)

  • Добавлена поддержка сохранения списков и словарей в viminfo [17].
  • Добавлено автодополнение аргументов команды :language [18].
  • Добавлена возможность [19] влиять на отступ внутри пространства имён C++.
  • Добавлена возможность [20] влиять на выравнивание условия if/while/for отдельно от выравнивания аргументов функций.
  • Добавлена возможность использовать словарные функции для сортировки [21]: третий аргумент sort().
  • Добавлены битовые операции: функции and() [22], or() [23], invert() [24] и xor() [25].
  • Улучшена поддержка cmd.exe в качестве оболочки.
  • Добавлено событие InsertCharPre [26], возникающее перед набором символа.
  • Добавлено событие CompleteDone [27], возникающее после завершения автодополнения в режиме ввода.
  • Добавлено событие GUIFailed [28], возникающее, если не удалось запустить графический интерфейс.
  • Добавлено событие QuitPre [29], возникающее при попытке закрыть Vim с помощью команд, которые могут вместо закрытия Vim закрыть окно.
  • Добавлено события TextChanged [30] и TextChangedI [31], возникающие при изменении текста.
  • Добавлена возможность автоматического удаления символа начала комментария при использовании J [32]: флаг j [33] настройки 'formatoptions' [34].
  • Добавлена возможность удалить [35] все значки для данного буфера или файла.
  • Добавлена возможность автоматически сохранять выделение в системный буфер обмена при использовании командной строки (опция autoselectplus настройки 'clipboard' [36]). Также добавлена возможность сделать системный буфер обмена буфером обмена по‐умолчанию (ранее можно было таким сделать только «мышиный» буфер, который, впрочем, называется основным).
  • Добавлена возможность выделения найденной строки в два нажатия и различных манипуляций (копирование, удаление, замена) с ним: команда gn [37].
  • Добавлена специальное значение 'shiftwidth' [38], имеющее такой же эффект, как и значение 'shiftwidth', равное 'tabstop' [39]. В связи с возникшими затруднениями добавлена функция shiftwidth() [40]. Также аналогичное специальное значение было добавлено у настройки 'softtabstop' [41].
  • Добавлен специальный аргумент expand() [42], раскрывающийся в номер текущей строки: <slnum>.
  • Команда :diffoff [43] теперь сохраняет значения настроек, а не возвращает значения по‐умолчанию.
  • Добавлена переменная, содержащая уникальный номер текущего окна (только для графического интерфейса): v:windowid [44].
  • Добавлена возможность вернуть номер символа в юникоде независимо от текущей кодировки: второй аргумент char2nr() [45].
  • Функции, генерирующие список файлов, теперь могут создавать именно список [46], а не строковое значение, разделённое на имена файлов символами новой строки.
  • Функции, получающие значения переменной в данных окне/вкладке/буфере, теперь могут возвращать указанное значение, если искомая переменная не существует, а не только пустую строку.
  • Добавлена функция luaeval() [47].
  • В интерфейсе lua также появились типы, привязанные к переменным VimL (список [48], словарь [49], ссылка на функцию [50]).
  • В интерфейсе lua функции vim.isbuffer() и vim.iswindow() были заменены на vim.type().
  • Добавлена функция sha256() [51].
  • Добавлена функция wildmenumode() [52], позволяющая узнать, активно ли в данный момент автодополнение командной строки.
  • Добавлена возможность указать, что левая часть данной привязки не должна являться началом левой части другой привязки (т.е. map <buffer><nowait> , <Nop> делает затруднительным запуск привязок map ,a A и map ,b B для данного буфера): при использовании аргумента <nowait> [53] Vim перестаёт ожидать следующего символа как только пользователь напечатает все символы, необходимые для запуска привязки с данной настройкой.
  • Добавлено несколько дополнительных типов автодополнения [54]: аргументы :behave [55], цветовые схемы, компиляторы, аргументы :cscope [56], файлы в каталогах, указанных в 'path' [57], аргументы :history [58], имена локалей, аргументы :sign [59], аргументы :syntime [60], имена пользователей.
  • Добавлена возможность использовать VimL функции для включения/выключения [61] и получения состояния [62] внешних методов ввода.
  • Добавлена возможность видеть номер текущей строки в колонке с номерами строк при включённой настройке 'relativenumber' [63]: включается при одновременном включении 'relativenumber' [63] и 'number' [64].
  • Добавлена поддержка мыши в rxvt-unicode и >xterm-277.
  • Добавлена возможность [65] игнорировать регистр при автодополнении.
  • Добавлены отладочные функции screen*() [66], позволяющие получить информацию о том, что отображается на экране.
  • Добавлена отладочная команда syntime() [60], позволяющая узнать скорость работы регулярных выражений, используемых подсветкой.
  • Исправлено множество ошибок.

Автор: ZyXI

Источник [67]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/vim/38149

Ссылки в тексте:

[1] объявил: https://groups.google.com/forum/?fromgroups=#!topic/vim_dev/N8jzif4e9L8

[2] :h new-regexp-engine: http://vimhelp.appspot.com/version7.txt.html#new-regexp-engine

[3] 'regexpengine': http://vimhelp.appspot.com/options.txt.html#%27regexpengine%27

[4] /%#=: http://vimhelp.appspot.com/pattern.txt.html#%2F%5C%25%23%3D

[5] vim.bindeval: http://vimhelp.appspot.com/if_pyth.txt.html#python-bindeval

[6] vim.eval: http://vimhelp.appspot.com/if_pyth.txt.html#python-eval

[7] vim.Dictionary: http://vimhelp.appspot.com/if_pyth.txt.html#python-Dictionary

[8] vim.List: http://vimhelp.appspot.com/if_pyth.txt.html#python-List

[9] vim.Function: http://vimhelp.appspot.com/if_pyth.txt.html#python-Function

[10] vim.vars: http://vimhelp.appspot.com/if_pyth.txt.html#python-vars

[11] buffer: http://vimhelp.appspot.com/if_pyth.txt.html#python-buffer

[12] vim.options: http://vimhelp.appspot.com/if_pyth.txt.html#python-options

[13] возможность: http://vimhelp.appspot.com/if_pyth.txt.html#python-tabpage

[14] vim.buffers: http://vimhelp.appspot.com/if_pyth.txt.html#python-buffers

[15] :pydo: http://vimhelp.appspot.com/if_pyth.txt.html#%3Apydo

[16] pyeval(): http://vimhelp.appspot.com/if_pyth.txt.html#python-pyeval

[17] viminfo: http://vimhelp.appspot.com/starting.txt.html#viminfo

[18] :language: http://vimhelp.appspot.com/mlang.txt.html#%3Alanguage

[19] возможность: http://vimhelp.appspot.com/indent.txt.html#cino-N

[20] возможность: http://vimhelp.appspot.com/indent.txt.html#cino-k

[21] сортировки: http://vimhelp.appspot.com/eval.txt.html#sort%28%29

[22] and(): http://vimhelp.appspot.com/eval.txt.html#and%28%29

[23] or(): http://vimhelp.appspot.com/eval.txt.html#or%28%29

[24] invert(): http://vimhelp.appspot.com/eval.txt.html#invert%28%29

[25] xor(): http://vimhelp.appspot.com/eval.txt.html#xor%28%29

[26] InsertCharPre: http://vimhelp.appspot.com/autocmd.txt.html#InsertCharPre

[27] CompleteDone: http://vimhelp.appspot.com/autocmd.txt.html#CompleteDone

[28] GUIFailed: http://vimhelp.appspot.com/autocmd.txt.html#GUIFailed

[29] QuitPre: http://vimhelp.appspot.com/autocmd.txt.html#QuitPre

[30] TextChanged: http://vimhelp.appspot.com/autocmd.txt.html#TextChanged

[31] TextChangedI: http://vimhelp.appspot.com/autocmd.txt.html#TextChangedI

[32] J: http://vimhelp.appspot.com/change.txt.html#J

[33] j: http://vimhelp.appspot.com/change.txt.html#fo-table

[34] 'formatoptions': http://vimhelp.appspot.com/options.txt.html#%27formatoptions%27

[35] удалить: http://vimhelp.appspot.com/sign.txt.html#%3Asign-unplace

[36] 'clipboard': http://vimhelp.appspot.com/options.txt.html#%27clipboard%27

[37] gn: http://vimhelp.appspot.com/visual.txt.html#gn

[38] 'shiftwidth': http://vimhelp.appspot.com/options.txt.html#%27shiftwidth%27

[39] 'tabstop': http://vimhelp.appspot.com/options.txt.html#%27tabstop%27

[40] shiftwidth(): http://vimhelp.appspot.com/eval.txt.html#shiftwidth%28%29

[41] 'softtabstop': http://vimhelp.appspot.com/options.txt.html#%27softtabstop%27

[42] expand(): http://vimhelp.appspot.com/eval.txt.html#expand%28%29

[43] :diffoff: http://vimhelp.appspot.com/diff.txt.html#%3Adiffoff

[44] v:windowid: http://vimhelp.appspot.com/eval.txt.html#v%3Awindowid

[45] char2nr(): http://vimhelp.appspot.com/eval.txt.html#char2nr%28%29

[46] список: http://vimhelp.appspot.com/eval.txt.html#List

[47] luaeval(): http://vimhelp.appspot.com/if_lua.txt.html#lua-luaeval

[48] список: http://vimhelp.appspot.com/if_lua.txt.html#lua-list

[49] словарь: http://vimhelp.appspot.com/if_lua.txt.html#lua-dict

[50] ссылка на функцию: http://vimhelp.appspot.com/if_lua.txt.html#lua-funcref

[51] sha256(): http://vimhelp.appspot.com/eval.txt.html#sha256%28%29

[52] wildmenumode(): http://vimhelp.appspot.com/eval.txt.html#wildmenumode%28%29

[53] <nowait>: http://vimhelp.appspot.com/map.txt.html#%3Amap-nowait

[54] автодополнения: http://vimhelp.appspot.com/map.txt.html#%3Acommand-complete

[55] :behave: http://vimhelp.appspot.com/gui.txt.html#%3Abehave

[56] :cscope: http://vimhelp.appspot.com/if_cscop.txt.html#%3Acscope

[57] 'path': http://vimhelp.appspot.com/options.txt.html#%27path%27

[58] :history: http://vimhelp.appspot.com/cmdline.txt.html#%3Ahistory

[59] :sign: http://vimhelp.appspot.com/sign.txt.html#%3Asign

[60] :syntime: http://vimhelp.appspot.com/syntax.txt.html#%3Asyntime

[61] включения/выключения: http://vimhelp.appspot.com/options.txt.html#%27imactivatefunc%27

[62] получения состояния: http://vimhelp.appspot.com/options.txt.html#%27imstatusfunc%27

[63] 'relativenumber': http://vimhelp.appspot.com/options.txt.html#%27relativenumber%27

[64] 'number': http://vimhelp.appspot.com/options.txt.html#%27number%27

[65] возможность: http://vimhelp.appspot.com/options.txt.html#%27wildignorecase%27

[66] screen*(): http://vimhelp.appspot.com/eval.txt.html#screenattr%28%29

[67] Источник: http://habrahabr.ru/post/185800/