November 11th, 2013

Book

Ещё одно чудо враждебной техники

Теперь это vim-syntastic

По совету друзей™ придумал и воплотил коварный план обновления cabal-install: собрал бинарный пекедж cabal-install 1.18.x используя б-ку Cabal 1.18, установленную на время сборки в песочницу. Потом обновил системный cabal-install на свой.

Так что теперь у меня есть cabal sandbox. Удивительно в нем то, что используется командная строка в старом виде, т.е. есть обратная совместимость, и всё что поддерживает простой cabal - поддерживает и sandbox, за исключением этапа создания песочницы.

Syntastic ставится просто и не требует конфигурации:

yaourt -S vim-syntastic haskell-ghc-mod

После чего по каждому сохранению запускается ghc-mod check, который из коробки понимает cabal sandbox.

Найденные проблемы красиво отображаются значками >> на "гуттере" (kak eto porusski?). Также можно огласить весь список, открыв :Errors

Но есть проблемы.

1. ghc-mod нельзя передать дополнительных аргументов.

По умолчанию он генерирует тучу ворнингов типа -Wall. А я пользуюсь скопипащенным кодом большой лигаси-библиотеки, и получаю 100500 ворнингов с ворнингами по смыслу в самом конце. Хотелось бы хотя бы передать -g -fno-warn-missing-signatures -g -fno-warn-name-shadowing, чтобы не предлагал фиксить совершенно уж низкоприоритетные вещи.

2. Syntastic (барабанная дробь!) НЕ. ПОДДЕРЖИВАЕТ. МНОГОСТРОЧНЫХ. ОШИБОК.

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

Представьте себе теперь такой файлик:
main = do
          print 42
          print $ () + 2 
          print 666
При компиляции ghc выдает такой аски-арт:
Foo.hs:3:20:
    No instance for (Num ()) arising from a use of `+'
    Possible fix: add an instance declaration for (Num ())
    In the second argument of `($)', namely `() + 2'
    In a stmt of a 'do' block: print $ () + 2
    In the expression:
      do { print 42;
           print $ () + 2;
           print 666 }
ghc-mod check выдает

Foo.hs:3:20:No instance for (Num ()) arising from a use of `+'Possible fix: add an instance declaration for (Num ())In the second argument of `($)', namely `() + 2'In a stmt of a 'do' block: print $ () + 2In the expression: do { print 42; print $ () + 2; print 666 }

После чего в vim получается в панели :Error такоэ:

Foo.hs|1 col 19 error| No instance for (Num ()) arising from a use of `+'Possible fix: add an instance declaration for (Num ())In the second argument of `($)', namely `() + 2'In the expression: print $ () + 2In an equation for `main': main = print $ () + 2

А в последней строке начальная часть этой строки, которая уместилась в 1 строчку:

No instance for (Num ()) arising from a use of `+'Possible fix: add an instance declaration for (Num ())In the second argument of `($)', namely `() + 2'In a stmt of a 'do' block: print $ () + 2In the expression: do { print 42; print $ () + 2; print 666 }

Какой жопой они думали, я не знаю. Syntastic поддерживает крестики, где многострочные ошибки - норма.

Блядь (у меня уже нет слов). В крестиках он вообще ничего не показывает. На этом коде говорит что вообще нет ошибок, и панель :Errors показывать отказывается:
template <typename F>
void Foo(F bar)
{
        return bar + 1;
}

struct Baz {};

void bar()
{
        Baz quux;
        Foo(quux);

}
А если bar + 1 заменить на F + 1 (ошибка попроще) - то уже показывает. Короче, остались одни выражения.

Upd: https://github.com/scrooloose/syntastic/issues/860
Book

И снова трудности

Только искоренил из своей системы Cabal-1.16 (для этого пришлось sudo ghc-pkg hide Cabal и установить в 100500 мест Cabal-1.18), как обнаружил, что старый добрый Gtk2HsSetup.hs подгнил и не собирается с 1.18.

Кто-нибудь знает, где брать свежий?

Нашел https://github.com/bgamari/gtk2hs/blob/master/gtk/Gtk2HsSetup.hs , но у него теперь в другом месте несовместимость.

Нашел как исправили https://github.com/scrive/hdbc-postgresql/commit/e9b2fbab07b8f55ae6a9e120ab0b98c433842a8b

Это уму не постижимо! (тайпкласс вместо #ifdef). Бьюсь головой об пол. И мы ещё боремся за звание дома высокой культуры быта!