Настройка общего для Windows и Linux репозитория конфигурационных файлов

February 14, 2011 git Linux mklink rake Ruby sudo Vim Windows

Пост посвящается взаимной любви линуксоидов и виндузятников, а также всем тем, кому пофиг.

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

Рядом программ я пользуюсь и там, и там; постоянно пользуюсь vimом, иногда - gitом, пореже – ruby.

Поскольку под линуксом я ими пользуюсь существенно чаще, конфигурационные файлы там новее; дублировать изменения в Windows обычно лень, поэтому они тут безбожно устаревают.

При этом способ синхронизировать файлы настроек у меня уже есть, как и у многих ответственных линуксоидов – репозиторий dotfiles, из которого связкой git clone && rake install можно установить мои файлы настроек на новую систему.

Увы, под Windows этот способ не работал, ввиду, во-первых, неполного соответствия названий файлов (.vimrc_vimrc и т.п.), а во-вторых, отсутствия на Windows команд rm и ln. Пришлось дорабатывать.

Можете смотреть на Rakefile, выполняющий вышеописанное извращение, а я изложу некоторые открытые мной подробности.

Выводы

Симлинки под Windows

Симлинки на Windows (точнее, на NTFS) есть. Создаются они командой mklink и работают, можно сказать, так же, как и на линуксе.

Но, для создания симлинка нужны привилегии администратора, либо разрешение от него же, установленное через Policy Editor, которого в моем Windows 7 Home Premium нет. Короче, скрипт приходится запускать “в роли администратора”, что не такая уж и большая проблема.

Run as administrator против sudo

Run as administrator в Windows - совсем не то же, что sudo в Linux. Этот режим, повышая привилегии, не меняет текущего пользователя, то есть оставляет его же окружение. Для нашего случая это довольно важно, поскольку устанавливать файлы нужно в домашнюю папку.

mklink, как выясняется, не является исполнимым файлом. Поэтому вызов этой команды напрямую провоцирует ruby на No such file or directory. Поломав немного голову, я обнаружил, что ее можно вызвать из-под сеанса cmd:

`cmd /c mklink LINK TARGET`

Особенности FileUtils.rm_rf под Windows

для начала – полезность: в Ruby вызов rm -rf можно заменить вызовом метода FileUtils.rm_rf(file_or_directory)! А теперь – сюрприз: симлинки в NTFS этим методом не удаляются! Потому мне приходится прибегать к таким трюкам:

if is_windows? && File.directory?(target_file)
  system %Q{rmdir /s /q "#{target_file}"}
else
  FileUtils.rm_rf target_file
end

Полноценный Vim для Windows

Сборка Vim c официального сайта лишена поддержки Ruby; поскольку Ruby используется рядом плагинов, например, LustyJuggler, то это довольно плохо.

Гораздо более полная версия Vim собирается проектом Cream. Если ты не в курсе, то Cream - такая себе дружественная пользователю сборка Vim с разнообразными дружественными свистелками. Менее известен тот факт, что те же люди предоставляют и традиционную сборку Vim-huge под Windows – рекомендую её всем, кто пользуется Vim под Windows.

Buy Me a Coffee at ko-fi.com