[g]Vim в режиме Python: Рекомпиляция в Windows

Введение

Редактор Vim наиболее известен среди разработчиков в системах Unix – конкурент emacs, что-то вроде консольного IDE – этот редактор при должной сноровке и настройке (мне кажется, сноровке несколько меньшей и настройке более очевидной чем в emacs, но у последнего также есть мощная мультифункциональность – выбор за программистом) способен убыстрить и упростить многие процессы на этапах разработки не в ущерб таким удобствам как, например, авто-дополнение и навигация по проекту. Однако, если вы собираетесь использовать его для разработки на Python со всеми подобными удобствами – потребуются некоторые усилия: а именно, перекомпиляция…

Приведу несколько ссылок по теме:

Версии

Компиляция производилась с использованием [g]Vim 7.1, Python 2.5.2, Tcl 8.5.1, Cygwin 1.5.25-11 на Windows XP SP2, но сценарий при этом должен быть насколько возможно независим от версий.

Установка необходимых программ

Итак, подготовка. Нужно заранее установить сам язык – Python (если он не установлен) и, если вы собираетесь использовать Tcl – соответственно Tcl/Tk (с некоторого времени язык стал владением ActiveState: можно скачать бесплатный ActiveTcl). При компиляции используются динамические библиотеки соответствующих языков.

Для работы с архивами и собственно компиляции нам понадобится эмулятор Unix-утилит под Windows - это Cygwin. В нём существуют и компилятор gcc, и необходимые для компиляции файлы (есть путь с компилятором Borland, но он несколько сложнее). Файл установки работает немного непривычным образом – скачивая и файлы установки и пакеты уже после вашего выбора (если вы выберете установку из Интернет, которая в первый раз в любом случае необходима) – при этом для обновления или до/переустановки пакетов вы, возможно, будете возвращаться к инсталлятору довольно-таки часто. Тем не менее, чтобы установить минимальный набор необходимых для нашего случая вещей – нужно отметить лишь пару пунктов: после выбора способа установки (на данный момент наиболее стабильно для меня работало зеркало ftp://mirror.switch.ch (хотя буквально в эти секунды его исключили из списка официальных зеркал): если будут ошибки закачки – вас снова вернут к выбору зеркала) в списке выбора пакетов убедитесь что вы находитесь в режиме Category (переключив его, если надо, кнопкой View вверху), рядом с пунктом All, несколько раз потыкав надпись Default поменяйте её на Uninstall (чтобы не устанавливать ненужных пакетов) и выберите следующие пункты – Utils/patch, Devel/gcc-g++, Devel/make, System/man и Devel/gcc-mingw (последний, возможно, будет уже заранее выбран, значит они уже исправили одну проблему, которая отражалось на удачной компиляции :) ) — при этом у вас автоматически станут выбраны некоторые другие относительно необходимые пакеты (можно перепроверить): Shells/bash, Utils/bzip2 и Devel/mingw-runtime (последний, тем не менее, безмерно важен). Также советую установить Web/wget для того, чтобы облегчить в дальнейшем закачку патчей. Всё, можно жать установку.

Затем нужно, собственно, установить gVim. Можно заранее его настроить под Python, руководствуясь статьей, упомянутой выше — тогда при попытке подключения авто-дополнения Vim будет сообщать о необходимости перекомпиляции с ключом +python, что мы и планируем сделать.

Подготовка

Запустите cmd и убедитесь, что в переменных окружения USERNAME и USERDOMAIN содержатся ваше имя и имя вашего компьютера и домена соответственно (echo %username%@%userdomain%), а PATH содержит путь к bin-каталогу Cygwin. HOME может указывать на ваш каталог “Мои документы” (туда, где находится ваш файл настройки vim — vimrc), а VIM – на месторасположение установленного, рабочего редактора vim, желательно в формате 8.3 (напр.: C:\PROGRA~1\VIM). Значения переменных можно изменять в диалоге, расположенном здесь: Мой компьютер → Свойства → Дополнительно → Переменные среды.

Не менее, а даже более нам необходимы исходники, поэтому скачиваем их для соответствующей установленной версии (будьте внимательны – именно исходники для Unix, даже при компиляции под Win32) (по предыдущей ссылке также можно скачать файлы для отладки, но отлаживание в этой статье не рассматривается и в их присутствии нет необходимости). Поверх этих исходников нужно добыть дополнение для Windows (-extra) и файлы языков (-lang) соответствующей версии отсюда.

Также, если вы используете стабильный релиз и хотите заодно установить новейшие патчи – за файлами патчей обращайтесь сюда (исправьте номер версии в ссылке, если нужно). Здесь есть некоторая проблема, поскольку файлы патчей упаковываются в один только при достижении сотни (001-100, 101-200 и т.д.), поэтому если их, например, 275 – последние 75 файлов придётся закачивать руками или написав batch-скрипт с использованием telnet. Однако, у нас уже установлен {{cygwin}}, поэтому можно создать .sh-скрипт, выполняющий те же функции через wget, выглядеть это может примерно так:


PATCHES_DOWNLOAD_PATH=ftp://ftp.vim.org/pub/vim/patches
PATCHES_VER=7.1
wget $PATCHES_DOWNLOAD_PATH/$PATCHES_VER/$PATCHES_VER.001-100.gz
wget $PATCHES_DOWNLOAD_PATH/$PATCHES_VER/$PATCHES_VER.101-200.gz

for i in `seq 201 278`;
do
    wget $PATCHES_DOWNLOAD_PATH/$PATCHES_VER/$PATCHES_VER.$i
done

Теперь займёмся расположением исходников в виде, удобном для компиляции.

Архивы с исходником, -extra и -lang нужно распаковать (по очереди, с заменой более старых файлов) в какой-либо каталог с сохранением структуры (пусть в нашем случае это будет C:/devel/vim-src/vim71), в нём должны содержаться каталоги /doc, /nsis, /src, /farsi и т.д.. В распаковке вам поможет или bzip2 из Cygwin, или встроенный архиватор файлового менеджера Total Commander или архиватор 7-zip или любой другой архиватор, поддерживающий архивы .tar.gz :).

В подкаталог /runtime можно положить файлы .vim, каталоги /doc и /plugins из рабочей версии вашего редактора vim – тогда они будут пропатчены соответственно, если вы выбрали путь компилирования с патчами. Патчи при этом можно положить в каталог /patches.

Компиляция

Для того, чтобы установить патчи, нужно выполнить над каждым из них команду patch из набора Cygwin, предварительно распаковав архивы файлов с сотнями патчей. В этом случае я воспользовался .bat-файлом вместо .sh скрипта (номера патчей, конечно, нужно, поправить на соответствующие вашему набору):


@ECHO off
ECHO changing directory to parent...

CD ..

ECHO -------------------- %Date% -------------------- >> patching-src.log

ECHO %CD%: applying first 200 patches

patch -p0 < patches/7.1.001-100 >> patching-src.log 2>&1
patch -p0 < patches/7.1.101-200 >> patching-src.log 2>&1

ECHO %CD%: applying the last patches

FOR /L %%B IN (201,1,278) DO
    patch -p0 < patches/7.1.%%B >> patching-src.log 2>&1

ECHO Finished

PAUSE

@ECHO on

Этот файл нужно положить в каталог /patches и после корректировки выполнить (убедитесь, что вся описанная выше структура дерева исходников сформирована): в корне исходников будет создан файл patching-src.log, в котором можно проследить результаты прошедшего патчинга. Если утилита patch не была найдена, проверьте PATH на наличие пути к Cygwin. Если некоторое (небольшое) количество файлов не было найдено и пропатчено – можно сильно не беспокоится, это в основном файлы для XWindow-версии.

Теперь можно перейти непосредственно к компиляции из консоли Cygwin. Для этого необходимо удачно выполнить лишь три команды — перейти в каталог с исходниками (cygwin монтирует ваши диски в точке /cygdrive/: подставьте корректные пути к вашей установке Python и Tcl а также их корректные версии, а если вы не компилируете версию для Tcl – просто уберите соответствующие параметры) и создать файлы vim.exe (консольная версия) и gvim.exe (GUI-версия):

$ cd /cygdrive/c/devel/vim-src/vim71
$ make -B -f Make_cyg.mak GUI=no \
    PYTHON=/cygdrive/c/devel/Python PYTHON_VER=25 DYNAMIC_PYTHON=yes \
    TCL=/cygdrive/c/devel/Tcl TCL_VER=85 DYNAMIC_TCL=yes vim.exe
$ make -B -f Make_cyg.mak OLE=yes \
    PYTHON=/cygdrive/c/devel/Python PYTHON_VER=25 DYNAMIC_PYTHON=yes \
    TCL=/cygdrive/c/devel/Tcl TCL_VER=85 DYNAMIC_TCL=yes gvim.exe

На предупреждения и даже некоторые ошибки, если они относятся к Python или Tcl и если процесс продолжается, а в результате .exe-файлы созданы, можно не обращать внимания. Если всё завершилось удачно, то в каталоге /src вы найдёте оба .exe-файла. Сделайте бэкап существующих файлов в рабочем, установленном vim (например, vim.exe.bak и gvim.exe.bak) и замените их только что скомпилированными. Если вы применяли патчи, то верните обратно *.vim файлы, каталоги /doc и /plugins из каталога /runtime, предварительно сделав бэкапы и для них и заменяя старые версии. После этого запустите gVim и vim из папки рабочего vim, проверьте версию и опции компилирования там же на присутствие +python – в большинстве случаев всё должно сложиться удачно.

Возможные ошибки

В процессе компилирования мне встретилось две ошибки: cannot exec cc1’: No such file or directoryиld: cannot find -lgcc. Обе они [известны авторам](http://www.mail-archive.com/cygwin@cygwin.com/msg10910.html) Cygwin, однако в моём случае в скачанных мной версиях они ещё не были решены. Первая временно решается предварительным (перед компиляцией) добавлением каталога с исполняемым файлом cc1.exeв локальныйPATH` cygwin:

$ PATH=$PATH:/cygdrive/c/devel/cygwin/lib/gcc/i686-pc-cygwin/3.4.4

Вторая решается так, как должна была решаться и первая – установкой Devel/gcc-mingw (её обещали сделать автоматической при выборе gcc в будущем) при установке Cygwin. При этом важно установить пакеты одновременно, поэтому если ошибка всё равно появляется – попробуйте выбрать режим Reinstall в установщике Cygwin в том месте, где до этого вы выбирали режим Uninstall и установите Cygwin заново.

Настройка Vim для Python

(Upd.)

На основе этой статьи я создал пак (взять можно здесь) из последних версий упомянутый в ней плагинов (Project, PythonComplete, NERD_Commenter, VCSCommand, RunScript и TagList плюс, поверх — PyDiction) + минимальной настройки (в ftplugin/python.vim, практически идентичный соответствующему в статье (изменённая функция TabWrapper + другой способ подключения словаря) – только общепринятые стандарты, omni completion повешен на Tab). Содержимое требуется распаковать в каталог <путь_к_установленному_vim>\vimfiles. Для плагина taglist потребуется скачать ctags отсюда, и распаковав полученный архив в некоторый каталог, добавить путь к нему в переменную окружения PATH. Затем нужно запустить vim и выполнить команду:

:helptags $VIM\vimfiles\doc

После этого можно будет использовать команду :help <название_плагина> для получения документации по соответствующему плагину.

Обычное автодополнение при использовании настроек из пакета работает по Tab, дополнение по контексту (omni completion) – по Ctrl+Enter и Ctrl+Space, а дополнение по ключевым словам и модулям – по Ctrl+Tab (при большом количестве вариантов словарь загружается относительно долго, поэтому намеренно установлено не очень удобное сочетание).

Для того, чтобы вставлять предлагаемые по спецификации строки в заголовки python-файлов при создании, добавьте нижеприведённый код в файл <путь_к_установленному_vim>\_vimrc (строка filename добавлена для демонстрации возможности добавления имени файла):


function! BufNewFile_PY()
   0put = '#!/usr/bin/env python'
   1put = '#-*- coding: utf-8 -*-'
   $put = '#-*- filename: ' . expand('') . ' -*-'
   $put = ''
   $put = ''
   normal G
endfunction

autocmd BufNewFile *.py call BufNewFile_PY()

…Вот теперь можно c чрезвычайным удобством программировать на Python.

#gvim #python